@girardelli/architect 5.0.0 → 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 (335) hide show
  1. package/dist/{cli.d.ts → src/adapters/cli.d.ts} +1 -2
  2. package/dist/{cli.js → src/adapters/cli.js} +191 -213
  3. package/dist/src/adapters/cli.js.map +1 -0
  4. package/dist/src/adapters/github-action.d.ts +9 -0
  5. package/dist/src/adapters/github-action.js +94 -0
  6. package/dist/src/adapters/github-action.js.map +1 -0
  7. package/dist/src/adapters/html-reporter/scripts.d.ts +5 -0
  8. package/dist/src/adapters/html-reporter/scripts.js +400 -0
  9. package/dist/src/adapters/html-reporter/scripts.js.map +1 -0
  10. package/dist/src/adapters/html-reporter/sections/agents.d.ts +2 -0
  11. package/dist/src/adapters/html-reporter/sections/agents.js +260 -0
  12. package/dist/src/adapters/html-reporter/sections/agents.js.map +1 -0
  13. package/dist/src/adapters/html-reporter/sections/anti-patterns.d.ts +13 -0
  14. package/dist/src/adapters/html-reporter/sections/anti-patterns.js +64 -0
  15. package/dist/src/adapters/html-reporter/sections/anti-patterns.js.map +1 -0
  16. package/dist/src/adapters/html-reporter/sections/header.d.ts +3 -0
  17. package/dist/src/adapters/html-reporter/sections/header.js +30 -0
  18. package/dist/src/adapters/html-reporter/sections/header.js.map +1 -0
  19. package/dist/src/adapters/html-reporter/sections/layers.d.ts +9 -0
  20. package/dist/src/adapters/html-reporter/sections/layers.js +143 -0
  21. package/dist/src/adapters/html-reporter/sections/layers.js.map +1 -0
  22. package/dist/src/adapters/html-reporter/sections/overview.d.ts +2 -0
  23. package/dist/src/adapters/html-reporter/sections/overview.js +58 -0
  24. package/dist/src/adapters/html-reporter/sections/overview.js.map +1 -0
  25. package/dist/src/adapters/html-reporter/sections/refactoring-plan.d.ts +3 -0
  26. package/dist/src/adapters/html-reporter/sections/refactoring-plan.js +151 -0
  27. package/dist/src/adapters/html-reporter/sections/refactoring-plan.js.map +1 -0
  28. package/dist/src/adapters/html-reporter/sections/score.d.ts +7 -0
  29. package/dist/src/adapters/html-reporter/sections/score.js +70 -0
  30. package/dist/src/adapters/html-reporter/sections/score.js.map +1 -0
  31. package/dist/src/adapters/html-reporter/sections/suggestions.d.ts +7 -0
  32. package/dist/src/adapters/html-reporter/sections/suggestions.js +34 -0
  33. package/dist/src/adapters/html-reporter/sections/suggestions.js.map +1 -0
  34. package/dist/src/adapters/html-reporter/styles.d.ts +1 -0
  35. package/dist/src/adapters/html-reporter/styles.js +526 -0
  36. package/dist/src/adapters/html-reporter/styles.js.map +1 -0
  37. package/dist/src/adapters/html-reporter/utils_adapters.d.ts +20 -0
  38. package/dist/src/adapters/html-reporter/utils_adapters.js +32 -0
  39. package/dist/src/adapters/html-reporter/utils_adapters.js.map +1 -0
  40. package/dist/src/adapters/html-reporter/utils_sections.d.ts +7 -0
  41. package/dist/src/adapters/html-reporter/utils_sections.js +58 -0
  42. package/dist/src/adapters/html-reporter/utils_sections.js.map +1 -0
  43. package/dist/src/adapters/html-reporter.d.ts +10 -0
  44. package/dist/src/adapters/html-reporter.js +97 -0
  45. package/dist/src/adapters/html-reporter.js.map +1 -0
  46. package/dist/src/adapters/progress-logger.d.ts +55 -0
  47. package/dist/src/adapters/progress-logger.js +200 -0
  48. package/dist/src/adapters/progress-logger.js.map +1 -0
  49. package/dist/{refactor-reporter.d.ts → src/adapters/refactor-reporter.d.ts} +1 -2
  50. package/dist/{refactor-reporter.js → src/adapters/refactor-reporter.js} +1 -1
  51. package/dist/src/adapters/refactor-reporter.js.map +1 -0
  52. package/dist/{reporter.d.ts → src/adapters/reporter.d.ts} +1 -2
  53. package/dist/src/adapters/reporter.js.map +1 -0
  54. package/dist/src/core/GenesisTerminal.d.ts +8 -0
  55. package/dist/src/core/GenesisTerminal.js +105 -0
  56. package/dist/src/core/GenesisTerminal.js.map +1 -0
  57. package/dist/{index.d.ts → src/core/architect.d.ts} +4 -18
  58. package/dist/{index.js → src/core/architect.js} +22 -21
  59. package/dist/src/core/architect.js.map +1 -0
  60. package/dist/tests/architect-adapter-enrichment.test.d.ts +1 -0
  61. package/dist/tests/architect-adapter-enrichment.test.js +11 -0
  62. package/dist/tests/architect-adapter-enrichment.test.js.map +1 -0
  63. package/dist/tests/github-action.test.d.ts +1 -0
  64. package/dist/tests/github-action.test.js +92 -0
  65. package/dist/tests/github-action.test.js.map +1 -0
  66. package/package.json +15 -65
  67. package/src/adapters/cli.ts +492 -0
  68. package/src/adapters/github-action.ts +109 -0
  69. package/src/adapters/html-reporter/scripts.ts +402 -0
  70. package/src/adapters/html-reporter/sections/agents.ts +267 -0
  71. package/src/adapters/html-reporter/sections/anti-patterns.ts +81 -0
  72. package/src/adapters/html-reporter/sections/header.ts +35 -0
  73. package/src/adapters/html-reporter/sections/layers.ts +165 -0
  74. package/src/adapters/html-reporter/sections/overview.ts +64 -0
  75. package/src/adapters/html-reporter/sections/refactoring-plan.ts +166 -0
  76. package/src/adapters/html-reporter/sections/score.ts +80 -0
  77. package/src/adapters/html-reporter/sections/suggestions.ts +39 -0
  78. package/src/adapters/html-reporter/styles.ts +525 -0
  79. package/src/adapters/html-reporter/utils_adapters.ts +39 -0
  80. package/src/adapters/html-reporter/utils_sections.ts +55 -0
  81. package/src/adapters/html-reporter.ts +102 -0
  82. package/src/adapters/progress-logger.ts +236 -0
  83. package/src/{refactor-reporter.ts → adapters/refactor-reporter.ts} +2 -2
  84. package/src/{reporter.ts → adapters/reporter.ts} +1 -1
  85. package/src/core/GenesisTerminal.ts +127 -0
  86. package/src/{index.ts → core/architect.ts} +27 -45
  87. package/tests/github-action.test.ts +109 -0
  88. package/tsconfig.json +12 -19
  89. package/CONTRIBUTING.md +0 -140
  90. package/LICENSE +0 -21
  91. package/PROJECT_STRUCTURE.txt +0 -168
  92. package/README.md +0 -257
  93. package/architect-run.sh +0 -431
  94. package/assets/banner-v3.html +0 -561
  95. package/dist/agent-generator/context-enricher.d.ts +0 -58
  96. package/dist/agent-generator/context-enricher.d.ts.map +0 -1
  97. package/dist/agent-generator/context-enricher.js +0 -613
  98. package/dist/agent-generator/context-enricher.js.map +0 -1
  99. package/dist/agent-generator/domain-inferrer.d.ts +0 -52
  100. package/dist/agent-generator/domain-inferrer.d.ts.map +0 -1
  101. package/dist/agent-generator/domain-inferrer.js +0 -585
  102. package/dist/agent-generator/domain-inferrer.js.map +0 -1
  103. package/dist/agent-generator/framework-detector.d.ts +0 -40
  104. package/dist/agent-generator/framework-detector.d.ts.map +0 -1
  105. package/dist/agent-generator/framework-detector.js +0 -611
  106. package/dist/agent-generator/framework-detector.js.map +0 -1
  107. package/dist/agent-generator/index.d.ts +0 -47
  108. package/dist/agent-generator/index.d.ts.map +0 -1
  109. package/dist/agent-generator/index.js +0 -545
  110. package/dist/agent-generator/index.js.map +0 -1
  111. package/dist/agent-generator/stack-detector.d.ts +0 -14
  112. package/dist/agent-generator/stack-detector.d.ts.map +0 -1
  113. package/dist/agent-generator/stack-detector.js +0 -124
  114. package/dist/agent-generator/stack-detector.js.map +0 -1
  115. package/dist/agent-generator/templates/core/agents.d.ts +0 -17
  116. package/dist/agent-generator/templates/core/agents.d.ts.map +0 -1
  117. package/dist/agent-generator/templates/core/agents.js +0 -1256
  118. package/dist/agent-generator/templates/core/agents.js.map +0 -1
  119. package/dist/agent-generator/templates/core/architecture-rules.d.ts +0 -7
  120. package/dist/agent-generator/templates/core/architecture-rules.d.ts.map +0 -1
  121. package/dist/agent-generator/templates/core/architecture-rules.js +0 -274
  122. package/dist/agent-generator/templates/core/architecture-rules.js.map +0 -1
  123. package/dist/agent-generator/templates/core/general-rules.d.ts +0 -8
  124. package/dist/agent-generator/templates/core/general-rules.d.ts.map +0 -1
  125. package/dist/agent-generator/templates/core/general-rules.js +0 -301
  126. package/dist/agent-generator/templates/core/general-rules.js.map +0 -1
  127. package/dist/agent-generator/templates/core/hooks-generator.d.ts +0 -21
  128. package/dist/agent-generator/templates/core/hooks-generator.d.ts.map +0 -1
  129. package/dist/agent-generator/templates/core/hooks-generator.js +0 -233
  130. package/dist/agent-generator/templates/core/hooks-generator.js.map +0 -1
  131. package/dist/agent-generator/templates/core/index-md.d.ts +0 -7
  132. package/dist/agent-generator/templates/core/index-md.d.ts.map +0 -1
  133. package/dist/agent-generator/templates/core/index-md.js +0 -246
  134. package/dist/agent-generator/templates/core/index-md.js.map +0 -1
  135. package/dist/agent-generator/templates/core/orchestrator.d.ts +0 -8
  136. package/dist/agent-generator/templates/core/orchestrator.d.ts.map +0 -1
  137. package/dist/agent-generator/templates/core/orchestrator.js +0 -422
  138. package/dist/agent-generator/templates/core/orchestrator.js.map +0 -1
  139. package/dist/agent-generator/templates/core/preflight.d.ts +0 -8
  140. package/dist/agent-generator/templates/core/preflight.d.ts.map +0 -1
  141. package/dist/agent-generator/templates/core/preflight.js +0 -213
  142. package/dist/agent-generator/templates/core/preflight.js.map +0 -1
  143. package/dist/agent-generator/templates/core/quality-gates.d.ts +0 -11
  144. package/dist/agent-generator/templates/core/quality-gates.d.ts.map +0 -1
  145. package/dist/agent-generator/templates/core/quality-gates.js +0 -254
  146. package/dist/agent-generator/templates/core/quality-gates.js.map +0 -1
  147. package/dist/agent-generator/templates/core/security-rules.d.ts +0 -7
  148. package/dist/agent-generator/templates/core/security-rules.d.ts.map +0 -1
  149. package/dist/agent-generator/templates/core/security-rules.js +0 -528
  150. package/dist/agent-generator/templates/core/security-rules.js.map +0 -1
  151. package/dist/agent-generator/templates/core/skills-generator.d.ts +0 -19
  152. package/dist/agent-generator/templates/core/skills-generator.d.ts.map +0 -1
  153. package/dist/agent-generator/templates/core/skills-generator.js +0 -546
  154. package/dist/agent-generator/templates/core/skills-generator.js.map +0 -1
  155. package/dist/agent-generator/templates/core/workflow-fix-bug.d.ts +0 -7
  156. package/dist/agent-generator/templates/core/workflow-fix-bug.d.ts.map +0 -1
  157. package/dist/agent-generator/templates/core/workflow-fix-bug.js +0 -237
  158. package/dist/agent-generator/templates/core/workflow-fix-bug.js.map +0 -1
  159. package/dist/agent-generator/templates/core/workflow-new-feature.d.ts +0 -8
  160. package/dist/agent-generator/templates/core/workflow-new-feature.d.ts.map +0 -1
  161. package/dist/agent-generator/templates/core/workflow-new-feature.js +0 -321
  162. package/dist/agent-generator/templates/core/workflow-new-feature.js.map +0 -1
  163. package/dist/agent-generator/templates/core/workflow-review.d.ts +0 -7
  164. package/dist/agent-generator/templates/core/workflow-review.d.ts.map +0 -1
  165. package/dist/agent-generator/templates/core/workflow-review.js +0 -104
  166. package/dist/agent-generator/templates/core/workflow-review.js.map +0 -1
  167. package/dist/agent-generator/templates/domain/index.d.ts +0 -22
  168. package/dist/agent-generator/templates/domain/index.d.ts.map +0 -1
  169. package/dist/agent-generator/templates/domain/index.js +0 -1176
  170. package/dist/agent-generator/templates/domain/index.js.map +0 -1
  171. package/dist/agent-generator/templates/stack/index.d.ts +0 -8
  172. package/dist/agent-generator/templates/stack/index.d.ts.map +0 -1
  173. package/dist/agent-generator/templates/stack/index.js +0 -695
  174. package/dist/agent-generator/templates/stack/index.js.map +0 -1
  175. package/dist/agent-generator/templates/template-helpers.d.ts +0 -75
  176. package/dist/agent-generator/templates/template-helpers.d.ts.map +0 -1
  177. package/dist/agent-generator/templates/template-helpers.js +0 -726
  178. package/dist/agent-generator/templates/template-helpers.js.map +0 -1
  179. package/dist/agent-generator/types.d.ts +0 -196
  180. package/dist/agent-generator/types.d.ts.map +0 -1
  181. package/dist/agent-generator/types.js +0 -27
  182. package/dist/agent-generator/types.js.map +0 -1
  183. package/dist/analyzer.d.ts +0 -38
  184. package/dist/analyzer.d.ts.map +0 -1
  185. package/dist/analyzer.js +0 -383
  186. package/dist/analyzer.js.map +0 -1
  187. package/dist/analyzers/forecast.d.ts +0 -85
  188. package/dist/analyzers/forecast.d.ts.map +0 -1
  189. package/dist/analyzers/forecast.js +0 -337
  190. package/dist/analyzers/forecast.js.map +0 -1
  191. package/dist/analyzers/git-cache.d.ts +0 -7
  192. package/dist/analyzers/git-cache.d.ts.map +0 -1
  193. package/dist/analyzers/git-cache.js +0 -41
  194. package/dist/analyzers/git-cache.js.map +0 -1
  195. package/dist/analyzers/git-history.d.ts +0 -113
  196. package/dist/analyzers/git-history.d.ts.map +0 -1
  197. package/dist/analyzers/git-history.js +0 -333
  198. package/dist/analyzers/git-history.js.map +0 -1
  199. package/dist/analyzers/index.d.ts +0 -10
  200. package/dist/analyzers/index.d.ts.map +0 -1
  201. package/dist/analyzers/index.js +0 -7
  202. package/dist/analyzers/index.js.map +0 -1
  203. package/dist/analyzers/temporal-scorer.d.ts +0 -72
  204. package/dist/analyzers/temporal-scorer.d.ts.map +0 -1
  205. package/dist/analyzers/temporal-scorer.js +0 -140
  206. package/dist/analyzers/temporal-scorer.js.map +0 -1
  207. package/dist/anti-patterns.d.ts +0 -24
  208. package/dist/anti-patterns.d.ts.map +0 -1
  209. package/dist/anti-patterns.js +0 -230
  210. package/dist/anti-patterns.js.map +0 -1
  211. package/dist/cli.d.ts.map +0 -1
  212. package/dist/cli.js.map +0 -1
  213. package/dist/config.d.ts +0 -12
  214. package/dist/config.d.ts.map +0 -1
  215. package/dist/config.js +0 -110
  216. package/dist/config.js.map +0 -1
  217. package/dist/diagram.d.ts +0 -9
  218. package/dist/diagram.d.ts.map +0 -1
  219. package/dist/diagram.js +0 -116
  220. package/dist/diagram.js.map +0 -1
  221. package/dist/html-reporter.d.ts +0 -47
  222. package/dist/html-reporter.d.ts.map +0 -1
  223. package/dist/html-reporter.js +0 -1747
  224. package/dist/html-reporter.js.map +0 -1
  225. package/dist/index.d.ts.map +0 -1
  226. package/dist/index.js.map +0 -1
  227. package/dist/project-summarizer.d.ts +0 -38
  228. package/dist/project-summarizer.d.ts.map +0 -1
  229. package/dist/project-summarizer.js +0 -463
  230. package/dist/project-summarizer.js.map +0 -1
  231. package/dist/refactor-engine.d.ts +0 -18
  232. package/dist/refactor-engine.d.ts.map +0 -1
  233. package/dist/refactor-engine.js +0 -86
  234. package/dist/refactor-engine.js.map +0 -1
  235. package/dist/refactor-reporter.d.ts.map +0 -1
  236. package/dist/refactor-reporter.js.map +0 -1
  237. package/dist/reporter.d.ts.map +0 -1
  238. package/dist/reporter.js.map +0 -1
  239. package/dist/rules/barrel-optimizer.d.ts +0 -13
  240. package/dist/rules/barrel-optimizer.d.ts.map +0 -1
  241. package/dist/rules/barrel-optimizer.js +0 -77
  242. package/dist/rules/barrel-optimizer.js.map +0 -1
  243. package/dist/rules/dead-code-detector.d.ts +0 -21
  244. package/dist/rules/dead-code-detector.d.ts.map +0 -1
  245. package/dist/rules/dead-code-detector.js +0 -117
  246. package/dist/rules/dead-code-detector.js.map +0 -1
  247. package/dist/rules/hub-splitter.d.ts +0 -13
  248. package/dist/rules/hub-splitter.d.ts.map +0 -1
  249. package/dist/rules/hub-splitter.js +0 -110
  250. package/dist/rules/hub-splitter.js.map +0 -1
  251. package/dist/rules/import-organizer.d.ts +0 -13
  252. package/dist/rules/import-organizer.d.ts.map +0 -1
  253. package/dist/rules/import-organizer.js +0 -85
  254. package/dist/rules/import-organizer.js.map +0 -1
  255. package/dist/rules/module-grouper.d.ts +0 -13
  256. package/dist/rules/module-grouper.d.ts.map +0 -1
  257. package/dist/rules/module-grouper.js +0 -110
  258. package/dist/rules/module-grouper.js.map +0 -1
  259. package/dist/scanner.d.ts +0 -31
  260. package/dist/scanner.d.ts.map +0 -1
  261. package/dist/scanner.js +0 -328
  262. package/dist/scanner.js.map +0 -1
  263. package/dist/scorer.d.ts +0 -27
  264. package/dist/scorer.d.ts.map +0 -1
  265. package/dist/scorer.js +0 -229
  266. package/dist/scorer.js.map +0 -1
  267. package/dist/types.d.ts +0 -186
  268. package/dist/types.d.ts.map +0 -1
  269. package/dist/types.js +0 -2
  270. package/dist/types.js.map +0 -1
  271. package/examples/sample-report.md +0 -207
  272. package/jest.config.js +0 -18
  273. package/src/agent-generator/context-enricher.ts +0 -672
  274. package/src/agent-generator/domain-inferrer.ts +0 -635
  275. package/src/agent-generator/framework-detector.ts +0 -669
  276. package/src/agent-generator/index.ts +0 -634
  277. package/src/agent-generator/stack-detector.ts +0 -115
  278. package/src/agent-generator/templates/core/agents.ts +0 -1296
  279. package/src/agent-generator/templates/core/architecture-rules.ts +0 -287
  280. package/src/agent-generator/templates/core/general-rules.ts +0 -306
  281. package/src/agent-generator/templates/core/hooks-generator.ts +0 -242
  282. package/src/agent-generator/templates/core/index-md.ts +0 -260
  283. package/src/agent-generator/templates/core/orchestrator.ts +0 -459
  284. package/src/agent-generator/templates/core/preflight.ts +0 -215
  285. package/src/agent-generator/templates/core/quality-gates.ts +0 -256
  286. package/src/agent-generator/templates/core/security-rules.ts +0 -543
  287. package/src/agent-generator/templates/core/skills-generator.ts +0 -585
  288. package/src/agent-generator/templates/core/workflow-fix-bug.ts +0 -239
  289. package/src/agent-generator/templates/core/workflow-new-feature.ts +0 -323
  290. package/src/agent-generator/templates/core/workflow-review.ts +0 -106
  291. package/src/agent-generator/templates/domain/index.ts +0 -1201
  292. package/src/agent-generator/templates/stack/index.ts +0 -705
  293. package/src/agent-generator/templates/template-helpers.ts +0 -776
  294. package/src/agent-generator/types.ts +0 -232
  295. package/src/analyzer.ts +0 -447
  296. package/src/analyzers/forecast.ts +0 -496
  297. package/src/analyzers/git-cache.ts +0 -52
  298. package/src/analyzers/git-history.ts +0 -488
  299. package/src/analyzers/index.ts +0 -33
  300. package/src/analyzers/temporal-scorer.ts +0 -227
  301. package/src/anti-patterns.ts +0 -287
  302. package/src/cli.ts +0 -517
  303. package/src/config.ts +0 -123
  304. package/src/diagram.ts +0 -144
  305. package/src/html-reporter.ts +0 -1830
  306. package/src/project-summarizer.ts +0 -521
  307. package/src/refactor-engine.ts +0 -117
  308. package/src/rules/barrel-optimizer.ts +0 -97
  309. package/src/rules/dead-code-detector.ts +0 -132
  310. package/src/rules/hub-splitter.ts +0 -123
  311. package/src/rules/import-organizer.ts +0 -98
  312. package/src/rules/module-grouper.ts +0 -124
  313. package/src/scanner.ts +0 -344
  314. package/src/scorer.ts +0 -254
  315. package/src/types.ts +0 -193
  316. package/tests/agent-generator.test.ts +0 -427
  317. package/tests/analyzers-integration.test.ts +0 -174
  318. package/tests/anti-patterns.test.ts +0 -94
  319. package/tests/context-enricher.test.ts +0 -971
  320. package/tests/fixtures/monorepo/package.json +0 -6
  321. package/tests/fixtures/monorepo/packages/app/package.json +0 -12
  322. package/tests/fixtures/monorepo/packages/app/src/index.ts +0 -6
  323. package/tests/fixtures/monorepo/packages/core/package.json +0 -7
  324. package/tests/fixtures/monorepo/packages/core/src/index.ts +0 -7
  325. package/tests/forecast.test.ts +0 -509
  326. package/tests/framework-detector.test.ts +0 -1172
  327. package/tests/git-history.test.ts +0 -254
  328. package/tests/monorepo-scan.test.ts +0 -170
  329. package/tests/scanner.test.ts +0 -54
  330. package/tests/scorer.test.ts +0 -674
  331. package/tests/stack-detector.test.ts +0 -241
  332. package/tests/template-generation.test.ts +0 -706
  333. package/tests/template-helpers.test.ts +0 -1152
  334. package/tests/temporal-scorer.test.ts +0 -307
  335. /package/dist/{reporter.js → src/adapters/reporter.js} +0 -0
package/dist/scorer.js DELETED
@@ -1,229 +0,0 @@
1
- import { basename } from 'path';
2
- export class ArchitectureScorer {
3
- constructor() {
4
- this.modularity = 0;
5
- this.coupling = 0;
6
- this.cohesion = 0;
7
- this.layering = 0;
8
- }
9
- score(edges, antiPatterns, totalFiles) {
10
- this.calculateModularity(edges, totalFiles);
11
- this.calculateCoupling(edges, totalFiles);
12
- this.calculateCohesion(edges);
13
- this.calculateLayering(antiPatterns, totalFiles);
14
- const components = [
15
- {
16
- name: 'Modularity',
17
- score: Math.round(this.modularity),
18
- maxScore: 100,
19
- weight: 0.4,
20
- explanation: 'Measures appropriate module boundaries and single responsibility principle adherence',
21
- },
22
- {
23
- name: 'Coupling',
24
- score: Math.round(this.coupling),
25
- maxScore: 100,
26
- weight: 0.25,
27
- explanation: 'Evaluates interdependencies between modules; lower coupling is better',
28
- },
29
- {
30
- name: 'Cohesion',
31
- score: Math.round(this.cohesion),
32
- maxScore: 100,
33
- weight: 0.2,
34
- explanation: 'Assesses how closely related functionality is grouped together',
35
- },
36
- {
37
- name: 'Layering',
38
- score: Math.round(this.layering),
39
- maxScore: 100,
40
- weight: 0.15,
41
- explanation: 'Checks adherence to architectural layer separation',
42
- },
43
- ];
44
- const overall = Math.round(components[0].score * components[0].weight +
45
- components[1].score * components[1].weight +
46
- components[2].score * components[2].weight +
47
- components[3].score * components[3].weight);
48
- return {
49
- overall: Math.min(100, Math.max(0, overall)),
50
- components,
51
- breakdown: {
52
- modularity: Math.round(this.modularity),
53
- coupling: Math.round(this.coupling),
54
- cohesion: Math.round(this.cohesion),
55
- layering: Math.round(this.layering),
56
- },
57
- };
58
- }
59
- calculateModularity(edges, totalFiles) {
60
- if (totalFiles === 0) {
61
- this.modularity = 50;
62
- return;
63
- }
64
- const avgEdgesPerFile = edges.length / totalFiles;
65
- if (avgEdgesPerFile < 2) {
66
- this.modularity = 95;
67
- }
68
- else if (avgEdgesPerFile < 4) {
69
- this.modularity = 85;
70
- }
71
- else if (avgEdgesPerFile < 6) {
72
- this.modularity = 70;
73
- }
74
- else if (avgEdgesPerFile < 10) {
75
- this.modularity = 50;
76
- }
77
- else {
78
- this.modularity = 30;
79
- }
80
- }
81
- calculateCoupling(edges, totalFiles) {
82
- if (totalFiles === 0 || totalFiles === 1) {
83
- this.coupling = 50;
84
- return;
85
- }
86
- // Exclude barrel/index files from max-edge calculation —
87
- // they naturally have many connections by design.
88
- const nonBarrelEdges = edges.filter((e) => {
89
- const fromFile = basename(e.from);
90
- const toFile = basename(e.to);
91
- return !ArchitectureScorer.BARREL_FILES.has(fromFile) &&
92
- !ArchitectureScorer.BARREL_FILES.has(toFile);
93
- });
94
- const nodeWithMaxEdges = this.findNodeWithMaxEdges(nonBarrelEdges);
95
- const maxEdgeCount = nodeWithMaxEdges ? nodeWithMaxEdges.count : 0;
96
- // Use non-barrel file count for ratio calculation
97
- const effectiveFiles = Math.max(totalFiles - 1, 1);
98
- const couplingRatio = maxEdgeCount / effectiveFiles;
99
- // More granular thresholds
100
- if (couplingRatio < 0.15) {
101
- this.coupling = 95;
102
- }
103
- else if (couplingRatio < 0.25) {
104
- this.coupling = 85;
105
- }
106
- else if (couplingRatio < 0.35) {
107
- this.coupling = 75;
108
- }
109
- else if (couplingRatio < 0.5) {
110
- this.coupling = 65;
111
- }
112
- else if (couplingRatio < 0.7) {
113
- this.coupling = 50;
114
- }
115
- else if (couplingRatio < 0.85) {
116
- this.coupling = 35;
117
- }
118
- else {
119
- this.coupling = 20;
120
- }
121
- }
122
- findNodeWithMaxEdges(edges) {
123
- const nodeEdgeCount = {};
124
- for (const edge of edges) {
125
- nodeEdgeCount[edge.from] = (nodeEdgeCount[edge.from] || 0) + 1;
126
- nodeEdgeCount[edge.to] = (nodeEdgeCount[edge.to] || 0) + 1;
127
- }
128
- let maxNode = null;
129
- let maxCount = 0;
130
- for (const [node, count] of Object.entries(nodeEdgeCount)) {
131
- if (count > maxCount) {
132
- maxCount = count;
133
- maxNode = node;
134
- }
135
- }
136
- return maxNode ? { node: maxNode, count: maxCount } : null;
137
- }
138
- calculateCohesion(edges) {
139
- if (edges.length === 0) {
140
- this.cohesion = 50;
141
- return;
142
- }
143
- const internalEdges = edges.filter((e) => this.isInternalDependency(e.from, e.to)).length;
144
- const cohesionRatio = internalEdges / edges.length;
145
- // More granular thresholds
146
- if (cohesionRatio > 0.8) {
147
- this.cohesion = 95;
148
- }
149
- else if (cohesionRatio > 0.6) {
150
- this.cohesion = 85;
151
- }
152
- else if (cohesionRatio > 0.45) {
153
- this.cohesion = 75;
154
- }
155
- else if (cohesionRatio > 0.3) {
156
- this.cohesion = 65;
157
- }
158
- else if (cohesionRatio > 0.15) {
159
- this.cohesion = 50;
160
- }
161
- else {
162
- this.cohesion = 30;
163
- }
164
- }
165
- /**
166
- * Determines if a dependency is "internal" (cohesive).
167
- * Two files are considered cohesive if they share the same top-level
168
- * package/directory (e.g., deepguard/cli.py → deepguard/analyzer.py).
169
- * This is crucial for Python flat packages where all files live in
170
- * one directory but ARE cohesive.
171
- */
172
- isInternalDependency(from, to) {
173
- const fromParts = from.split('/');
174
- const toParts = to.split('/');
175
- // If both are in root (no directory), they're cohesive
176
- if (fromParts.length <= 1 && toParts.length <= 1)
177
- return true;
178
- // Compare top-level directory (package name)
179
- // e.g., "deepguard/cli.py" and "deepguard/analyzer.py" → same package
180
- const fromTopLevel = fromParts.length > 1 ? fromParts[0] : '';
181
- const toTopLevel = toParts.length > 1 ? toParts[0] : '';
182
- return fromTopLevel === toTopLevel;
183
- }
184
- calculateLayering(antiPatterns, totalFiles) {
185
- const layeringViolations = antiPatterns.filter((p) => p.name === 'Leaky Abstraction' ||
186
- p.name === 'Shotgun Surgery' ||
187
- p.name === 'Circular Dependency').length;
188
- if (layeringViolations === 0) {
189
- this.layering = 95;
190
- return;
191
- }
192
- // Use ratio-based scoring: violations per 100 files
193
- // This makes scoring fair regardless of project size
194
- const fileCount = Math.max(totalFiles || 50, 10);
195
- const violationRatio = layeringViolations / fileCount;
196
- if (violationRatio < 0.02) {
197
- // < 2% — e.g. 1 violation in 50 files
198
- this.layering = 90;
199
- }
200
- else if (violationRatio < 0.05) {
201
- // < 5% — e.g. 2-3 violations in 50 files
202
- this.layering = 80;
203
- }
204
- else if (violationRatio < 0.1) {
205
- // < 10% — e.g. 5 violations in 50 files
206
- this.layering = 65;
207
- }
208
- else if (violationRatio < 0.2) {
209
- // < 20% — significant issues
210
- this.layering = 50;
211
- }
212
- else if (violationRatio < 0.35) {
213
- this.layering = 35;
214
- }
215
- else {
216
- // > 35% — severe layering problems
217
- this.layering = 20;
218
- }
219
- }
220
- }
221
- /**
222
- * Barrel/index files that naturally have many connections and should be
223
- * excluded from coupling max-edge penalty calculations.
224
- */
225
- ArchitectureScorer.BARREL_FILES = new Set([
226
- '__init__.py', 'index.ts', 'index.js', 'index.tsx', 'index.jsx',
227
- 'mod.rs', '__init__.pyi',
228
- ]);
229
- //# sourceMappingURL=scorer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scorer.js","sourceRoot":"","sources":["../src/scorer.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts DELETED
@@ -1,186 +0,0 @@
1
- export interface FileNode {
2
- path: string;
3
- name: string;
4
- type: 'file' | 'directory';
5
- extension?: string;
6
- lines?: number;
7
- language?: string;
8
- children?: FileNode[];
9
- imports?: string[];
10
- exports?: string[];
11
- }
12
- export interface DependencyEdge {
13
- from: string;
14
- to: string;
15
- type: 'import' | 'export' | 'inheritance' | 'composition';
16
- weight: number;
17
- }
18
- export interface Layer {
19
- name: 'API' | 'Service' | 'Data' | 'UI' | 'Infrastructure';
20
- files: string[];
21
- description: string;
22
- }
23
- export interface AntiPattern {
24
- name: string;
25
- severity: 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW';
26
- location: string;
27
- description: string;
28
- suggestion: string;
29
- affectedFiles?: string[];
30
- metrics?: Record<string, number | string>;
31
- }
32
- export interface ScoreComponent {
33
- name: string;
34
- score: number;
35
- maxScore: number;
36
- weight: number;
37
- explanation: string;
38
- }
39
- export interface ArchitectureScore {
40
- overall: number;
41
- components: ScoreComponent[];
42
- breakdown: {
43
- modularity: number;
44
- coupling: number;
45
- cohesion: number;
46
- layering: number;
47
- };
48
- }
49
- export interface WorkspaceInfo {
50
- name: string;
51
- path: string;
52
- relativePath: string;
53
- description: string;
54
- version: string;
55
- dependencies: Record<string, string>;
56
- devDependencies: Record<string, string>;
57
- bin?: Record<string, string>;
58
- main?: string;
59
- }
60
- export interface ProjectInfo {
61
- path: string;
62
- name: string;
63
- frameworks: string[];
64
- totalFiles: number;
65
- totalLines: number;
66
- primaryLanguages: string[];
67
- fileTree?: FileNode;
68
- workspaces?: WorkspaceInfo[];
69
- }
70
- export interface AnalysisReport {
71
- timestamp: string;
72
- projectInfo: ProjectInfo;
73
- score: ArchitectureScore;
74
- antiPatterns: AntiPattern[];
75
- layers: Layer[];
76
- dependencyGraph: {
77
- nodes: string[];
78
- edges: DependencyEdge[];
79
- };
80
- suggestions: {
81
- priority: 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW';
82
- title: string;
83
- description: string;
84
- impact: string;
85
- }[];
86
- diagram: {
87
- mermaid: string;
88
- type: 'component' | 'layer' | 'dependency';
89
- };
90
- projectSummary?: ProjectSummary;
91
- }
92
- export interface ProjectSummary {
93
- description: string;
94
- purpose: string;
95
- modules: {
96
- name: string;
97
- files: number;
98
- description: string;
99
- }[];
100
- techStack: string[];
101
- entryPoints: string[];
102
- keywords: string[];
103
- }
104
- export interface ArchitectConfig {
105
- ignore?: string[];
106
- frameworks?: {
107
- detect?: boolean;
108
- };
109
- antiPatterns?: {
110
- godClass?: {
111
- linesThreshold?: number;
112
- methodsThreshold?: number;
113
- };
114
- shotgunSurgery?: {
115
- changePropagationThreshold?: number;
116
- };
117
- };
118
- score?: {
119
- modularity?: number;
120
- coupling?: number;
121
- cohesion?: number;
122
- layering?: number;
123
- };
124
- monorepo?: {
125
- enabled?: boolean;
126
- treatPackagesAsModules?: boolean;
127
- };
128
- }
129
- export interface ParsedImport {
130
- source: string;
131
- names: string[];
132
- isDefault: boolean;
133
- isNamespace: boolean;
134
- }
135
- export interface RefactoringPlan {
136
- timestamp: string;
137
- projectPath: string;
138
- currentScore: ArchitectureScore;
139
- estimatedScoreAfter: {
140
- overall: number;
141
- breakdown: Record<string, number>;
142
- };
143
- steps: RefactorStep[];
144
- totalOperations: number;
145
- tier1Steps: number;
146
- tier2Steps: number;
147
- }
148
- export interface RefactorStep {
149
- id: number;
150
- tier: 1 | 2;
151
- rule: string;
152
- priority: 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW';
153
- title: string;
154
- description: string;
155
- rationale: string;
156
- operations: FileOperation[];
157
- scoreImpact: {
158
- metric: string;
159
- before: number;
160
- after: number;
161
- }[];
162
- codePreview?: string;
163
- }
164
- export interface FileOperation {
165
- type: 'CREATE' | 'MOVE' | 'MODIFY' | 'DELETE';
166
- path: string;
167
- newPath?: string;
168
- content?: string;
169
- diff?: string;
170
- description: string;
171
- }
172
- export interface CodeSymbol {
173
- name: string;
174
- type: 'function' | 'class' | 'variable' | 'import' | 'export';
175
- startLine: number;
176
- endLine: number;
177
- lines: number;
178
- dependencies: string[];
179
- usedBy: string[];
180
- }
181
- export interface RefactorRule {
182
- name: string;
183
- tier: 1 | 2;
184
- analyze(report: AnalysisReport, projectPath: string): RefactorStep[];
185
- }
186
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js DELETED
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
package/dist/types.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -1,207 +0,0 @@
1
- # Architecture Analysis Report
2
-
3
- Generated: 2026-03-15 14:23:45
4
- Project: ecommerce-api
5
- Path: /projects/ecommerce-api
6
-
7
- ## Project Summary
8
-
9
- | Metric | Value |
10
- |--------|-------|
11
- | Total Files | 147 |
12
- | Lines of Code | 24,583 |
13
- | Primary Languages | TypeScript, Python |
14
- | Frameworks | Express.js, React, PostgreSQL |
15
-
16
- ## Architecture Quality Score
17
-
18
- ### Overall Score: **72/100**
19
-
20
- Component Breakdown:
21
-
22
- - **Modularity**: 78/100 (weight: 40%)
23
- Measures appropriate module boundaries and single responsibility principle adherence
24
-
25
- - **Coupling**: 65/100 (weight: 25%)
26
- Evaluates interdependencies between modules; lower coupling is better
27
-
28
- - **Cohesion**: 72/100 (weight: 20%)
29
- Assesses how closely related functionality is grouped together
30
-
31
- - **Layering**: 68/100 (weight: 15%)
32
- Checks adherence to architectural layer separation
33
-
34
- ## Anti-Patterns Detected
35
-
36
- Found **3** anti-pattern(s):
37
-
38
- ### X God Class [CRITICAL]
39
-
40
- **Location**: `src/services/UserManager.ts`
41
-
42
- **Description**: Class with 834 lines and 16 methods violates single responsibility principle
43
-
44
- **Suggestion**: Consider splitting into smaller, focused classes with specific responsibilities
45
-
46
- **Metrics**:
47
- - lines: 834
48
- - methods: 16
49
-
50
- ### W Circular Dependency [HIGH]
51
-
52
- **Location**: src/utils/auth.ts -> src/services/cache.ts -> src/utils/auth.ts
53
-
54
- **Description**: Circular dependency detected: auth.ts -> cache.ts -> auth.ts
55
-
56
- **Suggestion**: Refactor code to break the circular dependency using dependency injection or intermediate abstractions
57
-
58
- ### o Leaky Abstraction [MEDIUM]
59
-
60
- **Location**: `src/models/Database.ts`
61
-
62
- **Description**: Exports 12 internal types that should be private
63
-
64
- **Suggestion**: Use private/internal access modifiers and facade patterns to hide implementation details
65
-
66
- **Metrics**:
67
- - exportedInternalTypes: 12
68
-
69
- ## Architectural Layers
70
-
71
- ### API Layer
72
-
73
- Handles external interfaces and routing
74
-
75
- **Files**: 12
76
- ```
77
- src/routes/users.ts
78
- src/routes/products.ts
79
- src/routes/orders.ts
80
- src/routes/auth.ts
81
- src/middleware/errorHandler.ts
82
- ... and 7 more files
83
- ```
84
-
85
- ### Service Layer
86
-
87
- Business logic and orchestration
88
-
89
- **Files**: 34
90
- ```
91
- src/services/UserService.ts
92
- src/services/ProductService.ts
93
- src/services/OrderService.ts
94
- src/services/PaymentService.ts
95
- src/services/NotificationService.ts
96
- ... and 29 more files
97
- ```
98
-
99
- ### Data Layer
100
-
101
- Database access and persistence
102
-
103
- **Files**: 18
104
- ```
105
- src/repositories/UserRepository.ts
106
- src/repositories/ProductRepository.ts
107
- src/repositories/OrderRepository.ts
108
- src/models/User.ts
109
- src/models/Product.ts
110
- ... and 13 more files
111
- ```
112
-
113
- ### UI Layer
114
-
115
- User interface components and views
116
-
117
- **Files**: 42
118
- ```
119
- src/components/Header.tsx
120
- src/components/ProductCard.tsx
121
- src/components/CartItem.tsx
122
- src/pages/Home.tsx
123
- src/pages/Product.tsx
124
- ... and 37 more files
125
- ```
126
-
127
- ### Infrastructure Layer
128
-
129
- Configuration and setup
130
-
131
- **Files**: 8
132
- ```
133
- config/database.ts
134
- config/logging.ts
135
- config/cache.ts
136
- scripts/migrate.ts
137
- docker-compose.yml
138
- ... and 3 more files
139
- ```
140
-
141
- ## Architecture Diagram
142
-
143
- Type: layer
144
-
145
- ```mermaid
146
- graph LR
147
- UI["UI<br/>(42 files)"]:::uiStyle
148
- API["API<br/>(12 files)"]:::apiStyle
149
- Service["Service<br/>(34 files)"]:::serviceStyle
150
- Data["Data<br/>(18 files)"]:::dataStyle
151
- Infrastructure["Infrastructure<br/>(8 files)"]:::infraStyle
152
-
153
- UI --> API
154
- API --> Service
155
- Service --> Data
156
- Data --> Infrastructure
157
-
158
- classDef apiStyle fill:#FFB6C1,stroke:#333,color:#000
159
- classDef serviceStyle fill:#87CEEB,stroke:#333,color:#000
160
- classDef dataStyle fill:#90EE90,stroke:#333,color:#000
161
- classDef uiStyle fill:#FFD700,stroke:#333,color:#000
162
- classDef infraStyle fill:#D3D3D3,stroke:#333,color:#000
163
- ```
164
-
165
- ## Refactoring Suggestions
166
-
167
- ### CRITICAL Priority
168
-
169
- 1. **God Class**
170
- Split UserManager into Repository, Service, and Manager classes following single responsibility principle
171
- Impact: Addressing this God Class will improve overall architecture score
172
-
173
- ### HIGH Priority
174
-
175
- 1. **Circular Dependency**
176
- Break circular dependency between auth and cache modules using dependency inversion
177
- Impact: Addressing this Circular Dependency will improve overall architecture score
178
-
179
- 2. **Reduce Coupling**
180
- Use dependency injection and invert control to reduce module interdependencies
181
- Impact: Can improve coupling score by 15-20 points
182
-
183
- ### MEDIUM Priority
184
-
185
- 1. **Leaky Abstraction**
186
- Hide internal database types behind facade pattern
187
- Impact: Addressing this Leaky Abstraction will improve overall architecture score
188
-
189
- 2. **Improve Cohesion**
190
- Group related functionality closer together; consider extracting utility modules
191
- Impact: Can improve cohesion score by 10-15 points
192
-
193
- ---
194
-
195
- ## Key Takeaways
196
-
197
- This e-commerce API demonstrates a reasonable architectural foundation with good modularity and separation of concerns. The main areas for improvement are:
198
-
199
- 1. Breaking down the oversized UserManager class (critical issue)
200
- 2. Resolving circular dependencies in the utility and cache modules
201
- 3. Tightening module coupling through better dependency management
202
- 4. Hiding internal implementation details from public APIs
203
-
204
- Implementing these suggestions could bring the overall score from 72/100 to approximately 85-90/100, achieving a highly maintainable and scalable architecture.
205
-
206
- **Estimated Effort**: 3-4 weeks for a team of 2-3 developers
207
- **Expected ROI**: Significantly improved code maintainability, reduced future technical debt, easier testing
package/jest.config.js DELETED
@@ -1,18 +0,0 @@
1
- /** @type {import('ts-jest').JestConfigWithTsJest} */
2
- export default {
3
- preset: 'ts-jest/presets/default-esm',
4
- testEnvironment: 'node',
5
- extensionsToTreatAsEsm: ['.ts'],
6
- moduleNameMapper: {
7
- '^(\\.{1,2}/.*)\\.js$': '$1',
8
- },
9
- transform: {
10
- '^.+\\.tsx?$': [
11
- 'ts-jest',
12
- {
13
- useESM: true,
14
- },
15
- ],
16
- },
17
- testMatch: ['**/tests/**/*.test.ts'],
18
- };