@girardelli/architect-agents 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/dist/src/core/agent-generator/context-enricher.d.ts +17 -0
  2. package/dist/src/core/agent-generator/context-enricher.js +51 -0
  3. package/dist/src/core/agent-generator/context-enricher.js.map +1 -0
  4. package/dist/src/core/agent-generator/detectors/base-detector.d.ts +8 -0
  5. package/dist/src/core/agent-generator/detectors/base-detector.js +12 -0
  6. package/dist/src/core/agent-generator/detectors/base-detector.js.map +1 -0
  7. package/dist/src/core/agent-generator/detectors/dart-detector.d.ts +5 -0
  8. package/dist/src/core/agent-generator/detectors/dart-detector.js +16 -0
  9. package/dist/src/core/agent-generator/detectors/dart-detector.js.map +1 -0
  10. package/dist/src/core/agent-generator/detectors/framework-registry.d.ts +5 -0
  11. package/dist/src/core/agent-generator/detectors/framework-registry.js +81 -0
  12. package/dist/src/core/agent-generator/detectors/framework-registry.js.map +1 -0
  13. package/dist/src/core/agent-generator/detectors/go-detector.d.ts +5 -0
  14. package/dist/src/core/agent-generator/detectors/go-detector.js +25 -0
  15. package/dist/src/core/agent-generator/detectors/go-detector.js.map +1 -0
  16. package/dist/src/core/agent-generator/detectors/java-detector.d.ts +5 -0
  17. package/dist/src/core/agent-generator/detectors/java-detector.js +44 -0
  18. package/dist/src/core/agent-generator/detectors/java-detector.js.map +1 -0
  19. package/dist/src/core/agent-generator/detectors/node-detector.d.ts +5 -0
  20. package/dist/src/core/agent-generator/detectors/node-detector.js +28 -0
  21. package/dist/src/core/agent-generator/detectors/node-detector.js.map +1 -0
  22. package/dist/src/core/agent-generator/detectors/php-detector.d.ts +5 -0
  23. package/dist/src/core/agent-generator/detectors/php-detector.js +28 -0
  24. package/dist/src/core/agent-generator/detectors/php-detector.js.map +1 -0
  25. package/dist/src/core/agent-generator/detectors/python-detector.d.ts +7 -0
  26. package/dist/src/core/agent-generator/detectors/python-detector.js +116 -0
  27. package/dist/src/core/agent-generator/detectors/python-detector.js.map +1 -0
  28. package/dist/src/core/agent-generator/detectors/ruby-detector.d.ts +5 -0
  29. package/dist/src/core/agent-generator/detectors/ruby-detector.js +23 -0
  30. package/dist/src/core/agent-generator/detectors/ruby-detector.js.map +1 -0
  31. package/dist/src/core/agent-generator/detectors/rust-detector.d.ts +5 -0
  32. package/dist/src/core/agent-generator/detectors/rust-detector.js +18 -0
  33. package/dist/src/core/agent-generator/detectors/rust-detector.js.map +1 -0
  34. package/dist/src/core/agent-generator/detectors/structure-detector.d.ts +4 -0
  35. package/dist/src/core/agent-generator/detectors/structure-detector.js +35 -0
  36. package/dist/src/core/agent-generator/detectors/structure-detector.js.map +1 -0
  37. package/dist/src/core/agent-generator/detectors/toolchain-detector.d.ts +5 -0
  38. package/dist/src/core/agent-generator/detectors/toolchain-detector.js +164 -0
  39. package/dist/src/core/agent-generator/detectors/toolchain-detector.js.map +1 -0
  40. package/dist/src/core/agent-generator/domain-inferrer.d.ts +51 -0
  41. package/dist/src/core/agent-generator/domain-inferrer.js +585 -0
  42. package/dist/src/core/agent-generator/domain-inferrer.js.map +1 -0
  43. package/dist/src/core/agent-generator/engines/audit-engine.d.ts +8 -0
  44. package/dist/src/core/agent-generator/engines/audit-engine.js +84 -0
  45. package/dist/src/core/agent-generator/engines/audit-engine.js.map +1 -0
  46. package/dist/src/core/agent-generator/engines/context-builder.d.ts +12 -0
  47. package/dist/src/core/agent-generator/engines/context-builder.js +84 -0
  48. package/dist/src/core/agent-generator/engines/context-builder.js.map +1 -0
  49. package/dist/src/core/agent-generator/engines/generation-engine.d.ts +7 -0
  50. package/dist/src/core/agent-generator/engines/generation-engine.js +160 -0
  51. package/dist/src/core/agent-generator/engines/generation-engine.js.map +1 -0
  52. package/dist/src/core/agent-generator/engines/generation-engine_deps.d.ts +21 -0
  53. package/dist/src/core/agent-generator/engines/generation-engine_deps.js +17 -0
  54. package/dist/src/core/agent-generator/engines/generation-engine_deps.js.map +1 -0
  55. package/dist/src/core/agent-generator/engines/suggestion-engine.d.ts +13 -0
  56. package/dist/src/core/agent-generator/engines/suggestion-engine.js +171 -0
  57. package/dist/src/core/agent-generator/engines/suggestion-engine.js.map +1 -0
  58. package/dist/src/core/agent-generator/engines/suggestion-engine_deps.d.ts +8 -0
  59. package/dist/src/core/agent-generator/engines/suggestion-engine_deps.js +5 -0
  60. package/dist/src/core/agent-generator/engines/suggestion-engine_deps.js.map +1 -0
  61. package/dist/src/core/agent-generator/enrichers/analysis-helpers.d.ts +9 -0
  62. package/dist/src/core/agent-generator/enrichers/analysis-helpers.js +51 -0
  63. package/dist/src/core/agent-generator/enrichers/analysis-helpers.js.map +1 -0
  64. package/dist/src/core/agent-generator/enrichers/description-generator.d.ts +4 -0
  65. package/dist/src/core/agent-generator/enrichers/description-generator.js +82 -0
  66. package/dist/src/core/agent-generator/enrichers/description-generator.js.map +1 -0
  67. package/dist/src/core/agent-generator/enrichers/endpoint-extractor.d.ts +7 -0
  68. package/dist/src/core/agent-generator/enrichers/endpoint-extractor.js +90 -0
  69. package/dist/src/core/agent-generator/enrichers/endpoint-extractor.js.map +1 -0
  70. package/dist/src/core/agent-generator/enrichers/layer-classifier.d.ts +12 -0
  71. package/dist/src/core/agent-generator/enrichers/layer-classifier.js +152 -0
  72. package/dist/src/core/agent-generator/enrichers/layer-classifier.js.map +1 -0
  73. package/dist/src/core/agent-generator/enrichers/module-extractor.d.ts +10 -0
  74. package/dist/src/core/agent-generator/enrichers/module-extractor.js +173 -0
  75. package/dist/src/core/agent-generator/enrichers/module-extractor.js.map +1 -0
  76. package/dist/src/core/agent-generator/framework-detector.d.ts +17 -0
  77. package/dist/src/core/agent-generator/framework-detector.js +56 -0
  78. package/dist/src/core/agent-generator/framework-detector.js.map +1 -0
  79. package/dist/src/core/agent-generator/index.d.ts +25 -0
  80. package/dist/src/core/agent-generator/index.js +37 -0
  81. package/dist/src/core/agent-generator/index.js.map +1 -0
  82. package/dist/src/core/agent-generator/stack-detector.d.ts +13 -0
  83. package/dist/src/core/agent-generator/stack-detector.js +124 -0
  84. package/dist/src/core/agent-generator/stack-detector.js.map +1 -0
  85. package/dist/src/core/agent-generator/templates/core/agents.d.ts +9 -0
  86. package/dist/src/core/agent-generator/templates/core/agents.js +1127 -0
  87. package/dist/src/core/agent-generator/templates/core/agents.js.map +1 -0
  88. package/dist/src/core/agent-generator/templates/core/architecture-rules.d.ts +6 -0
  89. package/dist/src/core/agent-generator/templates/core/architecture-rules.js +275 -0
  90. package/dist/src/core/agent-generator/templates/core/architecture-rules.js.map +1 -0
  91. package/dist/src/core/agent-generator/templates/core/general-rules.d.ts +7 -0
  92. package/dist/src/core/agent-generator/templates/core/general-rules.js +301 -0
  93. package/dist/src/core/agent-generator/templates/core/general-rules.js.map +1 -0
  94. package/dist/src/core/agent-generator/templates/core/hooks-generator.d.ts +20 -0
  95. package/dist/src/core/agent-generator/templates/core/hooks-generator.js +235 -0
  96. package/dist/src/core/agent-generator/templates/core/hooks-generator.js.map +1 -0
  97. package/dist/src/core/agent-generator/templates/core/index-md.d.ts +6 -0
  98. package/dist/src/core/agent-generator/templates/core/index-md.js +247 -0
  99. package/dist/src/core/agent-generator/templates/core/index-md.js.map +1 -0
  100. package/dist/src/core/agent-generator/templates/core/orchestrator.d.ts +7 -0
  101. package/dist/src/core/agent-generator/templates/core/orchestrator.js +423 -0
  102. package/dist/src/core/agent-generator/templates/core/orchestrator.js.map +1 -0
  103. package/dist/src/core/agent-generator/templates/core/preflight.d.ts +7 -0
  104. package/dist/src/core/agent-generator/templates/core/preflight.js +213 -0
  105. package/dist/src/core/agent-generator/templates/core/preflight.js.map +1 -0
  106. package/dist/src/core/agent-generator/templates/core/quality-gates.d.ts +10 -0
  107. package/dist/src/core/agent-generator/templates/core/quality-gates.js +255 -0
  108. package/dist/src/core/agent-generator/templates/core/quality-gates.js.map +1 -0
  109. package/dist/src/core/agent-generator/templates/core/security-rules.d.ts +6 -0
  110. package/dist/src/core/agent-generator/templates/core/security-rules.js +529 -0
  111. package/dist/src/core/agent-generator/templates/core/security-rules.js.map +1 -0
  112. package/dist/src/core/agent-generator/templates/core/skills-generator.d.ts +18 -0
  113. package/dist/src/core/agent-generator/templates/core/skills-generator.js +547 -0
  114. package/dist/src/core/agent-generator/templates/core/skills-generator.js.map +1 -0
  115. package/dist/src/core/agent-generator/templates/core/workflow-fix-bug.d.ts +6 -0
  116. package/dist/src/core/agent-generator/templates/core/workflow-fix-bug.js +238 -0
  117. package/dist/src/core/agent-generator/templates/core/workflow-fix-bug.js.map +1 -0
  118. package/dist/src/core/agent-generator/templates/core/workflow-new-feature.d.ts +7 -0
  119. package/dist/src/core/agent-generator/templates/core/workflow-new-feature.js +321 -0
  120. package/dist/src/core/agent-generator/templates/core/workflow-new-feature.js.map +1 -0
  121. package/dist/src/core/agent-generator/templates/core/workflow-review.d.ts +6 -0
  122. package/dist/src/core/agent-generator/templates/core/workflow-review.js +105 -0
  123. package/dist/src/core/agent-generator/templates/core/workflow-review.js.map +1 -0
  124. package/dist/src/core/agent-generator/templates/domain/index.d.ts +21 -0
  125. package/dist/src/core/agent-generator/templates/domain/index.js +1179 -0
  126. package/dist/src/core/agent-generator/templates/domain/index.js.map +1 -0
  127. package/dist/src/core/agent-generator/templates/helpers/base-helpers.d.ts +10 -0
  128. package/dist/src/core/agent-generator/templates/helpers/base-helpers.js +20 -0
  129. package/dist/src/core/agent-generator/templates/helpers/base-helpers.js.map +1 -0
  130. package/dist/src/core/agent-generator/templates/helpers/cross-ref-helpers.d.ts +2 -0
  131. package/dist/src/core/agent-generator/templates/helpers/cross-ref-helpers.js +77 -0
  132. package/dist/src/core/agent-generator/templates/helpers/cross-ref-helpers.js.map +1 -0
  133. package/dist/src/core/agent-generator/templates/helpers/security-helpers.d.ts +2 -0
  134. package/dist/src/core/agent-generator/templates/helpers/security-helpers.js +182 -0
  135. package/dist/src/core/agent-generator/templates/helpers/security-helpers.js.map +1 -0
  136. package/dist/src/core/agent-generator/templates/helpers/stack-helpers.d.ts +4 -0
  137. package/dist/src/core/agent-generator/templates/helpers/stack-helpers.js +69 -0
  138. package/dist/src/core/agent-generator/templates/helpers/stack-helpers.js.map +1 -0
  139. package/dist/src/core/agent-generator/templates/helpers/structure-helpers.d.ts +2 -0
  140. package/dist/src/core/agent-generator/templates/helpers/structure-helpers.js +275 -0
  141. package/dist/src/core/agent-generator/templates/helpers/structure-helpers.js.map +1 -0
  142. package/dist/src/core/agent-generator/templates/helpers/summary-helpers.d.ts +6 -0
  143. package/dist/src/core/agent-generator/templates/helpers/summary-helpers.js +56 -0
  144. package/dist/src/core/agent-generator/templates/helpers/summary-helpers.js.map +1 -0
  145. package/dist/src/core/agent-generator/templates/stack/index.d.ts +7 -0
  146. package/dist/src/core/agent-generator/templates/stack/index.js +695 -0
  147. package/dist/src/core/agent-generator/templates/stack/index.js.map +1 -0
  148. package/dist/src/core/agent-generator/templates/template-helpers.d.ts +11 -0
  149. package/dist/src/core/agent-generator/templates/template-helpers.js +12 -0
  150. package/dist/src/core/agent-generator/templates/template-helpers.js.map +1 -0
  151. package/dist/src/core/agent-generator/types/agent.d.ts +39 -0
  152. package/dist/src/core/agent-generator/types/agent.js +27 -0
  153. package/dist/src/core/agent-generator/types/agent.js.map +1 -0
  154. package/dist/src/core/agent-generator/types/domain.d.ts +58 -0
  155. package/dist/src/core/agent-generator/types/domain.js +2 -0
  156. package/dist/src/core/agent-generator/types/domain.js.map +1 -0
  157. package/dist/src/core/agent-generator/types/stack.d.ts +36 -0
  158. package/dist/src/core/agent-generator/types/stack.js +2 -0
  159. package/dist/src/core/agent-generator/types/stack.js.map +1 -0
  160. package/dist/src/core/agent-generator/types/template.d.ts +29 -0
  161. package/dist/src/core/agent-generator/types/template.js +2 -0
  162. package/dist/src/core/agent-generator/types/template.js.map +1 -0
  163. package/dist/src/core/agent-runtime/ai-provider.d.ts +33 -0
  164. package/dist/src/core/agent-runtime/ai-provider.js +146 -0
  165. package/dist/src/core/agent-runtime/ai-provider.js.map +1 -0
  166. package/dist/src/core/agent-runtime/executor.d.ts +13 -0
  167. package/dist/src/core/agent-runtime/executor.js +138 -0
  168. package/dist/src/core/agent-runtime/executor.js.map +1 -0
  169. package/dist/src/core/agent-runtime/human-gate.d.ts +16 -0
  170. package/dist/src/core/agent-runtime/human-gate.js +70 -0
  171. package/dist/src/core/agent-runtime/human-gate.js.map +1 -0
  172. package/dist/tests/agent-generator.test.d.ts +1 -0
  173. package/dist/tests/agent-generator.test.js +349 -0
  174. package/dist/tests/agent-generator.test.js.map +1 -0
  175. package/dist/tests/agent-runtime.test.d.ts +1 -0
  176. package/dist/tests/agent-runtime.test.js +107 -0
  177. package/dist/tests/agent-runtime.test.js.map +1 -0
  178. package/dist/tests/context-enricher.test.d.ts +1 -0
  179. package/dist/tests/context-enricher.test.js +875 -0
  180. package/dist/tests/context-enricher.test.js.map +1 -0
  181. package/dist/tests/framework-detector.test.d.ts +1 -0
  182. package/dist/tests/framework-detector.test.js +882 -0
  183. package/dist/tests/framework-detector.test.js.map +1 -0
  184. package/dist/tests/stack-detector.test.d.ts +1 -0
  185. package/dist/tests/stack-detector.test.js +183 -0
  186. package/dist/tests/stack-detector.test.js.map +1 -0
  187. package/dist/tests/template-generation.test.d.ts +1 -0
  188. package/dist/tests/template-generation.test.js +571 -0
  189. package/dist/tests/template-generation.test.js.map +1 -0
  190. package/dist/tests/template-helpers.test.d.ts +1 -0
  191. package/dist/tests/template-helpers.test.js +967 -0
  192. package/dist/tests/template-helpers.test.js.map +1 -0
  193. package/package.json +24 -0
  194. package/src/core/agent-generator/context-enricher.ts +67 -0
  195. package/src/core/agent-generator/detectors/base-detector.ts +18 -0
  196. package/src/core/agent-generator/detectors/dart-detector.ts +17 -0
  197. package/src/core/agent-generator/detectors/framework-registry.ts +82 -0
  198. package/src/core/agent-generator/detectors/go-detector.ts +26 -0
  199. package/src/core/agent-generator/detectors/java-detector.ts +46 -0
  200. package/src/core/agent-generator/detectors/node-detector.ts +28 -0
  201. package/src/core/agent-generator/detectors/php-detector.ts +28 -0
  202. package/src/core/agent-generator/detectors/python-detector.ts +125 -0
  203. package/src/core/agent-generator/detectors/ruby-detector.ts +24 -0
  204. package/src/core/agent-generator/detectors/rust-detector.ts +19 -0
  205. package/src/core/agent-generator/detectors/structure-detector.ts +38 -0
  206. package/src/core/agent-generator/detectors/toolchain-detector.ts +181 -0
  207. package/src/core/agent-generator/domain-inferrer.ts +630 -0
  208. package/src/core/agent-generator/engines/audit-engine.ts +98 -0
  209. package/src/core/agent-generator/engines/context-builder.ts +96 -0
  210. package/src/core/agent-generator/engines/generation-engine.ts +184 -0
  211. package/src/core/agent-generator/engines/generation-engine_deps.ts +21 -0
  212. package/src/core/agent-generator/engines/suggestion-engine.ts +202 -0
  213. package/src/core/agent-generator/engines/suggestion-engine_deps.ts +8 -0
  214. package/src/core/agent-generator/enrichers/analysis-helpers.ts +58 -0
  215. package/src/core/agent-generator/enrichers/description-generator.ts +91 -0
  216. package/src/core/agent-generator/enrichers/endpoint-extractor.ts +114 -0
  217. package/src/core/agent-generator/enrichers/layer-classifier.ts +156 -0
  218. package/src/core/agent-generator/enrichers/module-extractor.ts +203 -0
  219. package/src/core/agent-generator/framework-detector.ts +66 -0
  220. package/src/core/agent-generator/index.ts +55 -0
  221. package/src/core/agent-generator/stack-detector.ts +115 -0
  222. package/src/core/agent-generator/templates/core/agents.ts +1168 -0
  223. package/src/core/agent-generator/templates/core/architecture-rules.ts +288 -0
  224. package/src/core/agent-generator/templates/core/general-rules.ts +306 -0
  225. package/src/core/agent-generator/templates/core/hooks-generator.ts +244 -0
  226. package/src/core/agent-generator/templates/core/index-md.ts +261 -0
  227. package/src/core/agent-generator/templates/core/orchestrator.ts +462 -0
  228. package/src/core/agent-generator/templates/core/preflight.ts +216 -0
  229. package/src/core/agent-generator/templates/core/quality-gates.ts +257 -0
  230. package/src/core/agent-generator/templates/core/security-rules.ts +544 -0
  231. package/src/core/agent-generator/templates/core/skills-generator.ts +586 -0
  232. package/src/core/agent-generator/templates/core/workflow-fix-bug.ts +240 -0
  233. package/src/core/agent-generator/templates/core/workflow-new-feature.ts +323 -0
  234. package/src/core/agent-generator/templates/core/workflow-review.ts +107 -0
  235. package/src/core/agent-generator/templates/domain/index.ts +1204 -0
  236. package/src/core/agent-generator/templates/helpers/base-helpers.ts +33 -0
  237. package/src/core/agent-generator/templates/helpers/cross-ref-helpers.ts +79 -0
  238. package/src/core/agent-generator/templates/helpers/security-helpers.ts +198 -0
  239. package/src/core/agent-generator/templates/helpers/stack-helpers.ts +80 -0
  240. package/src/core/agent-generator/templates/helpers/structure-helpers.ts +293 -0
  241. package/src/core/agent-generator/templates/helpers/summary-helpers.ts +67 -0
  242. package/src/core/agent-generator/templates/stack/index.ts +705 -0
  243. package/src/core/agent-generator/templates/template-helpers.ts +12 -0
  244. package/src/core/agent-generator/types/agent.ts +65 -0
  245. package/src/core/agent-generator/types/domain.ts +63 -0
  246. package/src/core/agent-generator/types/stack.ts +38 -0
  247. package/src/core/agent-generator/types/template.ts +31 -0
  248. package/src/core/agent-runtime/ai-provider.ts +178 -0
  249. package/src/core/agent-runtime/executor.ts +148 -0
  250. package/src/core/agent-runtime/human-gate.ts +69 -0
  251. package/tests/agent-generator.test.ts +428 -0
  252. package/tests/agent-runtime.test.ts +125 -0
  253. package/tests/context-enricher.test.ts +972 -0
  254. package/tests/framework-detector.test.ts +1172 -0
  255. package/tests/stack-detector.test.ts +241 -0
  256. package/tests/template-generation.test.ts +709 -0
  257. package/tests/template-helpers.test.ts +1130 -0
  258. package/tsconfig.json +14 -0
@@ -0,0 +1,65 @@
1
+ import { StackInfo } from './stack.js';
2
+
3
+ export interface AgentAuditFinding {
4
+ type: 'MISSING' | 'OUTDATED' | 'IMPROVEMENT' | 'OK';
5
+ category: string;
6
+ file: string;
7
+ description: string;
8
+ suggestion?: string;
9
+ }
10
+
11
+ export type AgentItemStatus = 'KEEP' | 'MODIFY' | 'CREATE' | 'DELETE';
12
+
13
+ export interface AgentItem {
14
+ name: string;
15
+ status: AgentItemStatus;
16
+ reason?: string;
17
+ description?: string;
18
+ }
19
+
20
+ export interface AgentSuggestion {
21
+ stack: StackInfo;
22
+ hasExistingAgents: boolean;
23
+ suggestedAgents: AgentItem[];
24
+ suggestedRules: AgentItem[];
25
+ suggestedGuards: AgentItem[];
26
+ suggestedWorkflows: AgentItem[];
27
+ suggestedSkills: { name: string; source: string; description: string; status: AgentItemStatus }[];
28
+ audit: AgentAuditFinding[];
29
+ command: string;
30
+ }
31
+
32
+ export interface AgentGeneratorConfig {
33
+ coverageMinimum: number;
34
+ scoreThreshold: number;
35
+ language: 'pt-BR' | 'en';
36
+ goldenRules: string[];
37
+ blockers: string[];
38
+ }
39
+
40
+ export const DEFAULT_AGENT_CONFIG: AgentGeneratorConfig = {
41
+ coverageMinimum: 80,
42
+ scoreThreshold: 70,
43
+ language: 'pt-BR',
44
+ goldenRules: [
45
+ 'Git Flow completo (branch → PR → review → merge)',
46
+ 'Arquitetura C4 (4 níveis de documentação)',
47
+ 'BDD antes de código',
48
+ 'TDD — Red → Green → Refactor',
49
+ 'Diagnóstico obrigatório antes de codar',
50
+ 'Mockup antes de qualquer UI',
51
+ 'Nunca decidir sozinho — perguntar ao humano',
52
+ 'Qualidade > Velocidade',
53
+ 'Não abrir browser, não tirar screenshot — apenas código',
54
+ ],
55
+ blockers: [
56
+ 'console.log / print() em código de produção',
57
+ 'TODO / FIXME / HACK sem issue vinculada',
58
+ 'any (TypeScript) / type: ignore (Python) sem justificativa',
59
+ 'Testes com .skip() ou @pytest.mark.skip sem motivo',
60
+ 'Secrets, tokens ou senhas hardcoded',
61
+ 'Push direto em main/develop',
62
+ 'Arquivos > 500 linhas sem justificativa',
63
+ 'Imports circulares',
64
+ ],
65
+ };
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Detailed module information extracted from project analysis.
3
+ */
4
+ export interface ModuleDetail {
5
+ name: string;
6
+ path: string;
7
+ files: string[];
8
+ fileCount: number;
9
+ lineCount: number;
10
+ description: string;
11
+ hasTests: boolean;
12
+ testFiles: string[];
13
+ entities: string[];
14
+ controllers: string[];
15
+ services: string[];
16
+ layer: string;
17
+ }
18
+
19
+ /**
20
+ * API endpoint detected from route/controller files.
21
+ */
22
+ export interface DetectedEndpoint {
23
+ method: string;
24
+ path: string;
25
+ file: string;
26
+ handler: string;
27
+ hasAuth: boolean;
28
+ hasValidation: boolean;
29
+ }
30
+
31
+ export interface BusinessEntity {
32
+ name: string;
33
+ source: string;
34
+ fields: string[];
35
+ relationships: string[];
36
+ layer: 'model' | 'entity' | 'schema' | 'dto' | 'unknown';
37
+ }
38
+
39
+ export interface ComplianceRequirement {
40
+ name: string;
41
+ reason: string;
42
+ mandatoryChecks: string[];
43
+ }
44
+
45
+ export interface ExternalIntegration {
46
+ name: string;
47
+ type: 'api' | 'database' | 'queue' | 'storage' | 'payment' | 'auth' | 'government' | 'other';
48
+ detectedFrom: string;
49
+ }
50
+
51
+ /**
52
+ * Domain classification inferred from project analysis.
53
+ */
54
+ export interface DomainInsights {
55
+ domain: string;
56
+ subDomain: string;
57
+ description: string;
58
+ businessEntities: BusinessEntity[];
59
+ compliance: ComplianceRequirement[];
60
+ integrations: ExternalIntegration[];
61
+ keywords: string[];
62
+ confidence: number;
63
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Stack detection result from project analysis.
3
+ */
4
+ export interface StackInfo {
5
+ primary: string;
6
+ languages: string[];
7
+ frameworks: string[];
8
+ hasBackend: boolean;
9
+ hasFrontend: boolean;
10
+ hasMobile: boolean;
11
+ hasDatabase: boolean;
12
+ testFramework: string;
13
+ packageManager: string;
14
+ }
15
+
16
+ /**
17
+ * Detected framework with version, detected from dependency files.
18
+ */
19
+ export interface FrameworkInfo {
20
+ name: string;
21
+ version: string | null;
22
+ category: 'web' | 'orm' | 'test' | 'lint' | 'build' | 'other';
23
+ confidence: number;
24
+ }
25
+
26
+ /**
27
+ * Detected toolchain — build, test, lint, run commands.
28
+ */
29
+ export interface DetectedToolchain {
30
+ buildCmd: string;
31
+ testCmd: string;
32
+ lintCmd: string;
33
+ runCmd: string;
34
+ coverageCmd: string;
35
+ installCmd: string;
36
+ migrateCmd: string | null;
37
+ depsFile: string;
38
+ }
@@ -0,0 +1,31 @@
1
+ import { AnalysisReport } from '@girardelli/architect-core/src/core/types/core.js';
2
+ import { RefactoringPlan } from '@girardelli/architect-core/src/core/types/rules.js';
3
+ import { StackInfo, FrameworkInfo, DetectedToolchain } from './stack.js';
4
+ import { DomainInsights, ModuleDetail, DetectedEndpoint } from './domain.js';
5
+ import { AgentGeneratorConfig } from './agent.js';
6
+
7
+ export interface TemplateContext {
8
+ report: AnalysisReport;
9
+ plan: RefactoringPlan;
10
+ stack: StackInfo;
11
+ projectName: string;
12
+ stackLabel: string;
13
+ config: AgentGeneratorConfig;
14
+ }
15
+
16
+ export interface EnrichedTemplateContext extends TemplateContext {
17
+ domain: DomainInsights;
18
+ modules: ModuleDetail[];
19
+ endpoints: DetectedEndpoint[];
20
+ untestedModules: string[];
21
+ criticalPaths: string[]; // files with highest coupling
22
+ projectDepth: 'small' | 'medium' | 'large' | 'enterprise'; // drives template verbosity
23
+ /** Detected frameworks with versions */
24
+ detectedFrameworks: FrameworkInfo[];
25
+ /** Primary web framework (e.g., 'FastAPI', 'NestJS', 'Django') */
26
+ primaryFramework: FrameworkInfo | null;
27
+ /** Detected toolchain commands */
28
+ toolchain: DetectedToolchain;
29
+ /** Real project structure pattern detected */
30
+ projectStructure: 'clean-architecture' | 'mvc' | 'modular' | 'flat' | 'monorepo' | 'unknown';
31
+ }
@@ -0,0 +1,178 @@
1
+ /**
2
+ * AI Provider Factory
3
+ * Zero-dependency, lightweight adapter for multiple LLM endpoints.
4
+ */
5
+
6
+ export interface AIProvider {
7
+ /**
8
+ * Translates an explicit AI prompt along with the existing file content
9
+ * into a newly unified source code string.
10
+ */
11
+ executeRefactoringPrompt(fileContent: string, prompt: string): Promise<string>;
12
+ }
13
+
14
+ export class OpenAIProvider implements AIProvider {
15
+ private apiKey: string;
16
+ private model: string;
17
+ private apiUrl: string;
18
+
19
+ constructor(apiKey: string, model: string = 'gpt-4o', apiUrl = 'https://api.openai.com/v1/chat/completions') {
20
+ this.apiKey = apiKey;
21
+ this.model = model;
22
+ this.apiUrl = apiUrl;
23
+ }
24
+
25
+ async executeRefactoringPrompt(fileContent: string, prompt: string): Promise<string> {
26
+ const systemPrompt = `You are a strict, top-tier Software Architect AI modifying code.
27
+ Return ONLY the fully rewritten source code. Never use markdown code blocks (\`\`\`).
28
+ Do NOT include explanations or prefix/suffix text. Your complete response must be purely the new raw code content.`;
29
+
30
+ const userMessage = `${prompt}\n\nCurrent file content:\n\n${fileContent}`;
31
+
32
+ const response = await fetch(this.apiUrl, {
33
+ method: 'POST',
34
+ headers: {
35
+ 'Content-Type': 'application/json',
36
+ Authorization: `Bearer ${this.apiKey}`,
37
+ },
38
+ body: JSON.stringify({
39
+ model: this.model,
40
+ messages: [
41
+ { role: 'system', content: systemPrompt },
42
+ { role: 'user', content: userMessage },
43
+ ],
44
+ temperature: 0.1,
45
+ }),
46
+ });
47
+
48
+ if (!response.ok) {
49
+ const err = await response.text();
50
+ throw new Error(`OpenAI API Error (${response.status}): ${err}`);
51
+ }
52
+
53
+ const data: any = await response.json();
54
+ let newCode = data.choices[0].message.content.trim();
55
+
56
+ // Safety check just in case LLM injected markdown blocks
57
+ if (newCode.startsWith('```') && newCode.endsWith('```')) {
58
+ const lines = newCode.split('\n');
59
+ lines.shift(); // Remove first line (```language)
60
+ lines.pop(); // Remove last line (```)
61
+ newCode = lines.join('\n');
62
+ }
63
+
64
+ return newCode;
65
+ }
66
+ }
67
+
68
+ export class AnthropicProvider implements AIProvider {
69
+ private apiKey: string;
70
+ private model: string;
71
+
72
+ constructor(apiKey: string, model: string = 'claude-3-7-sonnet-20250219') {
73
+ this.apiKey = apiKey;
74
+ this.model = model;
75
+ }
76
+
77
+ async executeRefactoringPrompt(fileContent: string, prompt: string): Promise<string> {
78
+ const systemPrompt = `You are a strict Software Architect AI modifying code. Return ONLY the fully rewritten source code. Never use markdown code blocks (\`\`\`). Do NOT include any conversational text.`;
79
+ const userMessage = `${prompt}\n\n<current_file>\n${fileContent}\n</current_file>`;
80
+
81
+ const response = await fetch('https://api.anthropic.com/v1/messages', {
82
+ method: 'POST',
83
+ headers: {
84
+ 'Content-Type': 'application/json',
85
+ 'x-api-key': this.apiKey,
86
+ 'anthropic-version': '2023-06-01',
87
+ },
88
+ body: JSON.stringify({
89
+ model: this.model,
90
+ system: systemPrompt,
91
+ messages: [{ role: 'user', content: userMessage }],
92
+ max_tokens: 8192,
93
+ temperature: 0.1,
94
+ }),
95
+ });
96
+
97
+ if (!response.ok) {
98
+ const err = await response.text();
99
+ throw new Error(`Anthropic API Error (${response.status}): ${err}`);
100
+ }
101
+
102
+ const data: any = await response.json();
103
+ let newCode = data.content[0].text.trim();
104
+ if (newCode.startsWith('```') && newCode.endsWith('```')) {
105
+ const lines = newCode.split('\n');
106
+ lines.shift(); lines.pop();
107
+ newCode = lines.join('\n');
108
+ }
109
+ return newCode;
110
+ }
111
+ }
112
+
113
+ export class GeminiProvider implements AIProvider {
114
+ private apiKey: string;
115
+ private model: string;
116
+
117
+ constructor(apiKey: string, model: string = 'gemini-2.5-flash') {
118
+ this.apiKey = apiKey;
119
+ this.model = model;
120
+ }
121
+
122
+ async executeRefactoringPrompt(fileContent: string, prompt: string): Promise<string> {
123
+ const url = `https://generativelanguage.googleapis.com/v1beta/models/${this.model}:generateContent?key=${this.apiKey}`;
124
+
125
+ const systemPrompt = 'You are a strict Software Architect AI modifying code. Return ONLY the fully rewritten source code without markdown formatting or conversational filler.';
126
+
127
+ const response = await fetch(url, {
128
+ method: 'POST',
129
+ headers: { 'Content-Type': 'application/json' },
130
+ body: JSON.stringify({
131
+ systemInstruction: { parts: [{ text: systemPrompt }] },
132
+ contents: [
133
+ { role: 'user', parts: [{ text: `${prompt}\n\nFile Content:\n\n${fileContent}` }] }
134
+ ],
135
+ generationConfig: { temperature: 0.1 }
136
+ }),
137
+ });
138
+
139
+ if (!response.ok) {
140
+ const err = await response.text();
141
+ throw new Error(`Gemini API Error (${response.status}): ${err}`);
142
+ }
143
+
144
+ const data: any = await response.json();
145
+ const candidate = data.candidates?.[0]?.content?.parts?.[0]?.text || '';
146
+ let newCode = candidate.trim();
147
+
148
+ if (newCode.startsWith('```') && newCode.endsWith('```')) {
149
+ const lines = newCode.split('\n');
150
+ lines.shift(); lines.pop();
151
+ newCode = lines.join('\n');
152
+ }
153
+ return newCode;
154
+ }
155
+ }
156
+
157
+ export class ModelProviderFactory {
158
+ static createProvider(): AIProvider {
159
+ if (process.env.ANTHROPIC_API_KEY) {
160
+ return new AnthropicProvider(process.env.ANTHROPIC_API_KEY);
161
+ }
162
+
163
+ if (process.env.OPENAI_API_KEY) {
164
+ // Allow overriding API URL for OpenAI compatibles (e.g. DeepSeek, Groq, local LMStudio)
165
+ const model = process.env.OPENAI_MODEL_NAME || 'gpt-4o';
166
+ const apiUrl = process.env.OPENAI_BASE_URL
167
+ ? `${process.env.OPENAI_BASE_URL.replace(/\/$/, '')}/chat/completions`
168
+ : undefined;
169
+ return new OpenAIProvider(process.env.OPENAI_API_KEY, model, apiUrl);
170
+ }
171
+
172
+ if (process.env.GEMINI_API_KEY) {
173
+ return new GeminiProvider(process.env.GEMINI_API_KEY);
174
+ }
175
+
176
+ throw new Error('No AI API Key found in environment variables. Define OPENAI_API_KEY, ANTHROPIC_API_KEY, or GEMINI_API_KEY to execute AI-based refactoring.');
177
+ }
178
+ }
@@ -0,0 +1,148 @@
1
+ import { writeFileSync, mkdirSync, readFileSync, renameSync, unlinkSync, existsSync } from 'fs';
2
+ import { dirname } from 'path';
3
+ import { execSync } from 'child_process';
4
+ import { RefactoringPlan, RefactorStep, FileOperation } from '@girardelli/architect-core/src/core/types/rules.js';
5
+ import { HumanGate } from './human-gate.js';
6
+ import { ModelProviderFactory } from './ai-provider.js';
7
+
8
+ export class AgentExecutor {
9
+ private gate: HumanGate;
10
+ // @ts-ignore - Audit cleanup unused variable
11
+ private autoMode: boolean;
12
+
13
+ constructor(autoMode: boolean = false) {
14
+ this.autoMode = autoMode;
15
+ this.gate = new HumanGate(autoMode);
16
+ }
17
+
18
+ /**
19
+ * Main entrypoint for Agent Runtime.
20
+ */
21
+ async executePlan(plan: RefactoringPlan) {
22
+ console.log(`\n\x1b[35m=== 🤖 Architect Autonomous Agent ===\x1b[0m`);
23
+ console.log(`Loaded Refactoring Plan: ${plan.steps.length} procedural steps.\n`);
24
+
25
+ // 1. Mandatory Git Flow Branching
26
+ this.ensureProtectiveBranch();
27
+
28
+ // 2. Load AI Provider if needed
29
+ const needsAI = plan.steps.some((s) => !!s.aiPrompt);
30
+ let aiProvider = null;
31
+ if (needsAI) {
32
+ try {
33
+ aiProvider = ModelProviderFactory.createProvider();
34
+ console.log(`\x1b[32m[AI Engine Ready]\x1b[0m Linked to external LLM provider.\n`);
35
+ } catch (e: any) {
36
+ console.warn(`\x1b[33m[AI Warning]\x1b[0m Could not connect AI Provider (` + e.message + `). Steps requiring AI will be skipped.\n`);
37
+ }
38
+ }
39
+
40
+ // 3. Execution Loop
41
+ for (const step of plan.steps) {
42
+ const approved = await this.gate.requestApproval(step);
43
+
44
+ if (!approved) {
45
+ console.log(`\x1b[90mSkipping step #${step.id}...\x1b[0m\n`);
46
+ continue;
47
+ }
48
+
49
+ console.log(`\n\x1b[36mExecuting Step #${step.id}...\x1b[0m`);
50
+ let successCount = 0;
51
+
52
+ for (const op of step.operations) {
53
+ try {
54
+ await this.executeOperation(op, step.aiPrompt, aiProvider);
55
+ successCount++;
56
+ } catch (e: any) {
57
+ console.error(`\x1b[31mFailed to execute operation on ${op.path}:\x1b[0m ${e.message}`);
58
+ }
59
+ }
60
+
61
+ // 4. Atomic Commit per Step
62
+ if (successCount > 0) {
63
+ this.commitStep(step);
64
+ }
65
+ }
66
+
67
+ this.gate.close();
68
+ console.log(`\n\x1b[32m=== ✅ Autonomous Execution Complete ===\x1b[0m`);
69
+ console.log(`Changes are safed in the current feature branch. Review, test, and push to remote!`);
70
+ }
71
+
72
+ private async executeOperation(op: FileOperation, aiPrompt?: string, aiProvider?: any) {
73
+ const targetPath = op.path;
74
+
75
+ if (op.type === 'CREATE') {
76
+ if (op.content) {
77
+ mkdirSync(dirname(targetPath), { recursive: true });
78
+ writeFileSync(targetPath, op.content, 'utf8');
79
+ console.log(` \x1b[32m✔ Created:\x1b[0m ${targetPath}`);
80
+ }
81
+ }
82
+ else if (op.type === 'MOVE' && op.newPath) {
83
+ if (existsSync(targetPath)) {
84
+ mkdirSync(dirname(op.newPath), { recursive: true });
85
+ renameSync(targetPath, op.newPath);
86
+ console.log(` \x1b[34m✔ Moved:\x1b[0m ${targetPath} -> ${op.newPath}`);
87
+ }
88
+ }
89
+ else if (op.type === 'DELETE') {
90
+ if (existsSync(targetPath)) {
91
+ unlinkSync(targetPath);
92
+ console.log(` \x1b[31m✔ Deleted:\x1b[0m ${targetPath}`);
93
+ }
94
+ }
95
+ else if (op.type === 'MODIFY') {
96
+ if (!existsSync(targetPath)) {
97
+ throw new Error(`Target file ${targetPath} does not exist`);
98
+ }
99
+
100
+ const currentContent = readFileSync(targetPath, 'utf8');
101
+
102
+ if (aiPrompt) {
103
+ if (!aiProvider) throw new Error('AI Provider not configured, cannot execute prompt');
104
+ console.log(` \x1b[35m✨ AI Generating structure for ${targetPath}...\x1b[0m`);
105
+
106
+ const newContent = await aiProvider.executeRefactoringPrompt(currentContent, aiPrompt);
107
+ writeFileSync(targetPath, newContent, 'utf8');
108
+ console.log(` \x1b[33m✔ AI Re-wrote:\x1b[0m ${targetPath}`);
109
+ } else if (op.content) {
110
+ // Fallback or exact replacement
111
+ writeFileSync(targetPath, op.content, 'utf8');
112
+ console.log(` \x1b[33m✔ Modified:\x1b[0m ${targetPath}`);
113
+ }
114
+ }
115
+ }
116
+
117
+ private ensureProtectiveBranch() {
118
+ if (process.env.NODE_ENV === 'test') return;
119
+ try {
120
+ const currentBranch = execSync('git rev-parse --abbrev-ref HEAD').toString().trim();
121
+ const needsNewBranch = ['main', 'master', 'develop'].includes(currentBranch);
122
+
123
+ if (needsNewBranch) {
124
+ const ts = new Date().getTime();
125
+ const branchName = `feature/architect-refactor-${ts}`;
126
+ console.log(`\x1b[36m[Git Flow]\x1b[0m Currently on '${currentBranch}'. Creating protective branch \x1b[33m${branchName}\x1b[0m...`);
127
+ execSync(`git checkout -b ${branchName}`);
128
+ } else {
129
+ console.log(`\x1b[32m[Git Flow]\x1b[0m Continuing firmly on non-base branch '${currentBranch}'.`);
130
+ }
131
+ } catch (e) {
132
+ console.warn(`\x1b[33m[Warning]\x1b[0m Git repository not detected or git command failed. Proceeding without branch protection.`);
133
+ }
134
+ }
135
+
136
+ private commitStep(step: RefactorStep) {
137
+ if (process.env.NODE_ENV === 'test') return;
138
+ try {
139
+ execSync('git add .');
140
+ const msg = `refactor(architect): apply rule ${step.rule}\n\nAuto-applied by Architect Agent.\nMotivation: ${step.title}`;
141
+ execSync(`git commit -m "${msg}"`);
142
+ console.log(` \x1b[32m✔ Git Commit Saved: ${step.rule}\x1b[0m\n`);
143
+ } catch (e) {
144
+ // Might happen if there were no actual changes (e.g. content was identical)
145
+ console.log(` \x1b[90m(No git changes detected for this step)\x1b[0m\n`);
146
+ }
147
+ }
148
+ }
@@ -0,0 +1,69 @@
1
+ import * as readline from 'readline/promises';
2
+ import { stdin as input, stdout as output } from 'process';
3
+ import { RefactorStep, FileOperation } from '@girardelli/architect-core/src/core/types/rules.js';
4
+ import { logger } from '@girardelli/architect-core/src/infrastructure/logger.js';
5
+
6
+ export class HumanGate {
7
+ private rl: readline.Interface | null = null;
8
+ private autoMode: boolean;
9
+
10
+ constructor(autoMode: boolean = false) {
11
+ this.autoMode = autoMode;
12
+ }
13
+
14
+ /**
15
+ * Request manual approval before applying a refactoring step.
16
+ * If autoMode is true, it always auto-approves.
17
+ */
18
+ async requestApproval(step: RefactorStep): Promise<boolean> {
19
+ logger.info(`\n\x1b[36m[Architect Agent]\x1b[0m Evaluating Refactor Step \x1b[33m#${step.id}: ${step.title}\x1b[0m`);
20
+ logger.info(`\x1b[90mRationale: ${step.rationale}\x1b[0m\n`);
21
+
22
+ for (const op of step.operations) {
23
+ this.printOperation(op, !!step.aiPrompt);
24
+ }
25
+
26
+ if (this.autoMode) {
27
+ logger.info(`\n\x1b[32m[Auto-Mode Enabled]\x1b[0m Automatically applying changes...`);
28
+ return true;
29
+ }
30
+
31
+ if (!this.rl) {
32
+ this.rl = readline.createInterface({ input, output });
33
+ }
34
+
35
+ const answer = await this.rl.question(`\n⚠️ Do you approve executing these structural changes? [y/N]: `);
36
+ return answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes';
37
+ }
38
+
39
+ /**
40
+ * Prints the planned operation visually
41
+ */
42
+ private printOperation(op: FileOperation, hasAiPrompt: boolean) {
43
+ let color = '';
44
+ let label = '';
45
+
46
+ switch(op.type) {
47
+ case 'CREATE': color = '\x1b[32m'; label = '✚ CREATE'; break; // Green
48
+ case 'MODIFY': color = '\x1b[33m'; label = '✎ MODIFY'; break; // Yellow
49
+ case 'DELETE': color = '\x1b[31m'; label = '✖ DELETE'; break; // Red
50
+ case 'MOVE': color = '\x1b[34m'; label = '➡ MOVE '; break; // Blue
51
+ }
52
+
53
+ logger.info(` ${color}${label}\x1b[0m ${op.path}`);
54
+ if (op.newPath) {
55
+ logger.info(` \x1b[90m↳ Target: ${op.newPath}\x1b[0m`);
56
+ }
57
+ logger.info(` \x1b[90mDetails: ${op.description}\x1b[0m`);
58
+ if (hasAiPrompt && op.type === 'MODIFY') {
59
+ logger.info(` \x1b[35m✨ AI Operation:\x1b[0m Requires LLM Execution.`);
60
+ }
61
+ }
62
+
63
+ close() {
64
+ if (this.rl) {
65
+ this.rl.close();
66
+ this.rl = null;
67
+ }
68
+ }
69
+ }