amd-gaia 0.14.1__py3-none-any.whl

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 (800) hide show
  1. amd_gaia-0.14.1.dist-info/METADATA +768 -0
  2. amd_gaia-0.14.1.dist-info/RECORD +800 -0
  3. amd_gaia-0.14.1.dist-info/WHEEL +5 -0
  4. amd_gaia-0.14.1.dist-info/entry_points.txt +5 -0
  5. amd_gaia-0.14.1.dist-info/licenses/LICENSE.md +21 -0
  6. amd_gaia-0.14.1.dist-info/top_level.txt +1 -0
  7. gaia/__init__.py +2 -0
  8. gaia/agents/__init__.py +19 -0
  9. gaia/agents/base/__init__.py +9 -0
  10. gaia/agents/base/agent.py +2072 -0
  11. gaia/agents/base/api_agent.py +120 -0
  12. gaia/agents/base/console.py +1457 -0
  13. gaia/agents/base/mcp_agent.py +86 -0
  14. gaia/agents/base/tools.py +83 -0
  15. gaia/agents/blender/agent.py +556 -0
  16. gaia/agents/blender/agent_simple.py +135 -0
  17. gaia/agents/blender/app.py +211 -0
  18. gaia/agents/blender/app_simple.py +41 -0
  19. gaia/agents/blender/core/__init__.py +16 -0
  20. gaia/agents/blender/core/materials.py +506 -0
  21. gaia/agents/blender/core/objects.py +316 -0
  22. gaia/agents/blender/core/rendering.py +225 -0
  23. gaia/agents/blender/core/scene.py +220 -0
  24. gaia/agents/blender/core/view.py +146 -0
  25. gaia/agents/chat/__init__.py +9 -0
  26. gaia/agents/chat/agent.py +975 -0
  27. gaia/agents/chat/app.py +1058 -0
  28. gaia/agents/chat/session.py +508 -0
  29. gaia/agents/chat/tools/__init__.py +15 -0
  30. gaia/agents/chat/tools/file_tools.py +96 -0
  31. gaia/agents/chat/tools/rag_tools.py +1729 -0
  32. gaia/agents/chat/tools/shell_tools.py +436 -0
  33. gaia/agents/code/__init__.py +7 -0
  34. gaia/agents/code/agent.py +547 -0
  35. gaia/agents/code/app.py +266 -0
  36. gaia/agents/code/models.py +135 -0
  37. gaia/agents/code/orchestration/__init__.py +24 -0
  38. gaia/agents/code/orchestration/checklist_executor.py +1739 -0
  39. gaia/agents/code/orchestration/checklist_generator.py +709 -0
  40. gaia/agents/code/orchestration/factories/__init__.py +9 -0
  41. gaia/agents/code/orchestration/factories/base.py +63 -0
  42. gaia/agents/code/orchestration/factories/nextjs_factory.py +118 -0
  43. gaia/agents/code/orchestration/factories/python_factory.py +106 -0
  44. gaia/agents/code/orchestration/orchestrator.py +610 -0
  45. gaia/agents/code/orchestration/project_analyzer.py +391 -0
  46. gaia/agents/code/orchestration/steps/__init__.py +67 -0
  47. gaia/agents/code/orchestration/steps/base.py +188 -0
  48. gaia/agents/code/orchestration/steps/error_handler.py +314 -0
  49. gaia/agents/code/orchestration/steps/nextjs.py +828 -0
  50. gaia/agents/code/orchestration/steps/python.py +307 -0
  51. gaia/agents/code/orchestration/template_catalog.py +463 -0
  52. gaia/agents/code/orchestration/workflows/__init__.py +14 -0
  53. gaia/agents/code/orchestration/workflows/base.py +80 -0
  54. gaia/agents/code/orchestration/workflows/nextjs.py +186 -0
  55. gaia/agents/code/orchestration/workflows/python.py +94 -0
  56. gaia/agents/code/prompts/__init__.py +11 -0
  57. gaia/agents/code/prompts/base_prompt.py +77 -0
  58. gaia/agents/code/prompts/code_patterns.py +1925 -0
  59. gaia/agents/code/prompts/nextjs_prompt.py +40 -0
  60. gaia/agents/code/prompts/python_prompt.py +109 -0
  61. gaia/agents/code/schema_inference.py +365 -0
  62. gaia/agents/code/system_prompt.py +41 -0
  63. gaia/agents/code/tools/__init__.py +42 -0
  64. gaia/agents/code/tools/cli_tools.py +1138 -0
  65. gaia/agents/code/tools/code_formatting.py +319 -0
  66. gaia/agents/code/tools/code_tools.py +769 -0
  67. gaia/agents/code/tools/error_fixing.py +1347 -0
  68. gaia/agents/code/tools/external_tools.py +180 -0
  69. gaia/agents/code/tools/file_io.py +845 -0
  70. gaia/agents/code/tools/prisma_tools.py +190 -0
  71. gaia/agents/code/tools/project_management.py +1016 -0
  72. gaia/agents/code/tools/testing.py +321 -0
  73. gaia/agents/code/tools/typescript_tools.py +122 -0
  74. gaia/agents/code/tools/validation_parsing.py +461 -0
  75. gaia/agents/code/tools/validation_tools.py +803 -0
  76. gaia/agents/code/tools/web_dev_tools.py +1744 -0
  77. gaia/agents/code/validators/__init__.py +16 -0
  78. gaia/agents/code/validators/antipattern_checker.py +241 -0
  79. gaia/agents/code/validators/ast_analyzer.py +197 -0
  80. gaia/agents/code/validators/requirements_validator.py +145 -0
  81. gaia/agents/code/validators/syntax_validator.py +171 -0
  82. gaia/agents/docker/__init__.py +7 -0
  83. gaia/agents/docker/agent.py +642 -0
  84. gaia/agents/jira/__init__.py +11 -0
  85. gaia/agents/jira/agent.py +894 -0
  86. gaia/agents/jira/jql_templates.py +299 -0
  87. gaia/agents/routing/__init__.py +7 -0
  88. gaia/agents/routing/agent.py +512 -0
  89. gaia/agents/routing/system_prompt.py +75 -0
  90. gaia/api/__init__.py +23 -0
  91. gaia/api/agent_registry.py +238 -0
  92. gaia/api/app.py +305 -0
  93. gaia/api/openai_server.py +575 -0
  94. gaia/api/schemas.py +186 -0
  95. gaia/api/sse_handler.py +370 -0
  96. gaia/apps/__init__.py +4 -0
  97. gaia/apps/llm/__init__.py +6 -0
  98. gaia/apps/llm/app.py +169 -0
  99. gaia/apps/summarize/app.py +633 -0
  100. gaia/apps/summarize/html_viewer.py +133 -0
  101. gaia/apps/summarize/pdf_formatter.py +284 -0
  102. gaia/audio/__init__.py +2 -0
  103. gaia/audio/audio_client.py +439 -0
  104. gaia/audio/audio_recorder.py +269 -0
  105. gaia/audio/kokoro_tts.py +599 -0
  106. gaia/audio/whisper_asr.py +432 -0
  107. gaia/chat/__init__.py +16 -0
  108. gaia/chat/app.py +430 -0
  109. gaia/chat/prompts.py +522 -0
  110. gaia/chat/sdk.py +1200 -0
  111. gaia/cli.py +5621 -0
  112. gaia/eval/batch_experiment.py +2332 -0
  113. gaia/eval/claude.py +542 -0
  114. gaia/eval/config.py +37 -0
  115. gaia/eval/email_generator.py +512 -0
  116. gaia/eval/eval.py +3179 -0
  117. gaia/eval/groundtruth.py +1130 -0
  118. gaia/eval/transcript_generator.py +582 -0
  119. gaia/eval/webapp/README.md +168 -0
  120. gaia/eval/webapp/node_modules/.bin/mime +16 -0
  121. gaia/eval/webapp/node_modules/.bin/mime.cmd +17 -0
  122. gaia/eval/webapp/node_modules/.bin/mime.ps1 +28 -0
  123. gaia/eval/webapp/node_modules/.package-lock.json +865 -0
  124. gaia/eval/webapp/node_modules/accepts/HISTORY.md +243 -0
  125. gaia/eval/webapp/node_modules/accepts/LICENSE +23 -0
  126. gaia/eval/webapp/node_modules/accepts/README.md +140 -0
  127. gaia/eval/webapp/node_modules/accepts/index.js +238 -0
  128. gaia/eval/webapp/node_modules/accepts/package.json +47 -0
  129. gaia/eval/webapp/node_modules/array-flatten/LICENSE +21 -0
  130. gaia/eval/webapp/node_modules/array-flatten/README.md +43 -0
  131. gaia/eval/webapp/node_modules/array-flatten/array-flatten.js +64 -0
  132. gaia/eval/webapp/node_modules/array-flatten/package.json +39 -0
  133. gaia/eval/webapp/node_modules/body-parser/HISTORY.md +672 -0
  134. gaia/eval/webapp/node_modules/body-parser/LICENSE +23 -0
  135. gaia/eval/webapp/node_modules/body-parser/README.md +476 -0
  136. gaia/eval/webapp/node_modules/body-parser/SECURITY.md +25 -0
  137. gaia/eval/webapp/node_modules/body-parser/index.js +156 -0
  138. gaia/eval/webapp/node_modules/body-parser/lib/read.js +205 -0
  139. gaia/eval/webapp/node_modules/body-parser/lib/types/json.js +247 -0
  140. gaia/eval/webapp/node_modules/body-parser/lib/types/raw.js +101 -0
  141. gaia/eval/webapp/node_modules/body-parser/lib/types/text.js +121 -0
  142. gaia/eval/webapp/node_modules/body-parser/lib/types/urlencoded.js +307 -0
  143. gaia/eval/webapp/node_modules/body-parser/package.json +56 -0
  144. gaia/eval/webapp/node_modules/bytes/History.md +97 -0
  145. gaia/eval/webapp/node_modules/bytes/LICENSE +23 -0
  146. gaia/eval/webapp/node_modules/bytes/Readme.md +152 -0
  147. gaia/eval/webapp/node_modules/bytes/index.js +170 -0
  148. gaia/eval/webapp/node_modules/bytes/package.json +42 -0
  149. gaia/eval/webapp/node_modules/call-bind-apply-helpers/.eslintrc +17 -0
  150. gaia/eval/webapp/node_modules/call-bind-apply-helpers/.github/FUNDING.yml +12 -0
  151. gaia/eval/webapp/node_modules/call-bind-apply-helpers/.nycrc +9 -0
  152. gaia/eval/webapp/node_modules/call-bind-apply-helpers/CHANGELOG.md +30 -0
  153. gaia/eval/webapp/node_modules/call-bind-apply-helpers/LICENSE +21 -0
  154. gaia/eval/webapp/node_modules/call-bind-apply-helpers/README.md +62 -0
  155. gaia/eval/webapp/node_modules/call-bind-apply-helpers/actualApply.d.ts +1 -0
  156. gaia/eval/webapp/node_modules/call-bind-apply-helpers/actualApply.js +10 -0
  157. gaia/eval/webapp/node_modules/call-bind-apply-helpers/applyBind.d.ts +19 -0
  158. gaia/eval/webapp/node_modules/call-bind-apply-helpers/applyBind.js +10 -0
  159. gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionApply.d.ts +1 -0
  160. gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionApply.js +4 -0
  161. gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionCall.d.ts +1 -0
  162. gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionCall.js +4 -0
  163. gaia/eval/webapp/node_modules/call-bind-apply-helpers/index.d.ts +64 -0
  164. gaia/eval/webapp/node_modules/call-bind-apply-helpers/index.js +15 -0
  165. gaia/eval/webapp/node_modules/call-bind-apply-helpers/package.json +85 -0
  166. gaia/eval/webapp/node_modules/call-bind-apply-helpers/reflectApply.d.ts +3 -0
  167. gaia/eval/webapp/node_modules/call-bind-apply-helpers/reflectApply.js +4 -0
  168. gaia/eval/webapp/node_modules/call-bind-apply-helpers/test/index.js +63 -0
  169. gaia/eval/webapp/node_modules/call-bind-apply-helpers/tsconfig.json +9 -0
  170. gaia/eval/webapp/node_modules/call-bound/.eslintrc +13 -0
  171. gaia/eval/webapp/node_modules/call-bound/.github/FUNDING.yml +12 -0
  172. gaia/eval/webapp/node_modules/call-bound/.nycrc +9 -0
  173. gaia/eval/webapp/node_modules/call-bound/CHANGELOG.md +42 -0
  174. gaia/eval/webapp/node_modules/call-bound/LICENSE +21 -0
  175. gaia/eval/webapp/node_modules/call-bound/README.md +53 -0
  176. gaia/eval/webapp/node_modules/call-bound/index.d.ts +94 -0
  177. gaia/eval/webapp/node_modules/call-bound/index.js +19 -0
  178. gaia/eval/webapp/node_modules/call-bound/package.json +99 -0
  179. gaia/eval/webapp/node_modules/call-bound/test/index.js +61 -0
  180. gaia/eval/webapp/node_modules/call-bound/tsconfig.json +10 -0
  181. gaia/eval/webapp/node_modules/content-disposition/HISTORY.md +60 -0
  182. gaia/eval/webapp/node_modules/content-disposition/LICENSE +22 -0
  183. gaia/eval/webapp/node_modules/content-disposition/README.md +142 -0
  184. gaia/eval/webapp/node_modules/content-disposition/index.js +458 -0
  185. gaia/eval/webapp/node_modules/content-disposition/package.json +44 -0
  186. gaia/eval/webapp/node_modules/content-type/HISTORY.md +29 -0
  187. gaia/eval/webapp/node_modules/content-type/LICENSE +22 -0
  188. gaia/eval/webapp/node_modules/content-type/README.md +94 -0
  189. gaia/eval/webapp/node_modules/content-type/index.js +225 -0
  190. gaia/eval/webapp/node_modules/content-type/package.json +42 -0
  191. gaia/eval/webapp/node_modules/cookie/LICENSE +24 -0
  192. gaia/eval/webapp/node_modules/cookie/README.md +317 -0
  193. gaia/eval/webapp/node_modules/cookie/SECURITY.md +25 -0
  194. gaia/eval/webapp/node_modules/cookie/index.js +334 -0
  195. gaia/eval/webapp/node_modules/cookie/package.json +44 -0
  196. gaia/eval/webapp/node_modules/cookie-signature/.npmignore +4 -0
  197. gaia/eval/webapp/node_modules/cookie-signature/History.md +38 -0
  198. gaia/eval/webapp/node_modules/cookie-signature/Readme.md +42 -0
  199. gaia/eval/webapp/node_modules/cookie-signature/index.js +51 -0
  200. gaia/eval/webapp/node_modules/cookie-signature/package.json +18 -0
  201. gaia/eval/webapp/node_modules/debug/.coveralls.yml +1 -0
  202. gaia/eval/webapp/node_modules/debug/.eslintrc +11 -0
  203. gaia/eval/webapp/node_modules/debug/.npmignore +9 -0
  204. gaia/eval/webapp/node_modules/debug/.travis.yml +14 -0
  205. gaia/eval/webapp/node_modules/debug/CHANGELOG.md +362 -0
  206. gaia/eval/webapp/node_modules/debug/LICENSE +19 -0
  207. gaia/eval/webapp/node_modules/debug/Makefile +50 -0
  208. gaia/eval/webapp/node_modules/debug/README.md +312 -0
  209. gaia/eval/webapp/node_modules/debug/component.json +19 -0
  210. gaia/eval/webapp/node_modules/debug/karma.conf.js +70 -0
  211. gaia/eval/webapp/node_modules/debug/node.js +1 -0
  212. gaia/eval/webapp/node_modules/debug/package.json +49 -0
  213. gaia/eval/webapp/node_modules/debug/src/browser.js +185 -0
  214. gaia/eval/webapp/node_modules/debug/src/debug.js +202 -0
  215. gaia/eval/webapp/node_modules/debug/src/index.js +10 -0
  216. gaia/eval/webapp/node_modules/debug/src/inspector-log.js +15 -0
  217. gaia/eval/webapp/node_modules/debug/src/node.js +248 -0
  218. gaia/eval/webapp/node_modules/depd/History.md +103 -0
  219. gaia/eval/webapp/node_modules/depd/LICENSE +22 -0
  220. gaia/eval/webapp/node_modules/depd/Readme.md +280 -0
  221. gaia/eval/webapp/node_modules/depd/index.js +538 -0
  222. gaia/eval/webapp/node_modules/depd/lib/browser/index.js +77 -0
  223. gaia/eval/webapp/node_modules/depd/package.json +45 -0
  224. gaia/eval/webapp/node_modules/destroy/LICENSE +23 -0
  225. gaia/eval/webapp/node_modules/destroy/README.md +63 -0
  226. gaia/eval/webapp/node_modules/destroy/index.js +209 -0
  227. gaia/eval/webapp/node_modules/destroy/package.json +48 -0
  228. gaia/eval/webapp/node_modules/dunder-proto/.eslintrc +5 -0
  229. gaia/eval/webapp/node_modules/dunder-proto/.github/FUNDING.yml +12 -0
  230. gaia/eval/webapp/node_modules/dunder-proto/.nycrc +13 -0
  231. gaia/eval/webapp/node_modules/dunder-proto/CHANGELOG.md +24 -0
  232. gaia/eval/webapp/node_modules/dunder-proto/LICENSE +21 -0
  233. gaia/eval/webapp/node_modules/dunder-proto/README.md +54 -0
  234. gaia/eval/webapp/node_modules/dunder-proto/get.d.ts +5 -0
  235. gaia/eval/webapp/node_modules/dunder-proto/get.js +30 -0
  236. gaia/eval/webapp/node_modules/dunder-proto/package.json +76 -0
  237. gaia/eval/webapp/node_modules/dunder-proto/set.d.ts +5 -0
  238. gaia/eval/webapp/node_modules/dunder-proto/set.js +35 -0
  239. gaia/eval/webapp/node_modules/dunder-proto/test/get.js +34 -0
  240. gaia/eval/webapp/node_modules/dunder-proto/test/index.js +4 -0
  241. gaia/eval/webapp/node_modules/dunder-proto/test/set.js +50 -0
  242. gaia/eval/webapp/node_modules/dunder-proto/tsconfig.json +9 -0
  243. gaia/eval/webapp/node_modules/ee-first/LICENSE +22 -0
  244. gaia/eval/webapp/node_modules/ee-first/README.md +80 -0
  245. gaia/eval/webapp/node_modules/ee-first/index.js +95 -0
  246. gaia/eval/webapp/node_modules/ee-first/package.json +29 -0
  247. gaia/eval/webapp/node_modules/encodeurl/LICENSE +22 -0
  248. gaia/eval/webapp/node_modules/encodeurl/README.md +109 -0
  249. gaia/eval/webapp/node_modules/encodeurl/index.js +60 -0
  250. gaia/eval/webapp/node_modules/encodeurl/package.json +40 -0
  251. gaia/eval/webapp/node_modules/es-define-property/.eslintrc +13 -0
  252. gaia/eval/webapp/node_modules/es-define-property/.github/FUNDING.yml +12 -0
  253. gaia/eval/webapp/node_modules/es-define-property/.nycrc +9 -0
  254. gaia/eval/webapp/node_modules/es-define-property/CHANGELOG.md +29 -0
  255. gaia/eval/webapp/node_modules/es-define-property/LICENSE +21 -0
  256. gaia/eval/webapp/node_modules/es-define-property/README.md +49 -0
  257. gaia/eval/webapp/node_modules/es-define-property/index.d.ts +3 -0
  258. gaia/eval/webapp/node_modules/es-define-property/index.js +14 -0
  259. gaia/eval/webapp/node_modules/es-define-property/package.json +81 -0
  260. gaia/eval/webapp/node_modules/es-define-property/test/index.js +56 -0
  261. gaia/eval/webapp/node_modules/es-define-property/tsconfig.json +10 -0
  262. gaia/eval/webapp/node_modules/es-errors/.eslintrc +5 -0
  263. gaia/eval/webapp/node_modules/es-errors/.github/FUNDING.yml +12 -0
  264. gaia/eval/webapp/node_modules/es-errors/CHANGELOG.md +40 -0
  265. gaia/eval/webapp/node_modules/es-errors/LICENSE +21 -0
  266. gaia/eval/webapp/node_modules/es-errors/README.md +55 -0
  267. gaia/eval/webapp/node_modules/es-errors/eval.d.ts +3 -0
  268. gaia/eval/webapp/node_modules/es-errors/eval.js +4 -0
  269. gaia/eval/webapp/node_modules/es-errors/index.d.ts +3 -0
  270. gaia/eval/webapp/node_modules/es-errors/index.js +4 -0
  271. gaia/eval/webapp/node_modules/es-errors/package.json +80 -0
  272. gaia/eval/webapp/node_modules/es-errors/range.d.ts +3 -0
  273. gaia/eval/webapp/node_modules/es-errors/range.js +4 -0
  274. gaia/eval/webapp/node_modules/es-errors/ref.d.ts +3 -0
  275. gaia/eval/webapp/node_modules/es-errors/ref.js +4 -0
  276. gaia/eval/webapp/node_modules/es-errors/syntax.d.ts +3 -0
  277. gaia/eval/webapp/node_modules/es-errors/syntax.js +4 -0
  278. gaia/eval/webapp/node_modules/es-errors/test/index.js +19 -0
  279. gaia/eval/webapp/node_modules/es-errors/tsconfig.json +49 -0
  280. gaia/eval/webapp/node_modules/es-errors/type.d.ts +3 -0
  281. gaia/eval/webapp/node_modules/es-errors/type.js +4 -0
  282. gaia/eval/webapp/node_modules/es-errors/uri.d.ts +3 -0
  283. gaia/eval/webapp/node_modules/es-errors/uri.js +4 -0
  284. gaia/eval/webapp/node_modules/es-object-atoms/.eslintrc +16 -0
  285. gaia/eval/webapp/node_modules/es-object-atoms/.github/FUNDING.yml +12 -0
  286. gaia/eval/webapp/node_modules/es-object-atoms/CHANGELOG.md +37 -0
  287. gaia/eval/webapp/node_modules/es-object-atoms/LICENSE +21 -0
  288. gaia/eval/webapp/node_modules/es-object-atoms/README.md +63 -0
  289. gaia/eval/webapp/node_modules/es-object-atoms/RequireObjectCoercible.d.ts +3 -0
  290. gaia/eval/webapp/node_modules/es-object-atoms/RequireObjectCoercible.js +11 -0
  291. gaia/eval/webapp/node_modules/es-object-atoms/ToObject.d.ts +7 -0
  292. gaia/eval/webapp/node_modules/es-object-atoms/ToObject.js +10 -0
  293. gaia/eval/webapp/node_modules/es-object-atoms/index.d.ts +3 -0
  294. gaia/eval/webapp/node_modules/es-object-atoms/index.js +4 -0
  295. gaia/eval/webapp/node_modules/es-object-atoms/isObject.d.ts +3 -0
  296. gaia/eval/webapp/node_modules/es-object-atoms/isObject.js +6 -0
  297. gaia/eval/webapp/node_modules/es-object-atoms/package.json +80 -0
  298. gaia/eval/webapp/node_modules/es-object-atoms/test/index.js +38 -0
  299. gaia/eval/webapp/node_modules/es-object-atoms/tsconfig.json +6 -0
  300. gaia/eval/webapp/node_modules/escape-html/LICENSE +24 -0
  301. gaia/eval/webapp/node_modules/escape-html/Readme.md +43 -0
  302. gaia/eval/webapp/node_modules/escape-html/index.js +78 -0
  303. gaia/eval/webapp/node_modules/escape-html/package.json +24 -0
  304. gaia/eval/webapp/node_modules/etag/HISTORY.md +83 -0
  305. gaia/eval/webapp/node_modules/etag/LICENSE +22 -0
  306. gaia/eval/webapp/node_modules/etag/README.md +159 -0
  307. gaia/eval/webapp/node_modules/etag/index.js +131 -0
  308. gaia/eval/webapp/node_modules/etag/package.json +47 -0
  309. gaia/eval/webapp/node_modules/express/History.md +3656 -0
  310. gaia/eval/webapp/node_modules/express/LICENSE +24 -0
  311. gaia/eval/webapp/node_modules/express/Readme.md +260 -0
  312. gaia/eval/webapp/node_modules/express/index.js +11 -0
  313. gaia/eval/webapp/node_modules/express/lib/application.js +661 -0
  314. gaia/eval/webapp/node_modules/express/lib/express.js +116 -0
  315. gaia/eval/webapp/node_modules/express/lib/middleware/init.js +43 -0
  316. gaia/eval/webapp/node_modules/express/lib/middleware/query.js +47 -0
  317. gaia/eval/webapp/node_modules/express/lib/request.js +525 -0
  318. gaia/eval/webapp/node_modules/express/lib/response.js +1179 -0
  319. gaia/eval/webapp/node_modules/express/lib/router/index.js +673 -0
  320. gaia/eval/webapp/node_modules/express/lib/router/layer.js +181 -0
  321. gaia/eval/webapp/node_modules/express/lib/router/route.js +230 -0
  322. gaia/eval/webapp/node_modules/express/lib/utils.js +303 -0
  323. gaia/eval/webapp/node_modules/express/lib/view.js +182 -0
  324. gaia/eval/webapp/node_modules/express/package.json +102 -0
  325. gaia/eval/webapp/node_modules/finalhandler/HISTORY.md +210 -0
  326. gaia/eval/webapp/node_modules/finalhandler/LICENSE +22 -0
  327. gaia/eval/webapp/node_modules/finalhandler/README.md +147 -0
  328. gaia/eval/webapp/node_modules/finalhandler/SECURITY.md +25 -0
  329. gaia/eval/webapp/node_modules/finalhandler/index.js +341 -0
  330. gaia/eval/webapp/node_modules/finalhandler/package.json +47 -0
  331. gaia/eval/webapp/node_modules/forwarded/HISTORY.md +21 -0
  332. gaia/eval/webapp/node_modules/forwarded/LICENSE +22 -0
  333. gaia/eval/webapp/node_modules/forwarded/README.md +57 -0
  334. gaia/eval/webapp/node_modules/forwarded/index.js +90 -0
  335. gaia/eval/webapp/node_modules/forwarded/package.json +45 -0
  336. gaia/eval/webapp/node_modules/fresh/HISTORY.md +70 -0
  337. gaia/eval/webapp/node_modules/fresh/LICENSE +23 -0
  338. gaia/eval/webapp/node_modules/fresh/README.md +119 -0
  339. gaia/eval/webapp/node_modules/fresh/index.js +137 -0
  340. gaia/eval/webapp/node_modules/fresh/package.json +46 -0
  341. gaia/eval/webapp/node_modules/fs/README.md +9 -0
  342. gaia/eval/webapp/node_modules/fs/package.json +20 -0
  343. gaia/eval/webapp/node_modules/function-bind/.eslintrc +21 -0
  344. gaia/eval/webapp/node_modules/function-bind/.github/FUNDING.yml +12 -0
  345. gaia/eval/webapp/node_modules/function-bind/.github/SECURITY.md +3 -0
  346. gaia/eval/webapp/node_modules/function-bind/.nycrc +13 -0
  347. gaia/eval/webapp/node_modules/function-bind/CHANGELOG.md +136 -0
  348. gaia/eval/webapp/node_modules/function-bind/LICENSE +20 -0
  349. gaia/eval/webapp/node_modules/function-bind/README.md +46 -0
  350. gaia/eval/webapp/node_modules/function-bind/implementation.js +84 -0
  351. gaia/eval/webapp/node_modules/function-bind/index.js +5 -0
  352. gaia/eval/webapp/node_modules/function-bind/package.json +87 -0
  353. gaia/eval/webapp/node_modules/function-bind/test/.eslintrc +9 -0
  354. gaia/eval/webapp/node_modules/function-bind/test/index.js +252 -0
  355. gaia/eval/webapp/node_modules/get-intrinsic/.eslintrc +42 -0
  356. gaia/eval/webapp/node_modules/get-intrinsic/.github/FUNDING.yml +12 -0
  357. gaia/eval/webapp/node_modules/get-intrinsic/.nycrc +9 -0
  358. gaia/eval/webapp/node_modules/get-intrinsic/CHANGELOG.md +186 -0
  359. gaia/eval/webapp/node_modules/get-intrinsic/LICENSE +21 -0
  360. gaia/eval/webapp/node_modules/get-intrinsic/README.md +71 -0
  361. gaia/eval/webapp/node_modules/get-intrinsic/index.js +378 -0
  362. gaia/eval/webapp/node_modules/get-intrinsic/package.json +97 -0
  363. gaia/eval/webapp/node_modules/get-intrinsic/test/GetIntrinsic.js +274 -0
  364. gaia/eval/webapp/node_modules/get-proto/.eslintrc +10 -0
  365. gaia/eval/webapp/node_modules/get-proto/.github/FUNDING.yml +12 -0
  366. gaia/eval/webapp/node_modules/get-proto/.nycrc +9 -0
  367. gaia/eval/webapp/node_modules/get-proto/CHANGELOG.md +21 -0
  368. gaia/eval/webapp/node_modules/get-proto/LICENSE +21 -0
  369. gaia/eval/webapp/node_modules/get-proto/Object.getPrototypeOf.d.ts +5 -0
  370. gaia/eval/webapp/node_modules/get-proto/Object.getPrototypeOf.js +6 -0
  371. gaia/eval/webapp/node_modules/get-proto/README.md +50 -0
  372. gaia/eval/webapp/node_modules/get-proto/Reflect.getPrototypeOf.d.ts +3 -0
  373. gaia/eval/webapp/node_modules/get-proto/Reflect.getPrototypeOf.js +4 -0
  374. gaia/eval/webapp/node_modules/get-proto/index.d.ts +5 -0
  375. gaia/eval/webapp/node_modules/get-proto/index.js +27 -0
  376. gaia/eval/webapp/node_modules/get-proto/package.json +81 -0
  377. gaia/eval/webapp/node_modules/get-proto/test/index.js +68 -0
  378. gaia/eval/webapp/node_modules/get-proto/tsconfig.json +9 -0
  379. gaia/eval/webapp/node_modules/gopd/.eslintrc +16 -0
  380. gaia/eval/webapp/node_modules/gopd/.github/FUNDING.yml +12 -0
  381. gaia/eval/webapp/node_modules/gopd/CHANGELOG.md +45 -0
  382. gaia/eval/webapp/node_modules/gopd/LICENSE +21 -0
  383. gaia/eval/webapp/node_modules/gopd/README.md +40 -0
  384. gaia/eval/webapp/node_modules/gopd/gOPD.d.ts +1 -0
  385. gaia/eval/webapp/node_modules/gopd/gOPD.js +4 -0
  386. gaia/eval/webapp/node_modules/gopd/index.d.ts +5 -0
  387. gaia/eval/webapp/node_modules/gopd/index.js +15 -0
  388. gaia/eval/webapp/node_modules/gopd/package.json +77 -0
  389. gaia/eval/webapp/node_modules/gopd/test/index.js +36 -0
  390. gaia/eval/webapp/node_modules/gopd/tsconfig.json +9 -0
  391. gaia/eval/webapp/node_modules/has-symbols/.eslintrc +11 -0
  392. gaia/eval/webapp/node_modules/has-symbols/.github/FUNDING.yml +12 -0
  393. gaia/eval/webapp/node_modules/has-symbols/.nycrc +9 -0
  394. gaia/eval/webapp/node_modules/has-symbols/CHANGELOG.md +91 -0
  395. gaia/eval/webapp/node_modules/has-symbols/LICENSE +21 -0
  396. gaia/eval/webapp/node_modules/has-symbols/README.md +46 -0
  397. gaia/eval/webapp/node_modules/has-symbols/index.d.ts +3 -0
  398. gaia/eval/webapp/node_modules/has-symbols/index.js +14 -0
  399. gaia/eval/webapp/node_modules/has-symbols/package.json +111 -0
  400. gaia/eval/webapp/node_modules/has-symbols/shams.d.ts +3 -0
  401. gaia/eval/webapp/node_modules/has-symbols/shams.js +45 -0
  402. gaia/eval/webapp/node_modules/has-symbols/test/index.js +22 -0
  403. gaia/eval/webapp/node_modules/has-symbols/test/shams/core-js.js +29 -0
  404. gaia/eval/webapp/node_modules/has-symbols/test/shams/get-own-property-symbols.js +29 -0
  405. gaia/eval/webapp/node_modules/has-symbols/test/tests.js +58 -0
  406. gaia/eval/webapp/node_modules/has-symbols/tsconfig.json +10 -0
  407. gaia/eval/webapp/node_modules/hasown/.eslintrc +5 -0
  408. gaia/eval/webapp/node_modules/hasown/.github/FUNDING.yml +12 -0
  409. gaia/eval/webapp/node_modules/hasown/.nycrc +13 -0
  410. gaia/eval/webapp/node_modules/hasown/CHANGELOG.md +40 -0
  411. gaia/eval/webapp/node_modules/hasown/LICENSE +21 -0
  412. gaia/eval/webapp/node_modules/hasown/README.md +40 -0
  413. gaia/eval/webapp/node_modules/hasown/index.d.ts +3 -0
  414. gaia/eval/webapp/node_modules/hasown/index.js +8 -0
  415. gaia/eval/webapp/node_modules/hasown/package.json +92 -0
  416. gaia/eval/webapp/node_modules/hasown/tsconfig.json +6 -0
  417. gaia/eval/webapp/node_modules/http-errors/HISTORY.md +180 -0
  418. gaia/eval/webapp/node_modules/http-errors/LICENSE +23 -0
  419. gaia/eval/webapp/node_modules/http-errors/README.md +169 -0
  420. gaia/eval/webapp/node_modules/http-errors/index.js +289 -0
  421. gaia/eval/webapp/node_modules/http-errors/package.json +50 -0
  422. gaia/eval/webapp/node_modules/iconv-lite/Changelog.md +162 -0
  423. gaia/eval/webapp/node_modules/iconv-lite/LICENSE +21 -0
  424. gaia/eval/webapp/node_modules/iconv-lite/README.md +156 -0
  425. gaia/eval/webapp/node_modules/iconv-lite/encodings/dbcs-codec.js +555 -0
  426. gaia/eval/webapp/node_modules/iconv-lite/encodings/dbcs-data.js +176 -0
  427. gaia/eval/webapp/node_modules/iconv-lite/encodings/index.js +22 -0
  428. gaia/eval/webapp/node_modules/iconv-lite/encodings/internal.js +188 -0
  429. gaia/eval/webapp/node_modules/iconv-lite/encodings/sbcs-codec.js +72 -0
  430. gaia/eval/webapp/node_modules/iconv-lite/encodings/sbcs-data-generated.js +451 -0
  431. gaia/eval/webapp/node_modules/iconv-lite/encodings/sbcs-data.js +174 -0
  432. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/big5-added.json +122 -0
  433. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/cp936.json +264 -0
  434. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/cp949.json +273 -0
  435. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/cp950.json +177 -0
  436. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/eucjp.json +182 -0
  437. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json +1 -0
  438. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/gbk-added.json +55 -0
  439. gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/shiftjis.json +125 -0
  440. gaia/eval/webapp/node_modules/iconv-lite/encodings/utf16.js +177 -0
  441. gaia/eval/webapp/node_modules/iconv-lite/encodings/utf7.js +290 -0
  442. gaia/eval/webapp/node_modules/iconv-lite/lib/bom-handling.js +52 -0
  443. gaia/eval/webapp/node_modules/iconv-lite/lib/extend-node.js +217 -0
  444. gaia/eval/webapp/node_modules/iconv-lite/lib/index.d.ts +24 -0
  445. gaia/eval/webapp/node_modules/iconv-lite/lib/index.js +153 -0
  446. gaia/eval/webapp/node_modules/iconv-lite/lib/streams.js +121 -0
  447. gaia/eval/webapp/node_modules/iconv-lite/package.json +46 -0
  448. gaia/eval/webapp/node_modules/inherits/LICENSE +16 -0
  449. gaia/eval/webapp/node_modules/inherits/README.md +42 -0
  450. gaia/eval/webapp/node_modules/inherits/inherits.js +9 -0
  451. gaia/eval/webapp/node_modules/inherits/inherits_browser.js +27 -0
  452. gaia/eval/webapp/node_modules/inherits/package.json +29 -0
  453. gaia/eval/webapp/node_modules/ipaddr.js/LICENSE +19 -0
  454. gaia/eval/webapp/node_modules/ipaddr.js/README.md +233 -0
  455. gaia/eval/webapp/node_modules/ipaddr.js/ipaddr.min.js +1 -0
  456. gaia/eval/webapp/node_modules/ipaddr.js/lib/ipaddr.js +673 -0
  457. gaia/eval/webapp/node_modules/ipaddr.js/lib/ipaddr.js.d.ts +68 -0
  458. gaia/eval/webapp/node_modules/ipaddr.js/package.json +35 -0
  459. gaia/eval/webapp/node_modules/math-intrinsics/.eslintrc +16 -0
  460. gaia/eval/webapp/node_modules/math-intrinsics/.github/FUNDING.yml +12 -0
  461. gaia/eval/webapp/node_modules/math-intrinsics/CHANGELOG.md +24 -0
  462. gaia/eval/webapp/node_modules/math-intrinsics/LICENSE +21 -0
  463. gaia/eval/webapp/node_modules/math-intrinsics/README.md +50 -0
  464. gaia/eval/webapp/node_modules/math-intrinsics/abs.d.ts +1 -0
  465. gaia/eval/webapp/node_modules/math-intrinsics/abs.js +4 -0
  466. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxArrayLength.d.ts +3 -0
  467. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxArrayLength.js +4 -0
  468. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxSafeInteger.d.ts +3 -0
  469. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxSafeInteger.js +5 -0
  470. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxValue.d.ts +3 -0
  471. gaia/eval/webapp/node_modules/math-intrinsics/constants/maxValue.js +5 -0
  472. gaia/eval/webapp/node_modules/math-intrinsics/floor.d.ts +1 -0
  473. gaia/eval/webapp/node_modules/math-intrinsics/floor.js +4 -0
  474. gaia/eval/webapp/node_modules/math-intrinsics/isFinite.d.ts +3 -0
  475. gaia/eval/webapp/node_modules/math-intrinsics/isFinite.js +12 -0
  476. gaia/eval/webapp/node_modules/math-intrinsics/isInteger.d.ts +3 -0
  477. gaia/eval/webapp/node_modules/math-intrinsics/isInteger.js +16 -0
  478. gaia/eval/webapp/node_modules/math-intrinsics/isNaN.d.ts +1 -0
  479. gaia/eval/webapp/node_modules/math-intrinsics/isNaN.js +6 -0
  480. gaia/eval/webapp/node_modules/math-intrinsics/isNegativeZero.d.ts +3 -0
  481. gaia/eval/webapp/node_modules/math-intrinsics/isNegativeZero.js +6 -0
  482. gaia/eval/webapp/node_modules/math-intrinsics/max.d.ts +1 -0
  483. gaia/eval/webapp/node_modules/math-intrinsics/max.js +4 -0
  484. gaia/eval/webapp/node_modules/math-intrinsics/min.d.ts +1 -0
  485. gaia/eval/webapp/node_modules/math-intrinsics/min.js +4 -0
  486. gaia/eval/webapp/node_modules/math-intrinsics/mod.d.ts +3 -0
  487. gaia/eval/webapp/node_modules/math-intrinsics/mod.js +9 -0
  488. gaia/eval/webapp/node_modules/math-intrinsics/package.json +86 -0
  489. gaia/eval/webapp/node_modules/math-intrinsics/pow.d.ts +1 -0
  490. gaia/eval/webapp/node_modules/math-intrinsics/pow.js +4 -0
  491. gaia/eval/webapp/node_modules/math-intrinsics/round.d.ts +1 -0
  492. gaia/eval/webapp/node_modules/math-intrinsics/round.js +4 -0
  493. gaia/eval/webapp/node_modules/math-intrinsics/sign.d.ts +3 -0
  494. gaia/eval/webapp/node_modules/math-intrinsics/sign.js +11 -0
  495. gaia/eval/webapp/node_modules/math-intrinsics/test/index.js +192 -0
  496. gaia/eval/webapp/node_modules/math-intrinsics/tsconfig.json +3 -0
  497. gaia/eval/webapp/node_modules/media-typer/HISTORY.md +22 -0
  498. gaia/eval/webapp/node_modules/media-typer/LICENSE +22 -0
  499. gaia/eval/webapp/node_modules/media-typer/README.md +81 -0
  500. gaia/eval/webapp/node_modules/media-typer/index.js +270 -0
  501. gaia/eval/webapp/node_modules/media-typer/package.json +26 -0
  502. gaia/eval/webapp/node_modules/merge-descriptors/HISTORY.md +21 -0
  503. gaia/eval/webapp/node_modules/merge-descriptors/LICENSE +23 -0
  504. gaia/eval/webapp/node_modules/merge-descriptors/README.md +49 -0
  505. gaia/eval/webapp/node_modules/merge-descriptors/index.js +60 -0
  506. gaia/eval/webapp/node_modules/merge-descriptors/package.json +39 -0
  507. gaia/eval/webapp/node_modules/methods/HISTORY.md +29 -0
  508. gaia/eval/webapp/node_modules/methods/LICENSE +24 -0
  509. gaia/eval/webapp/node_modules/methods/README.md +51 -0
  510. gaia/eval/webapp/node_modules/methods/index.js +69 -0
  511. gaia/eval/webapp/node_modules/methods/package.json +36 -0
  512. gaia/eval/webapp/node_modules/mime/.npmignore +0 -0
  513. gaia/eval/webapp/node_modules/mime/CHANGELOG.md +164 -0
  514. gaia/eval/webapp/node_modules/mime/LICENSE +21 -0
  515. gaia/eval/webapp/node_modules/mime/README.md +90 -0
  516. gaia/eval/webapp/node_modules/mime/cli.js +8 -0
  517. gaia/eval/webapp/node_modules/mime/mime.js +108 -0
  518. gaia/eval/webapp/node_modules/mime/package.json +44 -0
  519. gaia/eval/webapp/node_modules/mime/src/build.js +53 -0
  520. gaia/eval/webapp/node_modules/mime/src/test.js +60 -0
  521. gaia/eval/webapp/node_modules/mime/types.json +1 -0
  522. gaia/eval/webapp/node_modules/mime-db/HISTORY.md +507 -0
  523. gaia/eval/webapp/node_modules/mime-db/LICENSE +23 -0
  524. gaia/eval/webapp/node_modules/mime-db/README.md +100 -0
  525. gaia/eval/webapp/node_modules/mime-db/db.json +8519 -0
  526. gaia/eval/webapp/node_modules/mime-db/index.js +12 -0
  527. gaia/eval/webapp/node_modules/mime-db/package.json +60 -0
  528. gaia/eval/webapp/node_modules/mime-types/HISTORY.md +397 -0
  529. gaia/eval/webapp/node_modules/mime-types/LICENSE +23 -0
  530. gaia/eval/webapp/node_modules/mime-types/README.md +113 -0
  531. gaia/eval/webapp/node_modules/mime-types/index.js +188 -0
  532. gaia/eval/webapp/node_modules/mime-types/package.json +44 -0
  533. gaia/eval/webapp/node_modules/ms/index.js +152 -0
  534. gaia/eval/webapp/node_modules/ms/license.md +21 -0
  535. gaia/eval/webapp/node_modules/ms/package.json +37 -0
  536. gaia/eval/webapp/node_modules/ms/readme.md +51 -0
  537. gaia/eval/webapp/node_modules/negotiator/HISTORY.md +108 -0
  538. gaia/eval/webapp/node_modules/negotiator/LICENSE +24 -0
  539. gaia/eval/webapp/node_modules/negotiator/README.md +203 -0
  540. gaia/eval/webapp/node_modules/negotiator/index.js +82 -0
  541. gaia/eval/webapp/node_modules/negotiator/lib/charset.js +169 -0
  542. gaia/eval/webapp/node_modules/negotiator/lib/encoding.js +184 -0
  543. gaia/eval/webapp/node_modules/negotiator/lib/language.js +179 -0
  544. gaia/eval/webapp/node_modules/negotiator/lib/mediaType.js +294 -0
  545. gaia/eval/webapp/node_modules/negotiator/package.json +42 -0
  546. gaia/eval/webapp/node_modules/object-inspect/.eslintrc +53 -0
  547. gaia/eval/webapp/node_modules/object-inspect/.github/FUNDING.yml +12 -0
  548. gaia/eval/webapp/node_modules/object-inspect/.nycrc +13 -0
  549. gaia/eval/webapp/node_modules/object-inspect/CHANGELOG.md +424 -0
  550. gaia/eval/webapp/node_modules/object-inspect/LICENSE +21 -0
  551. gaia/eval/webapp/node_modules/object-inspect/example/all.js +23 -0
  552. gaia/eval/webapp/node_modules/object-inspect/example/circular.js +6 -0
  553. gaia/eval/webapp/node_modules/object-inspect/example/fn.js +5 -0
  554. gaia/eval/webapp/node_modules/object-inspect/example/inspect.js +10 -0
  555. gaia/eval/webapp/node_modules/object-inspect/index.js +544 -0
  556. gaia/eval/webapp/node_modules/object-inspect/package-support.json +20 -0
  557. gaia/eval/webapp/node_modules/object-inspect/package.json +105 -0
  558. gaia/eval/webapp/node_modules/object-inspect/readme.markdown +84 -0
  559. gaia/eval/webapp/node_modules/object-inspect/test/bigint.js +58 -0
  560. gaia/eval/webapp/node_modules/object-inspect/test/browser/dom.js +15 -0
  561. gaia/eval/webapp/node_modules/object-inspect/test/circular.js +16 -0
  562. gaia/eval/webapp/node_modules/object-inspect/test/deep.js +12 -0
  563. gaia/eval/webapp/node_modules/object-inspect/test/element.js +53 -0
  564. gaia/eval/webapp/node_modules/object-inspect/test/err.js +48 -0
  565. gaia/eval/webapp/node_modules/object-inspect/test/fakes.js +29 -0
  566. gaia/eval/webapp/node_modules/object-inspect/test/fn.js +76 -0
  567. gaia/eval/webapp/node_modules/object-inspect/test/global.js +17 -0
  568. gaia/eval/webapp/node_modules/object-inspect/test/has.js +15 -0
  569. gaia/eval/webapp/node_modules/object-inspect/test/holes.js +15 -0
  570. gaia/eval/webapp/node_modules/object-inspect/test/indent-option.js +271 -0
  571. gaia/eval/webapp/node_modules/object-inspect/test/inspect.js +139 -0
  572. gaia/eval/webapp/node_modules/object-inspect/test/lowbyte.js +12 -0
  573. gaia/eval/webapp/node_modules/object-inspect/test/number.js +58 -0
  574. gaia/eval/webapp/node_modules/object-inspect/test/quoteStyle.js +26 -0
  575. gaia/eval/webapp/node_modules/object-inspect/test/toStringTag.js +40 -0
  576. gaia/eval/webapp/node_modules/object-inspect/test/undef.js +12 -0
  577. gaia/eval/webapp/node_modules/object-inspect/test/values.js +261 -0
  578. gaia/eval/webapp/node_modules/object-inspect/test-core-js.js +26 -0
  579. gaia/eval/webapp/node_modules/object-inspect/util.inspect.js +1 -0
  580. gaia/eval/webapp/node_modules/on-finished/HISTORY.md +98 -0
  581. gaia/eval/webapp/node_modules/on-finished/LICENSE +23 -0
  582. gaia/eval/webapp/node_modules/on-finished/README.md +162 -0
  583. gaia/eval/webapp/node_modules/on-finished/index.js +234 -0
  584. gaia/eval/webapp/node_modules/on-finished/package.json +39 -0
  585. gaia/eval/webapp/node_modules/parseurl/HISTORY.md +58 -0
  586. gaia/eval/webapp/node_modules/parseurl/LICENSE +24 -0
  587. gaia/eval/webapp/node_modules/parseurl/README.md +133 -0
  588. gaia/eval/webapp/node_modules/parseurl/index.js +158 -0
  589. gaia/eval/webapp/node_modules/parseurl/package.json +40 -0
  590. gaia/eval/webapp/node_modules/path/.npmignore +1 -0
  591. gaia/eval/webapp/node_modules/path/LICENSE +18 -0
  592. gaia/eval/webapp/node_modules/path/README.md +15 -0
  593. gaia/eval/webapp/node_modules/path/package.json +24 -0
  594. gaia/eval/webapp/node_modules/path/path.js +628 -0
  595. gaia/eval/webapp/node_modules/path-to-regexp/LICENSE +21 -0
  596. gaia/eval/webapp/node_modules/path-to-regexp/Readme.md +35 -0
  597. gaia/eval/webapp/node_modules/path-to-regexp/index.js +156 -0
  598. gaia/eval/webapp/node_modules/path-to-regexp/package.json +30 -0
  599. gaia/eval/webapp/node_modules/process/.eslintrc +21 -0
  600. gaia/eval/webapp/node_modules/process/LICENSE +22 -0
  601. gaia/eval/webapp/node_modules/process/README.md +26 -0
  602. gaia/eval/webapp/node_modules/process/browser.js +184 -0
  603. gaia/eval/webapp/node_modules/process/index.js +2 -0
  604. gaia/eval/webapp/node_modules/process/package.json +27 -0
  605. gaia/eval/webapp/node_modules/process/test.js +199 -0
  606. gaia/eval/webapp/node_modules/proxy-addr/HISTORY.md +161 -0
  607. gaia/eval/webapp/node_modules/proxy-addr/LICENSE +22 -0
  608. gaia/eval/webapp/node_modules/proxy-addr/README.md +139 -0
  609. gaia/eval/webapp/node_modules/proxy-addr/index.js +327 -0
  610. gaia/eval/webapp/node_modules/proxy-addr/package.json +47 -0
  611. gaia/eval/webapp/node_modules/qs/.editorconfig +46 -0
  612. gaia/eval/webapp/node_modules/qs/.eslintrc +38 -0
  613. gaia/eval/webapp/node_modules/qs/.github/FUNDING.yml +12 -0
  614. gaia/eval/webapp/node_modules/qs/.nycrc +13 -0
  615. gaia/eval/webapp/node_modules/qs/CHANGELOG.md +600 -0
  616. gaia/eval/webapp/node_modules/qs/LICENSE.md +29 -0
  617. gaia/eval/webapp/node_modules/qs/README.md +709 -0
  618. gaia/eval/webapp/node_modules/qs/dist/qs.js +90 -0
  619. gaia/eval/webapp/node_modules/qs/lib/formats.js +23 -0
  620. gaia/eval/webapp/node_modules/qs/lib/index.js +11 -0
  621. gaia/eval/webapp/node_modules/qs/lib/parse.js +296 -0
  622. gaia/eval/webapp/node_modules/qs/lib/stringify.js +351 -0
  623. gaia/eval/webapp/node_modules/qs/lib/utils.js +265 -0
  624. gaia/eval/webapp/node_modules/qs/package.json +91 -0
  625. gaia/eval/webapp/node_modules/qs/test/empty-keys-cases.js +267 -0
  626. gaia/eval/webapp/node_modules/qs/test/parse.js +1170 -0
  627. gaia/eval/webapp/node_modules/qs/test/stringify.js +1298 -0
  628. gaia/eval/webapp/node_modules/qs/test/utils.js +136 -0
  629. gaia/eval/webapp/node_modules/range-parser/HISTORY.md +56 -0
  630. gaia/eval/webapp/node_modules/range-parser/LICENSE +23 -0
  631. gaia/eval/webapp/node_modules/range-parser/README.md +84 -0
  632. gaia/eval/webapp/node_modules/range-parser/index.js +162 -0
  633. gaia/eval/webapp/node_modules/range-parser/package.json +44 -0
  634. gaia/eval/webapp/node_modules/raw-body/HISTORY.md +308 -0
  635. gaia/eval/webapp/node_modules/raw-body/LICENSE +22 -0
  636. gaia/eval/webapp/node_modules/raw-body/README.md +223 -0
  637. gaia/eval/webapp/node_modules/raw-body/SECURITY.md +24 -0
  638. gaia/eval/webapp/node_modules/raw-body/index.d.ts +87 -0
  639. gaia/eval/webapp/node_modules/raw-body/index.js +336 -0
  640. gaia/eval/webapp/node_modules/raw-body/package.json +49 -0
  641. gaia/eval/webapp/node_modules/safe-buffer/LICENSE +21 -0
  642. gaia/eval/webapp/node_modules/safe-buffer/README.md +584 -0
  643. gaia/eval/webapp/node_modules/safe-buffer/index.d.ts +187 -0
  644. gaia/eval/webapp/node_modules/safe-buffer/index.js +65 -0
  645. gaia/eval/webapp/node_modules/safe-buffer/package.json +51 -0
  646. gaia/eval/webapp/node_modules/safer-buffer/LICENSE +21 -0
  647. gaia/eval/webapp/node_modules/safer-buffer/Porting-Buffer.md +268 -0
  648. gaia/eval/webapp/node_modules/safer-buffer/Readme.md +156 -0
  649. gaia/eval/webapp/node_modules/safer-buffer/dangerous.js +58 -0
  650. gaia/eval/webapp/node_modules/safer-buffer/package.json +34 -0
  651. gaia/eval/webapp/node_modules/safer-buffer/safer.js +77 -0
  652. gaia/eval/webapp/node_modules/safer-buffer/tests.js +406 -0
  653. gaia/eval/webapp/node_modules/send/HISTORY.md +526 -0
  654. gaia/eval/webapp/node_modules/send/LICENSE +23 -0
  655. gaia/eval/webapp/node_modules/send/README.md +327 -0
  656. gaia/eval/webapp/node_modules/send/SECURITY.md +24 -0
  657. gaia/eval/webapp/node_modules/send/index.js +1142 -0
  658. gaia/eval/webapp/node_modules/send/node_modules/encodeurl/HISTORY.md +14 -0
  659. gaia/eval/webapp/node_modules/send/node_modules/encodeurl/LICENSE +22 -0
  660. gaia/eval/webapp/node_modules/send/node_modules/encodeurl/README.md +128 -0
  661. gaia/eval/webapp/node_modules/send/node_modules/encodeurl/index.js +60 -0
  662. gaia/eval/webapp/node_modules/send/node_modules/encodeurl/package.json +40 -0
  663. gaia/eval/webapp/node_modules/send/node_modules/ms/index.js +162 -0
  664. gaia/eval/webapp/node_modules/send/node_modules/ms/license.md +21 -0
  665. gaia/eval/webapp/node_modules/send/node_modules/ms/package.json +38 -0
  666. gaia/eval/webapp/node_modules/send/node_modules/ms/readme.md +59 -0
  667. gaia/eval/webapp/node_modules/send/package.json +62 -0
  668. gaia/eval/webapp/node_modules/serve-static/HISTORY.md +487 -0
  669. gaia/eval/webapp/node_modules/serve-static/LICENSE +25 -0
  670. gaia/eval/webapp/node_modules/serve-static/README.md +257 -0
  671. gaia/eval/webapp/node_modules/serve-static/index.js +209 -0
  672. gaia/eval/webapp/node_modules/serve-static/package.json +42 -0
  673. gaia/eval/webapp/node_modules/setprototypeof/LICENSE +13 -0
  674. gaia/eval/webapp/node_modules/setprototypeof/README.md +31 -0
  675. gaia/eval/webapp/node_modules/setprototypeof/index.d.ts +2 -0
  676. gaia/eval/webapp/node_modules/setprototypeof/index.js +17 -0
  677. gaia/eval/webapp/node_modules/setprototypeof/package.json +38 -0
  678. gaia/eval/webapp/node_modules/setprototypeof/test/index.js +24 -0
  679. gaia/eval/webapp/node_modules/side-channel/.editorconfig +9 -0
  680. gaia/eval/webapp/node_modules/side-channel/.eslintrc +12 -0
  681. gaia/eval/webapp/node_modules/side-channel/.github/FUNDING.yml +12 -0
  682. gaia/eval/webapp/node_modules/side-channel/.nycrc +13 -0
  683. gaia/eval/webapp/node_modules/side-channel/CHANGELOG.md +110 -0
  684. gaia/eval/webapp/node_modules/side-channel/LICENSE +21 -0
  685. gaia/eval/webapp/node_modules/side-channel/README.md +61 -0
  686. gaia/eval/webapp/node_modules/side-channel/index.d.ts +14 -0
  687. gaia/eval/webapp/node_modules/side-channel/index.js +43 -0
  688. gaia/eval/webapp/node_modules/side-channel/package.json +85 -0
  689. gaia/eval/webapp/node_modules/side-channel/test/index.js +104 -0
  690. gaia/eval/webapp/node_modules/side-channel/tsconfig.json +9 -0
  691. gaia/eval/webapp/node_modules/side-channel-list/.editorconfig +9 -0
  692. gaia/eval/webapp/node_modules/side-channel-list/.eslintrc +11 -0
  693. gaia/eval/webapp/node_modules/side-channel-list/.github/FUNDING.yml +12 -0
  694. gaia/eval/webapp/node_modules/side-channel-list/.nycrc +13 -0
  695. gaia/eval/webapp/node_modules/side-channel-list/CHANGELOG.md +15 -0
  696. gaia/eval/webapp/node_modules/side-channel-list/LICENSE +21 -0
  697. gaia/eval/webapp/node_modules/side-channel-list/README.md +62 -0
  698. gaia/eval/webapp/node_modules/side-channel-list/index.d.ts +13 -0
  699. gaia/eval/webapp/node_modules/side-channel-list/index.js +113 -0
  700. gaia/eval/webapp/node_modules/side-channel-list/list.d.ts +14 -0
  701. gaia/eval/webapp/node_modules/side-channel-list/package.json +77 -0
  702. gaia/eval/webapp/node_modules/side-channel-list/test/index.js +104 -0
  703. gaia/eval/webapp/node_modules/side-channel-list/tsconfig.json +9 -0
  704. gaia/eval/webapp/node_modules/side-channel-map/.editorconfig +9 -0
  705. gaia/eval/webapp/node_modules/side-channel-map/.eslintrc +11 -0
  706. gaia/eval/webapp/node_modules/side-channel-map/.github/FUNDING.yml +12 -0
  707. gaia/eval/webapp/node_modules/side-channel-map/.nycrc +13 -0
  708. gaia/eval/webapp/node_modules/side-channel-map/CHANGELOG.md +22 -0
  709. gaia/eval/webapp/node_modules/side-channel-map/LICENSE +21 -0
  710. gaia/eval/webapp/node_modules/side-channel-map/README.md +62 -0
  711. gaia/eval/webapp/node_modules/side-channel-map/index.d.ts +15 -0
  712. gaia/eval/webapp/node_modules/side-channel-map/index.js +68 -0
  713. gaia/eval/webapp/node_modules/side-channel-map/package.json +80 -0
  714. gaia/eval/webapp/node_modules/side-channel-map/test/index.js +114 -0
  715. gaia/eval/webapp/node_modules/side-channel-map/tsconfig.json +9 -0
  716. gaia/eval/webapp/node_modules/side-channel-weakmap/.editorconfig +9 -0
  717. gaia/eval/webapp/node_modules/side-channel-weakmap/.eslintrc +12 -0
  718. gaia/eval/webapp/node_modules/side-channel-weakmap/.github/FUNDING.yml +12 -0
  719. gaia/eval/webapp/node_modules/side-channel-weakmap/.nycrc +13 -0
  720. gaia/eval/webapp/node_modules/side-channel-weakmap/CHANGELOG.md +28 -0
  721. gaia/eval/webapp/node_modules/side-channel-weakmap/LICENSE +21 -0
  722. gaia/eval/webapp/node_modules/side-channel-weakmap/README.md +62 -0
  723. gaia/eval/webapp/node_modules/side-channel-weakmap/index.d.ts +15 -0
  724. gaia/eval/webapp/node_modules/side-channel-weakmap/index.js +84 -0
  725. gaia/eval/webapp/node_modules/side-channel-weakmap/package.json +87 -0
  726. gaia/eval/webapp/node_modules/side-channel-weakmap/test/index.js +114 -0
  727. gaia/eval/webapp/node_modules/side-channel-weakmap/tsconfig.json +9 -0
  728. gaia/eval/webapp/node_modules/statuses/HISTORY.md +82 -0
  729. gaia/eval/webapp/node_modules/statuses/LICENSE +23 -0
  730. gaia/eval/webapp/node_modules/statuses/README.md +136 -0
  731. gaia/eval/webapp/node_modules/statuses/codes.json +65 -0
  732. gaia/eval/webapp/node_modules/statuses/index.js +146 -0
  733. gaia/eval/webapp/node_modules/statuses/package.json +49 -0
  734. gaia/eval/webapp/node_modules/toidentifier/HISTORY.md +9 -0
  735. gaia/eval/webapp/node_modules/toidentifier/LICENSE +21 -0
  736. gaia/eval/webapp/node_modules/toidentifier/README.md +61 -0
  737. gaia/eval/webapp/node_modules/toidentifier/index.js +32 -0
  738. gaia/eval/webapp/node_modules/toidentifier/package.json +38 -0
  739. gaia/eval/webapp/node_modules/type-is/HISTORY.md +259 -0
  740. gaia/eval/webapp/node_modules/type-is/LICENSE +23 -0
  741. gaia/eval/webapp/node_modules/type-is/README.md +170 -0
  742. gaia/eval/webapp/node_modules/type-is/index.js +266 -0
  743. gaia/eval/webapp/node_modules/type-is/package.json +45 -0
  744. gaia/eval/webapp/node_modules/unpipe/HISTORY.md +4 -0
  745. gaia/eval/webapp/node_modules/unpipe/LICENSE +22 -0
  746. gaia/eval/webapp/node_modules/unpipe/README.md +43 -0
  747. gaia/eval/webapp/node_modules/unpipe/index.js +69 -0
  748. gaia/eval/webapp/node_modules/unpipe/package.json +27 -0
  749. gaia/eval/webapp/node_modules/util/LICENSE +18 -0
  750. gaia/eval/webapp/node_modules/util/README.md +15 -0
  751. gaia/eval/webapp/node_modules/util/node_modules/inherits/LICENSE +16 -0
  752. gaia/eval/webapp/node_modules/util/node_modules/inherits/README.md +42 -0
  753. gaia/eval/webapp/node_modules/util/node_modules/inherits/inherits.js +7 -0
  754. gaia/eval/webapp/node_modules/util/node_modules/inherits/inherits_browser.js +23 -0
  755. gaia/eval/webapp/node_modules/util/node_modules/inherits/package.json +29 -0
  756. gaia/eval/webapp/node_modules/util/package.json +35 -0
  757. gaia/eval/webapp/node_modules/util/support/isBuffer.js +3 -0
  758. gaia/eval/webapp/node_modules/util/support/isBufferBrowser.js +6 -0
  759. gaia/eval/webapp/node_modules/util/util.js +586 -0
  760. gaia/eval/webapp/node_modules/utils-merge/.npmignore +9 -0
  761. gaia/eval/webapp/node_modules/utils-merge/LICENSE +20 -0
  762. gaia/eval/webapp/node_modules/utils-merge/README.md +34 -0
  763. gaia/eval/webapp/node_modules/utils-merge/index.js +23 -0
  764. gaia/eval/webapp/node_modules/utils-merge/package.json +40 -0
  765. gaia/eval/webapp/node_modules/vary/HISTORY.md +39 -0
  766. gaia/eval/webapp/node_modules/vary/LICENSE +22 -0
  767. gaia/eval/webapp/node_modules/vary/README.md +101 -0
  768. gaia/eval/webapp/node_modules/vary/index.js +149 -0
  769. gaia/eval/webapp/node_modules/vary/package.json +43 -0
  770. gaia/eval/webapp/package-lock.json +875 -0
  771. gaia/eval/webapp/package.json +21 -0
  772. gaia/eval/webapp/public/app.js +3403 -0
  773. gaia/eval/webapp/public/index.html +88 -0
  774. gaia/eval/webapp/public/styles.css +3661 -0
  775. gaia/eval/webapp/server.js +416 -0
  776. gaia/eval/webapp/test-setup.js +73 -0
  777. gaia/llm/__init__.py +2 -0
  778. gaia/llm/lemonade_client.py +3083 -0
  779. gaia/llm/lemonade_manager.py +269 -0
  780. gaia/llm/llm_client.py +729 -0
  781. gaia/llm/vlm_client.py +307 -0
  782. gaia/logger.py +189 -0
  783. gaia/mcp/agent_mcp_server.py +245 -0
  784. gaia/mcp/blender_mcp_client.py +138 -0
  785. gaia/mcp/blender_mcp_server.py +648 -0
  786. gaia/mcp/context7_cache.py +332 -0
  787. gaia/mcp/external_services.py +518 -0
  788. gaia/mcp/mcp_bridge.py +550 -0
  789. gaia/mcp/servers/__init__.py +6 -0
  790. gaia/mcp/servers/docker_mcp.py +83 -0
  791. gaia/rag/__init__.py +10 -0
  792. gaia/rag/app.py +293 -0
  793. gaia/rag/demo.py +304 -0
  794. gaia/rag/pdf_utils.py +235 -0
  795. gaia/rag/sdk.py +2194 -0
  796. gaia/security.py +163 -0
  797. gaia/talk/app.py +289 -0
  798. gaia/talk/sdk.py +538 -0
  799. gaia/util.py +46 -0
  800. gaia/version.py +100 -0
@@ -0,0 +1,1016 @@
1
+ # Copyright(C) 2024-2025 Advanced Micro Devices, Inc. All rights reserved.
2
+ # SPDX-License-Identifier: MIT
3
+ """Project management tools mixin for Code Agent."""
4
+
5
+ import ast
6
+ import os
7
+ from pathlib import Path
8
+ from typing import Any, Dict, List
9
+
10
+
11
+ class ProjectManagementMixin:
12
+ """Mixin providing project-level management and creation tools.
13
+
14
+ This mixin provides tools for:
15
+ - Creating complete project structures from requirements
16
+ - Listing and validating project files
17
+ - Comprehensive project validation (structure, requirements, code quality)
18
+ - Multi-language support (Python, JavaScript/TypeScript, CSS, HTML)
19
+
20
+ Tools provided:
21
+ - list_files: List files and directories in a path
22
+ - validate_project: Comprehensive project validation with auto-fix capability
23
+ - create_project: Generate complete project from natural language description
24
+
25
+ Helper methods:
26
+ - _validate_project_structure: Validate project structure for consistency
27
+ """
28
+
29
+ def register_project_management_tools(self) -> None:
30
+ """Register project management tools."""
31
+ from gaia.agents.base.tools import tool
32
+
33
+ @tool
34
+ def list_files(path: str = ".") -> Dict[str, Any]:
35
+ """List files and directories in the specified path.
36
+
37
+ Args:
38
+ path: Directory path to list (default: current directory)
39
+
40
+ Returns:
41
+ Dictionary with list of files and directories
42
+ """
43
+ try:
44
+ items = os.listdir(path)
45
+ files = [
46
+ item for item in items if os.path.isfile(os.path.join(path, item))
47
+ ]
48
+ dirs = [
49
+ item for item in items if os.path.isdir(os.path.join(path, item))
50
+ ]
51
+
52
+ return {
53
+ "status": "success",
54
+ "path": path,
55
+ "files": sorted(files),
56
+ "directories": sorted(dirs),
57
+ "total": len(items),
58
+ }
59
+ except FileNotFoundError:
60
+ return {"status": "error", "error": f"Directory not found: {path}"}
61
+ except PermissionError:
62
+ return {"status": "error", "error": f"Permission denied: {path}"}
63
+ except Exception as e:
64
+ return {"status": "error", "error": str(e)}
65
+
66
+ @tool
67
+ def validate_project(project_path: str, fix: bool = False) -> Dict[str, Any]:
68
+ """Comprehensive project validation for all file types and quality checks.
69
+
70
+ This is the unified validation entry point that checks:
71
+ - Python files: pylint, anti-patterns, Black formatting
72
+ - JavaScript/TypeScript: ESLint (if available)
73
+ - requirements.txt: hallucination detection
74
+ - Project structure: entry points, essential files
75
+ - CSS/HTML: basic validation
76
+
77
+ Args:
78
+ project_path: Path to the project directory
79
+ fix: Whether to auto-fix issues where possible
80
+
81
+ Returns:
82
+ Dictionary with comprehensive validation results
83
+ """
84
+ try:
85
+ path = Path(project_path)
86
+ if not path.exists():
87
+ return {
88
+ "status": "error",
89
+ "error": f"Project not found: {project_path}",
90
+ }
91
+
92
+ results = {
93
+ "status": "success",
94
+ "project": str(path),
95
+ "validations": {},
96
+ "total_errors": 0,
97
+ "total_warnings": 0,
98
+ "is_valid": True,
99
+ }
100
+
101
+ # Get all project files
102
+ all_files = list(path.rglob("*"))
103
+ py_files = [f for f in all_files if f.suffix == ".py"]
104
+ js_files = [
105
+ f for f in all_files if f.suffix in [".js", ".jsx", ".ts", ".tsx"]
106
+ ]
107
+ css_files = [f for f in all_files if f.suffix in [".css", ".scss"]]
108
+ html_files = [f for f in all_files if f.suffix in [".html", ".htm"]]
109
+
110
+ # 1. Check project structure
111
+ structure_result = self._validate_project_structure(path, all_files)
112
+ results["validations"]["structure"] = structure_result
113
+ results["total_errors"] += len(structure_result.get("errors", []))
114
+ results["total_warnings"] += len(structure_result.get("warnings", []))
115
+
116
+ # 2. Validate requirements.txt
117
+ req_file = path / "requirements.txt"
118
+ if req_file.exists():
119
+ req_result = self._validate_requirements(req_file, fix)
120
+ results["validations"]["requirements"] = req_result
121
+ results["total_errors"] += len(req_result.get("errors", []))
122
+ results["total_warnings"] += len(req_result.get("warnings", []))
123
+
124
+ # 3. Validate Python files
125
+ if py_files:
126
+ py_result = self._validate_python_files(py_files, fix)
127
+ results["validations"]["python"] = py_result
128
+ results["total_errors"] += py_result.get("total_errors", 0)
129
+ results["total_warnings"] += py_result.get("total_warnings", 0)
130
+
131
+ # 4. Validate JavaScript/TypeScript files
132
+ if js_files:
133
+ js_result = self._validate_javascript_files(js_files, fix)
134
+ results["validations"]["javascript"] = js_result
135
+ results["total_errors"] += js_result.get("total_errors", 0)
136
+ results["total_warnings"] += js_result.get("total_warnings", 0)
137
+
138
+ # 5. Basic validation for CSS files
139
+ if css_files:
140
+ css_result = self._validate_css_files(css_files)
141
+ results["validations"]["css"] = css_result
142
+ results["total_warnings"] += css_result.get("warnings", 0)
143
+
144
+ # 6. Basic validation for HTML files
145
+ if html_files:
146
+ html_result = self._validate_html_files(html_files)
147
+ results["validations"]["html"] = html_result
148
+ results["total_warnings"] += html_result.get("warnings", 0)
149
+
150
+ # Overall status
151
+ results["is_valid"] = results["total_errors"] == 0
152
+ if results["is_valid"]:
153
+ if results["total_warnings"] > 0:
154
+ results["message"] = (
155
+ f"Validation passed with {results['total_warnings']} warnings"
156
+ )
157
+ else:
158
+ results["message"] = "All validations passed!"
159
+ else:
160
+ results["message"] = (
161
+ f"Validation failed: {results['total_errors']} errors, "
162
+ f"{results['total_warnings']} warnings"
163
+ )
164
+
165
+ return results
166
+
167
+ except Exception as e:
168
+ return {"status": "error", "error": str(e)}
169
+
170
+ @tool
171
+ def create_project(query: str) -> Dict[str, Any]:
172
+ """Create a complete Python project from requirements.
173
+
174
+ Workflow:
175
+ 1. Generate detailed plan with architecture and class/function outlines
176
+ 2. Implement files one-by-one with validation
177
+ 3. Generate comprehensive tests
178
+ 4. Run tests and fix issues
179
+ 5. Final validation and fixes
180
+ 6. Summary report
181
+
182
+ Args:
183
+ query: The project requirements/description
184
+
185
+ Returns:
186
+ Dictionary with project creation results
187
+ """
188
+ try:
189
+ self.console.print_header("šŸš€ Starting Project Generation")
190
+
191
+ # Phase 1: Generate detailed architectural plan
192
+ self.console.print_info("šŸ“‹ Phase 1: Creating architectural plan...")
193
+
194
+ plan_prompt = f"""Create a detailed architectural plan for: {query}
195
+
196
+ Generate a comprehensive JSON response with:
197
+ {{
198
+ "project_name": "short_snake_case_name",
199
+ "architecture": {{
200
+ "overview": "Detailed description of what this application does",
201
+ "patterns": ["List", "of", "design", "patterns"],
202
+ "technologies": ["List", "of", "frameworks", "libraries", "databases"]
203
+ }},
204
+ "modules": [
205
+ {{
206
+ "name": "filename.py",
207
+ "purpose": "What this module does",
208
+ "classes": [
209
+ {{"name": "ClassName", "purpose": "What this class handles", "methods": ["method1", "method2"]}}
210
+ ],
211
+ "functions": [
212
+ {{"name": "function_name", "signature": "function_name(args) -> ReturnType", "purpose": "What it does"}}
213
+ ]
214
+ }}
215
+ ],
216
+ "tests": [
217
+ {{"name": "test_filename.py", "coverage": "What this test file covers"}}
218
+ ]
219
+ }}
220
+
221
+ IMPORTANT: Include ALL modules needed for a complete, working application.
222
+ For the given requirements, think about:
223
+ - Entry points and main application flow
224
+ - Data models and database structure
225
+ - Business logic and services
226
+ - API endpoints or user interface
227
+ - Authentication and security
228
+ - Configuration and utilities
229
+ - Comprehensive test coverage
230
+
231
+ Return ONLY valid JSON."""
232
+
233
+ plan_response = self.chat.send(plan_prompt, max_tokens=3000).text
234
+
235
+ import json
236
+
237
+ try:
238
+ # Clean the response if it has markdown code blocks
239
+ if "```json" in plan_response:
240
+ plan_response = plan_response.split("```json")[1].split("```")[
241
+ 0
242
+ ]
243
+ elif "```" in plan_response:
244
+ plan_response = plan_response.split("```")[1].split("```")[0]
245
+
246
+ plan_data = json.loads(plan_response)
247
+ project_name = plan_data.get("project_name", "my_project")
248
+
249
+ # Basic sanitization - lowercase and replace spaces
250
+ project_name = (
251
+ project_name.lower().strip().replace(" ", "_").replace("-", "_")
252
+ )
253
+
254
+ # Check if name is valid (not too long, no special chars, doesn't already exist)
255
+ max_retries = 3
256
+ for retry in range(max_retries):
257
+ issues = []
258
+
259
+ # Check if folder already exists
260
+ if os.path.exists(project_name):
261
+ issues.append(f"folder '{project_name}' already exists")
262
+
263
+ # Check if name is too long
264
+ if len(project_name) > 30:
265
+ issues.append(
266
+ f"name too long ({len(project_name)} chars, max 30)"
267
+ )
268
+
269
+ # Check if name has invalid characters
270
+ if not project_name.replace("_", "").replace(".", "").isalnum():
271
+ issues.append(
272
+ "name contains invalid characters (only a-z, 0-9, _ allowed)"
273
+ )
274
+
275
+ # Check if name is empty
276
+ if not project_name or project_name == "_":
277
+ issues.append("name is empty or invalid")
278
+
279
+ # If valid, break
280
+ if not issues:
281
+ break
282
+
283
+ # Ask LLM to fix the name
284
+ if retry < max_retries - 1:
285
+ fix_prompt = f"""The project name "{project_name}" has issues: {', '.join(issues)}
286
+
287
+ Please provide a new, valid project name that:
288
+ - Is short and descriptive (max 30 characters)
289
+ - Uses snake_case (lowercase with underscores)
290
+ - Doesn't already exist
291
+ - Only contains letters, numbers, and underscores
292
+
293
+ Original project description: {query}
294
+
295
+ Respond with ONLY the new project name, nothing else."""
296
+
297
+ new_name = self.chat.send(
298
+ fix_prompt, max_tokens=50
299
+ ).text.strip()
300
+ # Clean the response
301
+ new_name = (
302
+ new_name.lower()
303
+ .strip()
304
+ .replace(" ", "_")
305
+ .replace("-", "_")
306
+ )
307
+ # Remove quotes if present
308
+ new_name = new_name.strip('"').strip("'")
309
+
310
+ self.console.print_warning(
311
+ f"āš ļø Project name '{project_name}' invalid: {', '.join(issues)}"
312
+ )
313
+ self.console.print_info(f" Retrying with: '{new_name}'")
314
+ project_name = new_name
315
+ else:
316
+ # Last resort - generate unique name
317
+ import random
318
+
319
+ project_name = f"project_{random.randint(1000, 9999)}"
320
+ self.console.print_warning(
321
+ f"āš ļø Using fallback name: '{project_name}'"
322
+ )
323
+ break
324
+
325
+ modules = plan_data.get("modules", [])
326
+ test_modules = plan_data.get("tests", [])
327
+ architecture = plan_data.get("architecture", {})
328
+
329
+ # Ensure we have at least basic files
330
+ if not any(m["name"] == "requirements.txt" for m in modules):
331
+ modules.append(
332
+ {
333
+ "name": "requirements.txt",
334
+ "purpose": "Python dependencies",
335
+ }
336
+ )
337
+ if not any(m["name"] == "README.md" for m in modules):
338
+ modules.append(
339
+ {"name": "README.md", "purpose": "Project documentation"}
340
+ )
341
+
342
+ except (json.JSONDecodeError, TypeError) as e:
343
+ self.console.print_warning(
344
+ f"āš ļø Could not parse JSON plan, using fallback: {str(e)[:100]}"
345
+ )
346
+ # Fallback plan
347
+ project_name = "my_project"
348
+ modules = [
349
+ {"name": "main.py", "purpose": "Entry point"},
350
+ {"name": "core.py", "purpose": "Core logic"},
351
+ {"name": "requirements.txt", "purpose": "Dependencies"},
352
+ {"name": "README.md", "purpose": "Documentation"},
353
+ ]
354
+ test_modules = [{"name": "test_main.py", "coverage": "main tests"}]
355
+ architecture = {"overview": query}
356
+
357
+ # Create project directory
358
+ os.makedirs(project_name, exist_ok=True)
359
+ created_files = []
360
+ implementation_issues = []
361
+ test_results = {}
362
+
363
+ # Write detailed PLAN.md with architecture and outlines
364
+ plan_content = f"""# {project_name} - Architectural Plan
365
+
366
+ ## Project Overview
367
+ {architecture.get('overview', query)}
368
+
369
+ ## Architecture
370
+ - **Patterns**: {', '.join(architecture.get('patterns', ['Modular']))}
371
+ - **Technologies**: {', '.join(architecture.get('technologies', ['Python']))}
372
+
373
+ ## Implementation Tasks
374
+
375
+ ### Phase 1: Project Setup
376
+ - [ ] Create project structure
377
+ - [ ] Generate PLAN.md
378
+ - [ ] Set up requirements.txt
379
+
380
+ ### Phase 2: Core Modules
381
+ """
382
+ for module in modules:
383
+ plan_content += f"- [ ] Implement `{module['name']}` - {module.get('purpose', 'Core functionality')}\n"
384
+
385
+ plan_content += "\n### Phase 3: Test Suite\n"
386
+ for test in test_modules:
387
+ plan_content += f"- [ ] Generate `{test['name']}` - {test.get('coverage', 'Unit tests')}\n"
388
+
389
+ plan_content += """
390
+ ### Phase 4: Quality Assurance
391
+ - [ ] Run all tests
392
+ - [ ] Fix any test failures
393
+ - [ ] Apply Black formatting
394
+ - [ ] Fix linting issues
395
+
396
+ ### Phase 5: Documentation
397
+ - [ ] Verify README.md completeness
398
+ - [ ] Add usage examples
399
+ - [ ] Document API if applicable
400
+
401
+ ## Module Specifications
402
+ """
403
+ for module in modules:
404
+ plan_content += f"\n### {module['name']}\n"
405
+ plan_content += (
406
+ f"**Purpose**: {module.get('purpose', 'Implementation')}\n\n"
407
+ )
408
+
409
+ if module.get("classes"):
410
+ plan_content += "**Classes**:\n"
411
+ for cls in module["classes"]:
412
+ plan_content += (
413
+ f"- `{cls['name']}`: {cls.get('purpose', '')}\n"
414
+ )
415
+ if cls.get("methods"):
416
+ plan_content += (
417
+ f" - Methods: {', '.join(cls['methods'])}\n"
418
+ )
419
+
420
+ if module.get("functions"):
421
+ plan_content += "\n**Functions**:\n"
422
+ for func in module["functions"]:
423
+ plan_content += f"- `{func.get('signature', func['name'])}`: {func.get('purpose', '')}\n"
424
+
425
+ plan_content += "\n## Test Coverage\n"
426
+ for test in test_modules:
427
+ plan_content += (
428
+ f"- **{test['name']}**: {test.get('coverage', 'Tests')}\n"
429
+ )
430
+
431
+ plan_content += "\n## Implementation Order\n"
432
+ plan_content += "1. Core modules and data structures\n"
433
+ plan_content += "2. Business logic implementation\n"
434
+ plan_content += "3. Integration and API layers\n"
435
+ plan_content += "4. Comprehensive test suite\n"
436
+ plan_content += "5. Documentation and examples\n"
437
+
438
+ # Start streaming preview for PLAN.md (markdown file)
439
+ self.console.start_file_preview(
440
+ "PLAN.md", max_lines=20, title_prefix="šŸ“‹"
441
+ )
442
+
443
+ # Stream the content in chunks for visual effect
444
+ plan_chunks = []
445
+ chunk_size = 500 # Characters per chunk
446
+ for i in range(0, len(plan_content), chunk_size):
447
+ chunk = plan_content[i : i + chunk_size]
448
+ plan_chunks.append(chunk)
449
+ self.console.update_file_preview(chunk)
450
+ # Small delay for visual streaming effect
451
+ import time
452
+
453
+ time.sleep(0.05)
454
+
455
+ # End the preview
456
+ self.console.stop_file_preview()
457
+
458
+ # Write PLAN.md
459
+ plan_path = os.path.join(project_name, "PLAN.md")
460
+ with open(plan_path, "w", encoding="utf-8") as f:
461
+ f.write(plan_content)
462
+ created_files.append(plan_path)
463
+
464
+ plan_lines = plan_content.count("\n") + 1
465
+ self.console.print_success(
466
+ f"āœ… Created detailed PLAN.md with architecture ({plan_lines} lines)"
467
+ )
468
+
469
+ # Project setup phase complete - agent can now use update_plan_progress tool
470
+
471
+ # Phase 2: Implement files one-by-one with validation
472
+ self.console.print_info(
473
+ "\nšŸ“ Phase 2: Implementing modules one-by-one..."
474
+ )
475
+
476
+ # Sort modules to implement core/config files first
477
+ priority_order = ["config", "models", "database", "utils", "core"]
478
+ modules_sorted = sorted(
479
+ modules,
480
+ key=lambda m: (
481
+ 0
482
+ if "requirements.txt" in m["name"]
483
+ else (
484
+ 1
485
+ if any(p in m["name"].lower() for p in priority_order)
486
+ else 2 if "main.py" in m["name"] else 3
487
+ )
488
+ ),
489
+ )
490
+
491
+ # Initial load of PLAN.md
492
+ plan_path = os.path.join(project_name, "PLAN.md")
493
+
494
+ for i, module in enumerate(modules_sorted, 1):
495
+ filename = module["name"]
496
+ progress_pct = int((i / len(modules)) * 100)
497
+ self.console.print_info(
498
+ f" [{i}/{len(modules)}] ({progress_pct}%) Generating {filename}..."
499
+ )
500
+
501
+ file_path = os.path.join(project_name, filename)
502
+
503
+ # Create subdirectories if needed
504
+ dir_path = os.path.dirname(file_path)
505
+ if dir_path:
506
+ os.makedirs(dir_path, exist_ok=True)
507
+
508
+ # Re-read PLAN.md each time to get latest updates
509
+ if os.path.exists(plan_path):
510
+ with open(plan_path, "r", encoding="utf-8") as f:
511
+ plan_context = f.read()
512
+ else:
513
+ plan_context = plan_content
514
+
515
+ # Generate with architecture context including latest PLAN.md
516
+ context = (
517
+ f"{query}\n\nProject Plan (Current State):\n{plan_context}\n\n"
518
+ f"Current Module:\n{json.dumps(module, indent=2)}"
519
+ )
520
+ code = self._generate_code_for_file(
521
+ filename=filename,
522
+ purpose=module.get("purpose", ""),
523
+ context=context,
524
+ )
525
+
526
+ # Write initial version
527
+ with open(file_path, "w", encoding="utf-8") as f:
528
+ f.write(code)
529
+
530
+ # Validate and fix iteratively (max 3 attempts)
531
+ if filename.endswith(".py"):
532
+ for attempt in range(3):
533
+ try:
534
+ # Syntax check
535
+
536
+ ast.parse(code)
537
+
538
+ # Anti-pattern check
539
+ antipattern_result = self._check_antipatterns(
540
+ Path(file_path), code
541
+ )
542
+ if antipattern_result["errors"]:
543
+ self.console.print_warning(
544
+ f" āš ļø Anti-patterns detected: {len(antipattern_result['errors'])} issues"
545
+ )
546
+ implementation_issues.append(
547
+ {
548
+ "file": filename,
549
+ "type": "antipattern",
550
+ "issues": antipattern_result["errors"][:2],
551
+ }
552
+ )
553
+
554
+ # If syntax is valid, we're done
555
+ self.console.print_success(
556
+ f" āœ… {filename} validated"
557
+ )
558
+ break
559
+
560
+ except SyntaxError as e:
561
+ if attempt < 2:
562
+ self.console.print_warning(
563
+ f" šŸ”§ Fixing syntax error (attempt {attempt+1}/3)"
564
+ )
565
+ code = self._fix_code_with_llm(
566
+ code, file_path, str(e)
567
+ )
568
+ with open(file_path, "w", encoding="utf-8") as f:
569
+ f.write(code)
570
+ else:
571
+ self.console.print_error(
572
+ f" āŒ Could not fix syntax in {filename}"
573
+ )
574
+ implementation_issues.append(
575
+ {
576
+ "file": filename,
577
+ "type": "syntax",
578
+ "error": str(e),
579
+ }
580
+ )
581
+
582
+ created_files.append(file_path)
583
+
584
+ # Phase 3: Generate comprehensive tests
585
+ self.console.print_info("\n🧪 Phase 3: Generating test suite...")
586
+
587
+ for i, test in enumerate(test_modules, 1):
588
+ test_filename = test["name"]
589
+ progress_pct = int((i / len(test_modules)) * 100)
590
+ self.console.print_info(
591
+ f" [{i}/{len(test_modules)}] ({progress_pct}%) Generating {test_filename}..."
592
+ )
593
+
594
+ test_path = os.path.join(project_name, test_filename)
595
+
596
+ # Re-read PLAN.md to get latest updates
597
+ if os.path.exists(plan_path):
598
+ with open(plan_path, "r", encoding="utf-8") as f:
599
+ plan_context = f.read()
600
+ else:
601
+ plan_context = plan_content
602
+
603
+ # Generate test with context about what to test and latest PLAN.md
604
+ test_context = f"{query}\n\nProject Plan (Current State):\n{plan_context}\n\nTest Coverage: {test.get('coverage', '')}\n\nModules to test:\n"
605
+ for module in modules:
606
+ if not module["name"].startswith("test_"):
607
+ test_context += (
608
+ f"- {module['name']}: {module.get('purpose', '')}\n"
609
+ )
610
+
611
+ # Add timeout handling for test generation
612
+ try:
613
+ import threading
614
+
615
+ test_code = None
616
+ generation_error = None
617
+
618
+ def generate_with_timeout(
619
+ test_filename_param, test_param, test_context_param
620
+ ):
621
+ nonlocal test_code, generation_error
622
+ try:
623
+ test_code = self._generate_code_for_file(
624
+ filename=test_filename_param,
625
+ purpose=f"Unit tests for {test_param.get('coverage', 'functionality')}",
626
+ context=test_context_param,
627
+ )
628
+ except Exception as e:
629
+ generation_error = e
630
+
631
+ # Run generation in a thread with timeout
632
+ gen_thread = threading.Thread(
633
+ target=generate_with_timeout,
634
+ args=(test_filename, test, test_context),
635
+ )
636
+ gen_thread.daemon = True
637
+ gen_thread.start()
638
+ gen_thread.join(
639
+ timeout=180
640
+ ) # 180 second (3 min) timeout for test generation
641
+
642
+ if gen_thread.is_alive():
643
+ self.console.print_warning(
644
+ f" āš ļø Test generation timeout for {test_filename}, using placeholder..."
645
+ )
646
+ # Generate a simple placeholder test
647
+ test_code = f'''"""Unit tests for {test.get('coverage', 'functionality')}."""
648
+ import unittest
649
+
650
+ class TestPlaceholder(unittest.TestCase):
651
+ """Placeholder tests - generation timed out."""
652
+
653
+ def test_placeholder(self):
654
+ """Placeholder test - needs implementation."""
655
+ self.skipTest("Test generation timed out - needs manual implementation")
656
+
657
+ if __name__ == "__main__":
658
+ unittest.main()
659
+ '''
660
+ elif generation_error is not None:
661
+ if isinstance(generation_error, Exception):
662
+ raise generation_error
663
+ else:
664
+ raise Exception(
665
+ f"Test generation error: {generation_error}"
666
+ )
667
+ elif not test_code:
668
+ raise Exception("No test code generated")
669
+
670
+ except Exception as e:
671
+ self.console.print_warning(
672
+ f" āš ļø Failed to generate {test_filename}: {str(e)[:100]}"
673
+ )
674
+ # Generate a simple placeholder test
675
+ test_code = f'''"""Unit tests for {test.get('coverage', 'functionality')}."""
676
+ import unittest
677
+
678
+ class TestPlaceholder(unittest.TestCase):
679
+ """Placeholder tests - generation failed."""
680
+
681
+ def test_placeholder(self):
682
+ """Placeholder test - needs implementation."""
683
+ self.skipTest("Test generation failed - needs manual implementation")
684
+
685
+ if __name__ == "__main__":
686
+ unittest.main()
687
+ '''
688
+
689
+ with open(test_path, "w", encoding="utf-8") as f:
690
+ f.write(test_code)
691
+
692
+ # Validate test file syntax
693
+ try:
694
+
695
+ ast.parse(test_code)
696
+ self.console.print_success(f" āœ… {test_filename} validated")
697
+ except SyntaxError as e:
698
+ self.console.print_warning(
699
+ f" āš ļø Syntax issues in {test_filename}, attempting fix..."
700
+ )
701
+ test_code = self._fix_code_with_llm(
702
+ test_code, test_path, str(e)
703
+ )
704
+ with open(test_path, "w", encoding="utf-8") as f:
705
+ f.write(test_code)
706
+
707
+ created_files.append(test_path)
708
+
709
+ # Phase 3.5: Apply Black formatting to all Python files
710
+ self.console.print_info(
711
+ "\nšŸŽØ Phase 3.5: Applying Black formatting to all Python files..."
712
+ )
713
+
714
+ # Format all Python files in the project
715
+ python_files = []
716
+ for f in created_files:
717
+ file_path = Path(f) if isinstance(f, str) else f
718
+ if file_path.suffix == ".py":
719
+ python_files.append(file_path)
720
+
721
+ formatted_count = 0
722
+
723
+ for py_file in python_files:
724
+ if py_file.exists():
725
+ format_result = self._execute_tool(
726
+ "format_with_black", {"file_path": str(py_file)}
727
+ )
728
+ if format_result.get("formatted"):
729
+ formatted_count += 1
730
+
731
+ if formatted_count > 0:
732
+ self.console.print_success(
733
+ f"āœ… Formatted {formatted_count} Python file(s) with Black"
734
+ )
735
+ else:
736
+ self.console.print_info(
737
+ "āœ“ All Python files already properly formatted"
738
+ )
739
+
740
+ # Phase 4: Run tests and fix issues
741
+ self.console.print_info(
742
+ "\nšŸƒ Phase 4: Running tests and fixing issues..."
743
+ )
744
+
745
+ test_run_result = self._execute_tool(
746
+ "run_tests", {"project_path": project_name, "timeout": 30}
747
+ )
748
+ if test_run_result.get("status") == "success":
749
+ if test_run_result.get("tests_passed"):
750
+ self.console.print_success("āœ… All tests passed!")
751
+ test_results["status"] = "passed"
752
+ test_results["details"] = "All tests executed successfully"
753
+ else:
754
+ # Show test failure details
755
+ failure_summary = test_run_result.get("failure_summary", "")
756
+ stdout = test_run_result.get("stdout", "")
757
+
758
+ self.console.print_warning(
759
+ f"āš ļø Some tests failed: {failure_summary}"
760
+ if failure_summary
761
+ else "āš ļø Some tests failed, attempting fixes..."
762
+ )
763
+
764
+ # Extract and show failed test names from pytest output
765
+ if stdout:
766
+ import re
767
+
768
+ # Get command that was run
769
+ test_command = test_run_result.get("command", "pytest")
770
+
771
+ # Look for FAILED lines in pytest output
772
+ failed_tests = re.findall(r"FAILED (.*?) -", stdout)
773
+ if failed_tests:
774
+ self.console.print_info(
775
+ f"\n Failed tests ({len(failed_tests)}):"
776
+ )
777
+ for test in failed_tests[:5]: # Show first 5
778
+ self.console.print_info(f" • {test}")
779
+ if len(failed_tests) > 5:
780
+ self.console.print_info(
781
+ f" ... and {len(failed_tests) - 5} more"
782
+ )
783
+
784
+ # Show terminal output preview - just raw output in a panel
785
+ # Take first 20 lines of pytest output
786
+ lines = stdout.split("\n")[:20]
787
+ if lines:
788
+ if (
789
+ hasattr(self.console, "console")
790
+ and self.console.console
791
+ ):
792
+ from rich.panel import Panel
793
+
794
+ # Show command and raw output
795
+ preview_text = f"$ {test_command}\n\n" + "\n".join(
796
+ lines
797
+ )
798
+ self.console.console.print(
799
+ Panel(
800
+ preview_text,
801
+ title="Test Output Preview",
802
+ border_style="yellow",
803
+ expand=False,
804
+ )
805
+ )
806
+ else:
807
+ print("\n Test Output Preview:")
808
+ print(" " + "─" * 70)
809
+ print(f" $ {test_command}\n")
810
+ for line in lines:
811
+ print(f" {line}")
812
+ print(" " + "─" * 70)
813
+
814
+ test_results["status"] = "partial"
815
+ test_results["stderr"] = test_run_result.get("stderr", "")
816
+ test_results["stdout"] = stdout
817
+ test_results["failure_summary"] = failure_summary
818
+
819
+ # Try to fix test failures
820
+ for attempt in range(2):
821
+ self.console.print_info(
822
+ f" šŸ”§ Fix attempt {attempt+1}/2..."
823
+ )
824
+
825
+ # Run auto_fix_syntax_errors on the project
826
+ fix_result = self._execute_tool(
827
+ "auto_fix_syntax_errors", {"project_path": project_name}
828
+ )
829
+ if fix_result.get("files_fixed"):
830
+ fixed_files = fix_result["files_fixed"]
831
+ self.console.print_info(
832
+ f" Fixed {len(fixed_files)} files:"
833
+ )
834
+ for file in fixed_files[:3]: # Show first 3
835
+ self.console.print_info(f" • {file}")
836
+ if len(fixed_files) > 3:
837
+ self.console.print_info(
838
+ f" ... and {len(fixed_files) - 3} more"
839
+ )
840
+
841
+ # Re-run tests
842
+ self.console.print_info(" Re-running tests...")
843
+ test_run_result = self._execute_tool(
844
+ "run_tests",
845
+ {"project_path": project_name, "timeout": 30},
846
+ )
847
+ if test_run_result.get("tests_passed"):
848
+ self.console.print_success(
849
+ " āœ… Tests now passing!"
850
+ )
851
+ test_results["status"] = "passed"
852
+ break
853
+ else:
854
+ # Show what's still failing
855
+ new_failure_summary = test_run_result.get(
856
+ "failure_summary", ""
857
+ )
858
+ if new_failure_summary:
859
+ self.console.print_warning(
860
+ f" Still failing: {new_failure_summary}"
861
+ )
862
+ else:
863
+ self.console.print_info(
864
+ " No syntax errors found to fix"
865
+ )
866
+ else:
867
+ self.console.print_warning(
868
+ f"āš ļø Could not run tests: {test_run_result.get('error', 'Unknown error')}"
869
+ )
870
+ test_results["status"] = "error"
871
+ test_results["error"] = test_run_result.get("error", "")
872
+
873
+ # Phase 5: Final comprehensive validation
874
+ self.console.print_info("\nšŸ” Phase 5: Final project validation...")
875
+
876
+ final_validation = self._execute_tool(
877
+ "validate_project", {"project_path": project_name, "fix": True}
878
+ )
879
+
880
+ # Try to fix any remaining issues
881
+ if not final_validation.get("is_valid"):
882
+ self.console.print_info(" šŸ”§ Attempting final fixes...")
883
+
884
+ for attempt in range(2):
885
+ if final_validation.get("total_errors", 0) == 0:
886
+ break
887
+
888
+ # Run auto-fix
889
+ auto_fix_result = self._execute_tool(
890
+ "auto_fix_syntax_errors", {"project_path": project_name}
891
+ )
892
+ if auto_fix_result.get("files_fixed"):
893
+ self.console.print_info(
894
+ f" Fixed {len(auto_fix_result['files_fixed'])} files"
895
+ )
896
+
897
+ # Re-validate
898
+ final_validation = self._execute_tool(
899
+ "validate_project",
900
+ {"project_path": project_name, "fix": True},
901
+ )
902
+ if final_validation.get("is_valid"):
903
+ self.console.print_success(
904
+ "āœ… All validation checks passed!"
905
+ )
906
+ break
907
+
908
+ # Phase 6: Generate summary
909
+ self.console.print_header("\nšŸ“Š Project Generation Complete!")
910
+
911
+ # Build summary message
912
+ summary = f"""
913
+ ## Project: {project_name}
914
+
915
+ ### šŸ“‹ Architecture
916
+ - **Overview**: {architecture.get('overview', query)[:100]}...
917
+ - **Technologies**: {', '.join(architecture.get('technologies', ['Python']))}
918
+ - **Patterns**: {', '.join(architecture.get('patterns', ['Modular']))}
919
+
920
+ ### šŸ“ Generated Files ({len(created_files)} total)
921
+ - **Core Modules**: {len([f for f in created_files if f.endswith('.py') and 'test' not in f])}
922
+ - **Test Files**: {len([f for f in created_files if 'test' in f])}
923
+ - **Documentation**: {len([f for f in created_files if f.endswith('.md')])}
924
+ - **Configuration**: {len([f for f in created_files if f.endswith(('.txt', '.yml', '.yaml', '.json'))])}
925
+
926
+ ### āœ… Quality Metrics
927
+ - **Syntax Validation**: {'āœ… Passed' if not implementation_issues else f'āš ļø {len(implementation_issues)} issues'}
928
+ - **Test Results**: {test_results.get('status', 'Not run').title()}
929
+ - **Code Quality**: {final_validation.get('total_errors', 0)} errors, {final_validation.get('total_warnings', 0)} warnings
930
+ - **Anti-patterns**: {'None detected' if not any(i['type'] == 'antipattern' for i in implementation_issues) else 'Some detected'}
931
+
932
+ ### šŸŽÆ Ready to Use
933
+ The project is structured and ready for development. Key features:
934
+ {chr(10).join(f"- {module['name']}: {module.get('purpose', '')}" for module in modules[:5])}
935
+
936
+ ### šŸš€ Next Steps
937
+ 1. Review PLAN.md for architecture details
938
+ 2. Install dependencies: `pip install -r requirements.txt`
939
+ 3. Run the application: `python main.py`
940
+ 4. Run tests: `pytest`
941
+ """
942
+
943
+ if hasattr(self.console, "console") and self.console.console:
944
+ from rich.panel import Panel
945
+
946
+ self.console.console.print(
947
+ Panel(summary, title="Project Summary", expand=False)
948
+ )
949
+ else:
950
+ print(summary)
951
+
952
+ return {
953
+ "status": "success",
954
+ "project_name": project_name,
955
+ "files_created": created_files,
956
+ "validation": final_validation,
957
+ "test_results": test_results,
958
+ "implementation_issues": implementation_issues,
959
+ "summary": summary,
960
+ "message": f"āœ… Successfully created {project_name} with {len(created_files)} files",
961
+ }
962
+
963
+ except Exception as e:
964
+ return {"status": "error", "error": str(e)}
965
+
966
+ def _validate_project_structure(
967
+ self, _project_path: Path, files: List[Path]
968
+ ) -> Dict[str, Any]:
969
+ """Validate project structure for consistency issues.
970
+
971
+ Args:
972
+ _project_path: Path to the project directory (unused currently)
973
+ files: List of Path objects for all files in the project
974
+
975
+ Returns:
976
+ Dictionary with validation results including errors and warnings
977
+ """
978
+ errors = []
979
+ warnings = []
980
+
981
+ filenames = [f.name for f in files if f.is_file()]
982
+
983
+ # Check for multiple entry points (common issue)
984
+ entry_points = ["main.py", "app.py", "run.py", "__main__.py", "wsgi.py"]
985
+ found_entries = [ep for ep in entry_points if ep in filenames]
986
+
987
+ if len(found_entries) > 1:
988
+ errors.append(
989
+ f"Multiple entry points found: {', '.join(found_entries)}. "
990
+ "Choose ONE pattern: either monolithic or modular."
991
+ )
992
+
993
+ # Check for essential files
994
+ if "README.md" not in filenames and "readme.md" not in filenames:
995
+ errors.append("Missing README.md")
996
+
997
+ if "requirements.txt" not in filenames and "pyproject.toml" not in filenames:
998
+ warnings.append("Missing requirements.txt or pyproject.toml")
999
+
1000
+ # Check for PLAN.md
1001
+ if "PLAN.md" not in filenames and "plan.md" not in filenames:
1002
+ warnings.append(
1003
+ "No PLAN.md found (architectural plan should be created first)"
1004
+ )
1005
+
1006
+ # Check for duplicate models (common issue)
1007
+ model_files = [
1008
+ f for f in files if "model" in f.name.lower() and f.suffix == ".py"
1009
+ ]
1010
+ if len(model_files) > 2:
1011
+ warnings.append(
1012
+ f"Multiple model files found ({len(model_files)}). "
1013
+ "Check for duplicate definitions."
1014
+ )
1015
+
1016
+ return {"is_valid": len(errors) == 0, "errors": errors, "warnings": warnings}