@girardelli/architect-agents 8.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 (258) hide show
  1. package/dist/src/core/agent-generator/context-enricher.d.ts +17 -0
  2. package/dist/src/core/agent-generator/context-enricher.js +51 -0
  3. package/dist/src/core/agent-generator/context-enricher.js.map +1 -0
  4. package/dist/src/core/agent-generator/detectors/base-detector.d.ts +8 -0
  5. package/dist/src/core/agent-generator/detectors/base-detector.js +12 -0
  6. package/dist/src/core/agent-generator/detectors/base-detector.js.map +1 -0
  7. package/dist/src/core/agent-generator/detectors/dart-detector.d.ts +5 -0
  8. package/dist/src/core/agent-generator/detectors/dart-detector.js +16 -0
  9. package/dist/src/core/agent-generator/detectors/dart-detector.js.map +1 -0
  10. package/dist/src/core/agent-generator/detectors/framework-registry.d.ts +5 -0
  11. package/dist/src/core/agent-generator/detectors/framework-registry.js +81 -0
  12. package/dist/src/core/agent-generator/detectors/framework-registry.js.map +1 -0
  13. package/dist/src/core/agent-generator/detectors/go-detector.d.ts +5 -0
  14. package/dist/src/core/agent-generator/detectors/go-detector.js +25 -0
  15. package/dist/src/core/agent-generator/detectors/go-detector.js.map +1 -0
  16. package/dist/src/core/agent-generator/detectors/java-detector.d.ts +5 -0
  17. package/dist/src/core/agent-generator/detectors/java-detector.js +44 -0
  18. package/dist/src/core/agent-generator/detectors/java-detector.js.map +1 -0
  19. package/dist/src/core/agent-generator/detectors/node-detector.d.ts +5 -0
  20. package/dist/src/core/agent-generator/detectors/node-detector.js +28 -0
  21. package/dist/src/core/agent-generator/detectors/node-detector.js.map +1 -0
  22. package/dist/src/core/agent-generator/detectors/php-detector.d.ts +5 -0
  23. package/dist/src/core/agent-generator/detectors/php-detector.js +28 -0
  24. package/dist/src/core/agent-generator/detectors/php-detector.js.map +1 -0
  25. package/dist/src/core/agent-generator/detectors/python-detector.d.ts +7 -0
  26. package/dist/src/core/agent-generator/detectors/python-detector.js +116 -0
  27. package/dist/src/core/agent-generator/detectors/python-detector.js.map +1 -0
  28. package/dist/src/core/agent-generator/detectors/ruby-detector.d.ts +5 -0
  29. package/dist/src/core/agent-generator/detectors/ruby-detector.js +23 -0
  30. package/dist/src/core/agent-generator/detectors/ruby-detector.js.map +1 -0
  31. package/dist/src/core/agent-generator/detectors/rust-detector.d.ts +5 -0
  32. package/dist/src/core/agent-generator/detectors/rust-detector.js +18 -0
  33. package/dist/src/core/agent-generator/detectors/rust-detector.js.map +1 -0
  34. package/dist/src/core/agent-generator/detectors/structure-detector.d.ts +4 -0
  35. package/dist/src/core/agent-generator/detectors/structure-detector.js +35 -0
  36. package/dist/src/core/agent-generator/detectors/structure-detector.js.map +1 -0
  37. package/dist/src/core/agent-generator/detectors/toolchain-detector.d.ts +5 -0
  38. package/dist/src/core/agent-generator/detectors/toolchain-detector.js +164 -0
  39. package/dist/src/core/agent-generator/detectors/toolchain-detector.js.map +1 -0
  40. package/dist/src/core/agent-generator/domain-inferrer.d.ts +51 -0
  41. package/dist/src/core/agent-generator/domain-inferrer.js +585 -0
  42. package/dist/src/core/agent-generator/domain-inferrer.js.map +1 -0
  43. package/dist/src/core/agent-generator/engines/audit-engine.d.ts +8 -0
  44. package/dist/src/core/agent-generator/engines/audit-engine.js +84 -0
  45. package/dist/src/core/agent-generator/engines/audit-engine.js.map +1 -0
  46. package/dist/src/core/agent-generator/engines/context-builder.d.ts +12 -0
  47. package/dist/src/core/agent-generator/engines/context-builder.js +84 -0
  48. package/dist/src/core/agent-generator/engines/context-builder.js.map +1 -0
  49. package/dist/src/core/agent-generator/engines/generation-engine.d.ts +7 -0
  50. package/dist/src/core/agent-generator/engines/generation-engine.js +160 -0
  51. package/dist/src/core/agent-generator/engines/generation-engine.js.map +1 -0
  52. package/dist/src/core/agent-generator/engines/generation-engine_deps.d.ts +21 -0
  53. package/dist/src/core/agent-generator/engines/generation-engine_deps.js +17 -0
  54. package/dist/src/core/agent-generator/engines/generation-engine_deps.js.map +1 -0
  55. package/dist/src/core/agent-generator/engines/suggestion-engine.d.ts +13 -0
  56. package/dist/src/core/agent-generator/engines/suggestion-engine.js +171 -0
  57. package/dist/src/core/agent-generator/engines/suggestion-engine.js.map +1 -0
  58. package/dist/src/core/agent-generator/engines/suggestion-engine_deps.d.ts +8 -0
  59. package/dist/src/core/agent-generator/engines/suggestion-engine_deps.js +5 -0
  60. package/dist/src/core/agent-generator/engines/suggestion-engine_deps.js.map +1 -0
  61. package/dist/src/core/agent-generator/enrichers/analysis-helpers.d.ts +9 -0
  62. package/dist/src/core/agent-generator/enrichers/analysis-helpers.js +51 -0
  63. package/dist/src/core/agent-generator/enrichers/analysis-helpers.js.map +1 -0
  64. package/dist/src/core/agent-generator/enrichers/description-generator.d.ts +4 -0
  65. package/dist/src/core/agent-generator/enrichers/description-generator.js +82 -0
  66. package/dist/src/core/agent-generator/enrichers/description-generator.js.map +1 -0
  67. package/dist/src/core/agent-generator/enrichers/endpoint-extractor.d.ts +7 -0
  68. package/dist/src/core/agent-generator/enrichers/endpoint-extractor.js +90 -0
  69. package/dist/src/core/agent-generator/enrichers/endpoint-extractor.js.map +1 -0
  70. package/dist/src/core/agent-generator/enrichers/layer-classifier.d.ts +12 -0
  71. package/dist/src/core/agent-generator/enrichers/layer-classifier.js +152 -0
  72. package/dist/src/core/agent-generator/enrichers/layer-classifier.js.map +1 -0
  73. package/dist/src/core/agent-generator/enrichers/module-extractor.d.ts +10 -0
  74. package/dist/src/core/agent-generator/enrichers/module-extractor.js +173 -0
  75. package/dist/src/core/agent-generator/enrichers/module-extractor.js.map +1 -0
  76. package/dist/src/core/agent-generator/framework-detector.d.ts +17 -0
  77. package/dist/src/core/agent-generator/framework-detector.js +56 -0
  78. package/dist/src/core/agent-generator/framework-detector.js.map +1 -0
  79. package/dist/src/core/agent-generator/index.d.ts +25 -0
  80. package/dist/src/core/agent-generator/index.js +37 -0
  81. package/dist/src/core/agent-generator/index.js.map +1 -0
  82. package/dist/src/core/agent-generator/stack-detector.d.ts +13 -0
  83. package/dist/src/core/agent-generator/stack-detector.js +124 -0
  84. package/dist/src/core/agent-generator/stack-detector.js.map +1 -0
  85. package/dist/src/core/agent-generator/templates/core/agents.d.ts +9 -0
  86. package/dist/src/core/agent-generator/templates/core/agents.js +1127 -0
  87. package/dist/src/core/agent-generator/templates/core/agents.js.map +1 -0
  88. package/dist/src/core/agent-generator/templates/core/architecture-rules.d.ts +6 -0
  89. package/dist/src/core/agent-generator/templates/core/architecture-rules.js +275 -0
  90. package/dist/src/core/agent-generator/templates/core/architecture-rules.js.map +1 -0
  91. package/dist/src/core/agent-generator/templates/core/general-rules.d.ts +7 -0
  92. package/dist/src/core/agent-generator/templates/core/general-rules.js +301 -0
  93. package/dist/src/core/agent-generator/templates/core/general-rules.js.map +1 -0
  94. package/dist/src/core/agent-generator/templates/core/hooks-generator.d.ts +20 -0
  95. package/dist/src/core/agent-generator/templates/core/hooks-generator.js +235 -0
  96. package/dist/src/core/agent-generator/templates/core/hooks-generator.js.map +1 -0
  97. package/dist/src/core/agent-generator/templates/core/index-md.d.ts +6 -0
  98. package/dist/src/core/agent-generator/templates/core/index-md.js +247 -0
  99. package/dist/src/core/agent-generator/templates/core/index-md.js.map +1 -0
  100. package/dist/src/core/agent-generator/templates/core/orchestrator.d.ts +7 -0
  101. package/dist/src/core/agent-generator/templates/core/orchestrator.js +423 -0
  102. package/dist/src/core/agent-generator/templates/core/orchestrator.js.map +1 -0
  103. package/dist/src/core/agent-generator/templates/core/preflight.d.ts +7 -0
  104. package/dist/src/core/agent-generator/templates/core/preflight.js +213 -0
  105. package/dist/src/core/agent-generator/templates/core/preflight.js.map +1 -0
  106. package/dist/src/core/agent-generator/templates/core/quality-gates.d.ts +10 -0
  107. package/dist/src/core/agent-generator/templates/core/quality-gates.js +255 -0
  108. package/dist/src/core/agent-generator/templates/core/quality-gates.js.map +1 -0
  109. package/dist/src/core/agent-generator/templates/core/security-rules.d.ts +6 -0
  110. package/dist/src/core/agent-generator/templates/core/security-rules.js +529 -0
  111. package/dist/src/core/agent-generator/templates/core/security-rules.js.map +1 -0
  112. package/dist/src/core/agent-generator/templates/core/skills-generator.d.ts +18 -0
  113. package/dist/src/core/agent-generator/templates/core/skills-generator.js +547 -0
  114. package/dist/src/core/agent-generator/templates/core/skills-generator.js.map +1 -0
  115. package/dist/src/core/agent-generator/templates/core/workflow-fix-bug.d.ts +6 -0
  116. package/dist/src/core/agent-generator/templates/core/workflow-fix-bug.js +238 -0
  117. package/dist/src/core/agent-generator/templates/core/workflow-fix-bug.js.map +1 -0
  118. package/dist/src/core/agent-generator/templates/core/workflow-new-feature.d.ts +7 -0
  119. package/dist/src/core/agent-generator/templates/core/workflow-new-feature.js +321 -0
  120. package/dist/src/core/agent-generator/templates/core/workflow-new-feature.js.map +1 -0
  121. package/dist/src/core/agent-generator/templates/core/workflow-review.d.ts +6 -0
  122. package/dist/src/core/agent-generator/templates/core/workflow-review.js +105 -0
  123. package/dist/src/core/agent-generator/templates/core/workflow-review.js.map +1 -0
  124. package/dist/src/core/agent-generator/templates/domain/index.d.ts +21 -0
  125. package/dist/src/core/agent-generator/templates/domain/index.js +1179 -0
  126. package/dist/src/core/agent-generator/templates/domain/index.js.map +1 -0
  127. package/dist/src/core/agent-generator/templates/helpers/base-helpers.d.ts +10 -0
  128. package/dist/src/core/agent-generator/templates/helpers/base-helpers.js +20 -0
  129. package/dist/src/core/agent-generator/templates/helpers/base-helpers.js.map +1 -0
  130. package/dist/src/core/agent-generator/templates/helpers/cross-ref-helpers.d.ts +2 -0
  131. package/dist/src/core/agent-generator/templates/helpers/cross-ref-helpers.js +77 -0
  132. package/dist/src/core/agent-generator/templates/helpers/cross-ref-helpers.js.map +1 -0
  133. package/dist/src/core/agent-generator/templates/helpers/security-helpers.d.ts +2 -0
  134. package/dist/src/core/agent-generator/templates/helpers/security-helpers.js +182 -0
  135. package/dist/src/core/agent-generator/templates/helpers/security-helpers.js.map +1 -0
  136. package/dist/src/core/agent-generator/templates/helpers/stack-helpers.d.ts +4 -0
  137. package/dist/src/core/agent-generator/templates/helpers/stack-helpers.js +69 -0
  138. package/dist/src/core/agent-generator/templates/helpers/stack-helpers.js.map +1 -0
  139. package/dist/src/core/agent-generator/templates/helpers/structure-helpers.d.ts +2 -0
  140. package/dist/src/core/agent-generator/templates/helpers/structure-helpers.js +275 -0
  141. package/dist/src/core/agent-generator/templates/helpers/structure-helpers.js.map +1 -0
  142. package/dist/src/core/agent-generator/templates/helpers/summary-helpers.d.ts +6 -0
  143. package/dist/src/core/agent-generator/templates/helpers/summary-helpers.js +56 -0
  144. package/dist/src/core/agent-generator/templates/helpers/summary-helpers.js.map +1 -0
  145. package/dist/src/core/agent-generator/templates/stack/index.d.ts +7 -0
  146. package/dist/src/core/agent-generator/templates/stack/index.js +695 -0
  147. package/dist/src/core/agent-generator/templates/stack/index.js.map +1 -0
  148. package/dist/src/core/agent-generator/templates/template-helpers.d.ts +11 -0
  149. package/dist/src/core/agent-generator/templates/template-helpers.js +12 -0
  150. package/dist/src/core/agent-generator/templates/template-helpers.js.map +1 -0
  151. package/dist/src/core/agent-generator/types/agent.d.ts +39 -0
  152. package/dist/src/core/agent-generator/types/agent.js +27 -0
  153. package/dist/src/core/agent-generator/types/agent.js.map +1 -0
  154. package/dist/src/core/agent-generator/types/domain.d.ts +58 -0
  155. package/dist/src/core/agent-generator/types/domain.js +2 -0
  156. package/dist/src/core/agent-generator/types/domain.js.map +1 -0
  157. package/dist/src/core/agent-generator/types/stack.d.ts +36 -0
  158. package/dist/src/core/agent-generator/types/stack.js +2 -0
  159. package/dist/src/core/agent-generator/types/stack.js.map +1 -0
  160. package/dist/src/core/agent-generator/types/template.d.ts +29 -0
  161. package/dist/src/core/agent-generator/types/template.js +2 -0
  162. package/dist/src/core/agent-generator/types/template.js.map +1 -0
  163. package/dist/src/core/agent-runtime/ai-provider.d.ts +33 -0
  164. package/dist/src/core/agent-runtime/ai-provider.js +146 -0
  165. package/dist/src/core/agent-runtime/ai-provider.js.map +1 -0
  166. package/dist/src/core/agent-runtime/executor.d.ts +13 -0
  167. package/dist/src/core/agent-runtime/executor.js +138 -0
  168. package/dist/src/core/agent-runtime/executor.js.map +1 -0
  169. package/dist/src/core/agent-runtime/human-gate.d.ts +16 -0
  170. package/dist/src/core/agent-runtime/human-gate.js +70 -0
  171. package/dist/src/core/agent-runtime/human-gate.js.map +1 -0
  172. package/dist/tests/agent-generator.test.d.ts +1 -0
  173. package/dist/tests/agent-generator.test.js +349 -0
  174. package/dist/tests/agent-generator.test.js.map +1 -0
  175. package/dist/tests/agent-runtime.test.d.ts +1 -0
  176. package/dist/tests/agent-runtime.test.js +107 -0
  177. package/dist/tests/agent-runtime.test.js.map +1 -0
  178. package/dist/tests/context-enricher.test.d.ts +1 -0
  179. package/dist/tests/context-enricher.test.js +875 -0
  180. package/dist/tests/context-enricher.test.js.map +1 -0
  181. package/dist/tests/framework-detector.test.d.ts +1 -0
  182. package/dist/tests/framework-detector.test.js +882 -0
  183. package/dist/tests/framework-detector.test.js.map +1 -0
  184. package/dist/tests/stack-detector.test.d.ts +1 -0
  185. package/dist/tests/stack-detector.test.js +183 -0
  186. package/dist/tests/stack-detector.test.js.map +1 -0
  187. package/dist/tests/template-generation.test.d.ts +1 -0
  188. package/dist/tests/template-generation.test.js +571 -0
  189. package/dist/tests/template-generation.test.js.map +1 -0
  190. package/dist/tests/template-helpers.test.d.ts +1 -0
  191. package/dist/tests/template-helpers.test.js +967 -0
  192. package/dist/tests/template-helpers.test.js.map +1 -0
  193. package/package.json +24 -0
  194. package/src/core/agent-generator/context-enricher.ts +67 -0
  195. package/src/core/agent-generator/detectors/base-detector.ts +18 -0
  196. package/src/core/agent-generator/detectors/dart-detector.ts +17 -0
  197. package/src/core/agent-generator/detectors/framework-registry.ts +82 -0
  198. package/src/core/agent-generator/detectors/go-detector.ts +26 -0
  199. package/src/core/agent-generator/detectors/java-detector.ts +46 -0
  200. package/src/core/agent-generator/detectors/node-detector.ts +28 -0
  201. package/src/core/agent-generator/detectors/php-detector.ts +28 -0
  202. package/src/core/agent-generator/detectors/python-detector.ts +125 -0
  203. package/src/core/agent-generator/detectors/ruby-detector.ts +24 -0
  204. package/src/core/agent-generator/detectors/rust-detector.ts +19 -0
  205. package/src/core/agent-generator/detectors/structure-detector.ts +38 -0
  206. package/src/core/agent-generator/detectors/toolchain-detector.ts +181 -0
  207. package/src/core/agent-generator/domain-inferrer.ts +630 -0
  208. package/src/core/agent-generator/engines/audit-engine.ts +98 -0
  209. package/src/core/agent-generator/engines/context-builder.ts +96 -0
  210. package/src/core/agent-generator/engines/generation-engine.ts +184 -0
  211. package/src/core/agent-generator/engines/generation-engine_deps.ts +21 -0
  212. package/src/core/agent-generator/engines/suggestion-engine.ts +202 -0
  213. package/src/core/agent-generator/engines/suggestion-engine_deps.ts +8 -0
  214. package/src/core/agent-generator/enrichers/analysis-helpers.ts +58 -0
  215. package/src/core/agent-generator/enrichers/description-generator.ts +91 -0
  216. package/src/core/agent-generator/enrichers/endpoint-extractor.ts +114 -0
  217. package/src/core/agent-generator/enrichers/layer-classifier.ts +156 -0
  218. package/src/core/agent-generator/enrichers/module-extractor.ts +203 -0
  219. package/src/core/agent-generator/framework-detector.ts +66 -0
  220. package/src/core/agent-generator/index.ts +55 -0
  221. package/src/core/agent-generator/stack-detector.ts +115 -0
  222. package/src/core/agent-generator/templates/core/agents.ts +1168 -0
  223. package/src/core/agent-generator/templates/core/architecture-rules.ts +288 -0
  224. package/src/core/agent-generator/templates/core/general-rules.ts +306 -0
  225. package/src/core/agent-generator/templates/core/hooks-generator.ts +244 -0
  226. package/src/core/agent-generator/templates/core/index-md.ts +261 -0
  227. package/src/core/agent-generator/templates/core/orchestrator.ts +462 -0
  228. package/src/core/agent-generator/templates/core/preflight.ts +216 -0
  229. package/src/core/agent-generator/templates/core/quality-gates.ts +257 -0
  230. package/src/core/agent-generator/templates/core/security-rules.ts +544 -0
  231. package/src/core/agent-generator/templates/core/skills-generator.ts +586 -0
  232. package/src/core/agent-generator/templates/core/workflow-fix-bug.ts +240 -0
  233. package/src/core/agent-generator/templates/core/workflow-new-feature.ts +323 -0
  234. package/src/core/agent-generator/templates/core/workflow-review.ts +107 -0
  235. package/src/core/agent-generator/templates/domain/index.ts +1204 -0
  236. package/src/core/agent-generator/templates/helpers/base-helpers.ts +33 -0
  237. package/src/core/agent-generator/templates/helpers/cross-ref-helpers.ts +79 -0
  238. package/src/core/agent-generator/templates/helpers/security-helpers.ts +198 -0
  239. package/src/core/agent-generator/templates/helpers/stack-helpers.ts +80 -0
  240. package/src/core/agent-generator/templates/helpers/structure-helpers.ts +293 -0
  241. package/src/core/agent-generator/templates/helpers/summary-helpers.ts +67 -0
  242. package/src/core/agent-generator/templates/stack/index.ts +705 -0
  243. package/src/core/agent-generator/templates/template-helpers.ts +12 -0
  244. package/src/core/agent-generator/types/agent.ts +65 -0
  245. package/src/core/agent-generator/types/domain.ts +63 -0
  246. package/src/core/agent-generator/types/stack.ts +38 -0
  247. package/src/core/agent-generator/types/template.ts +31 -0
  248. package/src/core/agent-runtime/ai-provider.ts +178 -0
  249. package/src/core/agent-runtime/executor.ts +148 -0
  250. package/src/core/agent-runtime/human-gate.ts +69 -0
  251. package/tests/agent-generator.test.ts +428 -0
  252. package/tests/agent-runtime.test.ts +125 -0
  253. package/tests/context-enricher.test.ts +972 -0
  254. package/tests/framework-detector.test.ts +1172 -0
  255. package/tests/stack-detector.test.ts +241 -0
  256. package/tests/template-generation.test.ts +709 -0
  257. package/tests/template-helpers.test.ts +1130 -0
  258. package/tsconfig.json +14 -0
@@ -0,0 +1,875 @@
1
+ import { ContextEnricher } from '../src/core/agent-generator/context-enricher.js';
2
+ import { mkdtempSync, rmSync, writeFileSync, mkdirSync } from 'fs';
3
+ import { join } from 'path';
4
+ // ── Test Data Factories ──
5
+ function makeReport(overrides = {}) {
6
+ return {
7
+ timestamp: new Date().toISOString(),
8
+ projectInfo: {
9
+ path: '/test',
10
+ name: 'test-project',
11
+ frameworks: ['NestJS'],
12
+ totalFiles: 50,
13
+ totalLines: 5000,
14
+ primaryLanguages: ['TypeScript'],
15
+ },
16
+ score: {
17
+ overall: 72,
18
+ components: [],
19
+ breakdown: { modularity: 80, coupling: 65, cohesion: 70, layering: 75 },
20
+ },
21
+ antiPatterns: [
22
+ {
23
+ name: 'God Class',
24
+ severity: 'CRITICAL',
25
+ location: 'src/AppService.ts',
26
+ description: 'Class with 800 lines',
27
+ suggestion: 'Split into smaller services',
28
+ affectedFiles: ['src/AppService.ts'],
29
+ },
30
+ ],
31
+ layers: [
32
+ { name: 'API', files: ['src/controller.ts'], description: 'API layer' },
33
+ { name: 'Service', files: ['src/service.ts'], description: 'Service layer' },
34
+ ],
35
+ dependencyGraph: {
36
+ nodes: ['src/app.module.ts', 'src/app.controller.ts', 'src/app.service.ts', 'src/entity/user.entity.ts'],
37
+ edges: [
38
+ { from: 'src/app.controller.ts', to: 'src/app.service.ts', type: 'import', weight: 1 },
39
+ { from: 'src/app.service.ts', to: 'src/entity/user.entity.ts', type: 'import', weight: 1 },
40
+ ],
41
+ },
42
+ suggestions: [],
43
+ diagram: { mermaid: '', type: 'layer' },
44
+ ...overrides,
45
+ };
46
+ }
47
+ function makePlan(overrides = {}) {
48
+ return {
49
+ timestamp: new Date().toISOString(),
50
+ projectPath: '/test',
51
+ currentScore: {
52
+ overall: 72,
53
+ components: [],
54
+ breakdown: { modularity: 80, coupling: 65, cohesion: 70, layering: 75 },
55
+ },
56
+ estimatedScoreAfter: { overall: 82, breakdown: { modularity: 85, coupling: 75, cohesion: 80, layering: 80 } },
57
+ steps: [
58
+ {
59
+ id: 1,
60
+ tier: 1,
61
+ rule: 'hub-splitter',
62
+ priority: 'HIGH',
63
+ title: 'Split AppService',
64
+ description: 'Split monolith service',
65
+ rationale: 'Reduce coupling',
66
+ operations: [],
67
+ scoreImpact: [{ metric: 'modularity', before: 80, after: 85 }],
68
+ },
69
+ ],
70
+ totalOperations: 1,
71
+ tier1Steps: 1,
72
+ tier2Steps: 0,
73
+ ...overrides,
74
+ };
75
+ }
76
+ // ── Test Suite ──
77
+ describe('ContextEnricher', () => {
78
+ const enricher = new ContextEnricher();
79
+ let tempDir;
80
+ beforeEach(() => {
81
+ tempDir = mkdtempSync(join(process.cwd(), '__test_context_'));
82
+ });
83
+ afterEach(() => {
84
+ if (tempDir) {
85
+ rmSync(tempDir, { recursive: true, force: true });
86
+ }
87
+ });
88
+ describe('enrich()', () => {
89
+ it('should return a valid EnrichedTemplateContext', () => {
90
+ const report = makeReport();
91
+ const plan = makePlan();
92
+ const result = enricher.enrich(report, plan, {
93
+ primary: 'TypeScript',
94
+ languages: ['TypeScript'],
95
+ frameworks: ['NestJS'],
96
+ hasBackend: true,
97
+ hasFrontend: false,
98
+ hasMobile: false,
99
+ hasDatabase: true,
100
+ testFramework: 'Jest',
101
+ packageManager: 'npm',
102
+ }, tempDir);
103
+ expect(result).toBeDefined();
104
+ expect(result.report).toBe(report);
105
+ expect(result.plan).toBe(plan);
106
+ expect(result.projectName).toBe('test-project');
107
+ expect(result.modules).toBeDefined();
108
+ expect(result.endpoints).toBeDefined();
109
+ expect(result.untestedModules).toBeDefined();
110
+ expect(result.criticalPaths).toBeDefined();
111
+ expect(result.projectDepth).toBeDefined();
112
+ });
113
+ it('should detect modules from dependency graph nodes', () => {
114
+ const report = makeReport({
115
+ dependencyGraph: {
116
+ nodes: [
117
+ 'src/modules/users/users.controller.ts',
118
+ 'src/modules/users/users.service.ts',
119
+ 'src/modules/users/user.entity.ts',
120
+ 'src/modules/auth/auth.controller.ts',
121
+ 'src/modules/auth/auth.service.ts',
122
+ ],
123
+ edges: [],
124
+ },
125
+ });
126
+ const plan = makePlan();
127
+ const result = enricher.enrich(report, plan, {
128
+ primary: 'TypeScript',
129
+ languages: ['TypeScript'],
130
+ frameworks: ['NestJS'],
131
+ hasBackend: true,
132
+ hasFrontend: false,
133
+ hasMobile: false,
134
+ hasDatabase: true,
135
+ testFramework: 'Jest',
136
+ packageManager: 'npm',
137
+ }, tempDir);
138
+ expect(result.modules.length).toBeGreaterThan(0);
139
+ const moduleNames = result.modules.map(m => m.name);
140
+ expect(moduleNames).toContain('users');
141
+ expect(moduleNames).toContain('auth');
142
+ });
143
+ it('should extract modules sorted by file count descending', () => {
144
+ const report = makeReport({
145
+ dependencyGraph: {
146
+ nodes: [
147
+ 'src/modules/users/users.controller.ts',
148
+ 'src/modules/users/users.service.ts',
149
+ 'src/modules/users/user.entity.ts',
150
+ 'src/modules/auth/auth.controller.ts',
151
+ ],
152
+ edges: [],
153
+ },
154
+ });
155
+ const plan = makePlan();
156
+ const result = enricher.enrich(report, plan, {
157
+ primary: 'TypeScript',
158
+ languages: ['TypeScript'],
159
+ frameworks: ['NestJS'],
160
+ hasBackend: true,
161
+ hasFrontend: false,
162
+ hasMobile: false,
163
+ hasDatabase: true,
164
+ testFramework: 'Jest',
165
+ packageManager: 'npm',
166
+ }, tempDir);
167
+ // Users has 3 files, auth has 1 file → users should come first
168
+ expect(result.modules[0].name).toBe('users');
169
+ expect(result.modules[0].fileCount).toBe(3);
170
+ });
171
+ it('should generate smart descriptions for known patterns', () => {
172
+ const report = makeReport({
173
+ dependencyGraph: {
174
+ nodes: [
175
+ 'src/modules/extractors/pdf.extractor.ts',
176
+ 'src/modules/extractors/image.extractor.ts',
177
+ 'src/modules/ocr/ocr.service.ts',
178
+ 'src/modules/guards/auth.guard.ts',
179
+ ],
180
+ edges: [],
181
+ },
182
+ });
183
+ const plan = makePlan();
184
+ const result = enricher.enrich(report, plan, {
185
+ primary: 'TypeScript',
186
+ languages: ['TypeScript'],
187
+ frameworks: ['NestJS'],
188
+ hasBackend: true,
189
+ hasFrontend: false,
190
+ hasMobile: false,
191
+ hasDatabase: true,
192
+ testFramework: 'Jest',
193
+ packageManager: 'npm',
194
+ }, tempDir);
195
+ const extractorsModule = result.modules.find(m => m.name === 'extractors');
196
+ expect(extractorsModule).toBeDefined();
197
+ expect(extractorsModule.description).toContain('Extração');
198
+ const ocrModule = result.modules.find(m => m.name === 'ocr');
199
+ expect(ocrModule).toBeDefined();
200
+ expect(ocrModule.description).toContain('OCR');
201
+ const guardsModule = result.modules.find(m => m.name === 'guards');
202
+ expect(guardsModule).toBeDefined();
203
+ expect(guardsModule.description).toContain('Validação');
204
+ });
205
+ it('should count lines for real files', () => {
206
+ // Create a temp file with 10 lines
207
+ const subdir = join(tempDir, 'src', 'modules', 'test');
208
+ mkdirSync(subdir, { recursive: true });
209
+ const filePath = join(subdir, 'test.ts');
210
+ const content = Array(10).fill('console.log("test");').join('\n');
211
+ writeFileSync(filePath, content);
212
+ const report = makeReport({
213
+ dependencyGraph: {
214
+ nodes: ['src/modules/test/test.ts'],
215
+ edges: [],
216
+ },
217
+ });
218
+ const plan = makePlan();
219
+ const result = enricher.enrich(report, plan, {
220
+ primary: 'TypeScript',
221
+ languages: ['TypeScript'],
222
+ frameworks: ['NestJS'],
223
+ hasBackend: true,
224
+ hasFrontend: false,
225
+ hasMobile: false,
226
+ hasDatabase: true,
227
+ testFramework: 'Jest',
228
+ packageManager: 'npm',
229
+ }, tempDir);
230
+ const testModule = result.modules.find(m => m.name === 'test');
231
+ expect(testModule).toBeDefined();
232
+ expect(testModule.lineCount).toBeGreaterThan(0);
233
+ });
234
+ it('should detect test files in modules', () => {
235
+ const report = makeReport({
236
+ dependencyGraph: {
237
+ nodes: [
238
+ 'src/modules/users/users.service.ts',
239
+ 'src/modules/users/users.service.test.ts',
240
+ 'src/modules/users/__tests__/users.spec.ts',
241
+ ],
242
+ edges: [],
243
+ },
244
+ });
245
+ const plan = makePlan();
246
+ const result = enricher.enrich(report, plan, {
247
+ primary: 'TypeScript',
248
+ languages: ['TypeScript'],
249
+ frameworks: ['NestJS'],
250
+ hasBackend: true,
251
+ hasFrontend: false,
252
+ hasMobile: false,
253
+ hasDatabase: true,
254
+ testFramework: 'Jest',
255
+ packageManager: 'npm',
256
+ }, tempDir);
257
+ const usersModule = result.modules.find(m => m.name === 'users');
258
+ expect(usersModule).toBeDefined();
259
+ expect(usersModule.hasTests).toBe(true);
260
+ expect(usersModule.testFiles.length).toBe(2);
261
+ });
262
+ it('should extract endpoints from route/controller files', () => {
263
+ const report = makeReport({
264
+ dependencyGraph: {
265
+ nodes: [
266
+ 'src/modules/users/users.controller.ts',
267
+ 'src/modules/users/users.service.ts',
268
+ 'src/auth/auth.controller.ts',
269
+ 'src/health/health.controller.ts',
270
+ ],
271
+ edges: [
272
+ { from: 'src/modules/users/users.controller.ts', to: 'src/modules/users/users.service.ts', type: 'import', weight: 1 },
273
+ { from: 'src/auth/auth.controller.ts', to: 'src/dependencies/auth.guard.ts', type: 'import', weight: 1 },
274
+ ],
275
+ },
276
+ });
277
+ const plan = makePlan();
278
+ const result = enricher.enrich(report, plan, {
279
+ primary: 'TypeScript',
280
+ languages: ['TypeScript'],
281
+ frameworks: ['NestJS'],
282
+ hasBackend: true,
283
+ hasFrontend: false,
284
+ hasMobile: false,
285
+ hasDatabase: true,
286
+ testFramework: 'Jest',
287
+ packageManager: 'npm',
288
+ }, tempDir);
289
+ expect(result.endpoints.length).toBeGreaterThan(0);
290
+ // Should detect users endpoints
291
+ const userEndpoints = result.endpoints.filter(e => e.path.includes('users'));
292
+ expect(userEndpoints.length).toBeGreaterThan(0);
293
+ });
294
+ it('should detect endpoints with authentication', () => {
295
+ const report = makeReport({
296
+ dependencyGraph: {
297
+ nodes: [
298
+ 'src/auth/auth.controller.ts',
299
+ 'src/dependencies/auth.guard.ts',
300
+ ],
301
+ edges: [
302
+ { from: 'src/auth/auth.controller.ts', to: 'src/dependencies/auth.guard.ts', type: 'import', weight: 1 },
303
+ ],
304
+ },
305
+ });
306
+ const plan = makePlan();
307
+ const result = enricher.enrich(report, plan, {
308
+ primary: 'TypeScript',
309
+ languages: ['TypeScript'],
310
+ frameworks: ['NestJS'],
311
+ hasBackend: true,
312
+ hasFrontend: false,
313
+ hasMobile: false,
314
+ hasDatabase: true,
315
+ testFramework: 'Jest',
316
+ packageManager: 'npm',
317
+ }, tempDir);
318
+ const authEndpoints = result.endpoints.filter(e => e.path.includes('auth'));
319
+ expect(authEndpoints.length).toBeGreaterThan(0);
320
+ // Auth endpoints should be marked as no auth (login/register are public)
321
+ const loginEndpoint = authEndpoints.find(e => e.path === '/auth/login');
322
+ expect(loginEndpoint).toBeDefined();
323
+ expect(loginEndpoint.hasAuth).toBe(false);
324
+ });
325
+ it('should detect untested modules', () => {
326
+ const report = makeReport({
327
+ dependencyGraph: {
328
+ nodes: [
329
+ 'src/modules/users/users.service.ts',
330
+ 'src/modules/users/users.controller.ts',
331
+ 'src/modules/notested/service.ts',
332
+ 'src/modules/notested/handler.ts',
333
+ ],
334
+ edges: [],
335
+ },
336
+ });
337
+ const plan = makePlan();
338
+ const result = enricher.enrich(report, plan, {
339
+ primary: 'TypeScript',
340
+ languages: ['TypeScript'],
341
+ frameworks: ['NestJS'],
342
+ hasBackend: true,
343
+ hasFrontend: false,
344
+ hasMobile: false,
345
+ hasDatabase: true,
346
+ testFramework: 'Jest',
347
+ packageManager: 'npm',
348
+ }, tempDir);
349
+ expect(result.untestedModules).toContain('notested');
350
+ });
351
+ it('should identify critical paths (files with high coupling)', () => {
352
+ const report = makeReport({
353
+ dependencyGraph: {
354
+ nodes: [
355
+ 'src/app.module.ts',
356
+ 'src/app.controller.ts',
357
+ 'src/app.service.ts',
358
+ 'src/users/user.service.ts',
359
+ 'src/auth/auth.service.ts',
360
+ ],
361
+ edges: [
362
+ { from: 'src/app.module.ts', to: 'src/app.controller.ts', type: 'import', weight: 1 },
363
+ { from: 'src/app.module.ts', to: 'src/app.service.ts', type: 'import', weight: 1 },
364
+ { from: 'src/app.module.ts', to: 'src/users/user.service.ts', type: 'import', weight: 1 },
365
+ { from: 'src/app.module.ts', to: 'src/auth/auth.service.ts', type: 'import', weight: 1 },
366
+ { from: 'src/app.controller.ts', to: 'src/app.service.ts', type: 'import', weight: 1 },
367
+ ],
368
+ },
369
+ });
370
+ const plan = makePlan();
371
+ const result = enricher.enrich(report, plan, {
372
+ primary: 'TypeScript',
373
+ languages: ['TypeScript'],
374
+ frameworks: ['NestJS'],
375
+ hasBackend: true,
376
+ hasFrontend: false,
377
+ hasMobile: false,
378
+ hasDatabase: true,
379
+ testFramework: 'Jest',
380
+ packageManager: 'npm',
381
+ }, tempDir);
382
+ expect(result.criticalPaths.length).toBeGreaterThan(0);
383
+ // app.module.ts should be in critical paths (4 edges)
384
+ expect(result.criticalPaths).toContain('src/app.module.ts');
385
+ });
386
+ it('should classify project depth as small', () => {
387
+ const report = makeReport({
388
+ projectInfo: {
389
+ path: '/test',
390
+ name: 'small-project',
391
+ frameworks: ['NestJS'],
392
+ totalFiles: 10,
393
+ totalLines: 1000,
394
+ primaryLanguages: ['TypeScript'],
395
+ },
396
+ dependencyGraph: {
397
+ nodes: [],
398
+ edges: [],
399
+ },
400
+ });
401
+ const plan = makePlan();
402
+ const result = enricher.enrich(report, plan, {
403
+ primary: 'TypeScript',
404
+ languages: ['TypeScript'],
405
+ frameworks: ['NestJS'],
406
+ hasBackend: true,
407
+ hasFrontend: false,
408
+ hasMobile: false,
409
+ hasDatabase: true,
410
+ testFramework: 'Jest',
411
+ packageManager: 'npm',
412
+ }, tempDir);
413
+ expect(result.projectDepth).toBe('small');
414
+ });
415
+ it('should classify project depth as medium', () => {
416
+ const report = makeReport({
417
+ projectInfo: {
418
+ path: '/test',
419
+ name: 'medium-project',
420
+ frameworks: ['NestJS'],
421
+ totalFiles: 150,
422
+ totalLines: 30000,
423
+ primaryLanguages: ['TypeScript'],
424
+ },
425
+ dependencyGraph: {
426
+ nodes: [],
427
+ edges: [],
428
+ },
429
+ });
430
+ const plan = makePlan();
431
+ const result = enricher.enrich(report, plan, {
432
+ primary: 'TypeScript',
433
+ languages: ['TypeScript'],
434
+ frameworks: ['NestJS'],
435
+ hasBackend: true,
436
+ hasFrontend: false,
437
+ hasMobile: false,
438
+ hasDatabase: true,
439
+ testFramework: 'Jest',
440
+ packageManager: 'npm',
441
+ }, tempDir);
442
+ expect(result.projectDepth).toBe('medium');
443
+ });
444
+ it('should classify project depth as large', () => {
445
+ const report = makeReport({
446
+ projectInfo: {
447
+ path: '/test',
448
+ name: 'large-project',
449
+ frameworks: ['NestJS'],
450
+ totalFiles: 300,
451
+ totalLines: 70000,
452
+ primaryLanguages: ['TypeScript'],
453
+ },
454
+ dependencyGraph: {
455
+ nodes: [],
456
+ edges: [],
457
+ },
458
+ });
459
+ const plan = makePlan();
460
+ const result = enricher.enrich(report, plan, {
461
+ primary: 'TypeScript',
462
+ languages: ['TypeScript'],
463
+ frameworks: ['NestJS'],
464
+ hasBackend: true,
465
+ hasFrontend: false,
466
+ hasMobile: false,
467
+ hasDatabase: true,
468
+ testFramework: 'Jest',
469
+ packageManager: 'npm',
470
+ }, tempDir);
471
+ expect(result.projectDepth).toBe('large');
472
+ });
473
+ it('should classify project depth as enterprise', () => {
474
+ const report = makeReport({
475
+ projectInfo: {
476
+ path: '/test',
477
+ name: 'enterprise-project',
478
+ frameworks: ['NestJS'],
479
+ totalFiles: 1000,
480
+ totalLines: 150000,
481
+ primaryLanguages: ['TypeScript'],
482
+ },
483
+ dependencyGraph: {
484
+ nodes: [],
485
+ edges: [],
486
+ },
487
+ });
488
+ const plan = makePlan();
489
+ const result = enricher.enrich(report, plan, {
490
+ primary: 'TypeScript',
491
+ languages: ['TypeScript'],
492
+ frameworks: ['NestJS'],
493
+ hasBackend: true,
494
+ hasFrontend: false,
495
+ hasMobile: false,
496
+ hasDatabase: true,
497
+ testFramework: 'Jest',
498
+ packageManager: 'npm',
499
+ }, tempDir);
500
+ expect(result.projectDepth).toBe('enterprise');
501
+ });
502
+ });
503
+ describe('Module inference strategies', () => {
504
+ it('should infer module name from explicit module markers', () => {
505
+ const report = makeReport({
506
+ dependencyGraph: {
507
+ nodes: [
508
+ 'src/modules/users/users.service.ts',
509
+ 'src/modules/auth/auth.service.ts',
510
+ 'src/features/notifications/notifier.ts',
511
+ ],
512
+ edges: [],
513
+ },
514
+ });
515
+ const plan = makePlan();
516
+ const result = enricher.enrich(report, plan, {
517
+ primary: 'TypeScript',
518
+ languages: ['TypeScript'],
519
+ frameworks: ['NestJS'],
520
+ hasBackend: true,
521
+ hasFrontend: false,
522
+ hasMobile: false,
523
+ hasDatabase: true,
524
+ testFramework: 'Jest',
525
+ packageManager: 'npm',
526
+ }, tempDir);
527
+ const moduleNames = result.modules.map(m => m.name);
528
+ expect(moduleNames).toContain('users');
529
+ expect(moduleNames).toContain('auth');
530
+ expect(moduleNames).toContain('notifications');
531
+ });
532
+ it('should infer module name from Django app pattern', () => {
533
+ const report = makeReport({
534
+ dependencyGraph: {
535
+ nodes: [
536
+ 'apps/users/views.py',
537
+ 'apps/users/models.py',
538
+ 'apps/posts/views.py',
539
+ ],
540
+ edges: [],
541
+ },
542
+ });
543
+ const plan = makePlan();
544
+ const result = enricher.enrich(report, plan, {
545
+ primary: 'Python',
546
+ languages: ['Python'],
547
+ frameworks: ['Django'],
548
+ hasBackend: true,
549
+ hasFrontend: false,
550
+ hasMobile: false,
551
+ hasDatabase: true,
552
+ testFramework: 'pytest',
553
+ packageManager: 'pip',
554
+ }, tempDir);
555
+ const moduleNames = result.modules.map(m => m.name);
556
+ expect(moduleNames).toContain('users');
557
+ expect(moduleNames).toContain('posts');
558
+ });
559
+ it('should infer module name from clean architecture layers', () => {
560
+ const report = makeReport({
561
+ dependencyGraph: {
562
+ nodes: [
563
+ 'src/domain/entities/user.entity.ts',
564
+ 'src/application/services/user.service.ts',
565
+ 'src/infrastructure/persistence/user.repository.ts',
566
+ ],
567
+ edges: [],
568
+ },
569
+ });
570
+ const plan = makePlan();
571
+ const result = enricher.enrich(report, plan, {
572
+ primary: 'TypeScript',
573
+ languages: ['TypeScript'],
574
+ frameworks: ['NestJS'],
575
+ hasBackend: true,
576
+ hasFrontend: false,
577
+ hasMobile: false,
578
+ hasDatabase: true,
579
+ testFramework: 'Jest',
580
+ packageManager: 'npm',
581
+ }, tempDir);
582
+ // Should infer modules related to user entity
583
+ expect(result.modules.length).toBeGreaterThan(0);
584
+ });
585
+ it('should handle Java package structure', () => {
586
+ const report = makeReport({
587
+ dependencyGraph: {
588
+ nodes: [
589
+ 'src/main/java/com/example/users/User.java',
590
+ 'src/main/java/com/example/users/UserService.java',
591
+ 'src/main/java/com/example/auth/AuthService.java',
592
+ ],
593
+ edges: [],
594
+ },
595
+ });
596
+ const plan = makePlan();
597
+ const result = enricher.enrich(report, plan, {
598
+ primary: 'Java',
599
+ languages: ['Java'],
600
+ frameworks: ['Spring Boot'],
601
+ hasBackend: true,
602
+ hasFrontend: false,
603
+ hasMobile: false,
604
+ hasDatabase: true,
605
+ testFramework: 'JUnit',
606
+ packageManager: 'maven',
607
+ }, tempDir);
608
+ const moduleNames = result.modules.map(m => m.name);
609
+ expect(moduleNames.length).toBeGreaterThan(0);
610
+ });
611
+ });
612
+ describe('Entity and controller detection', () => {
613
+ it('should detect entity files', () => {
614
+ const report = makeReport({
615
+ dependencyGraph: {
616
+ nodes: [
617
+ 'src/modules/users/entities/user.entity.ts',
618
+ 'src/modules/users/models/user.model.ts',
619
+ 'src/modules/users/user.service.ts',
620
+ ],
621
+ edges: [],
622
+ },
623
+ });
624
+ const plan = makePlan();
625
+ const result = enricher.enrich(report, plan, {
626
+ primary: 'TypeScript',
627
+ languages: ['TypeScript'],
628
+ frameworks: ['NestJS'],
629
+ hasBackend: true,
630
+ hasFrontend: false,
631
+ hasMobile: false,
632
+ hasDatabase: true,
633
+ testFramework: 'Jest',
634
+ packageManager: 'npm',
635
+ }, tempDir);
636
+ const usersModule = result.modules.find(m => m.name === 'users');
637
+ expect(usersModule).toBeDefined();
638
+ expect(usersModule.entities.length).toBeGreaterThan(0);
639
+ expect(usersModule.entities.some(e => e.includes('User'))).toBe(true);
640
+ });
641
+ it('should detect controller files', () => {
642
+ const report = makeReport({
643
+ dependencyGraph: {
644
+ nodes: [
645
+ 'src/modules/users/users.controller.ts',
646
+ 'src/modules/auth/auth.controller.ts',
647
+ 'src/modules/users/users.service.ts',
648
+ ],
649
+ edges: [],
650
+ },
651
+ });
652
+ const plan = makePlan();
653
+ const result = enricher.enrich(report, plan, {
654
+ primary: 'TypeScript',
655
+ languages: ['TypeScript'],
656
+ frameworks: ['NestJS'],
657
+ hasBackend: true,
658
+ hasFrontend: false,
659
+ hasMobile: false,
660
+ hasDatabase: true,
661
+ testFramework: 'Jest',
662
+ packageManager: 'npm',
663
+ }, tempDir);
664
+ const usersModule = result.modules.find(m => m.name === 'users');
665
+ expect(usersModule).toBeDefined();
666
+ expect(usersModule.controllers.length).toBeGreaterThan(0);
667
+ });
668
+ it('should detect service files', () => {
669
+ const report = makeReport({
670
+ dependencyGraph: {
671
+ nodes: [
672
+ 'src/modules/users/users.service.ts',
673
+ 'src/modules/auth/auth.service.ts',
674
+ 'src/modules/users/users.controller.ts',
675
+ ],
676
+ edges: [],
677
+ },
678
+ });
679
+ const plan = makePlan();
680
+ const result = enricher.enrich(report, plan, {
681
+ primary: 'TypeScript',
682
+ languages: ['TypeScript'],
683
+ frameworks: ['NestJS'],
684
+ hasBackend: true,
685
+ hasFrontend: false,
686
+ hasMobile: false,
687
+ hasDatabase: true,
688
+ testFramework: 'Jest',
689
+ packageManager: 'npm',
690
+ }, tempDir);
691
+ const usersModule = result.modules.find(m => m.name === 'users');
692
+ expect(usersModule).toBeDefined();
693
+ expect(usersModule.services.length).toBeGreaterThan(0);
694
+ });
695
+ });
696
+ describe('Smart descriptions for patterns', () => {
697
+ it('should generate description for routes/controllers', () => {
698
+ const report = makeReport({
699
+ dependencyGraph: {
700
+ nodes: ['src/modules/routes/app.routes.ts'],
701
+ edges: [],
702
+ },
703
+ });
704
+ const plan = makePlan();
705
+ const result = enricher.enrich(report, plan, {
706
+ primary: 'TypeScript',
707
+ languages: ['TypeScript'],
708
+ frameworks: ['NestJS'],
709
+ hasBackend: true,
710
+ hasFrontend: false,
711
+ hasMobile: false,
712
+ hasDatabase: true,
713
+ testFramework: 'Jest',
714
+ packageManager: 'npm',
715
+ }, tempDir);
716
+ const routesModule = result.modules.find(m => m.name === 'routes');
717
+ expect(routesModule).toBeDefined();
718
+ expect(routesModule.description).toContain('rotas');
719
+ });
720
+ it('should generate description for services', () => {
721
+ const report = makeReport({
722
+ dependencyGraph: {
723
+ nodes: ['src/modules/services/payment.service.ts'],
724
+ edges: [],
725
+ },
726
+ });
727
+ const plan = makePlan();
728
+ const result = enricher.enrich(report, plan, {
729
+ primary: 'TypeScript',
730
+ languages: ['TypeScript'],
731
+ frameworks: ['NestJS'],
732
+ hasBackend: true,
733
+ hasFrontend: false,
734
+ hasMobile: false,
735
+ hasDatabase: true,
736
+ testFramework: 'Jest',
737
+ packageManager: 'npm',
738
+ }, tempDir);
739
+ const servicesModule = result.modules.find(m => m.name === 'services');
740
+ expect(servicesModule).toBeDefined();
741
+ expect(servicesModule.description).toContain('Serviços');
742
+ });
743
+ it('should generate description for auth modules', () => {
744
+ const report = makeReport({
745
+ dependencyGraph: {
746
+ nodes: ['src/modules/auth/auth.service.ts'],
747
+ edges: [],
748
+ },
749
+ });
750
+ const plan = makePlan();
751
+ const result = enricher.enrich(report, plan, {
752
+ primary: 'TypeScript',
753
+ languages: ['TypeScript'],
754
+ frameworks: ['NestJS'],
755
+ hasBackend: true,
756
+ hasFrontend: false,
757
+ hasMobile: false,
758
+ hasDatabase: true,
759
+ testFramework: 'Jest',
760
+ packageManager: 'npm',
761
+ }, tempDir);
762
+ const authModule = result.modules.find(m => m.name === 'auth');
763
+ expect(authModule).toBeDefined();
764
+ expect(authModule.description.toLowerCase()).toContain('autenticação');
765
+ });
766
+ it('should include composition info in descriptions', () => {
767
+ const report = makeReport({
768
+ dependencyGraph: {
769
+ nodes: [
770
+ 'src/modules/users/users.controller.ts',
771
+ 'src/modules/users/users.service.ts',
772
+ 'src/modules/users/entities/user.entity.ts',
773
+ ],
774
+ edges: [],
775
+ },
776
+ });
777
+ const plan = makePlan();
778
+ const result = enricher.enrich(report, plan, {
779
+ primary: 'TypeScript',
780
+ languages: ['TypeScript'],
781
+ frameworks: ['NestJS'],
782
+ hasBackend: true,
783
+ hasFrontend: false,
784
+ hasMobile: false,
785
+ hasDatabase: true,
786
+ testFramework: 'Jest',
787
+ packageManager: 'npm',
788
+ }, tempDir);
789
+ const usersModule = result.modules.find(m => m.name === 'users');
790
+ expect(usersModule).toBeDefined();
791
+ // Should include composition info (endpoints, services, entities)
792
+ expect(usersModule.description).toMatch(/endpoint|service|entit/i);
793
+ });
794
+ });
795
+ describe('Line counting edge cases', () => {
796
+ it('should handle missing files gracefully', () => {
797
+ const report = makeReport({
798
+ dependencyGraph: {
799
+ nodes: ['src/nonexistent/file.ts'],
800
+ edges: [],
801
+ },
802
+ });
803
+ const plan = makePlan();
804
+ const result = enricher.enrich(report, plan, {
805
+ primary: 'TypeScript',
806
+ languages: ['TypeScript'],
807
+ frameworks: ['NestJS'],
808
+ hasBackend: true,
809
+ hasFrontend: false,
810
+ hasMobile: false,
811
+ hasDatabase: true,
812
+ testFramework: 'Jest',
813
+ packageManager: 'npm',
814
+ }, tempDir);
815
+ // Should not crash, modules should exist
816
+ expect(result.modules).toBeDefined();
817
+ });
818
+ it('should handle empty files', () => {
819
+ const subdir = join(tempDir, 'src', 'modules', 'empty');
820
+ mkdirSync(subdir, { recursive: true });
821
+ const filePath = join(subdir, 'empty.ts');
822
+ writeFileSync(filePath, '');
823
+ const report = makeReport({
824
+ dependencyGraph: {
825
+ nodes: ['src/modules/empty/empty.ts'],
826
+ edges: [],
827
+ },
828
+ });
829
+ const plan = makePlan();
830
+ const result = enricher.enrich(report, plan, {
831
+ primary: 'TypeScript',
832
+ languages: ['TypeScript'],
833
+ frameworks: ['NestJS'],
834
+ hasBackend: true,
835
+ hasFrontend: false,
836
+ hasMobile: false,
837
+ hasDatabase: true,
838
+ testFramework: 'Jest',
839
+ packageManager: 'npm',
840
+ }, tempDir);
841
+ const emptyModule = result.modules.find(m => m.name === 'empty');
842
+ expect(emptyModule).toBeDefined();
843
+ expect(emptyModule.lineCount).toBe(0);
844
+ });
845
+ it('should count lines in files with various line endings', () => {
846
+ const subdir = join(tempDir, 'src', 'modules', 'mixed');
847
+ mkdirSync(subdir, { recursive: true });
848
+ const filePath = join(subdir, 'mixed.ts');
849
+ // 5 lines
850
+ writeFileSync(filePath, 'line1\nline2\nline3\nline4\nline5');
851
+ const report = makeReport({
852
+ dependencyGraph: {
853
+ nodes: ['src/modules/mixed/mixed.ts'],
854
+ edges: [],
855
+ },
856
+ });
857
+ const plan = makePlan();
858
+ const result = enricher.enrich(report, plan, {
859
+ primary: 'TypeScript',
860
+ languages: ['TypeScript'],
861
+ frameworks: ['NestJS'],
862
+ hasBackend: true,
863
+ hasFrontend: false,
864
+ hasMobile: false,
865
+ hasDatabase: true,
866
+ testFramework: 'Jest',
867
+ packageManager: 'npm',
868
+ }, tempDir);
869
+ const mixedModule = result.modules.find(m => m.name === 'mixed');
870
+ expect(mixedModule).toBeDefined();
871
+ expect(mixedModule.lineCount).toBeGreaterThan(0);
872
+ });
873
+ });
874
+ });
875
+ //# sourceMappingURL=context-enricher.test.js.map