@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/src/cli.ts DELETED
@@ -1,517 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * Architect CLI v3.1
5
- * Enterprise Architecture Analysis — @girardelli/architect
6
- *
7
- * Uso:
8
- * npx architect analyze ./src
9
- * npx architect analyze ./src --format html --output report.html
10
- * npx architect diagram ./src
11
- * npx architect score ./src
12
- * npx architect anti-patterns ./src
13
- */
14
-
15
- import { architect, ProgressEvent } from './index.js';
16
- import { ReportGenerator } from './reporter.js';
17
- import { HtmlReportGenerator } from './html-reporter.js';
18
- import { RefactorReportGenerator } from './refactor-reporter.js';
19
- import { writeFileSync } from 'fs';
20
- import { resolve, basename } from 'path';
21
-
22
- type OutputFormat = 'json' | 'markdown' | 'html';
23
-
24
- interface CliOptions {
25
- command: string;
26
- path: string;
27
- format: OutputFormat;
28
- output?: string;
29
- }
30
-
31
- // ── ANSI Colors & Styles ──
32
- const c = {
33
- reset: '\x1b[0m',
34
- bold: '\x1b[1m',
35
- dim: '\x1b[2m',
36
- italic: '\x1b[3m',
37
- // Colors
38
- red: '\x1b[38;5;196m',
39
- green: '\x1b[38;5;46m',
40
- blue: '\x1b[38;5;33m',
41
- cyan: '\x1b[38;5;51m',
42
- yellow: '\x1b[38;5;220m',
43
- magenta: '\x1b[38;5;201m',
44
- orange: '\x1b[38;5;208m',
45
- white: '\x1b[38;5;255m',
46
- gray: '\x1b[38;5;240m',
47
- darkGray: '\x1b[38;5;236m',
48
- // Bg
49
- bgBlue: '\x1b[48;5;17m',
50
- bgGreen: '\x1b[48;5;22m',
51
- bgRed: '\x1b[48;5;52m',
52
- bgCyan: '\x1b[48;5;23m',
53
- };
54
-
55
- // ── Phase config ──
56
- interface PhaseConfig {
57
- icon: string;
58
- label: string;
59
- verb: string;
60
- color: string;
61
- }
62
-
63
- const PHASES: Record<string, PhaseConfig> = {
64
- scan: { icon: '◉', label: 'FILE SCANNER', verb: 'Scanning filesystem', color: c.cyan },
65
- dependencies: { icon: '◉', label: 'DEPENDENCY MAPPER', verb: 'Mapping import graph', color: c.blue },
66
- layers: { icon: '◉', label: 'LAYER DETECTOR', verb: 'Classifying architecture', color: c.magenta },
67
- antipatterns: { icon: '◉', label: 'PATTERN ANALYZER', verb: 'Detecting anti-patterns', color: c.orange },
68
- scoring: { icon: '◉', label: 'QUALITY ENGINE', verb: 'Computing quality metrics', color: c.yellow },
69
- normalize: { icon: '◉', label: 'PATH NORMALIZER', verb: 'Normalizing paths', color: c.gray },
70
- summarize: { icon: '◉', label: 'AI SUMMARIZER', verb: 'Generating project summary', color: c.green },
71
- };
72
-
73
- const PHASE_ORDER = ['scan', 'dependencies', 'layers', 'antipatterns', 'scoring', 'normalize', 'summarize'];
74
-
75
- /**
76
- * Enterprise-Grade Progress Reporter
77
- * Real-time phase tracking with visual feedback
78
- */
79
- class ProgressReporter {
80
- private startTime: number;
81
- private phaseStart: number = 0;
82
- private completedPhases: string[] = [];
83
- private totalPhases: number;
84
- private scanMetrics: Record<string, number | string> = {};
85
-
86
- constructor() {
87
- this.startTime = Date.now();
88
- this.totalPhases = PHASE_ORDER.length;
89
- }
90
-
91
- /** Print the stylized header */
92
- printHeader(projectPath: string): void {
93
- const name = basename(projectPath);
94
- const w = process.stderr;
95
-
96
- w.write('\n');
97
- w.write(`${c.darkGray} ┌─────────────────────────────────────────────────────────────────┐${c.reset}\n`);
98
- w.write(`${c.darkGray} │${c.reset} ${c.cyan}${c.bold}⚡ ARCHITECT v3.1${c.reset} ${c.dim}Enterprise Architecture Intelligence${c.reset} ${c.darkGray}│${c.reset}\n`);
99
- w.write(`${c.darkGray} │${c.reset} ${c.dim}@girardelli/architect — powered by Girardelli Tecnologia${c.reset} ${c.darkGray}│${c.reset}\n`);
100
- w.write(`${c.darkGray} └─────────────────────────────────────────────────────────────────┘${c.reset}\n`);
101
- w.write('\n');
102
- w.write(` ${c.dim}Target:${c.reset} ${c.white}${c.bold}${name}${c.reset}\n`);
103
- w.write(` ${c.dim}Path:${c.reset} ${c.gray}${projectPath}${c.reset}\n`);
104
- w.write('\n');
105
- w.write(` ${c.dim}──── Analysis Pipeline ────────────────────────────────────────${c.reset}\n`);
106
- w.write('\n');
107
- }
108
-
109
- /** Handle a progress event from the analyzer */
110
- onProgress(event: ProgressEvent): void {
111
- const phase = PHASES[event.phase];
112
- if (!phase) return;
113
-
114
- if (event.status === 'start') {
115
- this.phaseStart = Date.now();
116
- this.printPhaseStart(event.phase, phase);
117
- } else if (event.status === 'complete') {
118
- this.completedPhases.push(event.phase);
119
- this.printPhaseComplete(event.phase, phase, event.metrics);
120
- if (event.metrics) {
121
- Object.assign(this.scanMetrics, event.metrics);
122
- }
123
- }
124
- }
125
-
126
- private printPhaseStart(key: string, phase: PhaseConfig): void {
127
- const idx = PHASE_ORDER.indexOf(key) + 1;
128
- const bar = this.buildProgressBar(this.completedPhases.length, this.totalPhases);
129
- process.stderr.write(
130
- ` ${c.dim}[${idx}/${this.totalPhases}]${c.reset} ${phase.color}${phase.icon}${c.reset} ${c.bold}${phase.label}${c.reset} ${c.dim}— ${phase.verb}...${c.reset} ${bar}\n`
131
- );
132
- }
133
-
134
- private printPhaseComplete(key: string, phase: PhaseConfig, metrics?: Record<string, number | string>): void {
135
- const elapsed = Date.now() - this.phaseStart;
136
- const metricStr = metrics ? this.formatMetrics(key, metrics) : '';
137
- process.stderr.write(
138
- ` ${c.dim} └─${c.reset} ${c.green}✓${c.reset} ${c.dim}${this.formatTime(elapsed)}${c.reset}${metricStr}\n`
139
- );
140
- }
141
-
142
- private formatMetrics(phase: string, m: Record<string, number | string>): string {
143
- const parts: string[] = [];
144
- switch (phase) {
145
- case 'scan':
146
- parts.push(`${c.white}${m.files}${c.reset}${c.dim} files${c.reset}`);
147
- parts.push(`${c.white}${Number(m.lines).toLocaleString()}${c.reset}${c.dim} lines${c.reset}`);
148
- parts.push(`${c.white}${m.languages}${c.reset}${c.dim} langs${c.reset}`);
149
- break;
150
- case 'dependencies':
151
- parts.push(`${c.white}${m.edges}${c.reset}${c.dim} edges${c.reset}`);
152
- parts.push(`${c.white}${m.modules}${c.reset}${c.dim} modules${c.reset}`);
153
- break;
154
- case 'layers':
155
- parts.push(`${c.white}${m.layers}${c.reset}${c.dim} layers${c.reset}`);
156
- parts.push(`${c.white}${m.classified}${c.reset}${c.dim} classified${c.reset}`);
157
- break;
158
- case 'antipatterns':
159
- if (Number(m.total) === 0) {
160
- parts.push(`${c.green}clean${c.reset}`);
161
- } else {
162
- parts.push(`${c.yellow}${m.total}${c.reset}${c.dim} found${c.reset}`);
163
- if (Number(m.critical) > 0) parts.push(`${c.red}${m.critical} critical${c.reset}`);
164
- if (Number(m.high) > 0) parts.push(`${c.orange}${m.high} high${c.reset}`);
165
- }
166
- break;
167
- case 'scoring': {
168
- const overall = Number(m.overall);
169
- const scoreColor = overall >= 80 ? c.green : overall >= 60 ? c.yellow : c.red;
170
- parts.push(`${scoreColor}${c.bold}${overall}/100${c.reset}`);
171
- parts.push(`${c.dim}M:${m.modularity} C:${m.coupling} Co:${m.cohesion} L:${m.layering}${c.reset}`);
172
- break;
173
- }
174
- case 'summarize':
175
- parts.push(`${c.white}${m.modules}${c.reset}${c.dim} modules${c.reset}`);
176
- parts.push(`${c.white}${m.techStack}${c.reset}${c.dim} technologies${c.reset}`);
177
- break;
178
- }
179
- return parts.length ? ` ${c.dim}│${c.reset} ${parts.join(`${c.dim} · ${c.reset}`)}` : '';
180
- }
181
-
182
- private buildProgressBar(done: number, total: number): string {
183
- const width = 20;
184
- const filled = Math.round((done / total) * width);
185
- const empty = width - filled;
186
- const pct = Math.round((done / total) * 100);
187
- const bar = `${c.cyan}${'█'.repeat(filled)}${c.darkGray}${'░'.repeat(empty)}${c.reset}`;
188
- return `${c.dim}[${c.reset}${bar}${c.dim}]${c.reset} ${c.dim}${pct}%${c.reset}`;
189
- }
190
-
191
- private formatTime(ms: number): string {
192
- if (ms < 1000) return `${ms}ms`;
193
- return `${(ms / 1000).toFixed(1)}s`;
194
- }
195
-
196
- /** Print extra phase for refactor/agents/report generation */
197
- printExtraPhase(label: string, verb: string, color: string = c.cyan): void {
198
- this.phaseStart = Date.now();
199
- const idx = this.completedPhases.length + 1;
200
- process.stderr.write(
201
- ` ${c.dim}[${idx}/—]${c.reset} ${color}◉${c.reset} ${c.bold}${label}${c.reset} ${c.dim}— ${verb}...${c.reset}\n`
202
- );
203
- }
204
-
205
- printExtraComplete(detail: string): void {
206
- const elapsed = Date.now() - this.phaseStart;
207
- process.stderr.write(
208
- ` ${c.dim} └─${c.reset} ${c.green}✓${c.reset} ${c.dim}${this.formatTime(elapsed)}${c.reset} ${detail}\n`
209
- );
210
- }
211
-
212
- /** Final summary with score visualization */
213
- printSummary(score: number, breakdown: Record<string, number>, stats: {
214
- files: number; lines: number; antiPatterns: number;
215
- refactorSteps?: number; refactorOps?: number; agents?: number;
216
- }): void {
217
- const totalTime = Date.now() - this.startTime;
218
- const w = process.stderr;
219
-
220
- w.write('\n');
221
- w.write(` ${c.dim}──── Results ──────────────────────────────────────────────────${c.reset}\n`);
222
- w.write('\n');
223
-
224
- // Score meter
225
- const scoreColor = score >= 80 ? c.green : score >= 60 ? c.yellow : c.red;
226
- const meterWidth = 40;
227
- const filled = Math.round((score / 100) * meterWidth);
228
- const meter = `${scoreColor}${'━'.repeat(filled)}${c.darkGray}${'━'.repeat(meterWidth - filled)}${c.reset}`;
229
- const grade = score >= 90 ? 'A+' : score >= 80 ? 'A' : score >= 70 ? 'B' : score >= 60 ? 'C' : score >= 50 ? 'D' : 'F';
230
-
231
- w.write(` ${c.bold} ARCHITECTURE SCORE${c.reset}\n`);
232
- w.write(` ${meter} ${scoreColor}${c.bold}${score}/100${c.reset} ${c.dim}(${grade})${c.reset}\n`);
233
- w.write('\n');
234
- w.write(` ${c.dim} Modularity${c.reset} ${this.miniBar(breakdown.modularity)} ${c.white}${breakdown.modularity}${c.reset}\n`);
235
- w.write(` ${c.dim} Coupling${c.reset} ${this.miniBar(breakdown.coupling)} ${c.white}${breakdown.coupling}${c.reset}\n`);
236
- w.write(` ${c.dim} Cohesion${c.reset} ${this.miniBar(breakdown.cohesion)} ${c.white}${breakdown.cohesion}${c.reset}\n`);
237
- w.write(` ${c.dim} Layering${c.reset} ${this.miniBar(breakdown.layering)} ${c.white}${breakdown.layering}${c.reset}\n`);
238
- w.write('\n');
239
-
240
- // Stats line
241
- w.write(` ${c.cyan}📁${c.reset} ${c.white}${stats.files}${c.reset}${c.dim} files${c.reset}`);
242
- w.write(` ${c.cyan}📝${c.reset} ${c.white}${stats.lines.toLocaleString()}${c.reset}${c.dim} lines${c.reset}`);
243
- w.write(` ${c.cyan}⚠️${c.reset} ${c.white}${stats.antiPatterns}${c.reset}${c.dim} anti-patterns${c.reset}`);
244
- if (stats.refactorSteps !== undefined) {
245
- w.write(` ${c.cyan}🔧${c.reset} ${c.white}${stats.refactorSteps}${c.reset}${c.dim} steps${c.reset}`);
246
- }
247
- if (stats.agents !== undefined) {
248
- w.write(` ${c.cyan}🤖${c.reset} ${c.white}${stats.agents}${c.reset}${c.dim} agents${c.reset}`);
249
- }
250
- w.write('\n');
251
-
252
- // Timing
253
- w.write(`\n ${c.dim}⏱ Completed in ${this.formatTime(totalTime)}${c.reset}\n`);
254
- w.write('\n');
255
- }
256
-
257
- private miniBar(value: number): string {
258
- const w = 15;
259
- const f = Math.round((value / 100) * w);
260
- const color = value >= 80 ? c.green : value >= 60 ? c.yellow : c.red;
261
- return `${color}${'▓'.repeat(f)}${c.darkGray}${'░'.repeat(w - f)}${c.reset}`;
262
- }
263
- }
264
-
265
- // ── CLI Parsing ──
266
-
267
- function parseArgs(args: string[]): CliOptions {
268
- const command = args[0] || 'analyze';
269
- const pathArg = args.find((a) => !a.startsWith('--') && a !== command) || '.';
270
- const formatIdx = args.indexOf('--format');
271
- const format = (formatIdx >= 0 ? args[formatIdx + 1] : 'html') as OutputFormat;
272
- const outputIdx = args.indexOf('--output');
273
- const output = outputIdx >= 0 ? args[outputIdx + 1] : undefined;
274
-
275
- return { command, path: resolve(pathArg), format, output };
276
- }
277
-
278
- function printUsage(): void {
279
- console.log(`
280
- ${c.cyan}${c.bold}⚡ Architect v3.1${c.reset} — Enterprise Architecture Intelligence
281
-
282
- ${c.bold}Usage:${c.reset}
283
- architect <command> [path] [options]
284
-
285
- ${c.bold}Commands:${c.reset}
286
- ${c.cyan}analyze${c.reset} Full architecture analysis (default)
287
- ${c.cyan}refactor${c.reset} Generate refactoring plan with actionable steps
288
- ${c.cyan}agents${c.reset} Generate/audit .agent/ directory with AI agents
289
- ${c.cyan}diagram${c.reset} Generate architecture diagram only
290
- ${c.cyan}score${c.reset} Calculate quality score only
291
- ${c.cyan}anti-patterns${c.reset} Detect anti-patterns only
292
- ${c.cyan}layers${c.reset} Analyze layer structure only
293
-
294
- ${c.bold}Options:${c.reset}
295
- --format <type> Output format: html, json, markdown (default: html)
296
- --output <file> Output file path
297
- --help Show this help message
298
-
299
- ${c.bold}Examples:${c.reset}
300
- ${c.dim}$${c.reset} architect analyze ./src
301
- ${c.dim}$${c.reset} architect analyze ./src --format html --output report.html
302
- ${c.dim}$${c.reset} architect score ./src --format json
303
-
304
- ${c.dim}@girardelli/architect — Girardelli Tecnologia${c.reset}
305
- `);
306
- }
307
-
308
- async function main(): Promise<void> {
309
- const args = process.argv.slice(2);
310
-
311
- if (args.includes('--help') || args.includes('-h') || args.length === 0) {
312
- printUsage();
313
- process.exit(0);
314
- }
315
-
316
- const options = parseArgs(args);
317
-
318
- try {
319
- switch (options.command) {
320
- case 'analyze': {
321
- const progress = new ProgressReporter();
322
- progress.printHeader(options.path);
323
-
324
- const report = await architect.analyze(options.path, (e) => progress.onProgress(e));
325
-
326
- // Refactoring
327
- progress.printExtraPhase('REFACTOR ENGINE', 'Building refactoring plan', c.orange);
328
- const plan = architect.refactor(report, options.path);
329
- progress.printExtraComplete(
330
- `${c.white}${plan.steps.length}${c.reset}${c.dim} steps · ${c.reset}${c.white}${plan.totalOperations}${c.reset}${c.dim} operations · est. +${plan.estimatedScoreAfter.overall - plan.currentScore.overall} pts${c.reset}`
331
- );
332
-
333
- // Agent suggestion
334
- progress.printExtraPhase('AGENT SYSTEM', 'Analyzing agent requirements', c.magenta);
335
- const agentSuggestion = architect.suggestAgents(report, plan, options.path);
336
- progress.printExtraComplete(
337
- `${c.white}${agentSuggestion.suggestedAgents.length}${c.reset}${c.dim} agents suggested${agentSuggestion.hasExistingAgents ? ' (existing .agent/ audited)' : ''}${c.reset}`
338
- );
339
-
340
- const projectName = report.projectInfo.name || basename(options.path);
341
-
342
- // Report generation
343
- if (options.format === 'html') {
344
- progress.printExtraPhase('REPORT BUILDER', 'Generating interactive HTML report', c.cyan);
345
- const htmlGenerator = new HtmlReportGenerator();
346
- const html = htmlGenerator.generateHtml(report, plan, agentSuggestion);
347
- const outputPath = options.output || `architect-report-${projectName}.html`;
348
- writeFileSync(outputPath, html);
349
- progress.printExtraComplete(`${c.green}${outputPath}${c.reset}`);
350
- } else if (options.format === 'markdown') {
351
- progress.printExtraPhase('REPORT BUILDER', 'Generating Markdown report', c.cyan);
352
- const mdGenerator = new ReportGenerator();
353
- const markdown = mdGenerator.generateMarkdownReport(report);
354
- const outputPath = options.output || `architect-report-${projectName}.md`;
355
- writeFileSync(outputPath, markdown);
356
- progress.printExtraComplete(`${c.green}${outputPath}${c.reset}`);
357
- } else {
358
- progress.printExtraPhase('REPORT BUILDER', 'Generating JSON report', c.cyan);
359
- const outputPath = options.output || `architect-report-${projectName}.json`;
360
- writeFileSync(outputPath, JSON.stringify({ report, plan, agentSuggestion }, null, 2));
361
- progress.printExtraComplete(`${c.green}${outputPath}${c.reset}`);
362
- }
363
-
364
- // Summary
365
- progress.printSummary(report.score.overall, report.score.breakdown, {
366
- files: report.projectInfo.totalFiles,
367
- lines: report.projectInfo.totalLines,
368
- antiPatterns: report.antiPatterns.length,
369
- refactorSteps: plan.steps.length,
370
- refactorOps: plan.totalOperations,
371
- agents: agentSuggestion.suggestedAgents.length,
372
- });
373
- break;
374
- }
375
-
376
- case 'refactor': {
377
- const progress = new ProgressReporter();
378
- progress.printHeader(options.path);
379
-
380
- const report = await architect.analyze(options.path, (e) => progress.onProgress(e));
381
-
382
- progress.printExtraPhase('REFACTOR ENGINE', 'Building refactoring plan', c.orange);
383
- const plan = architect.refactor(report, options.path);
384
- const projectName = report.projectInfo.name || basename(options.path);
385
-
386
- if (options.format === 'json') {
387
- const outputPath = options.output || `refactor-plan-${projectName}.json`;
388
- writeFileSync(outputPath, JSON.stringify(plan, null, 2));
389
- progress.printExtraComplete(`${c.green}${outputPath}${c.reset}`);
390
- } else {
391
- const refactorReporter = new RefactorReportGenerator();
392
- const html = refactorReporter.generateHtml(plan);
393
- const outputPath = options.output || `refactor-plan-${projectName}.html`;
394
- writeFileSync(outputPath, html);
395
- progress.printExtraComplete(`${c.green}${outputPath}${c.reset}`);
396
- }
397
-
398
- process.stderr.write(`\n ${c.bold}REFACTORING PLAN${c.reset}\n`);
399
- process.stderr.write(` ${c.dim}Steps:${c.reset} ${c.white}${plan.steps.length}${c.reset} ${c.dim}Ops:${c.reset} ${c.white}${plan.totalOperations}${c.reset} ${c.dim}Tier1:${c.reset} ${c.white}${plan.tier1Steps}${c.reset} ${c.dim}Tier2:${c.reset} ${c.white}${plan.tier2Steps}${c.reset}\n`);
400
- process.stderr.write(` ${c.dim}Score:${c.reset} ${c.white}${plan.currentScore.overall}${c.reset}${c.dim} → ${c.reset}${c.green}${plan.estimatedScoreAfter.overall}${c.reset} ${c.dim}(+${plan.estimatedScoreAfter.overall - plan.currentScore.overall})${c.reset}\n\n`);
401
- break;
402
- }
403
-
404
- case 'agents': {
405
- const progress = new ProgressReporter();
406
- progress.printHeader(options.path);
407
-
408
- const report = await architect.analyze(options.path, (e) => progress.onProgress(e));
409
-
410
- progress.printExtraPhase('REFACTOR ENGINE', 'Building refactoring plan', c.orange);
411
- const plan = architect.refactor(report, options.path);
412
- progress.printExtraComplete(`${c.white}${plan.steps.length}${c.reset}${c.dim} steps${c.reset}`);
413
-
414
- progress.printExtraPhase('AGENT GENERATOR', 'Generating .agent/ framework', c.magenta);
415
- const outputDir = options.output || undefined;
416
- const result = architect.agents(report, plan, options.path, outputDir);
417
- progress.printExtraComplete(`${c.white}${result.generated.length}${c.reset}${c.dim} files generated${c.reset}`);
418
-
419
- process.stderr.write(`\n ${c.bold}🤖 AGENT SYSTEM${c.reset}\n\n`);
420
-
421
- if (result.generated.length > 0) {
422
- process.stderr.write(` ${c.green}Generated:${c.reset}\n`);
423
- for (const file of result.generated) {
424
- process.stderr.write(` ${c.dim} 📄${c.reset} ${file}\n`);
425
- }
426
- }
427
-
428
- if (result.audit.length > 0) {
429
- const missing = result.audit.filter(f => f.type === 'MISSING');
430
- const improvements = result.audit.filter(f => f.type === 'IMPROVEMENT');
431
- const ok = result.audit.filter(f => f.type === 'OK');
432
-
433
- if (ok.length > 0) process.stderr.write(`\n ${c.green}✓ ${ok.length} checks passed${c.reset}\n`);
434
- if (missing.length > 0) {
435
- process.stderr.write(`\n ${c.red}✗ ${missing.length} missing (auto-generated):${c.reset}\n`);
436
- for (const f of missing) process.stderr.write(` ${c.dim}📄${c.reset} ${f.file} — ${f.description}\n`);
437
- }
438
- if (improvements.length > 0) {
439
- process.stderr.write(`\n ${c.yellow}💡 ${improvements.length} improvements:${c.reset}\n`);
440
- for (const f of improvements) {
441
- process.stderr.write(` ${c.dim}⚡${c.reset} ${f.description}\n`);
442
- if (f.suggestion) process.stderr.write(` ${c.dim}→ ${f.suggestion}${c.reset}\n`);
443
- }
444
- }
445
- }
446
- process.stderr.write(`\n ${c.dim}Score: ${report.score.overall}/100${c.reset}\n\n`);
447
- break;
448
- }
449
-
450
- case 'diagram': {
451
- const diagram = await architect.diagram(options.path);
452
- if (options.output) {
453
- writeFileSync(options.output, diagram);
454
- process.stderr.write(` ${c.green}✓${c.reset} Diagram saved: ${options.output}\n`);
455
- } else {
456
- console.log(diagram);
457
- }
458
- break;
459
- }
460
-
461
- case 'score': {
462
- const score = await architect.score(options.path);
463
- if (options.format === 'json') {
464
- console.log(JSON.stringify(score, null, 2));
465
- } else {
466
- const scoreColor = score.overall >= 80 ? c.green : score.overall >= 60 ? c.yellow : c.red;
467
- process.stderr.write(`\n ${c.bold}ARCHITECTURE SCORE${c.reset}\n`);
468
- process.stderr.write(` ${scoreColor}${c.bold}${score.overall}/100${c.reset}\n\n`);
469
- for (const [name, value] of Object.entries(score.breakdown)) {
470
- process.stderr.write(` ${c.dim}${name}:${c.reset} ${c.white}${value}${c.reset}\n`);
471
- }
472
- process.stderr.write('\n');
473
- }
474
- break;
475
- }
476
-
477
- case 'anti-patterns': {
478
- const patterns = await architect.antiPatterns(options.path);
479
- if (options.format === 'json') {
480
- console.log(JSON.stringify(patterns, null, 2));
481
- } else {
482
- process.stderr.write(`\n ${c.bold}ANTI-PATTERNS${c.reset} — ${patterns.length} found\n\n`);
483
- for (const p of patterns) {
484
- const sevColor = p.severity === 'CRITICAL' ? c.red : p.severity === 'HIGH' ? c.orange : c.yellow;
485
- process.stderr.write(` ${sevColor}[${p.severity}]${c.reset} ${c.bold}${p.name}${c.reset}: ${p.description}\n`);
486
- }
487
- process.stderr.write('\n');
488
- }
489
- break;
490
- }
491
-
492
- case 'layers': {
493
- const layers = await architect.layers(options.path);
494
- if (options.format === 'json') {
495
- console.log(JSON.stringify(layers, null, 2));
496
- } else {
497
- process.stderr.write(`\n ${c.bold}ARCHITECTURE LAYERS${c.reset}\n\n`);
498
- for (const l of layers) {
499
- process.stderr.write(` ${c.cyan}${l.name}${c.reset}: ${c.white}${l.files.length}${c.reset} files\n`);
500
- }
501
- process.stderr.write('\n');
502
- }
503
- break;
504
- }
505
-
506
- default:
507
- console.error(`${c.red}✗${c.reset} Unknown command: ${options.command}`);
508
- printUsage();
509
- process.exit(1);
510
- }
511
- } catch (error) {
512
- process.stderr.write(`\n ${c.red}${c.bold}✗ ERROR${c.reset}: ${error instanceof Error ? error.message : error}\n\n`);
513
- process.exit(1);
514
- }
515
- }
516
-
517
- main();
package/src/config.ts DELETED
@@ -1,123 +0,0 @@
1
- import { readFileSync } from 'fs';
2
- import { join } from 'path';
3
- import { ArchitectConfig } from './types.js';
4
-
5
- const DEFAULT_CONFIG: ArchitectConfig = {
6
- ignore: [
7
- '**/node_modules/**',
8
- '**/dist/**',
9
- '**/build/**',
10
- '**/coverage/**',
11
- '**/.git/**',
12
- '**/.next/**',
13
- '**/venv/**',
14
- '**/__pycache__/**',
15
- '**/target/**',
16
- '**/out/**',
17
- '**/.cache/**',
18
- ],
19
- frameworks: {
20
- detect: true,
21
- },
22
- antiPatterns: {
23
- godClass: {
24
- linesThreshold: 500,
25
- methodsThreshold: 10,
26
- },
27
- shotgunSurgery: {
28
- changePropagationThreshold: 5,
29
- },
30
- },
31
- score: {
32
- modularity: 0.4,
33
- coupling: 0.25,
34
- cohesion: 0.2,
35
- layering: 0.15,
36
- },
37
- monorepo: {
38
- enabled: true,
39
- treatPackagesAsModules: true,
40
- },
41
- };
42
-
43
- /**
44
- * Normalize ignore patterns to use proper glob syntax.
45
- * Simple names like "node_modules" are expanded to cover nested directories:
46
- * "node_modules" → ["node_modules", "node_modules/**", "** /node_modules", "** /node_modules/**"]
47
- */
48
- export function normalizeIgnorePatterns(patterns: string[]): string[] {
49
- const normalized = new Set<string>();
50
-
51
- for (const p of patterns) {
52
- if (p.includes('*') || p.includes('/')) {
53
- // Already a glob pattern — keep as-is
54
- normalized.add(p);
55
- } else {
56
- // Simple directory name — expand to cover all nesting levels
57
- normalized.add(p);
58
- normalized.add(`${p}/**`);
59
- normalized.add(`**/${p}`);
60
- normalized.add(`**/${p}/**`);
61
- }
62
- }
63
-
64
- return [...normalized];
65
- }
66
-
67
- export class ConfigLoader {
68
- static loadConfig(projectPath: string): ArchitectConfig {
69
- const configPath = join(projectPath, '.architect.json');
70
-
71
- try {
72
- const content = readFileSync(configPath, 'utf-8');
73
- const userConfig = JSON.parse(content) as ArchitectConfig;
74
- return this.mergeConfigs(DEFAULT_CONFIG, userConfig);
75
- } catch {
76
- return { ...DEFAULT_CONFIG };
77
- }
78
- }
79
-
80
- private static mergeConfigs(
81
- defaults: ArchitectConfig,
82
- user: ArchitectConfig
83
- ): ArchitectConfig {
84
- // If user provides ignore patterns, normalize them to proper glob format
85
- const userIgnore = user.ignore
86
- ? normalizeIgnorePatterns(user.ignore)
87
- : defaults.ignore;
88
-
89
- return {
90
- ignore: userIgnore,
91
- frameworks: {
92
- detect: user.frameworks?.detect ?? defaults.frameworks?.detect,
93
- },
94
- antiPatterns: {
95
- godClass: {
96
- linesThreshold:
97
- user.antiPatterns?.godClass?.linesThreshold ??
98
- defaults.antiPatterns?.godClass?.linesThreshold,
99
- methodsThreshold:
100
- user.antiPatterns?.godClass?.methodsThreshold ??
101
- defaults.antiPatterns?.godClass?.methodsThreshold,
102
- },
103
- shotgunSurgery: {
104
- changePropagationThreshold:
105
- user.antiPatterns?.shotgunSurgery?.changePropagationThreshold ??
106
- defaults.antiPatterns?.shotgunSurgery?.changePropagationThreshold,
107
- },
108
- },
109
- score: {
110
- modularity: user.score?.modularity ?? defaults.score?.modularity,
111
- coupling: user.score?.coupling ?? defaults.score?.coupling,
112
- cohesion: user.score?.cohesion ?? defaults.score?.cohesion,
113
- layering: user.score?.layering ?? defaults.score?.layering,
114
- },
115
- monorepo: {
116
- enabled: user.monorepo?.enabled ?? defaults.monorepo?.enabled,
117
- treatPackagesAsModules:
118
- user.monorepo?.treatPackagesAsModules ??
119
- defaults.monorepo?.treatPackagesAsModules,
120
- },
121
- };
122
- }
123
- }