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