@oalacea/daemon 0.5.1 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/dist/cli/cli.d.ts +42 -0
  2. package/dist/cli/cli.d.ts.map +1 -0
  3. package/dist/cli/cli.js +89 -0
  4. package/dist/cli/cli.js.map +1 -0
  5. package/dist/cli/commands/detect.command.d.ts +39 -0
  6. package/dist/cli/commands/detect.command.d.ts.map +1 -0
  7. package/dist/cli/commands/detect.command.js +111 -0
  8. package/dist/cli/commands/detect.command.js.map +1 -0
  9. package/dist/cli/commands/index.d.ts +14 -0
  10. package/dist/cli/commands/index.d.ts.map +1 -0
  11. package/dist/cli/commands/index.js +11 -0
  12. package/dist/cli/commands/index.js.map +1 -0
  13. package/dist/cli/commands/init.command.d.ts +41 -0
  14. package/dist/cli/commands/init.command.d.ts.map +1 -0
  15. package/dist/cli/commands/init.command.js +111 -0
  16. package/dist/cli/commands/init.command.js.map +1 -0
  17. package/dist/cli/commands/test.command.d.ts +58 -0
  18. package/dist/cli/commands/test.command.d.ts.map +1 -0
  19. package/dist/cli/commands/test.command.js +180 -0
  20. package/dist/cli/commands/test.command.js.map +1 -0
  21. package/dist/cli/index.d.ts +8 -0
  22. package/dist/cli/index.d.ts.map +1 -0
  23. package/dist/cli/index.js +10 -0
  24. package/dist/cli/index.js.map +1 -0
  25. package/dist/core/config/daemon.config.d.ts +32 -0
  26. package/dist/core/config/daemon.config.d.ts.map +1 -0
  27. package/dist/core/config/daemon.config.js +83 -0
  28. package/dist/core/config/daemon.config.js.map +1 -0
  29. package/dist/core/config/index.d.ts +5 -0
  30. package/dist/core/config/index.d.ts.map +1 -0
  31. package/dist/core/config/index.js +5 -0
  32. package/dist/core/config/index.js.map +1 -0
  33. package/dist/core/constants.d.ts +36 -0
  34. package/dist/core/constants.d.ts.map +1 -0
  35. package/dist/core/constants.js +56 -0
  36. package/dist/core/constants.js.map +1 -0
  37. package/dist/core/types/common.types.d.ts +250 -0
  38. package/dist/core/types/common.types.d.ts.map +1 -0
  39. package/dist/core/types/common.types.js +7 -0
  40. package/dist/core/types/common.types.js.map +1 -0
  41. package/dist/core/types/detection.types.d.ts +232 -0
  42. package/dist/core/types/detection.types.d.ts.map +1 -0
  43. package/dist/core/types/detection.types.js +22 -0
  44. package/dist/core/types/detection.types.js.map +1 -0
  45. package/dist/core/types/docker.types.d.ts +322 -0
  46. package/dist/core/types/docker.types.d.ts.map +1 -0
  47. package/dist/core/types/docker.types.js +7 -0
  48. package/dist/core/types/docker.types.js.map +1 -0
  49. package/dist/core/types/index.d.ts +11 -0
  50. package/dist/core/types/index.d.ts.map +1 -0
  51. package/dist/core/types/index.js +7 -0
  52. package/dist/core/types/index.js.map +1 -0
  53. package/dist/core/types/project.types.d.ts +74 -0
  54. package/dist/core/types/project.types.d.ts.map +1 -0
  55. package/dist/core/types/project.types.js +7 -0
  56. package/dist/core/types/project.types.js.map +1 -0
  57. package/dist/core/types/shared.types.d.ts +118 -0
  58. package/dist/core/types/shared.types.d.ts.map +1 -0
  59. package/dist/core/types/shared.types.js +7 -0
  60. package/dist/core/types/shared.types.js.map +1 -0
  61. package/dist/core/types/test.types.d.ts +230 -0
  62. package/dist/core/types/test.types.d.ts.map +1 -0
  63. package/dist/core/types/test.types.js +7 -0
  64. package/dist/core/types/test.types.js.map +1 -0
  65. package/dist/services/detection/__tests__/framework-detector.test.d.ts +5 -0
  66. package/dist/services/detection/__tests__/framework-detector.test.d.ts.map +1 -0
  67. package/dist/services/detection/__tests__/framework-detector.test.js +52 -0
  68. package/dist/services/detection/__tests__/framework-detector.test.js.map +1 -0
  69. package/dist/services/detection/framework-detector.d.ts +179 -0
  70. package/dist/services/detection/framework-detector.d.ts.map +1 -0
  71. package/dist/services/detection/framework-detector.js +636 -0
  72. package/dist/services/detection/framework-detector.js.map +1 -0
  73. package/dist/services/detection/index.d.ts +10 -0
  74. package/dist/services/detection/index.d.ts.map +1 -0
  75. package/dist/services/detection/index.js +7 -0
  76. package/dist/services/detection/index.js.map +1 -0
  77. package/dist/services/docker/__tests__/docker-manager.test.d.ts +5 -0
  78. package/dist/services/docker/__tests__/docker-manager.test.d.ts.map +1 -0
  79. package/dist/services/docker/__tests__/docker-manager.test.js +67 -0
  80. package/dist/services/docker/__tests__/docker-manager.test.js.map +1 -0
  81. package/dist/services/docker/docker-manager.d.ts +157 -0
  82. package/dist/services/docker/docker-manager.d.ts.map +1 -0
  83. package/dist/services/docker/docker-manager.js +516 -0
  84. package/dist/services/docker/docker-manager.js.map +1 -0
  85. package/dist/services/docker/index.d.ts +9 -0
  86. package/dist/services/docker/index.d.ts.map +1 -0
  87. package/dist/services/docker/index.js +9 -0
  88. package/dist/services/docker/index.js.map +1 -0
  89. package/dist/services/index.d.ts +10 -0
  90. package/dist/services/index.d.ts.map +1 -0
  91. package/dist/services/index.js +8 -0
  92. package/dist/services/index.js.map +1 -0
  93. package/dist/shared/errors/__tests__/base.error.test.d.ts +5 -0
  94. package/dist/shared/errors/__tests__/base.error.test.d.ts.map +1 -0
  95. package/dist/shared/errors/__tests__/base.error.test.js +61 -0
  96. package/dist/shared/errors/__tests__/base.error.test.js.map +1 -0
  97. package/dist/shared/errors/__tests__/command.error.test.d.ts +5 -0
  98. package/dist/shared/errors/__tests__/command.error.test.d.ts.map +1 -0
  99. package/dist/shared/errors/__tests__/command.error.test.js +62 -0
  100. package/dist/shared/errors/__tests__/command.error.test.js.map +1 -0
  101. package/dist/shared/errors/__tests__/file.error.test.d.ts +5 -0
  102. package/dist/shared/errors/__tests__/file.error.test.d.ts.map +1 -0
  103. package/dist/shared/errors/__tests__/file.error.test.js +75 -0
  104. package/dist/shared/errors/__tests__/file.error.test.js.map +1 -0
  105. package/dist/shared/errors/__tests__/index.test.d.ts +5 -0
  106. package/dist/shared/errors/__tests__/index.test.d.ts.map +1 -0
  107. package/dist/shared/errors/__tests__/index.test.js +62 -0
  108. package/dist/shared/errors/__tests__/index.test.js.map +1 -0
  109. package/dist/shared/errors/__tests__/validation.error.test.d.ts +5 -0
  110. package/dist/shared/errors/__tests__/validation.error.test.d.ts.map +1 -0
  111. package/dist/shared/errors/__tests__/validation.error.test.js +79 -0
  112. package/dist/shared/errors/__tests__/validation.error.test.js.map +1 -0
  113. package/dist/shared/errors/base.error.d.ts +54 -0
  114. package/dist/shared/errors/base.error.d.ts.map +1 -0
  115. package/dist/shared/errors/base.error.js +85 -0
  116. package/dist/shared/errors/base.error.js.map +1 -0
  117. package/dist/shared/errors/command.error.d.ts +58 -0
  118. package/dist/shared/errors/command.error.d.ts.map +1 -0
  119. package/dist/shared/errors/command.error.js +102 -0
  120. package/dist/shared/errors/command.error.js.map +1 -0
  121. package/dist/shared/errors/detection.error.d.ts +42 -0
  122. package/dist/shared/errors/detection.error.d.ts.map +1 -0
  123. package/dist/shared/errors/detection.error.js +82 -0
  124. package/dist/shared/errors/detection.error.js.map +1 -0
  125. package/dist/shared/errors/docker.error.d.ts +142 -0
  126. package/dist/shared/errors/docker.error.d.ts.map +1 -0
  127. package/dist/shared/errors/docker.error.js +172 -0
  128. package/dist/shared/errors/docker.error.js.map +1 -0
  129. package/dist/shared/errors/file.error.d.ts +66 -0
  130. package/dist/shared/errors/file.error.d.ts.map +1 -0
  131. package/dist/shared/errors/file.error.js +93 -0
  132. package/dist/shared/errors/file.error.js.map +1 -0
  133. package/dist/shared/errors/index.d.ts +56 -0
  134. package/dist/shared/errors/index.d.ts.map +1 -0
  135. package/dist/shared/errors/index.js +86 -0
  136. package/dist/shared/errors/index.js.map +1 -0
  137. package/dist/shared/errors/validation.error.d.ts +67 -0
  138. package/dist/shared/errors/validation.error.d.ts.map +1 -0
  139. package/dist/shared/errors/validation.error.js +97 -0
  140. package/dist/shared/errors/validation.error.js.map +1 -0
  141. package/dist/shared/templates/index.d.ts +2 -0
  142. package/dist/shared/templates/index.d.ts.map +1 -0
  143. package/dist/shared/templates/index.js +2 -0
  144. package/dist/shared/templates/index.js.map +1 -0
  145. package/dist/shared/templates/prompt-builder.d.ts +2 -0
  146. package/dist/shared/templates/prompt-builder.d.ts.map +1 -0
  147. package/dist/shared/templates/prompt-builder.js +2 -0
  148. package/dist/shared/templates/prompt-builder.js.map +1 -0
  149. package/dist/shared/templates/template-engine.d.ts +2 -0
  150. package/dist/shared/templates/template-engine.d.ts.map +1 -0
  151. package/dist/shared/templates/template-engine.js +2 -0
  152. package/dist/shared/templates/template-engine.js.map +1 -0
  153. package/dist/shared/utils/__tests__/command-executor.test.d.ts +5 -0
  154. package/dist/shared/utils/__tests__/command-executor.test.d.ts.map +1 -0
  155. package/dist/shared/utils/__tests__/command-executor.test.js +45 -0
  156. package/dist/shared/utils/__tests__/command-executor.test.js.map +1 -0
  157. package/dist/shared/utils/__tests__/file-helper.test.d.ts +5 -0
  158. package/dist/shared/utils/__tests__/file-helper.test.d.ts.map +1 -0
  159. package/dist/shared/utils/__tests__/file-helper.test.js +71 -0
  160. package/dist/shared/utils/__tests__/file-helper.test.js.map +1 -0
  161. package/dist/shared/utils/__tests__/logger.test.d.ts +5 -0
  162. package/dist/shared/utils/__tests__/logger.test.d.ts.map +1 -0
  163. package/dist/shared/utils/__tests__/logger.test.js +83 -0
  164. package/dist/shared/utils/__tests__/logger.test.js.map +1 -0
  165. package/dist/shared/utils/command-executer.d.ts +2 -0
  166. package/dist/shared/utils/command-executer.d.ts.map +1 -0
  167. package/dist/shared/utils/command-executer.js +2 -0
  168. package/dist/shared/utils/command-executer.js.map +1 -0
  169. package/dist/shared/utils/command-executor.d.ts +255 -0
  170. package/dist/shared/utils/command-executor.d.ts.map +1 -0
  171. package/dist/shared/utils/command-executor.js +287 -0
  172. package/dist/shared/utils/command-executor.js.map +1 -0
  173. package/dist/shared/utils/file-helper.d.ts +86 -0
  174. package/dist/shared/utils/file-helper.d.ts.map +1 -0
  175. package/dist/shared/utils/file-helper.js +323 -0
  176. package/dist/shared/utils/file-helper.js.map +1 -0
  177. package/dist/shared/utils/index.d.ts +9 -0
  178. package/dist/shared/utils/index.d.ts.map +1 -0
  179. package/dist/shared/utils/index.js +9 -0
  180. package/dist/shared/utils/index.js.map +1 -0
  181. package/dist/shared/utils/logger.d.ts +163 -0
  182. package/dist/shared/utils/logger.d.ts.map +1 -0
  183. package/dist/shared/utils/logger.js +389 -0
  184. package/dist/shared/utils/logger.js.map +1 -0
  185. package/package.json +25 -6
  186. package/CHANGELOG.md +0 -46
  187. package/agents/deps-analyzer.js +0 -366
  188. package/agents/detector.js +0 -570
  189. package/agents/fix-engine.js +0 -305
  190. package/agents/lighthouse-scanner.js +0 -405
  191. package/agents/perf-analyzer.js +0 -294
  192. package/agents/perf-front-analyzer.js +0 -229
  193. package/agents/test-generator.js +0 -387
  194. package/agents/test-runner.js +0 -318
  195. package/bin/cli.js +0 -449
  196. package/lib/config.js +0 -250
  197. package/lib/docker.js +0 -207
  198. package/lib/reporter.js +0 -297
  199. package/scripts/dev.js +0 -106
@@ -0,0 +1,86 @@
1
+ /**
2
+ * FileSystemHelper - Opérations fichiers sécurisées et async
3
+ *
4
+ * @module shared/utils/file-helper
5
+ */
6
+ import type { Stats } from 'node:fs';
7
+ /**
8
+ * Options pour les opérations fichiers
9
+ */
10
+ export interface FileHelperOptions {
11
+ /** Creer les repertoires parents si necessaire */
12
+ ensureDir?: boolean;
13
+ /** Encodage pour les operations texte */
14
+ encoding?: BufferEncoding;
15
+ }
16
+ /**
17
+ * Resultat de recherche de fichiers
18
+ */
19
+ export interface FileSearchResult {
20
+ /** Fichiers trouves */
21
+ files: string[];
22
+ /** Nombre total de fichiers */
23
+ total: number;
24
+ /** Duree de la recherche en ms */
25
+ duration: number;
26
+ }
27
+ /**
28
+ * Helper pour les operations systeme de fichiers
29
+ *
30
+ * Toutes les operations sont asynchrones et utilisent fs/promises.
31
+ * Les erreurs sont loguees et propagees avec contexte via DaemonError.
32
+ */
33
+ export declare class FileSystemHelper {
34
+ /**
35
+ * Lit un fichier JSON et le parse
36
+ */
37
+ readJson<T = unknown>(filePath: string): Promise<T>;
38
+ /**
39
+ * Ecrit des donnees JSON dans un fichier
40
+ */
41
+ writeJson<T = unknown>(filePath: string, data: T, options?: FileHelperOptions): Promise<void>;
42
+ /**
43
+ * Sassure quun repertoire existe (cree recursivement si necessaire)
44
+ */
45
+ ensureDir(dirPath: string): Promise<void>;
46
+ /**
47
+ * Trouve des fichiers correspondant a un pattern
48
+ */
49
+ findFiles(pattern: string, cwd: string, options?: {
50
+ maxDepth?: number;
51
+ ignoreDirs?: string[];
52
+ }): Promise<FileSearchResult>;
53
+ /**
54
+ * Verifie si un fichier ou repertoire existe
55
+ */
56
+ exists(targetPath: string): Promise<boolean>;
57
+ /**
58
+ * Lit le contenu dun fichier texte
59
+ */
60
+ readFile(filePath: string, encoding?: BufferEncoding): Promise<string>;
61
+ /**
62
+ * Ecrit du contenu dans un fichier texte
63
+ */
64
+ writeFile(filePath: string, content: string, options?: FileHelperOptions): Promise<void>;
65
+ /**
66
+ * Copie un fichier vers une destination
67
+ */
68
+ copyFile(src: string, dest: string, options?: FileHelperOptions): Promise<void>;
69
+ /**
70
+ * Supprime un fichier ou un repertoire
71
+ */
72
+ remove(targetPath: string): Promise<void>;
73
+ /**
74
+ * Lit les metadonnees dun fichier
75
+ */
76
+ stat(filePath: string): Promise<Stats>;
77
+ /**
78
+ * Liste le contenu dun repertoire
79
+ */
80
+ readdir(dirPath: string): Promise<string[]>;
81
+ }
82
+ /**
83
+ * Instance singleton
84
+ */
85
+ export declare const fileHelper: FileSystemHelper;
86
+ //# sourceMappingURL=file-helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-helper.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/file-helper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAgBrC;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uBAAuB;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAAa,gBAAgB;IAC3B;;OAEG;IACG,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAiCzD;;OAEG;IACG,SAAS,CAAC,CAAC,GAAG,OAAO,EACzB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,CAAC,EACP,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,IAAI,CAAC;IA4BhB;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB/C;;OAEG;IACG,SAAS,CACb,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,GACA,OAAO,CAAC,gBAAgB,CAAC;IAkE5B;;OAEG;IACG,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASlD;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,cAAwB,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBrF;;OAEG;IACG,SAAS,CACb,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,IAAI,CAAC;IAwBhB;;OAEG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkCrF;;OAEG;IACG,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA8B/C;;OAEG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAkB5C;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAsBlD;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,kBAAyB,CAAC"}
@@ -0,0 +1,323 @@
1
+ /**
2
+ * FileSystemHelper - Opérations fichiers sécurisées et async
3
+ *
4
+ * @module shared/utils/file-helper
5
+ */
6
+ import * as fs from 'node:fs/promises';
7
+ import * as path from 'node:path';
8
+ import { createLogger } from './logger.js';
9
+ import { FileNotFoundError, FilePermissionError, InvalidJsonError, DirectoryCreationError, FileWriteError, FileReadError, FileCopyError, FileSearchError, } from '../errors/file.error.js';
10
+ const logger = createLogger('FileSystemHelper');
11
+ /**
12
+ * Helper pour les operations systeme de fichiers
13
+ *
14
+ * Toutes les operations sont asynchrones et utilisent fs/promises.
15
+ * Les erreurs sont loguees et propagees avec contexte via DaemonError.
16
+ */
17
+ export class FileSystemHelper {
18
+ /**
19
+ * Lit un fichier JSON et le parse
20
+ */
21
+ async readJson(filePath) {
22
+ const start = Date.now();
23
+ const resolvedPath = path.resolve(filePath);
24
+ try {
25
+ logger.debug(`Reading JSON file: ${resolvedPath}`);
26
+ const content = await fs.readFile(resolvedPath, 'utf-8');
27
+ const parsed = JSON.parse(content);
28
+ logger.debug(`JSON file read in ${Date.now() - start}ms`);
29
+ return parsed;
30
+ }
31
+ catch (error) {
32
+ const nodeError = error;
33
+ if (nodeError.code === 'ENOENT') {
34
+ logger.error(`File not found: ${resolvedPath}`);
35
+ throw new FileNotFoundError(resolvedPath, { cause: error });
36
+ }
37
+ if (error instanceof SyntaxError) {
38
+ logger.error(`Invalid JSON in file: ${resolvedPath}`, error);
39
+ throw new InvalidJsonError(resolvedPath, error.message, { cause: error });
40
+ }
41
+ if (nodeError.code === 'EPERM' || nodeError.code === 'EACCES') {
42
+ logger.error(`Permission denied reading file: ${resolvedPath}`);
43
+ throw new FilePermissionError(resolvedPath, 'read', { cause: error });
44
+ }
45
+ logger.error(`Failed to read JSON file: ${resolvedPath}`, error);
46
+ throw new FileReadError(resolvedPath, { cause: error });
47
+ }
48
+ }
49
+ /**
50
+ * Ecrit des donnees JSON dans un fichier
51
+ */
52
+ async writeJson(filePath, data, options) {
53
+ const start = Date.now();
54
+ const resolvedPath = path.resolve(filePath);
55
+ try {
56
+ logger.debug(`Writing JSON file: ${resolvedPath}`);
57
+ const dir = path.dirname(resolvedPath);
58
+ if (options?.ensureDir !== false) {
59
+ await this.ensureDir(dir);
60
+ }
61
+ const content = JSON.stringify(data, null, 2);
62
+ await fs.writeFile(resolvedPath, content, 'utf-8');
63
+ logger.debug(`JSON file written in ${Date.now() - start}ms`);
64
+ }
65
+ catch (error) {
66
+ const nodeError = error;
67
+ if (nodeError.code === 'EPERM' || nodeError.code === 'EACCES') {
68
+ logger.error(`Permission denied writing file: ${resolvedPath}`);
69
+ throw new FilePermissionError(resolvedPath, 'write', { cause: error });
70
+ }
71
+ logger.error(`Failed to write JSON file: ${resolvedPath}`, error);
72
+ throw new FileWriteError(resolvedPath, { cause: error });
73
+ }
74
+ }
75
+ /**
76
+ * Sassure quun repertoire existe (cree recursivement si necessaire)
77
+ */
78
+ async ensureDir(dirPath) {
79
+ const resolvedPath = path.resolve(dirPath);
80
+ try {
81
+ await fs.mkdir(resolvedPath, { recursive: true });
82
+ logger.debug(`Directory ensured: ${resolvedPath}`);
83
+ }
84
+ catch (error) {
85
+ const nodeError = error;
86
+ if (nodeError.code === 'EEXIST') {
87
+ return;
88
+ }
89
+ if (nodeError.code === 'EPERM' || nodeError.code === 'EACCES') {
90
+ logger.error(`Permission denied creating directory: ${resolvedPath}`);
91
+ throw new FilePermissionError(resolvedPath, 'create directory', { cause: error });
92
+ }
93
+ logger.error(`Failed to create directory: ${resolvedPath}`, error);
94
+ throw new DirectoryCreationError(resolvedPath, { cause: error });
95
+ }
96
+ }
97
+ /**
98
+ * Trouve des fichiers correspondant a un pattern
99
+ */
100
+ async findFiles(pattern, cwd, options) {
101
+ const start = Date.now();
102
+ const results = [];
103
+ const maxDepth = options?.maxDepth ?? 10;
104
+ const ignoreDirs = new Set([
105
+ 'node_modules',
106
+ '.git',
107
+ '.next',
108
+ 'dist',
109
+ 'build',
110
+ 'coverage',
111
+ ...(options?.ignoreDirs ?? []),
112
+ ]);
113
+ const searchDir = async (dir, depth = 0) => {
114
+ if (depth > maxDepth)
115
+ return;
116
+ try {
117
+ const entries = await fs.readdir(dir, { withFileTypes: true });
118
+ for (const entry of entries) {
119
+ const fullPath = path.join(dir, entry.name);
120
+ if (entry.isDirectory()) {
121
+ if (ignoreDirs.has(entry.name)) {
122
+ continue;
123
+ }
124
+ await searchDir(fullPath, depth + 1);
125
+ }
126
+ else if (entry.isFile()) {
127
+ const regex = new RegExp('^' +
128
+ pattern
129
+ .replace(/\./g, '\\.')
130
+ .replace(/\*/g, '.*')
131
+ .replace(/\?/g, '.') +
132
+ '$');
133
+ if (regex.test(entry.name)) {
134
+ results.push(fullPath);
135
+ }
136
+ }
137
+ }
138
+ }
139
+ catch (error) {
140
+ const nodeError = error;
141
+ if (nodeError.code !== 'EPERM' && nodeError.code !== 'EACCES') {
142
+ throw error;
143
+ }
144
+ }
145
+ };
146
+ try {
147
+ await searchDir(cwd);
148
+ const duration = Date.now() - start;
149
+ logger.debug(`Found ${results.length} files matching '${pattern}' in ${duration}ms`);
150
+ return {
151
+ files: results,
152
+ total: results.length,
153
+ duration,
154
+ };
155
+ }
156
+ catch (error) {
157
+ logger.error(`Failed to search files: ${cwd}`, error);
158
+ throw new FileSearchError(cwd, pattern, { cause: error });
159
+ }
160
+ }
161
+ /**
162
+ * Verifie si un fichier ou repertoire existe
163
+ */
164
+ async exists(targetPath) {
165
+ try {
166
+ await fs.access(targetPath);
167
+ return true;
168
+ }
169
+ catch {
170
+ return false;
171
+ }
172
+ }
173
+ /**
174
+ * Lit le contenu dun fichier texte
175
+ */
176
+ async readFile(filePath, encoding = 'utf-8') {
177
+ const resolvedPath = path.resolve(filePath);
178
+ try {
179
+ return await fs.readFile(resolvedPath, encoding);
180
+ }
181
+ catch (error) {
182
+ const nodeError = error;
183
+ if (nodeError.code === 'ENOENT') {
184
+ logger.error(`File not found: ${resolvedPath}`);
185
+ throw new FileNotFoundError(resolvedPath, { cause: error });
186
+ }
187
+ if (nodeError.code === 'EPERM' || nodeError.code === 'EACCES') {
188
+ logger.error(`Permission denied reading file: ${resolvedPath}`);
189
+ throw new FilePermissionError(resolvedPath, 'read', { cause: error });
190
+ }
191
+ logger.error(`Failed to read file: ${resolvedPath}`, error);
192
+ throw new FileReadError(resolvedPath, { cause: error });
193
+ }
194
+ }
195
+ /**
196
+ * Ecrit du contenu dans un fichier texte
197
+ */
198
+ async writeFile(filePath, content, options) {
199
+ const resolvedPath = path.resolve(filePath);
200
+ const dir = path.dirname(resolvedPath);
201
+ if (options?.ensureDir !== false) {
202
+ await this.ensureDir(dir);
203
+ }
204
+ try {
205
+ await fs.writeFile(resolvedPath, content, options?.encoding ?? 'utf-8');
206
+ logger.debug(`File written: ${resolvedPath}`);
207
+ }
208
+ catch (error) {
209
+ const nodeError = error;
210
+ if (nodeError.code === 'EPERM' || nodeError.code === 'EACCES') {
211
+ logger.error(`Permission denied writing file: ${resolvedPath}`);
212
+ throw new FilePermissionError(resolvedPath, 'write', { cause: error });
213
+ }
214
+ logger.error(`Failed to write file: ${resolvedPath}`, error);
215
+ throw new FileWriteError(resolvedPath, { cause: error });
216
+ }
217
+ }
218
+ /**
219
+ * Copie un fichier vers une destination
220
+ */
221
+ async copyFile(src, dest, options) {
222
+ const resolvedSrc = path.resolve(src);
223
+ const resolvedDest = path.resolve(dest);
224
+ const destDir = path.dirname(resolvedDest);
225
+ if (options?.ensureDir !== false) {
226
+ await this.ensureDir(destDir);
227
+ }
228
+ try {
229
+ const sourceExists = await this.exists(resolvedSrc);
230
+ if (!sourceExists) {
231
+ throw new FileNotFoundError(resolvedSrc);
232
+ }
233
+ await fs.copyFile(resolvedSrc, resolvedDest);
234
+ logger.debug(`File copied: ${resolvedSrc} -> ${resolvedDest}`);
235
+ }
236
+ catch (error) {
237
+ if (error instanceof FileNotFoundError) {
238
+ throw error;
239
+ }
240
+ const nodeError = error;
241
+ if (nodeError.code === 'EPERM' || nodeError.code === 'EACCES') {
242
+ logger.error(`Permission denied copying file: ${resolvedSrc} -> ${resolvedDest}`);
243
+ throw new FilePermissionError(resolvedDest, 'copy', { cause: error });
244
+ }
245
+ logger.error(`Failed to copy file: ${resolvedSrc} -> ${resolvedDest}`, error);
246
+ throw new FileCopyError(resolvedSrc, resolvedDest, { cause: error });
247
+ }
248
+ }
249
+ /**
250
+ * Supprime un fichier ou un repertoire
251
+ */
252
+ async remove(targetPath) {
253
+ const resolvedPath = path.resolve(targetPath);
254
+ try {
255
+ const stat = await fs.stat(resolvedPath);
256
+ if (stat.isDirectory()) {
257
+ await fs.rm(resolvedPath, { recursive: true, force: true });
258
+ }
259
+ else {
260
+ await fs.unlink(resolvedPath);
261
+ }
262
+ logger.debug(`Removed: ${resolvedPath}`);
263
+ }
264
+ catch (error) {
265
+ const nodeError = error;
266
+ if (nodeError.code === 'ENOENT') {
267
+ logger.debug(`Path already removed: ${resolvedPath}`);
268
+ return;
269
+ }
270
+ if (nodeError.code === 'EPERM' || nodeError.code === 'EACCES') {
271
+ logger.error(`Permission denied removing: ${resolvedPath}`);
272
+ throw new FilePermissionError(resolvedPath, 'delete', { cause: error });
273
+ }
274
+ logger.error(`Failed to remove: ${resolvedPath}`, error);
275
+ throw new FileReadError(resolvedPath, { cause: error });
276
+ }
277
+ }
278
+ /**
279
+ * Lit les metadonnees dun fichier
280
+ */
281
+ async stat(filePath) {
282
+ const resolvedPath = path.resolve(filePath);
283
+ try {
284
+ return await fs.stat(resolvedPath);
285
+ }
286
+ catch (error) {
287
+ const nodeError = error;
288
+ if (nodeError.code === 'ENOENT') {
289
+ logger.error(`File not found: ${resolvedPath}`);
290
+ throw new FileNotFoundError(resolvedPath, { cause: error });
291
+ }
292
+ logger.error(`Failed to stat file: ${resolvedPath}`, error);
293
+ throw new FileReadError(resolvedPath, { cause: error });
294
+ }
295
+ }
296
+ /**
297
+ * Liste le contenu dun repertoire
298
+ */
299
+ async readdir(dirPath) {
300
+ const resolvedPath = path.resolve(dirPath);
301
+ try {
302
+ return await fs.readdir(resolvedPath);
303
+ }
304
+ catch (error) {
305
+ const nodeError = error;
306
+ if (nodeError.code === 'ENOENT') {
307
+ logger.error(`Directory not found: ${resolvedPath}`);
308
+ throw new FileNotFoundError(resolvedPath, { cause: error });
309
+ }
310
+ if (nodeError.code === 'EPERM' || nodeError.code === 'EACCES') {
311
+ logger.error(`Permission denied reading directory: ${resolvedPath}`);
312
+ throw new FilePermissionError(resolvedPath, 'read directory', { cause: error });
313
+ }
314
+ logger.error(`Failed to read directory: ${resolvedPath}`, error);
315
+ throw new FileReadError(resolvedPath, { cause: error });
316
+ }
317
+ }
318
+ }
319
+ /**
320
+ * Instance singleton
321
+ */
322
+ export const fileHelper = new FileSystemHelper();
323
+ //# sourceMappingURL=file-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-helper.js","sourceRoot":"","sources":["../../../src/shared/utils/file-helper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Utilitaires partagés
3
+ *
4
+ * @module shared/utils
5
+ */
6
+ export * from './logger.js';
7
+ export * from './file-helper.js';
8
+ export * from './command-executor.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Utilitaires partagés
3
+ *
4
+ * @module shared/utils
5
+ */
6
+ export * from './logger.js';
7
+ export * from './file-helper.js';
8
+ export * from './command-executor.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/shared/utils/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Logger structuré avec support ANSI et contextes
3
+ *
4
+ * @module shared/utils/logger
5
+ */
6
+ /**
7
+ * Niveaux de log supportés
8
+ */
9
+ export declare enum LogLevel {
10
+ DEBUG = 0,
11
+ INFO = 1,
12
+ WARN = 2,
13
+ ERROR = 3,
14
+ SILENT = 4
15
+ }
16
+ /**
17
+ * Options de configuration du logger
18
+ */
19
+ export interface LoggerOptions {
20
+ /** Contexte du logger (ex: nom du module) */
21
+ context?: string;
22
+ /** Niveau minimum de log */
23
+ level?: LogLevel;
24
+ /** Format de sortie */
25
+ format?: 'pretty' | 'json';
26
+ /** Désactiver les couleurs */
27
+ noColor?: boolean;
28
+ /** Timestamp personnalisé */
29
+ timestamp?: boolean | (() => string);
30
+ }
31
+ /**
32
+ * Métadonnées structurées pour le logging
33
+ */
34
+ export interface LogMetadata {
35
+ [key: string]: unknown;
36
+ }
37
+ /**
38
+ * Entrée de log structurée
39
+ */
40
+ export interface LogEntry {
41
+ level: string;
42
+ message: string;
43
+ timestamp: string;
44
+ context?: string;
45
+ metadata?: LogMetadata;
46
+ error?: {
47
+ name: string;
48
+ message: string;
49
+ stack?: string;
50
+ };
51
+ }
52
+ /**
53
+ * Logger structuré avec support ANSI et contextes
54
+ *
55
+ * @example
56
+ * ```ts
57
+ * const logger = new Logger({ context: 'MyModule' });
58
+ * logger.info('Démarrage du module');
59
+ * logger.warn('Attention', { detail: 'valeur manquante' });
60
+ *
61
+ * // Contexte imbriqué
62
+ * const dbLogger = logger.createContext('Database');
63
+ * dbLogger.error('Erreur de connexion', new Error('ECONNREFUSED'));
64
+ * ```
65
+ */
66
+ export declare class Logger {
67
+ private readonly context;
68
+ private level;
69
+ private readonly format;
70
+ private readonly noColor;
71
+ private readonly timestampFn;
72
+ private static globalLevel;
73
+ private static globalNoColor;
74
+ /**
75
+ * Crée une nouvelle instance de Logger
76
+ */
77
+ constructor(options?: LoggerOptions);
78
+ /**
79
+ * Définit le niveau de log global
80
+ */
81
+ static setGlobalLevel(level: LogLevel): void;
82
+ /**
83
+ * Définit l'option de couleur globale
84
+ */
85
+ static setGlobalNoColor(noColor: boolean): void;
86
+ /**
87
+ * Définit le niveau de log pour cette instance
88
+ */
89
+ setLevel(level: LogLevel): void;
90
+ /**
91
+ * Retourne le niveau de log actuel
92
+ */
93
+ getLevel(): LogLevel;
94
+ /**
95
+ * Log un message de niveau DEBUG
96
+ */
97
+ debug(message: string, meta?: unknown): void;
98
+ /**
99
+ * Log un message de niveau INFO
100
+ */
101
+ info(message: string, meta?: unknown): void;
102
+ /**
103
+ * Log un message de niveau WARN
104
+ */
105
+ warn(message: string, meta?: unknown): void;
106
+ /**
107
+ * Log un message de niveau ERROR
108
+ */
109
+ error(message: string, error?: Error | unknown): void;
110
+ /**
111
+ * Log un message de succès (vert)
112
+ */
113
+ success(message: string, meta?: unknown): void;
114
+ /**
115
+ * Log au format succès avec couleur verte
116
+ */
117
+ private logSuccess;
118
+ /**
119
+ * Crée un nouveau logger avec un contexte imbriqué
120
+ */
121
+ createContext(context: string): Logger;
122
+ /**
123
+ * Log interne avec gestion du niveau et du format
124
+ */
125
+ private log;
126
+ /**
127
+ * Log au format JSON structuré
128
+ */
129
+ private logJson;
130
+ /**
131
+ * Log au format pretty avec couleurs ANSI
132
+ */
133
+ private logPretty;
134
+ /**
135
+ * Normalise les métadonnées en objet plat
136
+ */
137
+ private normalizeMetadata;
138
+ /**
139
+ * Colore une sortie JSON pour la console
140
+ */
141
+ private colorizeJson;
142
+ }
143
+ /**
144
+ * Logger racine sans contexte
145
+ */
146
+ export declare const rootLogger: Logger;
147
+ /**
148
+ * Crée un nouveau logger avec un contexte
149
+ *
150
+ * @example
151
+ * ```ts
152
+ * import { createLogger } from './logger';
153
+ *
154
+ * const logger = createLogger('MyModule');
155
+ * logger.info('Hello world');
156
+ * ```
157
+ */
158
+ export declare function createLogger(context: string, options?: Omit<LoggerOptions, 'context'>): Logger;
159
+ /**
160
+ * Logger global pour les usages simples
161
+ */
162
+ export declare const logger: Logger;
163
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/logger.ts"],"names":[],"mappings":"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"}