@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
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { groupAntiPatterns, groupSuggestions, escapeHtml } from './html-reporter/utils_adapters.js';
|
|
2
|
+
import { renderHeader, renderFooter } from './html-reporter/sections/header.js';
|
|
3
|
+
import { renderProjectOverview } from './html-reporter/sections/overview.js';
|
|
4
|
+
import { renderScoreHero, renderRadarChart, renderStats } from './html-reporter/sections/score.js';
|
|
5
|
+
import { renderLayers, renderDependencyGraph } from './html-reporter/sections/layers.js';
|
|
6
|
+
import { renderAntiPatternBubbles, renderAntiPatterns } from './html-reporter/sections/anti-patterns.js';
|
|
7
|
+
import { renderSuggestions } from './html-reporter/sections/suggestions.js';
|
|
8
|
+
import { renderRefactoringPlan } from './html-reporter/sections/refactoring-plan.js';
|
|
9
|
+
import { renderAgentSuggestions } from './html-reporter/sections/agents.js';
|
|
10
|
+
import { getScripts } from './html-reporter/scripts.js';
|
|
11
|
+
import { getStyles } from './html-reporter/styles.js';
|
|
12
|
+
import type { AnalysisReport} from '@girardelli/architect-core/src/core/types/core.js';
|
|
13
|
+
import type { RefactoringPlan} from '@girardelli/architect-core/src/core/types/rules.js';
|
|
14
|
+
import type { AgentSuggestion } from '@girardelli/architect-agents/src/core/agent-generator/index.js';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Generates premium visual HTML reports from AnalysisReport.
|
|
18
|
+
* Features: D3.js force graph, bubble charts, radar chart, animated counters.
|
|
19
|
+
*/
|
|
20
|
+
export class HtmlReportGenerator {
|
|
21
|
+
generateHtml(report: AnalysisReport, plan?: RefactoringPlan, agentSuggestion?: AgentSuggestion): string {
|
|
22
|
+
const grouped = groupAntiPatterns(report.antiPatterns);
|
|
23
|
+
const sugGrouped = groupSuggestions(report.suggestions);
|
|
24
|
+
|
|
25
|
+
return `<!DOCTYPE html>
|
|
26
|
+
<html lang="en">
|
|
27
|
+
<head>
|
|
28
|
+
<meta charset="UTF-8">
|
|
29
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
30
|
+
<title>Architect Report — ${escapeHtml(report.projectInfo.name)}</title>
|
|
31
|
+
${getStyles()}
|
|
32
|
+
<script src="https://cdn.jsdelivr.net/npm/d3@7"><\/script>
|
|
33
|
+
</head>
|
|
34
|
+
<body>
|
|
35
|
+
${renderHeader(report)}
|
|
36
|
+
<div class="report-layout">
|
|
37
|
+
<nav class="sidebar" id="reportSidebar">
|
|
38
|
+
<div class="sidebar-title">Navigation</div>
|
|
39
|
+
<a href="#score" class="sidebar-link active" data-section="score">📊 Score</a>
|
|
40
|
+
${report.projectSummary ? `<a href="#overview" class="sidebar-link" data-section="overview">📋 Overview</a>` : ''}
|
|
41
|
+
<a href="#layers" class="sidebar-link" data-section="layers">📐 Layers & Graph</a>
|
|
42
|
+
<a href="#anti-patterns" class="sidebar-link" data-section="anti-patterns">⚠️ Anti-Patterns (${report.antiPatterns.length})</a>
|
|
43
|
+
<a href="#suggestions" class="sidebar-link" data-section="suggestions">💡 Suggestions (${report.suggestions.length})</a>
|
|
44
|
+
${plan ? `<a href="#refactoring" class="sidebar-link" data-section="refactoring">🔧 Refactoring (${plan.steps.length})</a>` : ''}
|
|
45
|
+
${agentSuggestion ? `<a href="#agents" class="sidebar-link" data-section="agents">🤖 Agents</a>` : ''}
|
|
46
|
+
</nav>
|
|
47
|
+
<button class="sidebar-toggle" onclick="document.getElementById('reportSidebar').classList.toggle('sidebar-open')">☰</button>
|
|
48
|
+
|
|
49
|
+
<div class="container">
|
|
50
|
+
<div id="score">
|
|
51
|
+
${renderScoreHero(report)}
|
|
52
|
+
${renderRadarChart(report)}
|
|
53
|
+
${renderStats(report)}
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
${renderProjectOverview(report)}
|
|
57
|
+
|
|
58
|
+
<details class="section-accordion" id="layers" open>
|
|
59
|
+
<summary class="section-accordion-header">📐 Layer Analysis & Dependencies</summary>
|
|
60
|
+
<div class="section-accordion-body">
|
|
61
|
+
${renderLayers(report)}
|
|
62
|
+
${renderDependencyGraph(report)}
|
|
63
|
+
</div>
|
|
64
|
+
</details>
|
|
65
|
+
|
|
66
|
+
<details class="section-accordion" id="anti-patterns" open>
|
|
67
|
+
<summary class="section-accordion-header">⚠️ Anti-Patterns (${report.antiPatterns.length})</summary>
|
|
68
|
+
<div class="section-accordion-body">
|
|
69
|
+
${renderAntiPatternBubbles(report, grouped)}
|
|
70
|
+
${renderAntiPatterns(report, grouped)}
|
|
71
|
+
</div>
|
|
72
|
+
</details>
|
|
73
|
+
|
|
74
|
+
<details class="section-accordion" id="suggestions">
|
|
75
|
+
<summary class="section-accordion-header">💡 Suggestions (${report.suggestions.length})</summary>
|
|
76
|
+
<div class="section-accordion-body">
|
|
77
|
+
${renderSuggestions(sugGrouped)}
|
|
78
|
+
</div>
|
|
79
|
+
</details>
|
|
80
|
+
|
|
81
|
+
${plan ? `<details class="section-accordion" id="refactoring" open>
|
|
82
|
+
<summary class="section-accordion-header">🔧 Refactoring Plan (${plan.steps.length} steps, ${plan.totalOperations} operations)</summary>
|
|
83
|
+
<div class="section-accordion-body">
|
|
84
|
+
${renderRefactoringPlan(plan)}
|
|
85
|
+
</div>
|
|
86
|
+
</details>` : ''}
|
|
87
|
+
|
|
88
|
+
${agentSuggestion ? `<details class="section-accordion" id="agents" open>
|
|
89
|
+
<summary class="section-accordion-header">🤖 Agent System</summary>
|
|
90
|
+
<div class="section-accordion-body">
|
|
91
|
+
${renderAgentSuggestions(agentSuggestion)}
|
|
92
|
+
</div>
|
|
93
|
+
</details>` : ''}
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
${renderFooter()}
|
|
97
|
+
${getScripts(report)}
|
|
98
|
+
</body>
|
|
99
|
+
</html>`;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { ProgressEvent } from '../core/architect.js';
|
|
2
|
+
import { basename } from 'path';
|
|
3
|
+
|
|
4
|
+
// ── ANSI Colors & Styles ──
|
|
5
|
+
export const c = {
|
|
6
|
+
reset: '\x1b[0m',
|
|
7
|
+
bold: '\x1b[1m',
|
|
8
|
+
dim: '\x1b[2m',
|
|
9
|
+
italic: '\x1b[3m',
|
|
10
|
+
// Colors
|
|
11
|
+
red: '\x1b[38;5;196m',
|
|
12
|
+
green: '\x1b[38;5;46m',
|
|
13
|
+
blue: '\x1b[38;5;33m',
|
|
14
|
+
cyan: '\x1b[38;5;51m',
|
|
15
|
+
yellow: '\x1b[38;5;220m',
|
|
16
|
+
magenta: '\x1b[38;5;201m',
|
|
17
|
+
orange: '\x1b[38;5;208m',
|
|
18
|
+
white: '\x1b[38;5;255m',
|
|
19
|
+
gray: '\x1b[38;5;240m',
|
|
20
|
+
darkGray: '\x1b[38;5;236m',
|
|
21
|
+
// Bg
|
|
22
|
+
bgBlue: '\x1b[48;5;17m',
|
|
23
|
+
bgGreen: '\x1b[48;5;22m',
|
|
24
|
+
bgRed: '\x1b[48;5;52m',
|
|
25
|
+
bgCyan: '\x1b[48;5;23m',
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// ── Phase config ──
|
|
29
|
+
interface PhaseConfig {
|
|
30
|
+
icon: string;
|
|
31
|
+
label: string;
|
|
32
|
+
verb: string;
|
|
33
|
+
color: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const PHASES: Record<string, PhaseConfig> = {
|
|
37
|
+
scan: { icon: '◉', label: 'FILE SCANNER', verb: 'Scanning filesystem', color: c.cyan },
|
|
38
|
+
dependencies: { icon: '◉', label: 'DEPENDENCY MAPPER', verb: 'Mapping import graph', color: c.blue },
|
|
39
|
+
layers: { icon: '◉', label: 'LAYER DETECTOR', verb: 'Classifying architecture', color: c.magenta },
|
|
40
|
+
antipatterns: { icon: '◉', label: 'PATTERN ANALYZER', verb: 'Detecting anti-patterns', color: c.orange },
|
|
41
|
+
scoring: { icon: '◉', label: 'QUALITY ENGINE', verb: 'Computing quality metrics', color: c.yellow },
|
|
42
|
+
normalize: { icon: '◉', label: 'PATH NORMALIZER', verb: 'Normalizing paths', color: c.gray },
|
|
43
|
+
summarize: { icon: '◉', label: 'AI SUMMARIZER', verb: 'Generating project summary', color: c.green },
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const PHASE_ORDER = ['scan', 'dependencies', 'layers', 'antipatterns', 'scoring', 'normalize', 'summarize'];
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Enterprise-Grade Progress Reporter
|
|
50
|
+
* Real-time phase tracking with visual feedback
|
|
51
|
+
*/
|
|
52
|
+
export class ProgressReporter {
|
|
53
|
+
private startTime: number;
|
|
54
|
+
private phaseStart: number = 0;
|
|
55
|
+
private completedPhases: string[] = [];
|
|
56
|
+
private totalPhases: number;
|
|
57
|
+
private scanMetrics: Record<string, number | string> = {};
|
|
58
|
+
|
|
59
|
+
constructor() {
|
|
60
|
+
this.startTime = Date.now();
|
|
61
|
+
this.totalPhases = PHASE_ORDER.length;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Print the stylized header */
|
|
65
|
+
printHeader(projectPath: string): void {
|
|
66
|
+
const name = basename(projectPath);
|
|
67
|
+
const w = process.stderr;
|
|
68
|
+
|
|
69
|
+
w.write('\n');
|
|
70
|
+
w.write(`${c.darkGray} ┌─────────────────────────────────────────────────────────────────┐${c.reset}\n`);
|
|
71
|
+
w.write(`${c.darkGray} │${c.reset} ${c.cyan}${c.bold}⚡ ARCHITECT v8.1${c.reset} ${c.dim}Enterprise Architecture Intelligence${c.reset} ${c.darkGray}│${c.reset}\n`);
|
|
72
|
+
w.write(`${c.darkGray} │${c.reset} ${c.dim}@girardelli/architect — powered by Girardelli Tecnologia${c.reset} ${c.darkGray}│${c.reset}\n`);
|
|
73
|
+
w.write(`${c.darkGray} └─────────────────────────────────────────────────────────────────┘${c.reset}\n`);
|
|
74
|
+
w.write('\n');
|
|
75
|
+
w.write(` ${c.dim}Target:${c.reset} ${c.white}${c.bold}${name}${c.reset}\n`);
|
|
76
|
+
w.write(` ${c.dim}Path:${c.reset} ${c.gray}${projectPath}${c.reset}\n`);
|
|
77
|
+
w.write('\n');
|
|
78
|
+
w.write(` ${c.dim}──── Analysis Pipeline ────────────────────────────────────────${c.reset}\n`);
|
|
79
|
+
w.write('\n');
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Handle a progress event from the analyzer */
|
|
83
|
+
onProgress(event: ProgressEvent): void {
|
|
84
|
+
const phase = PHASES[event.phase];
|
|
85
|
+
if (!phase) return;
|
|
86
|
+
|
|
87
|
+
if (event.status === 'start') {
|
|
88
|
+
this.phaseStart = Date.now();
|
|
89
|
+
this.printPhaseStart(event.phase, phase);
|
|
90
|
+
} else if (event.status === 'complete') {
|
|
91
|
+
this.completedPhases.push(event.phase);
|
|
92
|
+
this.printPhaseComplete(event.phase, phase, event.metrics);
|
|
93
|
+
if (event.metrics) {
|
|
94
|
+
Object.assign(this.scanMetrics, event.metrics);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
private printPhaseStart(key: string, phase: PhaseConfig): void {
|
|
100
|
+
const idx = PHASE_ORDER.indexOf(key) + 1;
|
|
101
|
+
const bar = this.buildProgressBar(this.completedPhases.length, this.totalPhases);
|
|
102
|
+
process.stderr.write(
|
|
103
|
+
` ${c.dim}[${idx}/${this.totalPhases}]${c.reset} ${phase.color}${phase.icon}${c.reset} ${c.bold}${phase.label}${c.reset} ${c.dim}— ${phase.verb}...${c.reset} ${bar}\n`
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
private printPhaseComplete(key: string, _phase: PhaseConfig, metrics?: Record<string, number | string>): void {
|
|
108
|
+
const elapsed = Date.now() - this.phaseStart;
|
|
109
|
+
const metricStr = metrics ? this.formatMetrics(key, metrics) : '';
|
|
110
|
+
process.stderr.write(
|
|
111
|
+
` ${c.dim} └─${c.reset} ${c.green}✓${c.reset} ${c.dim}${this.formatTime(elapsed)}${c.reset}${metricStr}\n`
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private formatMetrics(phase: string, m: Record<string, number | string>): string {
|
|
116
|
+
const parts: string[] = [];
|
|
117
|
+
switch (phase) {
|
|
118
|
+
case 'scan':
|
|
119
|
+
parts.push(`${c.white}${m.files}${c.reset}${c.dim} files${c.reset}`);
|
|
120
|
+
parts.push(`${c.white}${Number(m.lines).toLocaleString()}${c.reset}${c.dim} lines${c.reset}`);
|
|
121
|
+
parts.push(`${c.white}${m.languages}${c.reset}${c.dim} langs${c.reset}`);
|
|
122
|
+
break;
|
|
123
|
+
case 'dependencies':
|
|
124
|
+
parts.push(`${c.white}${m.edges}${c.reset}${c.dim} edges${c.reset}`);
|
|
125
|
+
parts.push(`${c.white}${m.modules}${c.reset}${c.dim} modules${c.reset}`);
|
|
126
|
+
break;
|
|
127
|
+
case 'layers':
|
|
128
|
+
parts.push(`${c.white}${m.layers}${c.reset}${c.dim} layers${c.reset}`);
|
|
129
|
+
parts.push(`${c.white}${m.classified}${c.reset}${c.dim} classified${c.reset}`);
|
|
130
|
+
break;
|
|
131
|
+
case 'antipatterns':
|
|
132
|
+
if (Number(m.total) === 0) {
|
|
133
|
+
parts.push(`${c.green}clean${c.reset}`);
|
|
134
|
+
} else {
|
|
135
|
+
parts.push(`${c.yellow}${m.total}${c.reset}${c.dim} found${c.reset}`);
|
|
136
|
+
if (Number(m.critical) > 0) parts.push(`${c.red}${m.critical} critical${c.reset}`);
|
|
137
|
+
if (Number(m.high) > 0) parts.push(`${c.orange}${m.high} high${c.reset}`);
|
|
138
|
+
}
|
|
139
|
+
break;
|
|
140
|
+
case 'scoring': {
|
|
141
|
+
const overall = Number(m.overall);
|
|
142
|
+
const scoreColor = overall >= 80 ? c.green : overall >= 60 ? c.yellow : c.red;
|
|
143
|
+
parts.push(`${scoreColor}${c.bold}${overall}/100${c.reset}`);
|
|
144
|
+
parts.push(`${c.dim}M:${m.modularity} C:${m.coupling} Co:${m.cohesion} L:${m.layering}${c.reset}`);
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
case 'summarize':
|
|
148
|
+
parts.push(`${c.white}${m.modules}${c.reset}${c.dim} modules${c.reset}`);
|
|
149
|
+
parts.push(`${c.white}${m.techStack}${c.reset}${c.dim} technologies${c.reset}`);
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
return parts.length ? ` ${c.dim}│${c.reset} ${parts.join(`${c.dim} · ${c.reset}`)}` : '';
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
private buildProgressBar(done: number, total: number): string {
|
|
156
|
+
const width = 20;
|
|
157
|
+
const filled = Math.round((done / total) * width);
|
|
158
|
+
const empty = width - filled;
|
|
159
|
+
const pct = Math.round((done / total) * 100);
|
|
160
|
+
const bar = `${c.cyan}${'█'.repeat(filled)}${c.darkGray}${'░'.repeat(empty)}${c.reset}`;
|
|
161
|
+
return `${c.dim}[${c.reset}${bar}${c.dim}]${c.reset} ${c.dim}${pct}%${c.reset}`;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
private formatTime(ms: number): string {
|
|
165
|
+
if (ms < 1000) return `${ms}ms`;
|
|
166
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/** Print extra phase for refactor/agents/report generation */
|
|
170
|
+
printExtraPhase(label: string, verb: string, color: string = c.cyan): void {
|
|
171
|
+
this.phaseStart = Date.now();
|
|
172
|
+
const idx = this.completedPhases.length + 1;
|
|
173
|
+
process.stderr.write(
|
|
174
|
+
` ${c.dim}[${idx}/—]${c.reset} ${color}◉${c.reset} ${c.bold}${label}${c.reset} ${c.dim}— ${verb}...${c.reset}\n`
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
printExtraComplete(detail: string): void {
|
|
179
|
+
const elapsed = Date.now() - this.phaseStart;
|
|
180
|
+
process.stderr.write(
|
|
181
|
+
` ${c.dim} └─${c.reset} ${c.green}✓${c.reset} ${c.dim}${this.formatTime(elapsed)}${c.reset} ${detail}\n`
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/** Final summary with score visualization */
|
|
186
|
+
printSummary(score: number, breakdown: Record<string, number>, stats: {
|
|
187
|
+
files: number; lines: number; antiPatterns: number;
|
|
188
|
+
refactorSteps?: number; refactorOps?: number; agents?: number;
|
|
189
|
+
}): void {
|
|
190
|
+
const totalTime = Date.now() - this.startTime;
|
|
191
|
+
const w = process.stderr;
|
|
192
|
+
|
|
193
|
+
w.write('\n');
|
|
194
|
+
w.write(` ${c.dim}──── Results ──────────────────────────────────────────────────${c.reset}\n`);
|
|
195
|
+
w.write('\n');
|
|
196
|
+
|
|
197
|
+
// Score meter
|
|
198
|
+
const scoreColor = score >= 80 ? c.green : score >= 60 ? c.yellow : c.red;
|
|
199
|
+
const meterWidth = 40;
|
|
200
|
+
const filled = Math.round((score / 100) * meterWidth);
|
|
201
|
+
const meter = `${scoreColor}${'━'.repeat(filled)}${c.darkGray}${'━'.repeat(meterWidth - filled)}${c.reset}`;
|
|
202
|
+
const grade = score >= 90 ? 'A+' : score >= 80 ? 'A' : score >= 70 ? 'B' : score >= 60 ? 'C' : score >= 50 ? 'D' : 'F';
|
|
203
|
+
|
|
204
|
+
w.write(` ${c.bold} ARCHITECTURE SCORE${c.reset}\n`);
|
|
205
|
+
w.write(` ${meter} ${scoreColor}${c.bold}${score}/100${c.reset} ${c.dim}(${grade})${c.reset}\n`);
|
|
206
|
+
w.write('\n');
|
|
207
|
+
w.write(` ${c.dim} Modularity${c.reset} ${this.miniBar(breakdown.modularity)} ${c.white}${breakdown.modularity}${c.reset}\n`);
|
|
208
|
+
w.write(` ${c.dim} Coupling${c.reset} ${this.miniBar(breakdown.coupling)} ${c.white}${breakdown.coupling}${c.reset}\n`);
|
|
209
|
+
w.write(` ${c.dim} Cohesion${c.reset} ${this.miniBar(breakdown.cohesion)} ${c.white}${breakdown.cohesion}${c.reset}\n`);
|
|
210
|
+
w.write(` ${c.dim} Layering${c.reset} ${this.miniBar(breakdown.layering)} ${c.white}${breakdown.layering}${c.reset}\n`);
|
|
211
|
+
w.write('\n');
|
|
212
|
+
|
|
213
|
+
// Stats line
|
|
214
|
+
w.write(` ${c.cyan}📁${c.reset} ${c.white}${stats.files}${c.reset}${c.dim} files${c.reset}`);
|
|
215
|
+
w.write(` ${c.cyan}📝${c.reset} ${c.white}${stats.lines.toLocaleString()}${c.reset}${c.dim} lines${c.reset}`);
|
|
216
|
+
w.write(` ${c.cyan}⚠️${c.reset} ${c.white}${stats.antiPatterns}${c.reset}${c.dim} anti-patterns${c.reset}`);
|
|
217
|
+
if (stats.refactorSteps !== undefined) {
|
|
218
|
+
w.write(` ${c.cyan}🔧${c.reset} ${c.white}${stats.refactorSteps}${c.reset}${c.dim} steps${c.reset}`);
|
|
219
|
+
}
|
|
220
|
+
if (stats.agents !== undefined) {
|
|
221
|
+
w.write(` ${c.cyan}🤖${c.reset} ${c.white}${stats.agents}${c.reset}${c.dim} agents${c.reset}`);
|
|
222
|
+
}
|
|
223
|
+
w.write('\n');
|
|
224
|
+
|
|
225
|
+
// Timing
|
|
226
|
+
w.write(`\n ${c.dim}⏱ Completed in ${this.formatTime(totalTime)}${c.reset}\n`);
|
|
227
|
+
w.write('\n');
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
private miniBar(value: number): string {
|
|
231
|
+
const w = 15;
|
|
232
|
+
const f = Math.round((value / 100) * w);
|
|
233
|
+
const color = value >= 80 ? c.green : value >= 60 ? c.yellow : c.red;
|
|
234
|
+
return `${color}${'▓'.repeat(f)}${c.darkGray}${'░'.repeat(w - f)}${c.reset}`;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RefactoringPlan, RefactorStep
|
|
1
|
+
import { RefactoringPlan, RefactorStep} from '@girardelli/architect-core/src/core/types/rules.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Generates interactive HTML report for refactoring plans.
|
|
@@ -230,7 +230,7 @@ ${this.renderFooter()}
|
|
|
230
230
|
private renderFooter(): string {
|
|
231
231
|
return `
|
|
232
232
|
<div class="footer">
|
|
233
|
-
<p>Generated by <a href="https://github.com/camilooscargbaptista/architect">⚡ Architect
|
|
233
|
+
<p>Generated by <a href="https://github.com/camilooscargbaptista/architect">⚡ Architect v8.1</a> — Enterprise Refactoring Engine</p>
|
|
234
234
|
<p>By <strong>Camilo Girardelli</strong> · <a href="https://www.girardellitecnologia.com">Girardelli Tecnologia</a></p>
|
|
235
235
|
</div>`;
|
|
236
236
|
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { select, confirm } from '@inquirer/prompts';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { Architect, ProgressEvent } from './architect.js';
|
|
5
|
+
import { AgentExecutor } from '@girardelli/architect-agents/src/core/agent-runtime/executor.js';
|
|
6
|
+
import { ProgressReporter, c } from '../adapters/progress-logger.js';
|
|
7
|
+
import { HtmlReportGenerator } from '../adapters/html-reporter.js';
|
|
8
|
+
import * as fs from 'fs';
|
|
9
|
+
|
|
10
|
+
export class GenesisTerminal {
|
|
11
|
+
private architect: Architect;
|
|
12
|
+
|
|
13
|
+
constructor(architect: Architect) {
|
|
14
|
+
this.architect = architect;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public async start() {
|
|
18
|
+
console.clear();
|
|
19
|
+
console.log(chalk.cyan.bold('\nWelcome to Architect Genesis v8.0'));
|
|
20
|
+
console.log(chalk.gray('The Autonomous Architecture Intent Compiler\n'));
|
|
21
|
+
|
|
22
|
+
const action = await select({
|
|
23
|
+
message: 'What would you like to build today?',
|
|
24
|
+
choices: [
|
|
25
|
+
{
|
|
26
|
+
name: '🛡️ Scan Security & Anti-Pattern Boundaries',
|
|
27
|
+
value: 'scan',
|
|
28
|
+
description: 'Runs an O(N²) Matrix Analysis on your Codebase',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: '🛠️ Refactor System Anti-Patterns (God Mode)',
|
|
32
|
+
value: 'refactor',
|
|
33
|
+
description: 'Let AI Autonomous Agents rewrite your technical debt',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: '🏗️ Architect a New Technical Feature',
|
|
37
|
+
value: 'feature',
|
|
38
|
+
description: 'Build a new cross-layer feature dynamically',
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
switch (action) {
|
|
44
|
+
case 'scan':
|
|
45
|
+
await this.runScan();
|
|
46
|
+
break;
|
|
47
|
+
case 'refactor':
|
|
48
|
+
await this.runAutonomousRefactor();
|
|
49
|
+
break;
|
|
50
|
+
case 'feature':
|
|
51
|
+
console.log(chalk.yellow('\nFeature architecture mode is coming in Phase 7.0!'));
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
private async runScan() {
|
|
57
|
+
console.log(chalk.cyan('\n[System] Initiating Core Architectural Scan...'));
|
|
58
|
+
const progress = new ProgressReporter();
|
|
59
|
+
progress.printHeader('.');
|
|
60
|
+
|
|
61
|
+
try {
|
|
62
|
+
// Run deep analysis with full visual progress
|
|
63
|
+
const report = await this.architect.analyze('.', (e: ProgressEvent) => progress.onProgress(e));
|
|
64
|
+
|
|
65
|
+
// Compute score strictly for the final summary panel
|
|
66
|
+
const score = report.score;
|
|
67
|
+
|
|
68
|
+
// Extra Phase: Visual Report Generation
|
|
69
|
+
progress.printExtraPhase('HTML ENGINE', 'Compiling interactive matrices', c.magenta);
|
|
70
|
+
const htmlGenerator = new HtmlReportGenerator();
|
|
71
|
+
|
|
72
|
+
// We generate the refactoring plan & agent specs statically for the report (without executing them)
|
|
73
|
+
const plan = this.architect.refactor(report, '.');
|
|
74
|
+
const suggestion = this.architect.suggestAgents(report, plan, '.');
|
|
75
|
+
|
|
76
|
+
const htmlOutput = htmlGenerator.generateHtml(report, plan, suggestion);
|
|
77
|
+
const htmlPath = `${process.cwd()}/architect-report-genesis.html`;
|
|
78
|
+
|
|
79
|
+
fs.writeFileSync(htmlPath, htmlOutput);
|
|
80
|
+
|
|
81
|
+
progress.printExtraComplete(`Saved 3D Interactive Report to: ${chalk.cyan('architect-report-genesis.html')}`);
|
|
82
|
+
|
|
83
|
+
progress.printSummary(score.overall, score.breakdown, {
|
|
84
|
+
files: report.projectInfo.totalFiles,
|
|
85
|
+
lines: report.projectInfo.totalLines,
|
|
86
|
+
antiPatterns: report.antiPatterns.length
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
console.log(chalk.green(`\n🚀 Done! Open ${chalk.bold.cyan(htmlPath)} in your browser to see the graphics!`));
|
|
90
|
+
|
|
91
|
+
} catch (e: any) {
|
|
92
|
+
console.error(chalk.red(`\n❌ Analysis Failed: ${e.message}`));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
private async runAutonomousRefactor() {
|
|
97
|
+
console.log(chalk.blue('\n[System] Initializing AgentExecutor Runtime...'));
|
|
98
|
+
|
|
99
|
+
// Confirm Action
|
|
100
|
+
const isDangerous = await confirm({
|
|
101
|
+
message: chalk.red('WARNING: God Mode will rewrite files across your layers! Proceed?'),
|
|
102
|
+
default: false
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
if (!isDangerous) {
|
|
106
|
+
console.log(chalk.yellow('Refactor Aborted. Returning to orbit.'));
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const spinner = ora('Engaging Autonomous Refactoring Protocol...').start();
|
|
111
|
+
|
|
112
|
+
try {
|
|
113
|
+
const executor = new AgentExecutor(isDangerous);
|
|
114
|
+
const report = await this.architect.analyze('.');
|
|
115
|
+
const plan = this.architect.refactor(report, '.');
|
|
116
|
+
|
|
117
|
+
spinner.succeed(chalk.green('Refactor Plan Successfully Created!'));
|
|
118
|
+
await executor.executePlan(plan);
|
|
119
|
+
|
|
120
|
+
console.log(chalk.gray('Check your `git diff` to review the Agent changes before committing.'));
|
|
121
|
+
|
|
122
|
+
} catch (error: any) {
|
|
123
|
+
spinner.fail(`Agent Execution encountered an error: ${error.message}`);
|
|
124
|
+
// Only prompt about variables if Anthropic/OpenAI was chosen in the plan
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
|
-
import { ProjectScanner } from '
|
|
2
|
-
import { ArchitectureAnalyzer } from '
|
|
3
|
-
import { AntiPatternDetector } from '
|
|
4
|
-
import { ArchitectureScorer } from '
|
|
5
|
-
import { DiagramGenerator } from '
|
|
6
|
-
import { ReportGenerator } from '
|
|
7
|
-
import { HtmlReportGenerator } from '
|
|
8
|
-
import { RefactorEngine } from '
|
|
9
|
-
import { AgentGenerator, AgentSuggestion } from '
|
|
10
|
-
import { ProjectSummarizer } from '
|
|
11
|
-
import { ConfigLoader
|
|
12
|
-
import { AnalysisReport
|
|
1
|
+
import { ProjectScanner } from '@girardelli/architect-core/src/infrastructure/scanner.js';
|
|
2
|
+
import { ArchitectureAnalyzer } from '@girardelli/architect-core/src/core/analyzer.js';
|
|
3
|
+
import { AntiPatternDetector } from '@girardelli/architect-core/src/core/anti-patterns.js';
|
|
4
|
+
import { ArchitectureScorer } from '@girardelli/architect-core/src/core/scorer.js';
|
|
5
|
+
import { DiagramGenerator } from '@girardelli/architect-core/src/core/diagram.js';
|
|
6
|
+
// import { ReportGenerator } from '../adapters/reporter.js';
|
|
7
|
+
// import { HtmlReportGenerator } from '../adapters/html-reporter.js';
|
|
8
|
+
import { RefactorEngine } from '@girardelli/architect-core/src/core/refactor-engine.js';
|
|
9
|
+
import { AgentGenerator, AgentSuggestion } from '@girardelli/architect-agents/src/core/agent-generator/index.js';
|
|
10
|
+
import { ProjectSummarizer } from '@girardelli/architect-core/src/core/project-summarizer.js';
|
|
11
|
+
import { ConfigLoader} from '@girardelli/architect-core/src/core/config.js';
|
|
12
|
+
import type { AnalysisReport } from '@girardelli/architect-core/src/core/types/core.js';
|
|
13
|
+
import type { RefactoringPlan } from '@girardelli/architect-core/src/core/types/rules.js';
|
|
14
|
+
import { PluginLoader } from '@girardelli/architect-core/src/core/plugin-loader.js';
|
|
15
|
+
|
|
13
16
|
import { relative } from 'path';
|
|
14
17
|
|
|
15
18
|
export type ProgressPhase =
|
|
@@ -34,7 +37,7 @@ export interface ArchitectCommand {
|
|
|
34
37
|
layers: (path: string) => Promise<Array<{ name: string; files: string[] }>>;
|
|
35
38
|
}
|
|
36
39
|
|
|
37
|
-
class Architect implements ArchitectCommand {
|
|
40
|
+
export class Architect implements ArchitectCommand {
|
|
38
41
|
async analyze(projectPath: string, onProgress?: ProgressCallback): Promise<AnalysisReport> {
|
|
39
42
|
const emit = onProgress || (() => {});
|
|
40
43
|
const config = ConfigLoader.loadConfig(projectPath);
|
|
@@ -54,9 +57,12 @@ class Architect implements ArchitectCommand {
|
|
|
54
57
|
// ── Phase 2: Dependency Analysis ──
|
|
55
58
|
emit({ phase: 'dependencies', status: 'start' });
|
|
56
59
|
const analyzer = new ArchitectureAnalyzer(projectPath);
|
|
60
|
+
await analyzer.initialize();
|
|
61
|
+
|
|
62
|
+
const edges = analyzer.analyzeDependencies(projectInfo.fileTree);
|
|
63
|
+
|
|
57
64
|
const dependencies = new Map();
|
|
58
|
-
for (const [file, imports] of
|
|
59
|
-
.analyzeDependencies(projectInfo.fileTree)
|
|
65
|
+
for (const [file, imports] of edges
|
|
60
66
|
.reduce(
|
|
61
67
|
(map, edge) => {
|
|
62
68
|
if (!map.has(edge.from)) {
|
|
@@ -70,7 +76,6 @@ class Architect implements ArchitectCommand {
|
|
|
70
76
|
.entries()) {
|
|
71
77
|
dependencies.set(file, imports);
|
|
72
78
|
}
|
|
73
|
-
const edges = analyzer.analyzeDependencies(projectInfo.fileTree);
|
|
74
79
|
emit({
|
|
75
80
|
phase: 'dependencies', status: 'complete',
|
|
76
81
|
metrics: { edges: edges.length, modules: dependencies.size },
|
|
@@ -86,8 +91,12 @@ class Architect implements ArchitectCommand {
|
|
|
86
91
|
|
|
87
92
|
// ── Phase 4: Anti-Pattern Detection ──
|
|
88
93
|
emit({ phase: 'antipatterns', status: 'start' });
|
|
94
|
+
const pluginLoader = new PluginLoader(projectPath, config);
|
|
95
|
+
await pluginLoader.loadPlugins();
|
|
96
|
+
|
|
89
97
|
const detector = new AntiPatternDetector(config);
|
|
90
|
-
|
|
98
|
+
detector.setCustomDetectors(pluginLoader.customAntiPatternDetectors);
|
|
99
|
+
const antiPatterns = await detector.detect(projectInfo.fileTree, dependencies);
|
|
91
100
|
emit({
|
|
92
101
|
phase: 'antipatterns', status: 'complete',
|
|
93
102
|
metrics: {
|
|
@@ -226,6 +235,7 @@ class Architect implements ArchitectCommand {
|
|
|
226
235
|
}
|
|
227
236
|
|
|
228
237
|
const analyzer = new ArchitectureAnalyzer(projectPath);
|
|
238
|
+
await analyzer.initialize();
|
|
229
239
|
const edges = analyzer.analyzeDependencies(projectInfo.fileTree);
|
|
230
240
|
const layers = analyzer.detectLayers(projectInfo.fileTree);
|
|
231
241
|
|
|
@@ -364,31 +374,3 @@ class Architect implements ArchitectCommand {
|
|
|
364
374
|
}
|
|
365
375
|
|
|
366
376
|
export const architect = new Architect();
|
|
367
|
-
|
|
368
|
-
export {
|
|
369
|
-
ProjectScanner,
|
|
370
|
-
ArchitectureAnalyzer,
|
|
371
|
-
AntiPatternDetector,
|
|
372
|
-
ArchitectureScorer,
|
|
373
|
-
DiagramGenerator,
|
|
374
|
-
ReportGenerator,
|
|
375
|
-
HtmlReportGenerator,
|
|
376
|
-
AgentGenerator,
|
|
377
|
-
ConfigLoader,
|
|
378
|
-
};
|
|
379
|
-
|
|
380
|
-
// ── v4.0: Temporal & Predictive Analyzers ──
|
|
381
|
-
export { GitHistoryAnalyzer, TemporalScorer, ForecastEngine } from './analyzers/index.js';
|
|
382
|
-
export { saveToCache, loadFromCache } from './analyzers/git-cache.js';
|
|
383
|
-
export type {
|
|
384
|
-
GitHistoryReport, FileHistory, ModuleHistory, VelocityVector,
|
|
385
|
-
ChangeCoupling, GitAnalyzerConfig,
|
|
386
|
-
} from './analyzers/git-history.js';
|
|
387
|
-
export type {
|
|
388
|
-
Trend, TemporalScore, TemporalReport, TemporalScorerConfig,
|
|
389
|
-
} from './analyzers/temporal-scorer.js';
|
|
390
|
-
export type {
|
|
391
|
-
PreAntiPatternType, PreAntiPattern, ModuleForecast,
|
|
392
|
-
WeatherForecast, ForecastConfig,
|
|
393
|
-
} from './analyzers/forecast.js';
|
|
394
|
-
|