@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.
Files changed (212) hide show
  1. package/README.md +105 -116
  2. package/architect-run.sh +431 -0
  3. package/assets/banner-v3.html +561 -0
  4. package/dist/agent-generator/context-enricher.d.ts +58 -0
  5. package/dist/agent-generator/context-enricher.d.ts.map +1 -0
  6. package/dist/agent-generator/context-enricher.js +613 -0
  7. package/dist/agent-generator/context-enricher.js.map +1 -0
  8. package/dist/agent-generator/domain-inferrer.d.ts +52 -0
  9. package/dist/agent-generator/domain-inferrer.d.ts.map +1 -0
  10. package/dist/agent-generator/domain-inferrer.js +585 -0
  11. package/dist/agent-generator/domain-inferrer.js.map +1 -0
  12. package/dist/agent-generator/framework-detector.d.ts +40 -0
  13. package/dist/agent-generator/framework-detector.d.ts.map +1 -0
  14. package/dist/agent-generator/framework-detector.js +611 -0
  15. package/dist/agent-generator/framework-detector.js.map +1 -0
  16. package/dist/agent-generator/index.d.ts +47 -0
  17. package/dist/agent-generator/index.d.ts.map +1 -0
  18. package/dist/agent-generator/index.js +545 -0
  19. package/dist/agent-generator/index.js.map +1 -0
  20. package/dist/agent-generator/stack-detector.d.ts +14 -0
  21. package/dist/agent-generator/stack-detector.d.ts.map +1 -0
  22. package/dist/agent-generator/stack-detector.js +124 -0
  23. package/dist/agent-generator/stack-detector.js.map +1 -0
  24. package/dist/agent-generator/templates/core/agents.d.ts +17 -0
  25. package/dist/agent-generator/templates/core/agents.d.ts.map +1 -0
  26. package/dist/agent-generator/templates/core/agents.js +1256 -0
  27. package/dist/agent-generator/templates/core/agents.js.map +1 -0
  28. package/dist/agent-generator/templates/core/architecture-rules.d.ts +7 -0
  29. package/dist/agent-generator/templates/core/architecture-rules.d.ts.map +1 -0
  30. package/dist/agent-generator/templates/core/architecture-rules.js +274 -0
  31. package/dist/agent-generator/templates/core/architecture-rules.js.map +1 -0
  32. package/dist/agent-generator/templates/core/general-rules.d.ts +8 -0
  33. package/dist/agent-generator/templates/core/general-rules.d.ts.map +1 -0
  34. package/dist/agent-generator/templates/core/general-rules.js +301 -0
  35. package/dist/agent-generator/templates/core/general-rules.js.map +1 -0
  36. package/dist/agent-generator/templates/core/hooks-generator.d.ts +21 -0
  37. package/dist/agent-generator/templates/core/hooks-generator.d.ts.map +1 -0
  38. package/dist/agent-generator/templates/core/hooks-generator.js +233 -0
  39. package/dist/agent-generator/templates/core/hooks-generator.js.map +1 -0
  40. package/dist/agent-generator/templates/core/index-md.d.ts +7 -0
  41. package/dist/agent-generator/templates/core/index-md.d.ts.map +1 -0
  42. package/dist/agent-generator/templates/core/index-md.js +246 -0
  43. package/dist/agent-generator/templates/core/index-md.js.map +1 -0
  44. package/dist/agent-generator/templates/core/orchestrator.d.ts +8 -0
  45. package/dist/agent-generator/templates/core/orchestrator.d.ts.map +1 -0
  46. package/dist/agent-generator/templates/core/orchestrator.js +422 -0
  47. package/dist/agent-generator/templates/core/orchestrator.js.map +1 -0
  48. package/dist/agent-generator/templates/core/preflight.d.ts +8 -0
  49. package/dist/agent-generator/templates/core/preflight.d.ts.map +1 -0
  50. package/dist/agent-generator/templates/core/preflight.js +213 -0
  51. package/dist/agent-generator/templates/core/preflight.js.map +1 -0
  52. package/dist/agent-generator/templates/core/quality-gates.d.ts +11 -0
  53. package/dist/agent-generator/templates/core/quality-gates.d.ts.map +1 -0
  54. package/dist/agent-generator/templates/core/quality-gates.js +254 -0
  55. package/dist/agent-generator/templates/core/quality-gates.js.map +1 -0
  56. package/dist/agent-generator/templates/core/security-rules.d.ts +7 -0
  57. package/dist/agent-generator/templates/core/security-rules.d.ts.map +1 -0
  58. package/dist/agent-generator/templates/core/security-rules.js +528 -0
  59. package/dist/agent-generator/templates/core/security-rules.js.map +1 -0
  60. package/dist/agent-generator/templates/core/skills-generator.d.ts +19 -0
  61. package/dist/agent-generator/templates/core/skills-generator.d.ts.map +1 -0
  62. package/dist/agent-generator/templates/core/skills-generator.js +546 -0
  63. package/dist/agent-generator/templates/core/skills-generator.js.map +1 -0
  64. package/dist/agent-generator/templates/core/workflow-fix-bug.d.ts +7 -0
  65. package/dist/agent-generator/templates/core/workflow-fix-bug.d.ts.map +1 -0
  66. package/dist/agent-generator/templates/core/workflow-fix-bug.js +237 -0
  67. package/dist/agent-generator/templates/core/workflow-fix-bug.js.map +1 -0
  68. package/dist/agent-generator/templates/core/workflow-new-feature.d.ts +8 -0
  69. package/dist/agent-generator/templates/core/workflow-new-feature.d.ts.map +1 -0
  70. package/dist/agent-generator/templates/core/workflow-new-feature.js +321 -0
  71. package/dist/agent-generator/templates/core/workflow-new-feature.js.map +1 -0
  72. package/dist/agent-generator/templates/core/workflow-review.d.ts +7 -0
  73. package/dist/agent-generator/templates/core/workflow-review.d.ts.map +1 -0
  74. package/dist/agent-generator/templates/core/workflow-review.js +104 -0
  75. package/dist/agent-generator/templates/core/workflow-review.js.map +1 -0
  76. package/dist/agent-generator/templates/domain/index.d.ts +22 -0
  77. package/dist/agent-generator/templates/domain/index.d.ts.map +1 -0
  78. package/dist/agent-generator/templates/domain/index.js +1176 -0
  79. package/dist/agent-generator/templates/domain/index.js.map +1 -0
  80. package/dist/agent-generator/templates/stack/index.d.ts +8 -0
  81. package/dist/agent-generator/templates/stack/index.d.ts.map +1 -0
  82. package/dist/agent-generator/templates/stack/index.js +695 -0
  83. package/dist/agent-generator/templates/stack/index.js.map +1 -0
  84. package/dist/agent-generator/templates/template-helpers.d.ts +75 -0
  85. package/dist/agent-generator/templates/template-helpers.d.ts.map +1 -0
  86. package/dist/agent-generator/templates/template-helpers.js +726 -0
  87. package/dist/agent-generator/templates/template-helpers.js.map +1 -0
  88. package/dist/agent-generator/types.d.ts +196 -0
  89. package/dist/agent-generator/types.d.ts.map +1 -0
  90. package/dist/agent-generator/types.js +27 -0
  91. package/dist/agent-generator/types.js.map +1 -0
  92. package/dist/analyzer.d.ts +5 -0
  93. package/dist/analyzer.d.ts.map +1 -1
  94. package/dist/analyzer.js +46 -5
  95. package/dist/analyzer.js.map +1 -1
  96. package/dist/analyzers/forecast.d.ts +85 -0
  97. package/dist/analyzers/forecast.d.ts.map +1 -0
  98. package/dist/analyzers/forecast.js +337 -0
  99. package/dist/analyzers/forecast.js.map +1 -0
  100. package/dist/analyzers/git-cache.d.ts +7 -0
  101. package/dist/analyzers/git-cache.d.ts.map +1 -0
  102. package/dist/analyzers/git-cache.js +41 -0
  103. package/dist/analyzers/git-cache.js.map +1 -0
  104. package/dist/analyzers/git-history.d.ts +113 -0
  105. package/dist/analyzers/git-history.d.ts.map +1 -0
  106. package/dist/analyzers/git-history.js +333 -0
  107. package/dist/analyzers/git-history.js.map +1 -0
  108. package/dist/analyzers/index.d.ts +10 -0
  109. package/dist/analyzers/index.d.ts.map +1 -0
  110. package/dist/analyzers/index.js +7 -0
  111. package/dist/analyzers/index.js.map +1 -0
  112. package/dist/analyzers/temporal-scorer.d.ts +72 -0
  113. package/dist/analyzers/temporal-scorer.d.ts.map +1 -0
  114. package/dist/analyzers/temporal-scorer.js +140 -0
  115. package/dist/analyzers/temporal-scorer.js.map +1 -0
  116. package/dist/anti-patterns.d.ts +7 -0
  117. package/dist/anti-patterns.d.ts.map +1 -1
  118. package/dist/anti-patterns.js +25 -6
  119. package/dist/anti-patterns.js.map +1 -1
  120. package/dist/cli.d.ts +2 -3
  121. package/dist/cli.d.ts.map +1 -1
  122. package/dist/cli.js +275 -113
  123. package/dist/cli.js.map +1 -1
  124. package/dist/config.d.ts +6 -0
  125. package/dist/config.d.ts.map +1 -1
  126. package/dist/config.js +48 -11
  127. package/dist/config.js.map +1 -1
  128. package/dist/html-reporter.d.ts +3 -1
  129. package/dist/html-reporter.d.ts.map +1 -1
  130. package/dist/html-reporter.js +248 -12
  131. package/dist/html-reporter.js.map +1 -1
  132. package/dist/index.d.ts +16 -3
  133. package/dist/index.d.ts.map +1 -1
  134. package/dist/index.js +63 -4
  135. package/dist/index.js.map +1 -1
  136. package/dist/project-summarizer.d.ts +38 -0
  137. package/dist/project-summarizer.d.ts.map +1 -0
  138. package/dist/project-summarizer.js +463 -0
  139. package/dist/project-summarizer.js.map +1 -0
  140. package/dist/refactor-reporter.js +1 -1
  141. package/dist/scanner.d.ts +8 -2
  142. package/dist/scanner.d.ts.map +1 -1
  143. package/dist/scanner.js +153 -113
  144. package/dist/scanner.js.map +1 -1
  145. package/dist/scorer.d.ts.map +1 -1
  146. package/dist/scorer.js +24 -11
  147. package/dist/scorer.js.map +1 -1
  148. package/dist/types.d.ts +29 -0
  149. package/dist/types.d.ts.map +1 -1
  150. package/package.json +12 -3
  151. package/src/agent-generator/context-enricher.ts +672 -0
  152. package/src/agent-generator/domain-inferrer.ts +635 -0
  153. package/src/agent-generator/framework-detector.ts +669 -0
  154. package/src/agent-generator/index.ts +634 -0
  155. package/src/agent-generator/stack-detector.ts +115 -0
  156. package/src/agent-generator/templates/core/agents.ts +1296 -0
  157. package/src/agent-generator/templates/core/architecture-rules.ts +287 -0
  158. package/src/agent-generator/templates/core/general-rules.ts +306 -0
  159. package/src/agent-generator/templates/core/hooks-generator.ts +242 -0
  160. package/src/agent-generator/templates/core/index-md.ts +260 -0
  161. package/src/agent-generator/templates/core/orchestrator.ts +459 -0
  162. package/src/agent-generator/templates/core/preflight.ts +215 -0
  163. package/src/agent-generator/templates/core/quality-gates.ts +256 -0
  164. package/src/agent-generator/templates/core/security-rules.ts +543 -0
  165. package/src/agent-generator/templates/core/skills-generator.ts +585 -0
  166. package/src/agent-generator/templates/core/workflow-fix-bug.ts +239 -0
  167. package/src/agent-generator/templates/core/workflow-new-feature.ts +323 -0
  168. package/src/agent-generator/templates/core/workflow-review.ts +106 -0
  169. package/src/agent-generator/templates/domain/index.ts +1201 -0
  170. package/src/agent-generator/templates/stack/index.ts +705 -0
  171. package/src/agent-generator/templates/template-helpers.ts +776 -0
  172. package/src/agent-generator/types.ts +232 -0
  173. package/src/analyzer.ts +51 -5
  174. package/src/analyzers/forecast.ts +496 -0
  175. package/src/analyzers/git-cache.ts +52 -0
  176. package/src/analyzers/git-history.ts +488 -0
  177. package/src/analyzers/index.ts +33 -0
  178. package/src/analyzers/temporal-scorer.ts +227 -0
  179. package/src/anti-patterns.ts +29 -6
  180. package/src/cli.ts +316 -117
  181. package/src/config.ts +52 -11
  182. package/src/html-reporter.ts +263 -13
  183. package/src/index.ts +93 -10
  184. package/src/project-summarizer.ts +521 -0
  185. package/src/refactor-reporter.ts +1 -1
  186. package/src/scanner.ts +136 -90
  187. package/src/scorer.ts +26 -11
  188. package/src/types.ts +27 -0
  189. package/tests/agent-generator.test.ts +427 -0
  190. package/tests/analyzers-integration.test.ts +174 -0
  191. package/tests/architect-adapter-enrichment.test.ts +9 -0
  192. package/tests/context-enricher.test.ts +971 -0
  193. package/tests/fixtures/monorepo/package.json +6 -0
  194. package/tests/fixtures/monorepo/packages/app/package.json +12 -0
  195. package/tests/fixtures/monorepo/packages/app/src/index.ts +6 -0
  196. package/tests/fixtures/monorepo/packages/core/package.json +7 -0
  197. package/tests/fixtures/monorepo/packages/core/src/index.ts +7 -0
  198. package/tests/forecast.test.ts +509 -0
  199. package/tests/framework-detector.test.ts +1172 -0
  200. package/tests/git-history.test.ts +254 -0
  201. package/tests/monorepo-scan.test.ts +170 -0
  202. package/tests/scanner.test.ts +7 -8
  203. package/tests/scorer.test.ts +594 -0
  204. package/tests/stack-detector.test.ts +241 -0
  205. package/tests/template-generation.test.ts +706 -0
  206. package/tests/template-helpers.test.ts +1152 -0
  207. package/tests/temporal-scorer.test.ts +307 -0
  208. package/dist/agent-generator.d.ts +0 -106
  209. package/dist/agent-generator.d.ts.map +0 -1
  210. package/dist/agent-generator.js +0 -1398
  211. package/dist/agent-generator.js.map +0 -1
  212. package/src/agent-generator.ts +0 -1526
@@ -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 "$@"