@girardelli/architect 2.2.0 → 5.0.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/README.md +105 -116
- package/architect-run.sh +431 -0
- package/assets/banner-v3.html +561 -0
- package/dist/agent-generator/context-enricher.d.ts +58 -0
- package/dist/agent-generator/context-enricher.d.ts.map +1 -0
- package/dist/agent-generator/context-enricher.js +613 -0
- package/dist/agent-generator/context-enricher.js.map +1 -0
- package/dist/agent-generator/domain-inferrer.d.ts +52 -0
- package/dist/agent-generator/domain-inferrer.d.ts.map +1 -0
- package/dist/agent-generator/domain-inferrer.js +585 -0
- package/dist/agent-generator/domain-inferrer.js.map +1 -0
- package/dist/agent-generator/framework-detector.d.ts +40 -0
- package/dist/agent-generator/framework-detector.d.ts.map +1 -0
- package/dist/agent-generator/framework-detector.js +611 -0
- package/dist/agent-generator/framework-detector.js.map +1 -0
- package/dist/agent-generator/index.d.ts +47 -0
- package/dist/agent-generator/index.d.ts.map +1 -0
- package/dist/agent-generator/index.js +545 -0
- package/dist/agent-generator/index.js.map +1 -0
- package/dist/agent-generator/stack-detector.d.ts +14 -0
- package/dist/agent-generator/stack-detector.d.ts.map +1 -0
- package/dist/agent-generator/stack-detector.js +124 -0
- package/dist/agent-generator/stack-detector.js.map +1 -0
- package/dist/agent-generator/templates/core/agents.d.ts +17 -0
- package/dist/agent-generator/templates/core/agents.d.ts.map +1 -0
- package/dist/agent-generator/templates/core/agents.js +1256 -0
- package/dist/agent-generator/templates/core/agents.js.map +1 -0
- package/dist/agent-generator/templates/core/architecture-rules.d.ts +7 -0
- package/dist/agent-generator/templates/core/architecture-rules.d.ts.map +1 -0
- package/dist/agent-generator/templates/core/architecture-rules.js +274 -0
- package/dist/agent-generator/templates/core/architecture-rules.js.map +1 -0
- package/dist/agent-generator/templates/core/general-rules.d.ts +8 -0
- package/dist/agent-generator/templates/core/general-rules.d.ts.map +1 -0
- package/dist/agent-generator/templates/core/general-rules.js +301 -0
- package/dist/agent-generator/templates/core/general-rules.js.map +1 -0
- package/dist/agent-generator/templates/core/hooks-generator.d.ts +21 -0
- package/dist/agent-generator/templates/core/hooks-generator.d.ts.map +1 -0
- package/dist/agent-generator/templates/core/hooks-generator.js +233 -0
- package/dist/agent-generator/templates/core/hooks-generator.js.map +1 -0
- package/dist/agent-generator/templates/core/index-md.d.ts +7 -0
- package/dist/agent-generator/templates/core/index-md.d.ts.map +1 -0
- package/dist/agent-generator/templates/core/index-md.js +246 -0
- package/dist/agent-generator/templates/core/index-md.js.map +1 -0
- package/dist/agent-generator/templates/core/orchestrator.d.ts +8 -0
- package/dist/agent-generator/templates/core/orchestrator.d.ts.map +1 -0
- package/dist/agent-generator/templates/core/orchestrator.js +422 -0
- package/dist/agent-generator/templates/core/orchestrator.js.map +1 -0
- package/dist/agent-generator/templates/core/preflight.d.ts +8 -0
- package/dist/agent-generator/templates/core/preflight.d.ts.map +1 -0
- package/dist/agent-generator/templates/core/preflight.js +213 -0
- package/dist/agent-generator/templates/core/preflight.js.map +1 -0
- package/dist/agent-generator/templates/core/quality-gates.d.ts +11 -0
- package/dist/agent-generator/templates/core/quality-gates.d.ts.map +1 -0
- package/dist/agent-generator/templates/core/quality-gates.js +254 -0
- package/dist/agent-generator/templates/core/quality-gates.js.map +1 -0
- package/dist/agent-generator/templates/core/security-rules.d.ts +7 -0
- package/dist/agent-generator/templates/core/security-rules.d.ts.map +1 -0
- package/dist/agent-generator/templates/core/security-rules.js +528 -0
- package/dist/agent-generator/templates/core/security-rules.js.map +1 -0
- package/dist/agent-generator/templates/core/skills-generator.d.ts +19 -0
- package/dist/agent-generator/templates/core/skills-generator.d.ts.map +1 -0
- package/dist/agent-generator/templates/core/skills-generator.js +546 -0
- package/dist/agent-generator/templates/core/skills-generator.js.map +1 -0
- package/dist/agent-generator/templates/core/workflow-fix-bug.d.ts +7 -0
- package/dist/agent-generator/templates/core/workflow-fix-bug.d.ts.map +1 -0
- package/dist/agent-generator/templates/core/workflow-fix-bug.js +237 -0
- package/dist/agent-generator/templates/core/workflow-fix-bug.js.map +1 -0
- package/dist/agent-generator/templates/core/workflow-new-feature.d.ts +8 -0
- package/dist/agent-generator/templates/core/workflow-new-feature.d.ts.map +1 -0
- package/dist/agent-generator/templates/core/workflow-new-feature.js +321 -0
- package/dist/agent-generator/templates/core/workflow-new-feature.js.map +1 -0
- package/dist/agent-generator/templates/core/workflow-review.d.ts +7 -0
- package/dist/agent-generator/templates/core/workflow-review.d.ts.map +1 -0
- package/dist/agent-generator/templates/core/workflow-review.js +104 -0
- package/dist/agent-generator/templates/core/workflow-review.js.map +1 -0
- package/dist/agent-generator/templates/domain/index.d.ts +22 -0
- package/dist/agent-generator/templates/domain/index.d.ts.map +1 -0
- package/dist/agent-generator/templates/domain/index.js +1176 -0
- package/dist/agent-generator/templates/domain/index.js.map +1 -0
- package/dist/agent-generator/templates/stack/index.d.ts +8 -0
- package/dist/agent-generator/templates/stack/index.d.ts.map +1 -0
- package/dist/agent-generator/templates/stack/index.js +695 -0
- package/dist/agent-generator/templates/stack/index.js.map +1 -0
- package/dist/agent-generator/templates/template-helpers.d.ts +75 -0
- package/dist/agent-generator/templates/template-helpers.d.ts.map +1 -0
- package/dist/agent-generator/templates/template-helpers.js +726 -0
- package/dist/agent-generator/templates/template-helpers.js.map +1 -0
- package/dist/agent-generator/types.d.ts +196 -0
- package/dist/agent-generator/types.d.ts.map +1 -0
- package/dist/agent-generator/types.js +27 -0
- package/dist/agent-generator/types.js.map +1 -0
- package/dist/analyzer.d.ts +5 -0
- package/dist/analyzer.d.ts.map +1 -1
- package/dist/analyzer.js +46 -5
- package/dist/analyzer.js.map +1 -1
- package/dist/analyzers/forecast.d.ts +85 -0
- package/dist/analyzers/forecast.d.ts.map +1 -0
- package/dist/analyzers/forecast.js +337 -0
- package/dist/analyzers/forecast.js.map +1 -0
- package/dist/analyzers/git-cache.d.ts +7 -0
- package/dist/analyzers/git-cache.d.ts.map +1 -0
- package/dist/analyzers/git-cache.js +41 -0
- package/dist/analyzers/git-cache.js.map +1 -0
- package/dist/analyzers/git-history.d.ts +113 -0
- package/dist/analyzers/git-history.d.ts.map +1 -0
- package/dist/analyzers/git-history.js +333 -0
- package/dist/analyzers/git-history.js.map +1 -0
- package/dist/analyzers/index.d.ts +10 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +7 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/analyzers/temporal-scorer.d.ts +72 -0
- package/dist/analyzers/temporal-scorer.d.ts.map +1 -0
- package/dist/analyzers/temporal-scorer.js +140 -0
- package/dist/analyzers/temporal-scorer.js.map +1 -0
- package/dist/anti-patterns.d.ts +7 -0
- package/dist/anti-patterns.d.ts.map +1 -1
- package/dist/anti-patterns.js +25 -6
- package/dist/anti-patterns.js.map +1 -1
- package/dist/cli.d.ts +2 -3
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +275 -113
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +48 -11
- package/dist/config.js.map +1 -1
- package/dist/html-reporter.d.ts +3 -1
- package/dist/html-reporter.d.ts.map +1 -1
- package/dist/html-reporter.js +248 -12
- package/dist/html-reporter.js.map +1 -1
- package/dist/index.d.ts +16 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +63 -4
- package/dist/index.js.map +1 -1
- package/dist/project-summarizer.d.ts +38 -0
- package/dist/project-summarizer.d.ts.map +1 -0
- package/dist/project-summarizer.js +463 -0
- package/dist/project-summarizer.js.map +1 -0
- package/dist/refactor-reporter.js +1 -1
- package/dist/scanner.d.ts +8 -2
- package/dist/scanner.d.ts.map +1 -1
- package/dist/scanner.js +153 -113
- package/dist/scanner.js.map +1 -1
- package/dist/scorer.d.ts.map +1 -1
- package/dist/scorer.js +24 -11
- package/dist/scorer.js.map +1 -1
- package/dist/types.d.ts +29 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +12 -3
- package/src/agent-generator/context-enricher.ts +672 -0
- package/src/agent-generator/domain-inferrer.ts +635 -0
- package/src/agent-generator/framework-detector.ts +669 -0
- package/src/agent-generator/index.ts +634 -0
- package/src/agent-generator/stack-detector.ts +115 -0
- package/src/agent-generator/templates/core/agents.ts +1296 -0
- package/src/agent-generator/templates/core/architecture-rules.ts +287 -0
- package/src/agent-generator/templates/core/general-rules.ts +306 -0
- package/src/agent-generator/templates/core/hooks-generator.ts +242 -0
- package/src/agent-generator/templates/core/index-md.ts +260 -0
- package/src/agent-generator/templates/core/orchestrator.ts +459 -0
- package/src/agent-generator/templates/core/preflight.ts +215 -0
- package/src/agent-generator/templates/core/quality-gates.ts +256 -0
- package/src/agent-generator/templates/core/security-rules.ts +543 -0
- package/src/agent-generator/templates/core/skills-generator.ts +585 -0
- package/src/agent-generator/templates/core/workflow-fix-bug.ts +239 -0
- package/src/agent-generator/templates/core/workflow-new-feature.ts +323 -0
- package/src/agent-generator/templates/core/workflow-review.ts +106 -0
- package/src/agent-generator/templates/domain/index.ts +1201 -0
- package/src/agent-generator/templates/stack/index.ts +705 -0
- package/src/agent-generator/templates/template-helpers.ts +776 -0
- package/src/agent-generator/types.ts +232 -0
- package/src/analyzer.ts +51 -5
- package/src/analyzers/forecast.ts +496 -0
- package/src/analyzers/git-cache.ts +52 -0
- package/src/analyzers/git-history.ts +488 -0
- package/src/analyzers/index.ts +33 -0
- package/src/analyzers/temporal-scorer.ts +227 -0
- package/src/anti-patterns.ts +29 -6
- package/src/cli.ts +316 -117
- package/src/config.ts +52 -11
- package/src/html-reporter.ts +263 -13
- package/src/index.ts +93 -10
- package/src/project-summarizer.ts +521 -0
- package/src/refactor-reporter.ts +1 -1
- package/src/scanner.ts +136 -90
- package/src/scorer.ts +26 -11
- package/src/types.ts +27 -0
- package/tests/agent-generator.test.ts +427 -0
- package/tests/analyzers-integration.test.ts +174 -0
- package/tests/architect-adapter-enrichment.test.ts +9 -0
- package/tests/context-enricher.test.ts +971 -0
- package/tests/fixtures/monorepo/package.json +6 -0
- package/tests/fixtures/monorepo/packages/app/package.json +12 -0
- package/tests/fixtures/monorepo/packages/app/src/index.ts +6 -0
- package/tests/fixtures/monorepo/packages/core/package.json +7 -0
- package/tests/fixtures/monorepo/packages/core/src/index.ts +7 -0
- package/tests/forecast.test.ts +509 -0
- package/tests/framework-detector.test.ts +1172 -0
- package/tests/git-history.test.ts +254 -0
- package/tests/monorepo-scan.test.ts +170 -0
- package/tests/scanner.test.ts +7 -8
- package/tests/scorer.test.ts +594 -0
- package/tests/stack-detector.test.ts +241 -0
- package/tests/template-generation.test.ts +706 -0
- package/tests/template-helpers.test.ts +1152 -0
- package/tests/temporal-scorer.test.ts +307 -0
- package/dist/agent-generator.d.ts +0 -106
- package/dist/agent-generator.d.ts.map +0 -1
- package/dist/agent-generator.js +0 -1398
- package/dist/agent-generator.js.map +0 -1
- package/src/agent-generator.ts +0 -1526
package/architect-run.sh
ADDED
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ╔══════════════════════════════════════════════════════════════════╗
|
|
3
|
+
# ║ 🏗️ Architect v3.0 — Interactive Launcher ║
|
|
4
|
+
# ║ Seleciona projeto via Finder, executa análise completa, ║
|
|
5
|
+
# ║ salva resultados no diretório escolhido. ║
|
|
6
|
+
# ╚══════════════════════════════════════════════════════════════════╝
|
|
7
|
+
|
|
8
|
+
set -euo pipefail
|
|
9
|
+
|
|
10
|
+
# ── Colors ──
|
|
11
|
+
RED='\033[0;31m'
|
|
12
|
+
GREEN='\033[0;32m'
|
|
13
|
+
YELLOW='\033[1;33m'
|
|
14
|
+
BLUE='\033[0;34m'
|
|
15
|
+
CYAN='\033[0;36m'
|
|
16
|
+
BOLD='\033[1m'
|
|
17
|
+
DIM='\033[2m'
|
|
18
|
+
NC='\033[0m' # No Color
|
|
19
|
+
|
|
20
|
+
# ── Script location (resolve symlinks) ──
|
|
21
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
22
|
+
ARCHITECT_BIN="${SCRIPT_DIR}/dist/cli.js"
|
|
23
|
+
|
|
24
|
+
# ── Helpers ──
|
|
25
|
+
|
|
26
|
+
print_banner() {
|
|
27
|
+
local GRAY='\033[38;5;240m'
|
|
28
|
+
local WHITE='\033[38;5;255m'
|
|
29
|
+
local MAGENTA='\033[38;5;201m'
|
|
30
|
+
echo ""
|
|
31
|
+
echo -e "${GRAY} ┌─────────────────────────────────────────────────────────────────┐${NC}"
|
|
32
|
+
echo -e "${GRAY} │${NC} ${GRAY}│${NC}"
|
|
33
|
+
echo -e "${GRAY} │${NC} ${CYAN}${BOLD}⚡ ARCHITECT v3.0${NC} ${DIM}Enterprise Architecture Intelligence${NC} ${GRAY}│${NC}"
|
|
34
|
+
echo -e "${GRAY} │${NC} ${DIM}@girardelli/architect — powered by Girardelli Tecnologia${NC} ${GRAY}│${NC}"
|
|
35
|
+
echo -e "${GRAY} │${NC} ${GRAY}│${NC}"
|
|
36
|
+
echo -e "${GRAY} └─────────────────────────────────────────────────────────────────┘${NC}"
|
|
37
|
+
echo ""
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
print_step() {
|
|
41
|
+
echo -e "\n${BLUE}▸${NC} ${BOLD}$1${NC}"
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
print_success() {
|
|
45
|
+
echo -e " ${GREEN}✅ $1${NC}"
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
print_warn() {
|
|
49
|
+
echo -e " ${YELLOW}⚠️ $1${NC}"
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
print_error() {
|
|
53
|
+
echo -e " ${RED}❌ $1${NC}"
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
print_info() {
|
|
57
|
+
echo -e " ${DIM}$1${NC}"
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
# ── OS Detection ──
|
|
61
|
+
|
|
62
|
+
detect_os() {
|
|
63
|
+
case "$(uname -s)" in
|
|
64
|
+
Darwin*) echo "macos" ;;
|
|
65
|
+
Linux*) echo "linux" ;;
|
|
66
|
+
MINGW*|MSYS*|CYGWIN*) echo "windows" ;;
|
|
67
|
+
*) echo "unknown" ;;
|
|
68
|
+
esac
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
OS=$(detect_os)
|
|
72
|
+
|
|
73
|
+
# ── Folder Picker ──
|
|
74
|
+
|
|
75
|
+
pick_folder() {
|
|
76
|
+
local prompt="$1"
|
|
77
|
+
local default_path="${2:-$HOME}"
|
|
78
|
+
local result=""
|
|
79
|
+
|
|
80
|
+
case "$OS" in
|
|
81
|
+
macos)
|
|
82
|
+
result=$(osascript -e "
|
|
83
|
+
set selectedFolder to choose folder with prompt \"$prompt\" default location POSIX file \"$default_path\"
|
|
84
|
+
return POSIX path of selectedFolder
|
|
85
|
+
" 2>/dev/null) || true
|
|
86
|
+
;;
|
|
87
|
+
linux)
|
|
88
|
+
# Try zenity first (GNOME), then kdialog (KDE), then terminal fallback
|
|
89
|
+
if command -v zenity &>/dev/null; then
|
|
90
|
+
result=$(zenity --file-selection --directory --title="$prompt" 2>/dev/null) || true
|
|
91
|
+
elif command -v kdialog &>/dev/null; then
|
|
92
|
+
result=$(kdialog --getexistingdirectory "$default_path" --title "$prompt" 2>/dev/null) || true
|
|
93
|
+
fi
|
|
94
|
+
;;
|
|
95
|
+
windows)
|
|
96
|
+
# PowerShell folder picker
|
|
97
|
+
result=$(powershell.exe -Command "
|
|
98
|
+
Add-Type -AssemblyName System.Windows.Forms
|
|
99
|
+
\$dialog = New-Object System.Windows.Forms.FolderBrowserDialog
|
|
100
|
+
\$dialog.Description = '$prompt'
|
|
101
|
+
\$dialog.SelectedPath = '$default_path'
|
|
102
|
+
if (\$dialog.ShowDialog() -eq 'OK') { \$dialog.SelectedPath }
|
|
103
|
+
" 2>/dev/null | tr -d '\r') || true
|
|
104
|
+
;;
|
|
105
|
+
esac
|
|
106
|
+
|
|
107
|
+
# Fallback: terminal input
|
|
108
|
+
if [ -z "$result" ]; then
|
|
109
|
+
echo "" >&2
|
|
110
|
+
echo -e " ${YELLOW}Não foi possível abrir o seletor de pasta.${NC}" >&2
|
|
111
|
+
echo -e " ${DIM}Digite o caminho manualmente:${NC}" >&2
|
|
112
|
+
read -rp " > " result </dev/tty
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
# Remove trailing slash
|
|
116
|
+
echo "${result%/}"
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
# ── Menu de Análise ──
|
|
120
|
+
|
|
121
|
+
show_analysis_menu() {
|
|
122
|
+
echo "" >&2
|
|
123
|
+
echo -e "${BOLD}Selecione as análises a executar:${NC}" >&2
|
|
124
|
+
echo "" >&2
|
|
125
|
+
echo -e " ${CYAN}1)${NC} 🔍 Análise completa ${DIM}(report HTML + refactor plan + agents)${NC}" >&2
|
|
126
|
+
echo -e " ${CYAN}2)${NC} 📊 Apenas score ${DIM}(score rápido com breakdown)${NC}" >&2
|
|
127
|
+
echo -e " ${CYAN}3)${NC} 🐛 Anti-patterns ${DIM}(detectar problemas arquiteturais)${NC}" >&2
|
|
128
|
+
echo -e " ${CYAN}4)${NC} 🤖 Gerar .agent/ ${DIM}(framework de agentes Enterprise-Grade)${NC}" >&2
|
|
129
|
+
echo -e " ${CYAN}5)${NC} 🔧 Plano de refatoração ${DIM}(steps + operations + score estimado)${NC}" >&2
|
|
130
|
+
echo -e " ${CYAN}6)${NC} 🗺️ Diagrama Mermaid ${DIM}(grafo de dependências)${NC}" >&2
|
|
131
|
+
echo -e " ${CYAN}7)${NC} 🚀 TUDO ${DIM}(roda todas as análises acima)${NC}" >&2
|
|
132
|
+
echo "" >&2
|
|
133
|
+
read -rp " Opção [1-7] (default: 1): " choice </dev/tty
|
|
134
|
+
echo "${choice:-1}"
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
# ── Validações ──
|
|
138
|
+
|
|
139
|
+
check_prerequisites() {
|
|
140
|
+
print_step "Verificando pré-requisitos..."
|
|
141
|
+
|
|
142
|
+
# Node.js
|
|
143
|
+
if ! command -v node &>/dev/null; then
|
|
144
|
+
print_error "Node.js não encontrado. Instale: https://nodejs.org"
|
|
145
|
+
exit 1
|
|
146
|
+
fi
|
|
147
|
+
local node_version
|
|
148
|
+
node_version=$(node -v | sed 's/v//' | cut -d. -f1)
|
|
149
|
+
if [ "$node_version" -lt 18 ]; then
|
|
150
|
+
print_error "Node.js >= 18 necessário. Atual: $(node -v)"
|
|
151
|
+
exit 1
|
|
152
|
+
fi
|
|
153
|
+
print_success "Node.js $(node -v)"
|
|
154
|
+
|
|
155
|
+
# Dependencies installed?
|
|
156
|
+
if [ ! -d "${SCRIPT_DIR}/node_modules" ]; then
|
|
157
|
+
print_warn "Dependências não instaladas. Instalando agora..."
|
|
158
|
+
(cd "$SCRIPT_DIR" && npm install --silent)
|
|
159
|
+
if [ $? -ne 0 ]; then
|
|
160
|
+
print_error "Falha ao instalar dependências. Rode: cd $SCRIPT_DIR && npm install"
|
|
161
|
+
exit 1
|
|
162
|
+
fi
|
|
163
|
+
print_success "Dependências instaladas"
|
|
164
|
+
fi
|
|
165
|
+
|
|
166
|
+
# Architect built?
|
|
167
|
+
if [ ! -f "$ARCHITECT_BIN" ]; then
|
|
168
|
+
print_warn "Architect não compilado. Compilando agora..."
|
|
169
|
+
(cd "$SCRIPT_DIR" && npm run build)
|
|
170
|
+
if [ ! -f "$ARCHITECT_BIN" ]; then
|
|
171
|
+
print_error "Falha ao compilar. Rode: cd $SCRIPT_DIR && npm run build"
|
|
172
|
+
exit 1
|
|
173
|
+
fi
|
|
174
|
+
print_success "Build concluído"
|
|
175
|
+
else
|
|
176
|
+
print_success "Architect compilado"
|
|
177
|
+
fi
|
|
178
|
+
|
|
179
|
+
# Register CLI globally (npm link) if 'architect' not in PATH
|
|
180
|
+
if ! command -v architect &>/dev/null; then
|
|
181
|
+
print_warn "Comando 'architect' não encontrado no PATH. Registrando via npm link..."
|
|
182
|
+
(cd "$SCRIPT_DIR" && npm link --silent 2>/dev/null) || true
|
|
183
|
+
if command -v architect &>/dev/null; then
|
|
184
|
+
print_success "Comando 'architect' disponível globalmente"
|
|
185
|
+
else
|
|
186
|
+
print_info "npm link falhou (talvez precise de sudo). Use: npx architect ou ./architect-run.sh"
|
|
187
|
+
fi
|
|
188
|
+
else
|
|
189
|
+
print_success "Comando 'architect' disponível"
|
|
190
|
+
fi
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
# ── Execução das Análises ──
|
|
194
|
+
|
|
195
|
+
run_analyze() {
|
|
196
|
+
local project="$1"
|
|
197
|
+
local output_dir="$2"
|
|
198
|
+
local project_name
|
|
199
|
+
project_name=$(basename "$project")
|
|
200
|
+
|
|
201
|
+
print_step "Executando análise completa de ${BOLD}${project_name}${NC}..."
|
|
202
|
+
node "$ARCHITECT_BIN" analyze "$project" \
|
|
203
|
+
--format html \
|
|
204
|
+
--output "${output_dir}/architect-report-${project_name}.html"
|
|
205
|
+
print_success "Report HTML: ${output_dir}/architect-report-${project_name}.html"
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
run_score() {
|
|
209
|
+
local project="$1"
|
|
210
|
+
local output_dir="$2"
|
|
211
|
+
local project_name
|
|
212
|
+
project_name=$(basename "$project")
|
|
213
|
+
|
|
214
|
+
print_step "Calculando score de ${BOLD}${project_name}${NC}..."
|
|
215
|
+
node "$ARCHITECT_BIN" score "$project" --format json \
|
|
216
|
+
> "${output_dir}/architect-score-${project_name}.json"
|
|
217
|
+
|
|
218
|
+
# Print inline score
|
|
219
|
+
local score
|
|
220
|
+
score=$(node -e "const s = require('${output_dir}/architect-score-${project_name}.json'); console.log(s.overall + '/100 — M:' + s.breakdown.modularity + ' C:' + s.breakdown.coupling + ' Co:' + s.breakdown.cohesion + ' L:' + s.breakdown.layering)" 2>/dev/null || echo "ver JSON")
|
|
221
|
+
print_success "Score: ${score}"
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
run_anti_patterns() {
|
|
225
|
+
local project="$1"
|
|
226
|
+
local output_dir="$2"
|
|
227
|
+
local project_name
|
|
228
|
+
project_name=$(basename "$project")
|
|
229
|
+
|
|
230
|
+
print_step "Detectando anti-patterns em ${BOLD}${project_name}${NC}..."
|
|
231
|
+
node "$ARCHITECT_BIN" anti-patterns "$project" --format json \
|
|
232
|
+
> "${output_dir}/architect-antipatterns-${project_name}.json"
|
|
233
|
+
|
|
234
|
+
local count
|
|
235
|
+
count=$(node -e "const d = require('${output_dir}/architect-antipatterns-${project_name}.json'); console.log(d.length)" 2>/dev/null || echo "?")
|
|
236
|
+
print_success "Anti-patterns encontrados: ${count}"
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
run_agents() {
|
|
240
|
+
local project="$1"
|
|
241
|
+
local output_dir="$2"
|
|
242
|
+
local project_name
|
|
243
|
+
project_name=$(basename "$project")
|
|
244
|
+
|
|
245
|
+
print_step "Gerando framework de agentes (.agent/) para ${BOLD}${project_name}${NC}..."
|
|
246
|
+
|
|
247
|
+
# Generate agents in the project directory (standard location)
|
|
248
|
+
node "$ARCHITECT_BIN" agents "$project"
|
|
249
|
+
|
|
250
|
+
# Also copy to output dir if different
|
|
251
|
+
if [ -d "${project}/.agent" ] && [ "$project" != "$output_dir" ]; then
|
|
252
|
+
cp -r "${project}/.agent" "${output_dir}/.agent-${project_name}" 2>/dev/null || true
|
|
253
|
+
print_success ".agent/ gerado no projeto E copiado para output"
|
|
254
|
+
else
|
|
255
|
+
print_success ".agent/ gerado no projeto"
|
|
256
|
+
fi
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
run_refactor() {
|
|
260
|
+
local project="$1"
|
|
261
|
+
local output_dir="$2"
|
|
262
|
+
local project_name
|
|
263
|
+
project_name=$(basename "$project")
|
|
264
|
+
|
|
265
|
+
print_step "Gerando plano de refatoração para ${BOLD}${project_name}${NC}..."
|
|
266
|
+
node "$ARCHITECT_BIN" refactor "$project" \
|
|
267
|
+
--output "${output_dir}/architect-refactor-${project_name}.html"
|
|
268
|
+
print_success "Refactor plan: ${output_dir}/architect-refactor-${project_name}.html"
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
run_diagram() {
|
|
272
|
+
local project="$1"
|
|
273
|
+
local output_dir="$2"
|
|
274
|
+
local project_name
|
|
275
|
+
project_name=$(basename "$project")
|
|
276
|
+
|
|
277
|
+
print_step "Gerando diagrama Mermaid de ${BOLD}${project_name}${NC}..."
|
|
278
|
+
node "$ARCHITECT_BIN" diagram "$project" \
|
|
279
|
+
--output "${output_dir}/architect-diagram-${project_name}.mmd"
|
|
280
|
+
print_success "Diagrama: ${output_dir}/architect-diagram-${project_name}.mmd"
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
# ── Open Results ──
|
|
284
|
+
|
|
285
|
+
open_results() {
|
|
286
|
+
local output_dir="$1"
|
|
287
|
+
|
|
288
|
+
echo ""
|
|
289
|
+
echo -e "${GREEN}═══════════════════════════════════════════════════════════${NC}"
|
|
290
|
+
echo -e " ${BOLD}✅ Análise concluída!${NC}"
|
|
291
|
+
echo -e "${GREEN}═══════════════════════════════════════════════════════════${NC}"
|
|
292
|
+
echo ""
|
|
293
|
+
echo -e " ${DIM}Resultados salvos em:${NC}"
|
|
294
|
+
echo -e " ${BOLD}${output_dir}${NC}"
|
|
295
|
+
echo ""
|
|
296
|
+
|
|
297
|
+
# List generated files
|
|
298
|
+
echo -e " ${DIM}Arquivos gerados:${NC}"
|
|
299
|
+
for f in "${output_dir}"/architect-*; do
|
|
300
|
+
[ -e "$f" ] && echo -e " ${CYAN}📄${NC} $(basename "$f")"
|
|
301
|
+
done
|
|
302
|
+
if [ -d "${output_dir}/.agent"* ] 2>/dev/null; then
|
|
303
|
+
echo -e " ${CYAN}📁${NC} .agent/ (framework de agentes)"
|
|
304
|
+
fi
|
|
305
|
+
|
|
306
|
+
echo ""
|
|
307
|
+
read -rp " Abrir pasta de resultados? [S/n]: " open_choice </dev/tty
|
|
308
|
+
open_choice="${open_choice:-S}"
|
|
309
|
+
|
|
310
|
+
if [[ "$open_choice" =~ ^[Ss]$ ]]; then
|
|
311
|
+
case "$OS" in
|
|
312
|
+
macos) open "$output_dir" ;;
|
|
313
|
+
linux) xdg-open "$output_dir" 2>/dev/null || true ;;
|
|
314
|
+
windows) explorer.exe "$output_dir" 2>/dev/null || true ;;
|
|
315
|
+
esac
|
|
316
|
+
fi
|
|
317
|
+
|
|
318
|
+
# Try to open HTML report
|
|
319
|
+
local html_report
|
|
320
|
+
html_report=$(find "$output_dir" -name "architect-report-*.html" -maxdepth 1 2>/dev/null | head -1)
|
|
321
|
+
if [ -n "$html_report" ]; then
|
|
322
|
+
read -rp " Abrir report HTML no browser? [S/n]: " browser_choice </dev/tty
|
|
323
|
+
browser_choice="${browser_choice:-S}"
|
|
324
|
+
if [[ "$browser_choice" =~ ^[Ss]$ ]]; then
|
|
325
|
+
case "$OS" in
|
|
326
|
+
macos) open "$html_report" ;;
|
|
327
|
+
linux) xdg-open "$html_report" 2>/dev/null || true ;;
|
|
328
|
+
windows) start "$html_report" 2>/dev/null || true ;;
|
|
329
|
+
esac
|
|
330
|
+
fi
|
|
331
|
+
fi
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
# ── Main ──
|
|
335
|
+
|
|
336
|
+
main() {
|
|
337
|
+
print_banner
|
|
338
|
+
check_prerequisites
|
|
339
|
+
|
|
340
|
+
# ── Step 1: Select project ──
|
|
341
|
+
print_step "Selecione o projeto para analisar"
|
|
342
|
+
print_info "Uma janela do Finder/Explorer será aberta..."
|
|
343
|
+
|
|
344
|
+
PROJECT_PATH=$(pick_folder "🏗️ Architect — Selecione o PROJETO para analisar" "$HOME")
|
|
345
|
+
|
|
346
|
+
if [ -z "$PROJECT_PATH" ] || [ ! -d "$PROJECT_PATH" ]; then
|
|
347
|
+
print_error "Nenhum projeto selecionado ou diretório inválido."
|
|
348
|
+
exit 1
|
|
349
|
+
fi
|
|
350
|
+
print_success "Projeto: ${PROJECT_PATH}"
|
|
351
|
+
|
|
352
|
+
# Quick validation — does it look like a code project?
|
|
353
|
+
local file_count
|
|
354
|
+
file_count=$(find "$PROJECT_PATH" -maxdepth 3 -type f \( -name "*.ts" -o -name "*.js" -o -name "*.py" -o -name "*.dart" -o -name "*.go" -o -name "*.java" -o -name "*.rs" -o -name "*.rb" -o -name "*.php" -o -name "*.cs" \) 2>/dev/null | wc -l | tr -d ' ') || file_count=0
|
|
355
|
+
if [ "$file_count" -eq 0 ]; then
|
|
356
|
+
print_warn "Nenhum arquivo de código encontrado nas primeiras 3 camadas."
|
|
357
|
+
read -rp " Continuar mesmo assim? [s/N]: " continue_choice </dev/tty
|
|
358
|
+
if [[ ! "$continue_choice" =~ ^[Ss]$ ]]; then
|
|
359
|
+
echo " Abortado."
|
|
360
|
+
exit 0
|
|
361
|
+
fi
|
|
362
|
+
else
|
|
363
|
+
print_info "Encontrados ${file_count} arquivos de código"
|
|
364
|
+
fi
|
|
365
|
+
|
|
366
|
+
# ── Step 2: Select output directory ──
|
|
367
|
+
print_step "Selecione onde salvar os resultados"
|
|
368
|
+
print_info "Uma janela do Finder/Explorer será aberta..."
|
|
369
|
+
|
|
370
|
+
OUTPUT_PATH=$(pick_folder "🏗️ Architect — Selecione DESTINO dos resultados" "$HOME/Documents")
|
|
371
|
+
|
|
372
|
+
if [ -z "$OUTPUT_PATH" ]; then
|
|
373
|
+
# Default: create output dir next to project
|
|
374
|
+
OUTPUT_PATH="${PROJECT_PATH}/architect-results"
|
|
375
|
+
print_warn "Nenhum destino selecionado. Usando: ${OUTPUT_PATH}"
|
|
376
|
+
fi
|
|
377
|
+
|
|
378
|
+
# Create output dir if needed
|
|
379
|
+
mkdir -p "$OUTPUT_PATH"
|
|
380
|
+
print_success "Destino: ${OUTPUT_PATH}"
|
|
381
|
+
|
|
382
|
+
# ── Step 3: Choose analysis ──
|
|
383
|
+
CHOICE=$(show_analysis_menu)
|
|
384
|
+
|
|
385
|
+
# ── Step 4: Execute ──
|
|
386
|
+
local start_time
|
|
387
|
+
start_time=$(date +%s)
|
|
388
|
+
|
|
389
|
+
echo ""
|
|
390
|
+
echo -e "${BOLD}═══════════════════════════════════════════════════════════${NC}"
|
|
391
|
+
echo -e " ${BOLD}🚀 Iniciando análise...${NC}"
|
|
392
|
+
echo -e "${BOLD}═══════════════════════════════════════════════════════════${NC}"
|
|
393
|
+
|
|
394
|
+
case "$CHOICE" in
|
|
395
|
+
1) run_analyze "$PROJECT_PATH" "$OUTPUT_PATH" ;;
|
|
396
|
+
2) run_score "$PROJECT_PATH" "$OUTPUT_PATH" ;;
|
|
397
|
+
3) run_anti_patterns "$PROJECT_PATH" "$OUTPUT_PATH" ;;
|
|
398
|
+
4) run_agents "$PROJECT_PATH" "$OUTPUT_PATH" ;;
|
|
399
|
+
5) run_refactor "$PROJECT_PATH" "$OUTPUT_PATH" ;;
|
|
400
|
+
6) run_diagram "$PROJECT_PATH" "$OUTPUT_PATH" ;;
|
|
401
|
+
7)
|
|
402
|
+
run_analyze "$PROJECT_PATH" "$OUTPUT_PATH"
|
|
403
|
+
run_refactor "$PROJECT_PATH" "$OUTPUT_PATH"
|
|
404
|
+
run_agents "$PROJECT_PATH" "$OUTPUT_PATH"
|
|
405
|
+
run_diagram "$PROJECT_PATH" "$OUTPUT_PATH"
|
|
406
|
+
run_anti_patterns "$PROJECT_PATH" "$OUTPUT_PATH"
|
|
407
|
+
run_score "$PROJECT_PATH" "$OUTPUT_PATH"
|
|
408
|
+
;;
|
|
409
|
+
*)
|
|
410
|
+
print_error "Opção inválida: $CHOICE"
|
|
411
|
+
exit 1
|
|
412
|
+
;;
|
|
413
|
+
esac
|
|
414
|
+
|
|
415
|
+
local end_time
|
|
416
|
+
end_time=$(date +%s)
|
|
417
|
+
local elapsed=$((end_time - start_time))
|
|
418
|
+
|
|
419
|
+
echo ""
|
|
420
|
+
echo -e " ${DIM}⏱️ Tempo total: ${elapsed}s${NC}"
|
|
421
|
+
|
|
422
|
+
# ── Step 5: Open results ──
|
|
423
|
+
open_results "$OUTPUT_PATH"
|
|
424
|
+
|
|
425
|
+
echo ""
|
|
426
|
+
echo -e " ${DIM}Powered by @girardelli/architect v3.0${NC}"
|
|
427
|
+
echo ""
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
# ── Run ──
|
|
431
|
+
main "$@"
|