@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,241 @@
1
+ import { StackDetector } from '../src/agent-generator/stack-detector.js';
2
+ import { AnalysisReport } from '../src/types.js';
3
+
4
+ function makeReport(nodes: string[], frameworks: string[] = []): AnalysisReport {
5
+ return {
6
+ timestamp: new Date().toISOString(),
7
+ projectInfo: {
8
+ path: '/test',
9
+ name: 'test-project',
10
+ frameworks,
11
+ totalFiles: nodes.length,
12
+ totalLines: 1000,
13
+ primaryLanguages: [],
14
+ },
15
+ score: {
16
+ overall: 75,
17
+ components: [],
18
+ breakdown: { modularity: 80, coupling: 70, cohesion: 75, layering: 75 },
19
+ },
20
+ antiPatterns: [],
21
+ layers: [],
22
+ dependencyGraph: { nodes, edges: [] },
23
+ suggestions: [],
24
+ diagram: { mermaid: '', type: 'layer' },
25
+ };
26
+ }
27
+
28
+ describe('StackDetector', () => {
29
+ const detector = new StackDetector();
30
+
31
+ describe('Language Detection', () => {
32
+ it('should detect TypeScript from .ts files', () => {
33
+ const report = makeReport(['src/app.ts', 'src/index.ts']);
34
+ const stack = detector.detect(report);
35
+
36
+ expect(stack.languages).toContain('TypeScript');
37
+ expect(stack.primary).toBe('TypeScript');
38
+ });
39
+
40
+ it('should detect Python from .py files', () => {
41
+ const report = makeReport(['src/main.py', 'src/utils.py']);
42
+ const stack = detector.detect(report);
43
+
44
+ expect(stack.languages).toContain('Python');
45
+ expect(stack.primary).toBe('Python');
46
+ });
47
+
48
+ it('should detect Dart from .dart files', () => {
49
+ const report = makeReport(['lib/main.dart', 'lib/app.dart']);
50
+ const stack = detector.detect(report);
51
+
52
+ expect(stack.languages).toContain('Dart');
53
+ expect(stack.primary).toBe('Dart');
54
+ });
55
+
56
+ it('should detect Go from .go files', () => {
57
+ const report = makeReport(['main.go', 'handler.go', 'go.mod']);
58
+ const stack = detector.detect(report);
59
+
60
+ expect(stack.languages).toContain('Go');
61
+ });
62
+
63
+ it('should detect multiple languages', () => {
64
+ const report = makeReport(['src/app.ts', 'scripts/build.py']);
65
+ const stack = detector.detect(report);
66
+
67
+ expect(stack.languages).toContain('TypeScript');
68
+ expect(stack.languages).toContain('Python');
69
+ });
70
+
71
+ it('should return Unknown for unrecognized extensions', () => {
72
+ const report = makeReport(['file.xyz', 'data.abc']);
73
+ const stack = detector.detect(report);
74
+
75
+ expect(stack.primary).toBe('Unknown');
76
+ expect(stack.languages).toHaveLength(0);
77
+ });
78
+ });
79
+
80
+ describe('Framework Detection', () => {
81
+ it('should detect NestJS from projectInfo.frameworks', () => {
82
+ const report = makeReport(['src/app.module.ts', 'src/users/users.service.ts'], ['NestJS']);
83
+ const stack = detector.detect(report);
84
+
85
+ expect(stack.frameworks).toContain('NestJS');
86
+ });
87
+
88
+ it('should detect Angular from projectInfo.frameworks', () => {
89
+ const report = makeReport(['src/app/app.component.ts', 'src/app/app.module.ts'], ['Angular']);
90
+ const stack = detector.detect(report);
91
+
92
+ expect(stack.frameworks).toContain('Angular');
93
+ });
94
+
95
+ it('should detect Django from projectInfo.frameworks', () => {
96
+ const report = makeReport(['manage.py', 'app/views.py', 'app/models.py'], ['Django']);
97
+ const stack = detector.detect(report);
98
+
99
+ expect(stack.frameworks).toContain('Django');
100
+ });
101
+
102
+ it('should detect Flutter from projectInfo.frameworks', () => {
103
+ const report = makeReport(['lib/main.dart', 'lib/app.dart'], ['Flutter']);
104
+ const stack = detector.detect(report);
105
+
106
+ expect(stack.frameworks).toContain('Flutter');
107
+ });
108
+
109
+ it('should detect Spring Boot from projectInfo.frameworks', () => {
110
+ const report = makeReport(['pom.xml', 'src/main/java/App.java'], ['Spring Boot']);
111
+ const stack = detector.detect(report);
112
+
113
+ expect(stack.frameworks).toContain('Spring Boot');
114
+ });
115
+
116
+ it('should detect Next.js from projectInfo.frameworks', () => {
117
+ const report = makeReport(['src/pages/index.tsx', 'next.config.js'], ['Next.js']);
118
+ const stack = detector.detect(report);
119
+
120
+ expect(stack.frameworks).toContain('Next.js');
121
+ });
122
+
123
+ it('should detect Vue from projectInfo.frameworks', () => {
124
+ const report = makeReport(['src/App.vue', 'src/components/Header.vue'], ['Vue']);
125
+ const stack = detector.detect(report);
126
+
127
+ expect(stack.frameworks).toContain('Vue');
128
+ });
129
+ });
130
+
131
+ describe('Derived Properties', () => {
132
+ it('should set hasBackend true for TypeScript projects', () => {
133
+ const report = makeReport(['src/app.ts', 'src/controller.ts']);
134
+ const stack = detector.detect(report);
135
+
136
+ expect(stack.hasBackend).toBe(true);
137
+ });
138
+
139
+ it('should set hasFrontend true for Angular projects', () => {
140
+ const report = makeReport(['src/app.component.ts', 'src/app.module.ts'], ['Angular']);
141
+ const stack = detector.detect(report);
142
+
143
+ expect(stack.hasFrontend).toBe(true);
144
+ });
145
+
146
+ it('should set hasMobile true for Dart projects', () => {
147
+ const report = makeReport(['lib/main.dart']);
148
+ const stack = detector.detect(report);
149
+
150
+ expect(stack.hasMobile).toBe(true);
151
+ });
152
+
153
+ it('should set hasDatabase true when migration files exist', () => {
154
+ const report = makeReport(['src/app.ts', 'src/migration/001_init.ts']);
155
+ const stack = detector.detect(report);
156
+
157
+ expect(stack.hasDatabase).toBe(true);
158
+ });
159
+
160
+ it('should set hasDatabase true when entity files exist', () => {
161
+ const report = makeReport(['src/app.ts', 'src/entity/user.entity.ts']);
162
+ const stack = detector.detect(report);
163
+
164
+ expect(stack.hasDatabase).toBe(true);
165
+ });
166
+
167
+ it('should set hasDatabase false when no DB-related patterns', () => {
168
+ const report = makeReport(['src/app.ts', 'src/utils.ts']);
169
+ const stack = detector.detect(report);
170
+
171
+ expect(stack.hasDatabase).toBe(false);
172
+ });
173
+ });
174
+
175
+ describe('Test Framework Detection', () => {
176
+ it('should return pytest for Python', () => {
177
+ const report = makeReport(['src/main.py']);
178
+ const stack = detector.detect(report);
179
+
180
+ expect(stack.testFramework).toBe('pytest');
181
+ });
182
+
183
+ it('should return flutter_test for Dart', () => {
184
+ const report = makeReport(['lib/main.dart']);
185
+ const stack = detector.detect(report);
186
+
187
+ expect(stack.testFramework).toBe('flutter_test');
188
+ });
189
+
190
+ it('should return Jest for TypeScript (non-Angular)', () => {
191
+ const report = makeReport(['src/app.ts']);
192
+ const stack = detector.detect(report);
193
+
194
+ expect(stack.testFramework).toBe('Jest');
195
+ });
196
+
197
+ it('should return Jest + Jasmine for Angular', () => {
198
+ const report = makeReport(['src/app.component.ts'], ['Angular']);
199
+ const stack = detector.detect(report);
200
+
201
+ expect(stack.testFramework).toBe('Jest + Jasmine');
202
+ });
203
+
204
+ it('should return go test for Go', () => {
205
+ const report = makeReport(['main.go']);
206
+ const stack = detector.detect(report);
207
+
208
+ expect(stack.testFramework).toBe('go test');
209
+ });
210
+ });
211
+
212
+ describe('Package Manager Detection', () => {
213
+ it('should return pip for Python', () => {
214
+ const report = makeReport(['src/main.py']);
215
+ const stack = detector.detect(report);
216
+
217
+ expect(stack.packageManager).toBe('pip');
218
+ });
219
+
220
+ it('should return npm for TypeScript', () => {
221
+ const report = makeReport(['src/app.ts']);
222
+ const stack = detector.detect(report);
223
+
224
+ expect(stack.packageManager).toBe('npm');
225
+ });
226
+
227
+ it('should return pub for Dart', () => {
228
+ const report = makeReport(['lib/main.dart']);
229
+ const stack = detector.detect(report);
230
+
231
+ expect(stack.packageManager).toBe('pub');
232
+ });
233
+
234
+ it('should return cargo for Rust', () => {
235
+ const report = makeReport(['src/main.rs', 'Cargo.toml']);
236
+ const stack = detector.detect(report);
237
+
238
+ expect(stack.packageManager).toBe('cargo');
239
+ });
240
+ });
241
+ });