@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
@@ -0,0 +1,526 @@
1
+ export function getStyles() {
2
+ return `<style>
3
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap');
4
+
5
+ * { margin: 0; padding: 0; box-sizing: border-box; }
6
+
7
+ body {
8
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
9
+ background: #0f172a;
10
+ color: #e2e8f0;
11
+ line-height: 1.6;
12
+ min-height: 100vh;
13
+ }
14
+
15
+ html { scroll-behavior: smooth; }
16
+
17
+ /* ── Layout ── */
18
+ .report-layout { display: flex; min-height: 100vh; }
19
+
20
+ .sidebar {
21
+ position: sticky; top: 0; height: 100vh; width: 220px; min-width: 220px;
22
+ background: linear-gradient(180deg, #0f172a 0%, #1e293b 100%);
23
+ border-right: 1px solid #334155; padding: 1.5rem 0;
24
+ display: flex; flex-direction: column; gap: 0.25rem;
25
+ overflow-y: auto; z-index: 100;
26
+ }
27
+ .sidebar-title {
28
+ font-size: 0.7rem; font-weight: 700; text-transform: uppercase;
29
+ letter-spacing: 0.15em; color: #475569; padding: 0 1.25rem; margin-bottom: 0.75rem;
30
+ }
31
+ .sidebar-link {
32
+ display: flex; align-items: center; gap: 0.5rem; padding: 0.6rem 1.25rem;
33
+ color: #94a3b8; text-decoration: none; font-size: 0.8rem; font-weight: 500;
34
+ border-left: 3px solid transparent; transition: all 0.2s;
35
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
36
+ }
37
+ .sidebar-link:hover { color: #e2e8f0; background: #1e293b; border-left-color: #475569; }
38
+ .sidebar-link.active { color: #c084fc; background: #c084fc10; border-left-color: #c084fc; font-weight: 700; }
39
+
40
+ .sidebar-toggle {
41
+ display: none; position: fixed; bottom: 1.5rem; right: 1.5rem; z-index: 200;
42
+ width: 48px; height: 48px; border-radius: 50%; border: none;
43
+ background: #c084fc; color: #0f172a; font-size: 1.2rem; cursor: pointer;
44
+ box-shadow: 0 4px 16px rgba(192,132,252,0.4); transition: all 0.2s;
45
+ }
46
+ .sidebar-toggle:hover { transform: scale(1.1); }
47
+
48
+ @media (max-width: 1024px) {
49
+ .sidebar {
50
+ position: fixed; left: -240px; top: 0; width: 240px; min-width: 240px;
51
+ transition: left 0.3s ease; box-shadow: none;
52
+ }
53
+ .sidebar.sidebar-open { left: 0; box-shadow: 4px 0 24px rgba(0,0,0,0.5); }
54
+ .sidebar-toggle { display: flex; align-items: center; justify-content: center; }
55
+ .report-layout { flex-direction: column; }
56
+ }
57
+
58
+ .container { max-width: 1200px; margin: 0 auto; padding: 2rem; flex: 1; min-width: 0; }
59
+
60
+ /* ── Header ── */
61
+ .header {
62
+ text-align: center;
63
+ padding: 3rem 2rem;
64
+ background: linear-gradient(135deg, #1e293b 0%, #0f172a 50%, #1e1b4b 100%);
65
+ border-bottom: 1px solid #334155;
66
+ margin-bottom: 2rem;
67
+ }
68
+ .header h1 {
69
+ font-size: 2.5rem;
70
+ font-weight: 900;
71
+ background: linear-gradient(135deg, #818cf8, #c084fc, #f472b6);
72
+ -webkit-background-clip: text;
73
+ -webkit-text-fill-color: transparent;
74
+ margin-bottom: 0.5rem;
75
+ }
76
+ .header .subtitle { color: #94a3b8; font-size: 1.1rem; font-weight: 300; }
77
+ .header .meta {
78
+ margin-top: 1rem;
79
+ display: flex; justify-content: center; gap: 1rem; flex-wrap: wrap;
80
+ }
81
+ .header .meta span {
82
+ background: #1e293b; padding: 0.4rem 1rem; border-radius: 99px;
83
+ font-size: 0.85rem; color: #94a3b8; border: 1px solid #334155;
84
+ }
85
+ .header .meta span strong { color: #e2e8f0; }
86
+
87
+ /* ── Score Hero ── */
88
+ .score-hero {
89
+ display: flex; align-items: center; justify-content: center; gap: 3rem;
90
+ padding: 2.5rem;
91
+ background: linear-gradient(135deg, #1e293b, #1e1b4b);
92
+ border-radius: 24px; border: 1px solid #334155;
93
+ margin-bottom: 2rem; flex-wrap: wrap;
94
+ }
95
+ .score-circle { position: relative; width: 180px; height: 180px; }
96
+ .score-circle svg { transform: rotate(-90deg); }
97
+ .score-circle circle { fill: none; stroke-width: 10; stroke-linecap: round; }
98
+ .score-circle .bg { stroke: #334155; }
99
+ .score-circle .fg { transition: stroke-dashoffset 1.5s cubic-bezier(0.4, 0, 0.2, 1); }
100
+ .score-value {
101
+ position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);
102
+ text-align: center;
103
+ }
104
+ .score-value .number { font-size: 3rem; font-weight: 900; line-height: 1; }
105
+ .score-value .label { font-size: 0.85rem; color: #94a3b8; text-transform: uppercase; letter-spacing: 2px; }
106
+ .score-value .grade { font-size: 0.75rem; color: #64748b; margin-top: 4px; text-transform: uppercase; letter-spacing: 1px; }
107
+
108
+ .score-breakdown { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; }
109
+ .score-item {
110
+ padding: 1rem 1.5rem; background: rgba(255,255,255,0.03);
111
+ border-radius: 12px; border: 1px solid #334155; min-width: 200px;
112
+ }
113
+ .score-item .name { font-size: 0.8rem; text-transform: uppercase; letter-spacing: 1px; color: #94a3b8; margin-bottom: 0.3rem; }
114
+ .score-item .bar-container { background: #1e293b; border-radius: 99px; height: 8px; margin-top: 0.5rem; overflow: hidden; }
115
+ .score-item .bar { height: 100%; border-radius: 99px; transition: width 1.5s cubic-bezier(0.4, 0, 0.2, 1); }
116
+ .score-item .val { font-size: 1.5rem; font-weight: 700; }
117
+
118
+ /* ── Stats Grid ── */
119
+ .stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; margin-bottom: 2rem; }
120
+ .stat-card {
121
+ background: linear-gradient(135deg, #1e293b, #0f172a);
122
+ border: 1px solid #334155; border-radius: 16px; padding: 1.5rem; text-align: center;
123
+ }
124
+ .stat-card .value {
125
+ font-size: 2rem; font-weight: 800;
126
+ background: linear-gradient(135deg, #818cf8, #c084fc);
127
+ -webkit-background-clip: text; -webkit-text-fill-color: transparent;
128
+ }
129
+ .stat-card .label { font-size: 0.85rem; color: #94a3b8; margin-top: 0.3rem; }
130
+
131
+ /* ── Section Title ── */
132
+ .section-title {
133
+ font-size: 1.4rem; font-weight: 700; margin: 2.5rem 0 1rem;
134
+ display: flex; align-items: center; gap: 0.5rem;
135
+ }
136
+
137
+ /* ── Section Accordion ── */
138
+ .section-accordion {
139
+ margin: 1.5rem 0; border: 1px solid #334155; border-radius: 16px;
140
+ background: transparent; overflow: hidden;
141
+ }
142
+ .section-accordion-header {
143
+ cursor: pointer; list-style: none; display: flex; align-items: center; gap: 0.75rem;
144
+ font-size: 1.3rem; font-weight: 700; color: #e2e8f0;
145
+ padding: 1.25rem 1.5rem; background: linear-gradient(135deg, #1e293b, #0f172a);
146
+ border-bottom: 1px solid transparent; transition: all 0.3s; user-select: none;
147
+ }
148
+ .section-accordion-header:hover { background: linear-gradient(135deg, #334155, #1e293b); }
149
+ .section-accordion[open] > .section-accordion-header { border-bottom-color: #334155; }
150
+ .section-accordion-header::after {
151
+ content: '\\25B6'; margin-left: auto; font-size: 0.8rem; color: #818cf8;
152
+ transition: transform 0.3s;
153
+ }
154
+ .section-accordion[open] > .section-accordion-header::after { transform: rotate(90deg); }
155
+ .section-accordion-header::-webkit-details-marker { display: none; }
156
+ .section-accordion-body { padding: 0.5rem 0; }
157
+
158
+ /* ── Project Overview ── */
159
+ .overview-grid {
160
+ display: grid;
161
+ grid-template-columns: 1fr 1fr;
162
+ gap: 1rem;
163
+ margin-bottom: 1.5rem;
164
+ }
165
+ .overview-card {
166
+ background: rgba(255,255,255,0.03);
167
+ border: 1px solid #334155;
168
+ border-radius: 12px;
169
+ padding: 1.25rem;
170
+ }
171
+ .overview-main {
172
+ grid-column: 1 / -1;
173
+ background: linear-gradient(135deg, rgba(59,130,246,0.08), rgba(139,92,246,0.08));
174
+ border-color: #3b82f6;
175
+ }
176
+ .overview-label {
177
+ font-size: 0.75rem;
178
+ font-weight: 600;
179
+ text-transform: uppercase;
180
+ letter-spacing: 0.05em;
181
+ color: #94a3b8;
182
+ margin-bottom: 0.75rem;
183
+ }
184
+ .overview-description {
185
+ font-size: 1.1rem;
186
+ color: #e2e8f0;
187
+ line-height: 1.6;
188
+ margin-bottom: 0.75rem;
189
+ }
190
+ .overview-purpose-row {
191
+ display: flex;
192
+ align-items: center;
193
+ gap: 0.5rem;
194
+ }
195
+ .overview-purpose-label {
196
+ font-size: 0.8rem;
197
+ color: #64748b;
198
+ }
199
+ .overview-purpose-value {
200
+ font-size: 0.85rem;
201
+ color: #a78bfa;
202
+ font-weight: 600;
203
+ background: rgba(139,92,246,0.1);
204
+ padding: 0.2rem 0.6rem;
205
+ border-radius: 6px;
206
+ }
207
+ .overview-tags {
208
+ display: flex;
209
+ flex-wrap: wrap;
210
+ gap: 0.4rem;
211
+ }
212
+ .overview-tag {
213
+ font-size: 0.75rem;
214
+ padding: 0.25rem 0.6rem;
215
+ border-radius: 6px;
216
+ font-weight: 500;
217
+ }
218
+ .tech-tag {
219
+ background: rgba(59,130,246,0.15);
220
+ color: #60a5fa;
221
+ border: 1px solid rgba(59,130,246,0.3);
222
+ }
223
+ .keyword-tag {
224
+ background: rgba(16,185,129,0.1);
225
+ color: #34d399;
226
+ border: 1px solid rgba(16,185,129,0.2);
227
+ }
228
+ .overview-entry {
229
+ font-size: 0.8rem;
230
+ background: rgba(255,255,255,0.05);
231
+ padding: 0.25rem 0.5rem;
232
+ border-radius: 4px;
233
+ color: #e2e8f0;
234
+ font-family: 'SF Mono', monospace;
235
+ }
236
+ .overview-entries {
237
+ display: flex;
238
+ flex-wrap: wrap;
239
+ gap: 0.4rem;
240
+ }
241
+ .overview-modules-section {
242
+ margin-top: 0.5rem;
243
+ }
244
+ .overview-modules-grid {
245
+ display: grid;
246
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
247
+ gap: 0.75rem;
248
+ margin-top: 0.5rem;
249
+ }
250
+ .overview-module {
251
+ background: rgba(255,255,255,0.03);
252
+ border: 1px solid #1e293b;
253
+ border-radius: 8px;
254
+ padding: 0.75rem 1rem;
255
+ transition: border-color 0.2s;
256
+ }
257
+ .overview-module:hover {
258
+ border-color: #3b82f6;
259
+ }
260
+ .overview-module-name {
261
+ font-weight: 600;
262
+ color: #e2e8f0;
263
+ font-size: 0.9rem;
264
+ margin-bottom: 0.25rem;
265
+ }
266
+ .overview-module-desc {
267
+ color: #94a3b8;
268
+ font-size: 0.75rem;
269
+ margin-bottom: 0.25rem;
270
+ }
271
+ .overview-module-files {
272
+ color: #64748b;
273
+ font-size: 0.7rem;
274
+ }
275
+ .overview-empty {
276
+ color: #475569;
277
+ font-size: 0.85rem;
278
+ font-style: italic;
279
+ }
280
+ @media (max-width: 768px) {
281
+ .overview-grid { grid-template-columns: 1fr; }
282
+ }
283
+
284
+ /* ── Operations Accordion (inside refactoring steps) ── */
285
+ .rstep-ops-accordion {
286
+ margin: 0.75rem 0; border: 1px solid #1e293b; border-radius: 10px; overflow: hidden;
287
+ }
288
+ .rstep-ops-toggle {
289
+ cursor: pointer; list-style: none; display: flex; align-items: center; gap: 0.5rem;
290
+ font-size: 0.9rem; font-weight: 600; color: #94a3b8;
291
+ padding: 0.75rem 1rem; background: #0f172a; transition: all 0.2s;
292
+ }
293
+ .rstep-ops-toggle:hover { background: #1e293b; color: #e2e8f0; }
294
+ .rstep-ops-toggle::after {
295
+ content: '\\25B6'; margin-left: auto; font-size: 0.65rem; color: #818cf8;
296
+ transition: transform 0.3s;
297
+ }
298
+ .rstep-ops-accordion[open] > .rstep-ops-toggle::after { transform: rotate(90deg); }
299
+ .rstep-ops-toggle::-webkit-details-marker { display: none; }
300
+
301
+ /* ── Cards ── */
302
+ .card {
303
+ background: #1e293b; border-radius: 16px; border: 1px solid #334155;
304
+ padding: 1.5rem; margin-bottom: 1rem; overflow-x: auto;
305
+ }
306
+ .success-card { border-color: #22c55e40; color: #22c55e; text-align: center; padding: 2rem; font-size: 1.1rem; }
307
+
308
+ /* ── Graph ── */
309
+ .graph-card { padding: 1rem; }
310
+ .graph-controls { margin-bottom: 0.75rem; }
311
+ .graph-legend {
312
+ display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 0.5rem;
313
+ justify-content: center;
314
+ }
315
+ .legend-item { display: flex; align-items: center; gap: 4px; font-size: 0.75rem; color: #94a3b8; }
316
+ .legend-dot { width: 10px; height: 10px; border-radius: 50%; display: inline-block; flex-shrink: 0; }
317
+ .graph-filters {
318
+ display: flex; gap: 0.75rem; align-items: center; flex-wrap: wrap;
319
+ justify-content: center; margin-top: 0.5rem;
320
+ }
321
+ .graph-search {
322
+ background: #0f172a; border: 1px solid #334155; border-radius: 8px;
323
+ padding: 0.4rem 0.75rem; color: #e2e8f0; font-size: 0.8rem;
324
+ outline: none; width: 180px; transition: border-color 0.2s;
325
+ }
326
+ .graph-search:focus { border-color: #818cf8; }
327
+ .graph-layer-filters {
328
+ display: flex; gap: 0.5rem; flex-wrap: wrap; align-items: center;
329
+ }
330
+ .graph-filter-check {
331
+ display: flex; align-items: center; gap: 4px;
332
+ font-size: 0.75rem; color: #94a3b8; cursor: pointer;
333
+ }
334
+ .graph-filter-check input { width: 14px; height: 14px; accent-color: #818cf8; }
335
+ .graph-limit-notice {
336
+ text-align: center; font-size: 0.75rem; color: #f59e0b;
337
+ background: #f59e0b15; padding: 0.3rem 0.75rem; border-radius: 6px;
338
+ margin-top: 0.5rem;
339
+ }
340
+ .graph-hint {
341
+ text-align: center; font-size: 0.75rem; color: #475569; margin-top: 0.5rem;
342
+ font-style: italic;
343
+ }
344
+ #dep-graph svg { background: rgba(0,0,0,0.2); border-radius: 12px; cursor: grab; }
345
+ #dep-graph svg:active { cursor: grabbing; }
346
+
347
+ /* ── Layers Grid ── */
348
+ .layers-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 1rem; }
349
+ .layer-card {
350
+ background: linear-gradient(135deg, #1e293b, #0f172a);
351
+ border: 1px solid #334155; border-radius: 16px; padding: 1.5rem;
352
+ text-align: center; position: relative; overflow: hidden;
353
+ }
354
+ .layer-card::before {
355
+ content: ''; position: absolute; top: 0; left: 0; right: 0; height: 3px;
356
+ background: var(--layer-color, #64748b);
357
+ }
358
+ .layer-card .count { font-size: 2.5rem; font-weight: 900; line-height: 1; }
359
+ .layer-card .name { font-size: 1rem; color: #94a3b8; margin-top: 0.3rem; font-weight: 600; }
360
+ .layer-card .desc { font-size: 0.75rem; color: #475569; margin-top: 0.5rem; }
361
+
362
+ /* ── Tables ── */
363
+ table { width: 100%; border-collapse: collapse; }
364
+ th, td { text-align: left; padding: 0.75rem 1rem; border-bottom: 1px solid #334155; }
365
+ th { font-size: 0.75rem; text-transform: uppercase; letter-spacing: 1px; color: #64748b; font-weight: 600; }
366
+ .count-cell { font-weight: 700; font-size: 1.1rem; }
367
+ .impact { color: #94a3b8; font-size: 0.85rem; }
368
+ .suggestion { color: #64748b; font-size: 0.8rem; }
369
+
370
+ .severity-badge {
371
+ display: inline-block; padding: 0.2rem 0.6rem; border-radius: 99px;
372
+ font-size: 0.72rem; font-weight: 600; letter-spacing: 0.5px;
373
+ }
374
+ .severity-CRITICAL { background: #dc262620; color: #ef4444; border: 1px solid #ef444440; }
375
+ .severity-HIGH { background: #f59e0b20; color: #f59e0b; border: 1px solid #f59e0b40; }
376
+ .severity-MEDIUM { background: #3b82f620; color: #60a5fa; border: 1px solid #60a5fa40; }
377
+ .severity-LOW { background: #22c55e20; color: #22c55e; border: 1px solid #22c55e40; }
378
+
379
+ .count-badge {
380
+ display: inline-block; background: #818cf820; color: #818cf8; padding: 0.1rem 0.4rem;
381
+ border-radius: 99px; font-size: 0.7rem; margin-left: 0.5rem; font-weight: 600;
382
+ }
383
+
384
+ .locations { font-size: 0.75rem; color: #64748b; }
385
+ .locations code { background: #0f172a; padding: 1px 4px; border-radius: 3px; font-size: 0.7rem; }
386
+
387
+ /* ── Footer ── */
388
+ .footer {
389
+ text-align: center; padding: 2rem; color: #475569; font-size: 0.85rem;
390
+ border-top: 1px solid #1e293b; margin-top: 3rem;
391
+ }
392
+ .footer a { color: #818cf8; text-decoration: none; }
393
+ .footer a:hover { text-decoration: underline; }
394
+
395
+ /* ── Refactoring Plan ── */
396
+ .refactor-score { padding: 2rem; }
397
+ .refactor-score-pair {
398
+ display: flex; align-items: center; justify-content: center; gap: 1.5rem;
399
+ margin-bottom: 2rem; flex-wrap: wrap;
400
+ }
401
+ .rscore-box { text-align: center; }
402
+ .rscore-num { font-size: 3rem; font-weight: 900; line-height: 1; }
403
+ .rscore-label { font-size: 0.8rem; color: #94a3b8; text-transform: uppercase; letter-spacing: 1px; }
404
+ .rscore-improvement { font-size: 1.3rem; font-weight: 700; }
405
+
406
+ .refactor-legend { display: flex; gap: 1rem; margin-bottom: 0.5rem; }
407
+ .rlegend-tag { font-size: 0.75rem; padding: 0.2rem 0.6rem; border-radius: 6px; }
408
+ .rlegend-tag.rbefore { background: rgba(255,255,255,0.05); color: #94a3b8; }
409
+ .rlegend-tag.rafter { background: rgba(129,140,248,0.2); color: #818cf8; }
410
+
411
+ .refactor-metric-name { width: 100px; font-size: 0.8rem; text-transform: uppercase; color: #94a3b8; font-weight: 600; }
412
+ .refactor-metric-bars { flex: 1; position: relative; height: 30px; }
413
+ .rbar-before, .rbar-after {
414
+ position: absolute; left: 0; height: 14px; border-radius: 4px;
415
+ display: flex; align-items: center; padding-left: 6px;
416
+ font-size: 0.7rem; font-weight: 600;
417
+ }
418
+ .rbar-before { top: 0; }
419
+ .rbar-after { top: 15px; }
420
+ .refactor-metric-diff { width: 50px; text-align: right; font-weight: 700; font-size: 0.85rem; }
421
+
422
+ .refactor-stats-row {
423
+ display: flex; gap: 1rem; margin-bottom: 1rem; flex-wrap: wrap;
424
+ }
425
+ .rstat {
426
+ background: #1e293b; border: 1px solid #334155; border-radius: 99px;
427
+ padding: 0.4rem 1rem; font-size: 0.85rem; color: #94a3b8; font-weight: 500;
428
+ }
429
+
430
+ .priority-bar {
431
+ display: flex; border-radius: 12px; overflow: hidden; height: 32px; margin-bottom: 2rem;
432
+ }
433
+ .prio-seg {
434
+ display: flex; align-items: center; justify-content: center;
435
+ font-size: 0.75rem; font-weight: 600;
436
+ }
437
+ .prio-critical { background: #ef444430; color: #ef4444; }
438
+ .prio-high { background: #f59e0b30; color: #f59e0b; }
439
+ .prio-medium { background: #3b82f630; color: #60a5fa; }
440
+ .prio-low { background: #22c55e30; color: #22c55e; }
441
+
442
+ .refactor-roadmap { display: flex; flex-direction: column; gap: 1rem; }
443
+ .rstep-card {
444
+ background: #1e293b; border-radius: 16px; border: 1px solid #334155;
445
+ padding: 1.5rem; transition: border-color 0.2s;
446
+ }
447
+ .rstep-card:hover { border-color: #818cf8; }
448
+ .rstep-header { display: flex; gap: 1rem; margin-bottom: 1rem; }
449
+ .rstep-number {
450
+ width: 40px; height: 40px; border-radius: 50%;
451
+ background: linear-gradient(135deg, #818cf8, #c084fc);
452
+ display: flex; align-items: center; justify-content: center;
453
+ font-weight: 800; font-size: 1rem; color: white; flex-shrink: 0;
454
+ }
455
+ .rstep-info { flex: 1; }
456
+ .rstep-title-row { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; }
457
+ .rstep-title-row h3 { font-size: 1.1rem; font-weight: 700; }
458
+ .rstep-desc { color: #94a3b8; font-size: 0.9rem; margin-top: 0.3rem; }
459
+ .tier-badge {
460
+ background: #818cf815; color: #818cf8; border: 1px solid #818cf830;
461
+ padding: 0.15rem 0.5rem; border-radius: 99px; font-size: 0.65rem; font-weight: 600;
462
+ }
463
+ .rstep-details { margin-top: 0.5rem; }
464
+ .rstep-details summary { cursor: pointer; color: #818cf8; font-size: 0.85rem; font-weight: 500; }
465
+ .rstep-rationale { color: #64748b; font-size: 0.85rem; margin-top: 0.3rem; font-style: italic; }
466
+
467
+ .rstep-ops { margin-top: 1rem; padding-top: 1rem; border-top: 1px solid #334155; }
468
+ .rstep-ops h4 { font-size: 0.85rem; color: #94a3b8; margin-bottom: 0.5rem; }
469
+ .rop { display: flex; align-items: flex-start; gap: 0.5rem; margin-bottom: 0.5rem; flex-wrap: wrap; }
470
+ .rop-icon { font-size: 0.9rem; }
471
+ .rop-badge { padding: 0.1rem 0.4rem; border-radius: 6px; font-size: 0.65rem; font-weight: 700; }
472
+ .rop-path { background: #0f172a; padding: 1px 6px; border-radius: 4px; font-size: 0.8rem; color: #c084fc; }
473
+ .rop-arrow { color: #818cf8; font-weight: 700; }
474
+ .rop-desc { width: 100%; color: #64748b; font-size: 0.8rem; padding-left: 1.8rem; }
475
+
476
+ .rstep-impact { margin-top: 0.5rem; }
477
+ .rstep-impact h4 { font-size: 0.85rem; color: #94a3b8; margin-bottom: 0.3rem; }
478
+ .rimpact-tags { display: flex; gap: 0.5rem; flex-wrap: wrap; }
479
+ .rimpact-tag {
480
+ background: #22c55e10; color: #22c55e; border: 1px solid #22c55e30;
481
+ padding: 0.2rem 0.6rem; border-radius: 8px; font-size: 0.75rem; font-weight: 500;
482
+ }
483
+
484
+ /* ── AI Prompt Box (Refactoring) ── */
485
+ .ai-prompt-box {
486
+ margin-top: 1rem; padding: 1rem; border-radius: 12px;
487
+ background: linear-gradient(135deg, rgba(16,185,129,0.05), rgba(16,185,129,0.02));
488
+ border: 1px solid rgba(16,185,129,0.2); border-left: 4px solid #10b981;
489
+ }
490
+ .prompt-export-cb { width: 1.25rem; height: 1.25rem; accent-color: #10b981; cursor: pointer; }
491
+ .ai-prompt-box h4 { font-size: 0.9rem; color: #10b981; margin: 0; display: flex; align-items: center; gap: 0.4rem; }
492
+ .ai-prompt-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 0.75rem; gap: 1rem; flex-wrap: wrap; }
493
+ .ai-prompt-desc { font-size: 0.8rem; color: #94a3b8; margin: 0; }
494
+ .ai-prompt-btn {
495
+ background: #10b98120; border: 1px solid #10b981; color: #10b981; padding: 0.4rem 0.8rem;
496
+ border-radius: 6px; font-size: 0.75rem; font-weight: 600; cursor: pointer; transition: all 0.2s; white-space: nowrap;
497
+ }
498
+ .ai-prompt-btn:hover { background: #10b981; color: #fff; transform: translateY(-1px); box-shadow: 0 2px 4px rgba(16,185,129,0.2); }
499
+ .ai-prompt-btn:active { transform: translateY(0); }
500
+ .ai-prompt-pre { position: relative; }
501
+ .ai-prompt-pre pre {
502
+ background: #0f172a; padding: 1rem; border-radius: 8px; border: 1px solid #334155;
503
+ overflow-x: auto; white-space: pre-wrap; font-size: 0.85rem; color: #e2e8f0; font-family: 'SF Mono', monospace; line-height: 1.5;
504
+ }
505
+
506
+ /* ── Responsive ── */
507
+ @media (max-width: 768px) {
508
+ .score-hero { flex-direction: column; gap: 1.5rem; }
509
+ .score-breakdown { grid-template-columns: 1fr; }
510
+ .header h1 { font-size: 1.8rem; }
511
+ .container { padding: 1rem; }
512
+ .refactor-score-pair { flex-direction: column; }
513
+ }
514
+
515
+ /* ── Print ── */
516
+ @media print {
517
+ body { background: white; color: #1e293b; }
518
+ .header { background: white; border-bottom: 2px solid #e2e8f0; }
519
+ .header h1 { -webkit-text-fill-color: #4f46e5; }
520
+ .card, .stat-card, .score-hero, .layer-card, .score-item {
521
+ background: white; border-color: #e2e8f0;
522
+ }
523
+ }
524
+ </style>`;
525
+ }
526
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../src/adapters/html-reporter/styles.ts"],"names":[],"mappings":"AAAE,MAAM,UAAU,SAAS;IACvB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA0gBF,CAAC;AACR,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { AntiPattern } from '@girardelli/architect-core/src/core/types/core.js';
2
+ export declare function groupAntiPatterns(antiPatterns: AntiPattern[]): Record<string, {
3
+ count: number;
4
+ severity: string;
5
+ locations: string[];
6
+ suggestion: string;
7
+ }>;
8
+ export declare function groupSuggestions(suggestions: Array<{
9
+ priority: string;
10
+ title: string;
11
+ description: string;
12
+ impact: string;
13
+ }>): Array<{
14
+ priority: string;
15
+ title: string;
16
+ description: string;
17
+ impact: string;
18
+ count: number;
19
+ }>;
20
+ export declare function escapeHtml(text: string): string;
@@ -0,0 +1,32 @@
1
+ export function groupAntiPatterns(antiPatterns) {
2
+ const grouped = {};
3
+ for (const p of antiPatterns) {
4
+ if (!grouped[p.name]) {
5
+ grouped[p.name] = { count: 0, severity: p.severity, locations: [], suggestion: p.suggestion };
6
+ }
7
+ grouped[p.name].count++;
8
+ if (grouped[p.name].locations.length < 10) {
9
+ grouped[p.name].locations.push(p.location);
10
+ }
11
+ }
12
+ return grouped;
13
+ }
14
+ export function groupSuggestions(suggestions) {
15
+ const map = new Map();
16
+ for (const s of suggestions) {
17
+ const key = `${s.title}|${s.priority}`;
18
+ if (!map.has(key)) {
19
+ map.set(key, { ...s, count: 0 });
20
+ }
21
+ map.get(key).count++;
22
+ }
23
+ return Array.from(map.values()).slice(0, 15);
24
+ }
25
+ export function escapeHtml(text) {
26
+ return text
27
+ .replace(/&/g, '&amp;')
28
+ .replace(/</g, '&lt;')
29
+ .replace(/>/g, '&gt;')
30
+ .replace(/"/g, '&quot;');
31
+ }
32
+ //# sourceMappingURL=utils_adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils_adapters.js","sourceRoot":"","sources":["../../../../src/adapters/html-reporter/utils_adapters.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAC/B,YAA2B;IAE3B,MAAM,OAAO,GAAiG,EAAE,CAAC;IACjH,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;QAChG,CAAC;QACD,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC1C,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,WAA4F;IAE5F,MAAM,GAAG,GAAG,IAAI,GAAG,EAAmG,CAAC;IACvH,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function scoreColor(score: number): string;
2
+ export declare function scoreEmoji(score: number): string;
3
+ export declare function scoreLabel(score: number): string;
4
+ export declare function escapeHtml(text: string): string;
5
+ export declare function esc(text: string): string;
6
+ export declare function opColor(type: string): string;
7
+ export declare function opIcon(type: string): string;
@@ -0,0 +1,58 @@
1
+ export function scoreColor(score) {
2
+ if (score >= 70)
3
+ return '#22c55e';
4
+ if (score >= 50)
5
+ return '#f59e0b';
6
+ return '#ef4444';
7
+ }
8
+ export function scoreEmoji(score) {
9
+ if (score >= 70)
10
+ return '✅';
11
+ if (score >= 50)
12
+ return '⚠️';
13
+ return '❌';
14
+ }
15
+ export function scoreLabel(score) {
16
+ if (score >= 90)
17
+ return 'Excellent';
18
+ if (score >= 70)
19
+ return 'Good';
20
+ if (score >= 50)
21
+ return 'Needs Attention';
22
+ if (score >= 30)
23
+ return 'Poor';
24
+ return 'Critical';
25
+ }
26
+ export function escapeHtml(text) {
27
+ return text
28
+ .replace(/&/g, '&amp;')
29
+ .replace(/</g, '&lt;')
30
+ .replace(/>/g, '&gt;')
31
+ .replace(/"/g, '&quot;');
32
+ }
33
+ export function esc(text) {
34
+ return text
35
+ .replace(/&/g, '&amp;')
36
+ .replace(/</g, '&lt;')
37
+ .replace(/>/g, '&gt;')
38
+ .replace(/"/g, '&quot;');
39
+ }
40
+ export function opColor(type) {
41
+ switch (type) {
42
+ case 'CREATE': return '#22c55e';
43
+ case 'MOVE': return '#3b82f6';
44
+ case 'MODIFY': return '#f59e0b';
45
+ case 'DELETE': return '#ef4444';
46
+ default: return '#64748b';
47
+ }
48
+ }
49
+ export function opIcon(type) {
50
+ switch (type) {
51
+ case 'CREATE': return '➕';
52
+ case 'MOVE': return '📦';
53
+ case 'MODIFY': return '✏️';
54
+ case 'DELETE': return '🗑️';
55
+ default: return '📄';
56
+ }
57
+ }
58
+ //# sourceMappingURL=utils_sections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils_sections.js","sourceRoot":"","sources":["../../../../src/adapters/html-reporter/utils_sections.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,SAAS,CAAC;IAClC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,SAAS,CAAC;IAClC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC;IAC5B,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IAC7B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,WAAW,CAAC;IACpC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC;IAC/B,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,iBAAiB,CAAC;IAC1C,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC;IAC/B,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,IAAY;IAC9B,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ,CAAC,CAAC,OAAO,SAAS,CAAC;QAChC,KAAK,MAAM,CAAC,CAAC,OAAO,SAAS,CAAC;QAC9B,KAAK,QAAQ,CAAC,CAAC,OAAO,SAAS,CAAC;QAChC,KAAK,QAAQ,CAAC,CAAC,OAAO,SAAS,CAAC;QAChC,OAAO,CAAC,CAAC,OAAO,SAAS,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ,CAAC,CAAC,OAAO,GAAG,CAAC;QAC1B,KAAK,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC;QACzB,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC;QAC3B,KAAK,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAC;QAC5B,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { AnalysisReport } from '@girardelli/architect-core/src/core/types/core.js';
2
+ import type { RefactoringPlan } from '@girardelli/architect-core/src/core/types/rules.js';
3
+ import type { AgentSuggestion } from '@girardelli/architect-agents/src/core/agent-generator/index.js';
4
+ /**
5
+ * Generates premium visual HTML reports from AnalysisReport.
6
+ * Features: D3.js force graph, bubble charts, radar chart, animated counters.
7
+ */
8
+ export declare class HtmlReportGenerator {
9
+ generateHtml(report: AnalysisReport, plan?: RefactoringPlan, agentSuggestion?: AgentSuggestion): string;
10
+ }