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.
- amd_gaia-0.14.1.dist-info/METADATA +768 -0
- amd_gaia-0.14.1.dist-info/RECORD +800 -0
- amd_gaia-0.14.1.dist-info/WHEEL +5 -0
- amd_gaia-0.14.1.dist-info/entry_points.txt +5 -0
- amd_gaia-0.14.1.dist-info/licenses/LICENSE.md +21 -0
- amd_gaia-0.14.1.dist-info/top_level.txt +1 -0
- gaia/__init__.py +2 -0
- gaia/agents/__init__.py +19 -0
- gaia/agents/base/__init__.py +9 -0
- gaia/agents/base/agent.py +2072 -0
- gaia/agents/base/api_agent.py +120 -0
- gaia/agents/base/console.py +1457 -0
- gaia/agents/base/mcp_agent.py +86 -0
- gaia/agents/base/tools.py +83 -0
- gaia/agents/blender/agent.py +556 -0
- gaia/agents/blender/agent_simple.py +135 -0
- gaia/agents/blender/app.py +211 -0
- gaia/agents/blender/app_simple.py +41 -0
- gaia/agents/blender/core/__init__.py +16 -0
- gaia/agents/blender/core/materials.py +506 -0
- gaia/agents/blender/core/objects.py +316 -0
- gaia/agents/blender/core/rendering.py +225 -0
- gaia/agents/blender/core/scene.py +220 -0
- gaia/agents/blender/core/view.py +146 -0
- gaia/agents/chat/__init__.py +9 -0
- gaia/agents/chat/agent.py +975 -0
- gaia/agents/chat/app.py +1058 -0
- gaia/agents/chat/session.py +508 -0
- gaia/agents/chat/tools/__init__.py +15 -0
- gaia/agents/chat/tools/file_tools.py +96 -0
- gaia/agents/chat/tools/rag_tools.py +1729 -0
- gaia/agents/chat/tools/shell_tools.py +436 -0
- gaia/agents/code/__init__.py +7 -0
- gaia/agents/code/agent.py +547 -0
- gaia/agents/code/app.py +266 -0
- gaia/agents/code/models.py +135 -0
- gaia/agents/code/orchestration/__init__.py +24 -0
- gaia/agents/code/orchestration/checklist_executor.py +1739 -0
- gaia/agents/code/orchestration/checklist_generator.py +709 -0
- gaia/agents/code/orchestration/factories/__init__.py +9 -0
- gaia/agents/code/orchestration/factories/base.py +63 -0
- gaia/agents/code/orchestration/factories/nextjs_factory.py +118 -0
- gaia/agents/code/orchestration/factories/python_factory.py +106 -0
- gaia/agents/code/orchestration/orchestrator.py +610 -0
- gaia/agents/code/orchestration/project_analyzer.py +391 -0
- gaia/agents/code/orchestration/steps/__init__.py +67 -0
- gaia/agents/code/orchestration/steps/base.py +188 -0
- gaia/agents/code/orchestration/steps/error_handler.py +314 -0
- gaia/agents/code/orchestration/steps/nextjs.py +828 -0
- gaia/agents/code/orchestration/steps/python.py +307 -0
- gaia/agents/code/orchestration/template_catalog.py +463 -0
- gaia/agents/code/orchestration/workflows/__init__.py +14 -0
- gaia/agents/code/orchestration/workflows/base.py +80 -0
- gaia/agents/code/orchestration/workflows/nextjs.py +186 -0
- gaia/agents/code/orchestration/workflows/python.py +94 -0
- gaia/agents/code/prompts/__init__.py +11 -0
- gaia/agents/code/prompts/base_prompt.py +77 -0
- gaia/agents/code/prompts/code_patterns.py +1925 -0
- gaia/agents/code/prompts/nextjs_prompt.py +40 -0
- gaia/agents/code/prompts/python_prompt.py +109 -0
- gaia/agents/code/schema_inference.py +365 -0
- gaia/agents/code/system_prompt.py +41 -0
- gaia/agents/code/tools/__init__.py +42 -0
- gaia/agents/code/tools/cli_tools.py +1138 -0
- gaia/agents/code/tools/code_formatting.py +319 -0
- gaia/agents/code/tools/code_tools.py +769 -0
- gaia/agents/code/tools/error_fixing.py +1347 -0
- gaia/agents/code/tools/external_tools.py +180 -0
- gaia/agents/code/tools/file_io.py +845 -0
- gaia/agents/code/tools/prisma_tools.py +190 -0
- gaia/agents/code/tools/project_management.py +1016 -0
- gaia/agents/code/tools/testing.py +321 -0
- gaia/agents/code/tools/typescript_tools.py +122 -0
- gaia/agents/code/tools/validation_parsing.py +461 -0
- gaia/agents/code/tools/validation_tools.py +803 -0
- gaia/agents/code/tools/web_dev_tools.py +1744 -0
- gaia/agents/code/validators/__init__.py +16 -0
- gaia/agents/code/validators/antipattern_checker.py +241 -0
- gaia/agents/code/validators/ast_analyzer.py +197 -0
- gaia/agents/code/validators/requirements_validator.py +145 -0
- gaia/agents/code/validators/syntax_validator.py +171 -0
- gaia/agents/docker/__init__.py +7 -0
- gaia/agents/docker/agent.py +642 -0
- gaia/agents/jira/__init__.py +11 -0
- gaia/agents/jira/agent.py +894 -0
- gaia/agents/jira/jql_templates.py +299 -0
- gaia/agents/routing/__init__.py +7 -0
- gaia/agents/routing/agent.py +512 -0
- gaia/agents/routing/system_prompt.py +75 -0
- gaia/api/__init__.py +23 -0
- gaia/api/agent_registry.py +238 -0
- gaia/api/app.py +305 -0
- gaia/api/openai_server.py +575 -0
- gaia/api/schemas.py +186 -0
- gaia/api/sse_handler.py +370 -0
- gaia/apps/__init__.py +4 -0
- gaia/apps/llm/__init__.py +6 -0
- gaia/apps/llm/app.py +169 -0
- gaia/apps/summarize/app.py +633 -0
- gaia/apps/summarize/html_viewer.py +133 -0
- gaia/apps/summarize/pdf_formatter.py +284 -0
- gaia/audio/__init__.py +2 -0
- gaia/audio/audio_client.py +439 -0
- gaia/audio/audio_recorder.py +269 -0
- gaia/audio/kokoro_tts.py +599 -0
- gaia/audio/whisper_asr.py +432 -0
- gaia/chat/__init__.py +16 -0
- gaia/chat/app.py +430 -0
- gaia/chat/prompts.py +522 -0
- gaia/chat/sdk.py +1200 -0
- gaia/cli.py +5621 -0
- gaia/eval/batch_experiment.py +2332 -0
- gaia/eval/claude.py +542 -0
- gaia/eval/config.py +37 -0
- gaia/eval/email_generator.py +512 -0
- gaia/eval/eval.py +3179 -0
- gaia/eval/groundtruth.py +1130 -0
- gaia/eval/transcript_generator.py +582 -0
- gaia/eval/webapp/README.md +168 -0
- gaia/eval/webapp/node_modules/.bin/mime +16 -0
- gaia/eval/webapp/node_modules/.bin/mime.cmd +17 -0
- gaia/eval/webapp/node_modules/.bin/mime.ps1 +28 -0
- gaia/eval/webapp/node_modules/.package-lock.json +865 -0
- gaia/eval/webapp/node_modules/accepts/HISTORY.md +243 -0
- gaia/eval/webapp/node_modules/accepts/LICENSE +23 -0
- gaia/eval/webapp/node_modules/accepts/README.md +140 -0
- gaia/eval/webapp/node_modules/accepts/index.js +238 -0
- gaia/eval/webapp/node_modules/accepts/package.json +47 -0
- gaia/eval/webapp/node_modules/array-flatten/LICENSE +21 -0
- gaia/eval/webapp/node_modules/array-flatten/README.md +43 -0
- gaia/eval/webapp/node_modules/array-flatten/array-flatten.js +64 -0
- gaia/eval/webapp/node_modules/array-flatten/package.json +39 -0
- gaia/eval/webapp/node_modules/body-parser/HISTORY.md +672 -0
- gaia/eval/webapp/node_modules/body-parser/LICENSE +23 -0
- gaia/eval/webapp/node_modules/body-parser/README.md +476 -0
- gaia/eval/webapp/node_modules/body-parser/SECURITY.md +25 -0
- gaia/eval/webapp/node_modules/body-parser/index.js +156 -0
- gaia/eval/webapp/node_modules/body-parser/lib/read.js +205 -0
- gaia/eval/webapp/node_modules/body-parser/lib/types/json.js +247 -0
- gaia/eval/webapp/node_modules/body-parser/lib/types/raw.js +101 -0
- gaia/eval/webapp/node_modules/body-parser/lib/types/text.js +121 -0
- gaia/eval/webapp/node_modules/body-parser/lib/types/urlencoded.js +307 -0
- gaia/eval/webapp/node_modules/body-parser/package.json +56 -0
- gaia/eval/webapp/node_modules/bytes/History.md +97 -0
- gaia/eval/webapp/node_modules/bytes/LICENSE +23 -0
- gaia/eval/webapp/node_modules/bytes/Readme.md +152 -0
- gaia/eval/webapp/node_modules/bytes/index.js +170 -0
- gaia/eval/webapp/node_modules/bytes/package.json +42 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/.eslintrc +17 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/.nycrc +9 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/CHANGELOG.md +30 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/LICENSE +21 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/README.md +62 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/actualApply.d.ts +1 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/actualApply.js +10 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/applyBind.d.ts +19 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/applyBind.js +10 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionApply.d.ts +1 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionApply.js +4 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionCall.d.ts +1 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/functionCall.js +4 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/index.d.ts +64 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/index.js +15 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/package.json +85 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/reflectApply.d.ts +3 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/reflectApply.js +4 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/test/index.js +63 -0
- gaia/eval/webapp/node_modules/call-bind-apply-helpers/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/call-bound/.eslintrc +13 -0
- gaia/eval/webapp/node_modules/call-bound/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/call-bound/.nycrc +9 -0
- gaia/eval/webapp/node_modules/call-bound/CHANGELOG.md +42 -0
- gaia/eval/webapp/node_modules/call-bound/LICENSE +21 -0
- gaia/eval/webapp/node_modules/call-bound/README.md +53 -0
- gaia/eval/webapp/node_modules/call-bound/index.d.ts +94 -0
- gaia/eval/webapp/node_modules/call-bound/index.js +19 -0
- gaia/eval/webapp/node_modules/call-bound/package.json +99 -0
- gaia/eval/webapp/node_modules/call-bound/test/index.js +61 -0
- gaia/eval/webapp/node_modules/call-bound/tsconfig.json +10 -0
- gaia/eval/webapp/node_modules/content-disposition/HISTORY.md +60 -0
- gaia/eval/webapp/node_modules/content-disposition/LICENSE +22 -0
- gaia/eval/webapp/node_modules/content-disposition/README.md +142 -0
- gaia/eval/webapp/node_modules/content-disposition/index.js +458 -0
- gaia/eval/webapp/node_modules/content-disposition/package.json +44 -0
- gaia/eval/webapp/node_modules/content-type/HISTORY.md +29 -0
- gaia/eval/webapp/node_modules/content-type/LICENSE +22 -0
- gaia/eval/webapp/node_modules/content-type/README.md +94 -0
- gaia/eval/webapp/node_modules/content-type/index.js +225 -0
- gaia/eval/webapp/node_modules/content-type/package.json +42 -0
- gaia/eval/webapp/node_modules/cookie/LICENSE +24 -0
- gaia/eval/webapp/node_modules/cookie/README.md +317 -0
- gaia/eval/webapp/node_modules/cookie/SECURITY.md +25 -0
- gaia/eval/webapp/node_modules/cookie/index.js +334 -0
- gaia/eval/webapp/node_modules/cookie/package.json +44 -0
- gaia/eval/webapp/node_modules/cookie-signature/.npmignore +4 -0
- gaia/eval/webapp/node_modules/cookie-signature/History.md +38 -0
- gaia/eval/webapp/node_modules/cookie-signature/Readme.md +42 -0
- gaia/eval/webapp/node_modules/cookie-signature/index.js +51 -0
- gaia/eval/webapp/node_modules/cookie-signature/package.json +18 -0
- gaia/eval/webapp/node_modules/debug/.coveralls.yml +1 -0
- gaia/eval/webapp/node_modules/debug/.eslintrc +11 -0
- gaia/eval/webapp/node_modules/debug/.npmignore +9 -0
- gaia/eval/webapp/node_modules/debug/.travis.yml +14 -0
- gaia/eval/webapp/node_modules/debug/CHANGELOG.md +362 -0
- gaia/eval/webapp/node_modules/debug/LICENSE +19 -0
- gaia/eval/webapp/node_modules/debug/Makefile +50 -0
- gaia/eval/webapp/node_modules/debug/README.md +312 -0
- gaia/eval/webapp/node_modules/debug/component.json +19 -0
- gaia/eval/webapp/node_modules/debug/karma.conf.js +70 -0
- gaia/eval/webapp/node_modules/debug/node.js +1 -0
- gaia/eval/webapp/node_modules/debug/package.json +49 -0
- gaia/eval/webapp/node_modules/debug/src/browser.js +185 -0
- gaia/eval/webapp/node_modules/debug/src/debug.js +202 -0
- gaia/eval/webapp/node_modules/debug/src/index.js +10 -0
- gaia/eval/webapp/node_modules/debug/src/inspector-log.js +15 -0
- gaia/eval/webapp/node_modules/debug/src/node.js +248 -0
- gaia/eval/webapp/node_modules/depd/History.md +103 -0
- gaia/eval/webapp/node_modules/depd/LICENSE +22 -0
- gaia/eval/webapp/node_modules/depd/Readme.md +280 -0
- gaia/eval/webapp/node_modules/depd/index.js +538 -0
- gaia/eval/webapp/node_modules/depd/lib/browser/index.js +77 -0
- gaia/eval/webapp/node_modules/depd/package.json +45 -0
- gaia/eval/webapp/node_modules/destroy/LICENSE +23 -0
- gaia/eval/webapp/node_modules/destroy/README.md +63 -0
- gaia/eval/webapp/node_modules/destroy/index.js +209 -0
- gaia/eval/webapp/node_modules/destroy/package.json +48 -0
- gaia/eval/webapp/node_modules/dunder-proto/.eslintrc +5 -0
- gaia/eval/webapp/node_modules/dunder-proto/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/dunder-proto/.nycrc +13 -0
- gaia/eval/webapp/node_modules/dunder-proto/CHANGELOG.md +24 -0
- gaia/eval/webapp/node_modules/dunder-proto/LICENSE +21 -0
- gaia/eval/webapp/node_modules/dunder-proto/README.md +54 -0
- gaia/eval/webapp/node_modules/dunder-proto/get.d.ts +5 -0
- gaia/eval/webapp/node_modules/dunder-proto/get.js +30 -0
- gaia/eval/webapp/node_modules/dunder-proto/package.json +76 -0
- gaia/eval/webapp/node_modules/dunder-proto/set.d.ts +5 -0
- gaia/eval/webapp/node_modules/dunder-proto/set.js +35 -0
- gaia/eval/webapp/node_modules/dunder-proto/test/get.js +34 -0
- gaia/eval/webapp/node_modules/dunder-proto/test/index.js +4 -0
- gaia/eval/webapp/node_modules/dunder-proto/test/set.js +50 -0
- gaia/eval/webapp/node_modules/dunder-proto/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/ee-first/LICENSE +22 -0
- gaia/eval/webapp/node_modules/ee-first/README.md +80 -0
- gaia/eval/webapp/node_modules/ee-first/index.js +95 -0
- gaia/eval/webapp/node_modules/ee-first/package.json +29 -0
- gaia/eval/webapp/node_modules/encodeurl/LICENSE +22 -0
- gaia/eval/webapp/node_modules/encodeurl/README.md +109 -0
- gaia/eval/webapp/node_modules/encodeurl/index.js +60 -0
- gaia/eval/webapp/node_modules/encodeurl/package.json +40 -0
- gaia/eval/webapp/node_modules/es-define-property/.eslintrc +13 -0
- gaia/eval/webapp/node_modules/es-define-property/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/es-define-property/.nycrc +9 -0
- gaia/eval/webapp/node_modules/es-define-property/CHANGELOG.md +29 -0
- gaia/eval/webapp/node_modules/es-define-property/LICENSE +21 -0
- gaia/eval/webapp/node_modules/es-define-property/README.md +49 -0
- gaia/eval/webapp/node_modules/es-define-property/index.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-define-property/index.js +14 -0
- gaia/eval/webapp/node_modules/es-define-property/package.json +81 -0
- gaia/eval/webapp/node_modules/es-define-property/test/index.js +56 -0
- gaia/eval/webapp/node_modules/es-define-property/tsconfig.json +10 -0
- gaia/eval/webapp/node_modules/es-errors/.eslintrc +5 -0
- gaia/eval/webapp/node_modules/es-errors/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/es-errors/CHANGELOG.md +40 -0
- gaia/eval/webapp/node_modules/es-errors/LICENSE +21 -0
- gaia/eval/webapp/node_modules/es-errors/README.md +55 -0
- gaia/eval/webapp/node_modules/es-errors/eval.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-errors/eval.js +4 -0
- gaia/eval/webapp/node_modules/es-errors/index.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-errors/index.js +4 -0
- gaia/eval/webapp/node_modules/es-errors/package.json +80 -0
- gaia/eval/webapp/node_modules/es-errors/range.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-errors/range.js +4 -0
- gaia/eval/webapp/node_modules/es-errors/ref.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-errors/ref.js +4 -0
- gaia/eval/webapp/node_modules/es-errors/syntax.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-errors/syntax.js +4 -0
- gaia/eval/webapp/node_modules/es-errors/test/index.js +19 -0
- gaia/eval/webapp/node_modules/es-errors/tsconfig.json +49 -0
- gaia/eval/webapp/node_modules/es-errors/type.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-errors/type.js +4 -0
- gaia/eval/webapp/node_modules/es-errors/uri.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-errors/uri.js +4 -0
- gaia/eval/webapp/node_modules/es-object-atoms/.eslintrc +16 -0
- gaia/eval/webapp/node_modules/es-object-atoms/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/es-object-atoms/CHANGELOG.md +37 -0
- gaia/eval/webapp/node_modules/es-object-atoms/LICENSE +21 -0
- gaia/eval/webapp/node_modules/es-object-atoms/README.md +63 -0
- gaia/eval/webapp/node_modules/es-object-atoms/RequireObjectCoercible.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-object-atoms/RequireObjectCoercible.js +11 -0
- gaia/eval/webapp/node_modules/es-object-atoms/ToObject.d.ts +7 -0
- gaia/eval/webapp/node_modules/es-object-atoms/ToObject.js +10 -0
- gaia/eval/webapp/node_modules/es-object-atoms/index.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-object-atoms/index.js +4 -0
- gaia/eval/webapp/node_modules/es-object-atoms/isObject.d.ts +3 -0
- gaia/eval/webapp/node_modules/es-object-atoms/isObject.js +6 -0
- gaia/eval/webapp/node_modules/es-object-atoms/package.json +80 -0
- gaia/eval/webapp/node_modules/es-object-atoms/test/index.js +38 -0
- gaia/eval/webapp/node_modules/es-object-atoms/tsconfig.json +6 -0
- gaia/eval/webapp/node_modules/escape-html/LICENSE +24 -0
- gaia/eval/webapp/node_modules/escape-html/Readme.md +43 -0
- gaia/eval/webapp/node_modules/escape-html/index.js +78 -0
- gaia/eval/webapp/node_modules/escape-html/package.json +24 -0
- gaia/eval/webapp/node_modules/etag/HISTORY.md +83 -0
- gaia/eval/webapp/node_modules/etag/LICENSE +22 -0
- gaia/eval/webapp/node_modules/etag/README.md +159 -0
- gaia/eval/webapp/node_modules/etag/index.js +131 -0
- gaia/eval/webapp/node_modules/etag/package.json +47 -0
- gaia/eval/webapp/node_modules/express/History.md +3656 -0
- gaia/eval/webapp/node_modules/express/LICENSE +24 -0
- gaia/eval/webapp/node_modules/express/Readme.md +260 -0
- gaia/eval/webapp/node_modules/express/index.js +11 -0
- gaia/eval/webapp/node_modules/express/lib/application.js +661 -0
- gaia/eval/webapp/node_modules/express/lib/express.js +116 -0
- gaia/eval/webapp/node_modules/express/lib/middleware/init.js +43 -0
- gaia/eval/webapp/node_modules/express/lib/middleware/query.js +47 -0
- gaia/eval/webapp/node_modules/express/lib/request.js +525 -0
- gaia/eval/webapp/node_modules/express/lib/response.js +1179 -0
- gaia/eval/webapp/node_modules/express/lib/router/index.js +673 -0
- gaia/eval/webapp/node_modules/express/lib/router/layer.js +181 -0
- gaia/eval/webapp/node_modules/express/lib/router/route.js +230 -0
- gaia/eval/webapp/node_modules/express/lib/utils.js +303 -0
- gaia/eval/webapp/node_modules/express/lib/view.js +182 -0
- gaia/eval/webapp/node_modules/express/package.json +102 -0
- gaia/eval/webapp/node_modules/finalhandler/HISTORY.md +210 -0
- gaia/eval/webapp/node_modules/finalhandler/LICENSE +22 -0
- gaia/eval/webapp/node_modules/finalhandler/README.md +147 -0
- gaia/eval/webapp/node_modules/finalhandler/SECURITY.md +25 -0
- gaia/eval/webapp/node_modules/finalhandler/index.js +341 -0
- gaia/eval/webapp/node_modules/finalhandler/package.json +47 -0
- gaia/eval/webapp/node_modules/forwarded/HISTORY.md +21 -0
- gaia/eval/webapp/node_modules/forwarded/LICENSE +22 -0
- gaia/eval/webapp/node_modules/forwarded/README.md +57 -0
- gaia/eval/webapp/node_modules/forwarded/index.js +90 -0
- gaia/eval/webapp/node_modules/forwarded/package.json +45 -0
- gaia/eval/webapp/node_modules/fresh/HISTORY.md +70 -0
- gaia/eval/webapp/node_modules/fresh/LICENSE +23 -0
- gaia/eval/webapp/node_modules/fresh/README.md +119 -0
- gaia/eval/webapp/node_modules/fresh/index.js +137 -0
- gaia/eval/webapp/node_modules/fresh/package.json +46 -0
- gaia/eval/webapp/node_modules/fs/README.md +9 -0
- gaia/eval/webapp/node_modules/fs/package.json +20 -0
- gaia/eval/webapp/node_modules/function-bind/.eslintrc +21 -0
- gaia/eval/webapp/node_modules/function-bind/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/function-bind/.github/SECURITY.md +3 -0
- gaia/eval/webapp/node_modules/function-bind/.nycrc +13 -0
- gaia/eval/webapp/node_modules/function-bind/CHANGELOG.md +136 -0
- gaia/eval/webapp/node_modules/function-bind/LICENSE +20 -0
- gaia/eval/webapp/node_modules/function-bind/README.md +46 -0
- gaia/eval/webapp/node_modules/function-bind/implementation.js +84 -0
- gaia/eval/webapp/node_modules/function-bind/index.js +5 -0
- gaia/eval/webapp/node_modules/function-bind/package.json +87 -0
- gaia/eval/webapp/node_modules/function-bind/test/.eslintrc +9 -0
- gaia/eval/webapp/node_modules/function-bind/test/index.js +252 -0
- gaia/eval/webapp/node_modules/get-intrinsic/.eslintrc +42 -0
- gaia/eval/webapp/node_modules/get-intrinsic/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/get-intrinsic/.nycrc +9 -0
- gaia/eval/webapp/node_modules/get-intrinsic/CHANGELOG.md +186 -0
- gaia/eval/webapp/node_modules/get-intrinsic/LICENSE +21 -0
- gaia/eval/webapp/node_modules/get-intrinsic/README.md +71 -0
- gaia/eval/webapp/node_modules/get-intrinsic/index.js +378 -0
- gaia/eval/webapp/node_modules/get-intrinsic/package.json +97 -0
- gaia/eval/webapp/node_modules/get-intrinsic/test/GetIntrinsic.js +274 -0
- gaia/eval/webapp/node_modules/get-proto/.eslintrc +10 -0
- gaia/eval/webapp/node_modules/get-proto/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/get-proto/.nycrc +9 -0
- gaia/eval/webapp/node_modules/get-proto/CHANGELOG.md +21 -0
- gaia/eval/webapp/node_modules/get-proto/LICENSE +21 -0
- gaia/eval/webapp/node_modules/get-proto/Object.getPrototypeOf.d.ts +5 -0
- gaia/eval/webapp/node_modules/get-proto/Object.getPrototypeOf.js +6 -0
- gaia/eval/webapp/node_modules/get-proto/README.md +50 -0
- gaia/eval/webapp/node_modules/get-proto/Reflect.getPrototypeOf.d.ts +3 -0
- gaia/eval/webapp/node_modules/get-proto/Reflect.getPrototypeOf.js +4 -0
- gaia/eval/webapp/node_modules/get-proto/index.d.ts +5 -0
- gaia/eval/webapp/node_modules/get-proto/index.js +27 -0
- gaia/eval/webapp/node_modules/get-proto/package.json +81 -0
- gaia/eval/webapp/node_modules/get-proto/test/index.js +68 -0
- gaia/eval/webapp/node_modules/get-proto/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/gopd/.eslintrc +16 -0
- gaia/eval/webapp/node_modules/gopd/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/gopd/CHANGELOG.md +45 -0
- gaia/eval/webapp/node_modules/gopd/LICENSE +21 -0
- gaia/eval/webapp/node_modules/gopd/README.md +40 -0
- gaia/eval/webapp/node_modules/gopd/gOPD.d.ts +1 -0
- gaia/eval/webapp/node_modules/gopd/gOPD.js +4 -0
- gaia/eval/webapp/node_modules/gopd/index.d.ts +5 -0
- gaia/eval/webapp/node_modules/gopd/index.js +15 -0
- gaia/eval/webapp/node_modules/gopd/package.json +77 -0
- gaia/eval/webapp/node_modules/gopd/test/index.js +36 -0
- gaia/eval/webapp/node_modules/gopd/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/has-symbols/.eslintrc +11 -0
- gaia/eval/webapp/node_modules/has-symbols/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/has-symbols/.nycrc +9 -0
- gaia/eval/webapp/node_modules/has-symbols/CHANGELOG.md +91 -0
- gaia/eval/webapp/node_modules/has-symbols/LICENSE +21 -0
- gaia/eval/webapp/node_modules/has-symbols/README.md +46 -0
- gaia/eval/webapp/node_modules/has-symbols/index.d.ts +3 -0
- gaia/eval/webapp/node_modules/has-symbols/index.js +14 -0
- gaia/eval/webapp/node_modules/has-symbols/package.json +111 -0
- gaia/eval/webapp/node_modules/has-symbols/shams.d.ts +3 -0
- gaia/eval/webapp/node_modules/has-symbols/shams.js +45 -0
- gaia/eval/webapp/node_modules/has-symbols/test/index.js +22 -0
- gaia/eval/webapp/node_modules/has-symbols/test/shams/core-js.js +29 -0
- gaia/eval/webapp/node_modules/has-symbols/test/shams/get-own-property-symbols.js +29 -0
- gaia/eval/webapp/node_modules/has-symbols/test/tests.js +58 -0
- gaia/eval/webapp/node_modules/has-symbols/tsconfig.json +10 -0
- gaia/eval/webapp/node_modules/hasown/.eslintrc +5 -0
- gaia/eval/webapp/node_modules/hasown/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/hasown/.nycrc +13 -0
- gaia/eval/webapp/node_modules/hasown/CHANGELOG.md +40 -0
- gaia/eval/webapp/node_modules/hasown/LICENSE +21 -0
- gaia/eval/webapp/node_modules/hasown/README.md +40 -0
- gaia/eval/webapp/node_modules/hasown/index.d.ts +3 -0
- gaia/eval/webapp/node_modules/hasown/index.js +8 -0
- gaia/eval/webapp/node_modules/hasown/package.json +92 -0
- gaia/eval/webapp/node_modules/hasown/tsconfig.json +6 -0
- gaia/eval/webapp/node_modules/http-errors/HISTORY.md +180 -0
- gaia/eval/webapp/node_modules/http-errors/LICENSE +23 -0
- gaia/eval/webapp/node_modules/http-errors/README.md +169 -0
- gaia/eval/webapp/node_modules/http-errors/index.js +289 -0
- gaia/eval/webapp/node_modules/http-errors/package.json +50 -0
- gaia/eval/webapp/node_modules/iconv-lite/Changelog.md +162 -0
- gaia/eval/webapp/node_modules/iconv-lite/LICENSE +21 -0
- gaia/eval/webapp/node_modules/iconv-lite/README.md +156 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/dbcs-codec.js +555 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/dbcs-data.js +176 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/index.js +22 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/internal.js +188 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/sbcs-codec.js +72 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/sbcs-data-generated.js +451 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/sbcs-data.js +174 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/big5-added.json +122 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/cp936.json +264 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/cp949.json +273 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/cp950.json +177 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/eucjp.json +182 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json +1 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/gbk-added.json +55 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/tables/shiftjis.json +125 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/utf16.js +177 -0
- gaia/eval/webapp/node_modules/iconv-lite/encodings/utf7.js +290 -0
- gaia/eval/webapp/node_modules/iconv-lite/lib/bom-handling.js +52 -0
- gaia/eval/webapp/node_modules/iconv-lite/lib/extend-node.js +217 -0
- gaia/eval/webapp/node_modules/iconv-lite/lib/index.d.ts +24 -0
- gaia/eval/webapp/node_modules/iconv-lite/lib/index.js +153 -0
- gaia/eval/webapp/node_modules/iconv-lite/lib/streams.js +121 -0
- gaia/eval/webapp/node_modules/iconv-lite/package.json +46 -0
- gaia/eval/webapp/node_modules/inherits/LICENSE +16 -0
- gaia/eval/webapp/node_modules/inherits/README.md +42 -0
- gaia/eval/webapp/node_modules/inherits/inherits.js +9 -0
- gaia/eval/webapp/node_modules/inherits/inherits_browser.js +27 -0
- gaia/eval/webapp/node_modules/inherits/package.json +29 -0
- gaia/eval/webapp/node_modules/ipaddr.js/LICENSE +19 -0
- gaia/eval/webapp/node_modules/ipaddr.js/README.md +233 -0
- gaia/eval/webapp/node_modules/ipaddr.js/ipaddr.min.js +1 -0
- gaia/eval/webapp/node_modules/ipaddr.js/lib/ipaddr.js +673 -0
- gaia/eval/webapp/node_modules/ipaddr.js/lib/ipaddr.js.d.ts +68 -0
- gaia/eval/webapp/node_modules/ipaddr.js/package.json +35 -0
- gaia/eval/webapp/node_modules/math-intrinsics/.eslintrc +16 -0
- gaia/eval/webapp/node_modules/math-intrinsics/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/math-intrinsics/CHANGELOG.md +24 -0
- gaia/eval/webapp/node_modules/math-intrinsics/LICENSE +21 -0
- gaia/eval/webapp/node_modules/math-intrinsics/README.md +50 -0
- gaia/eval/webapp/node_modules/math-intrinsics/abs.d.ts +1 -0
- gaia/eval/webapp/node_modules/math-intrinsics/abs.js +4 -0
- gaia/eval/webapp/node_modules/math-intrinsics/constants/maxArrayLength.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/constants/maxArrayLength.js +4 -0
- gaia/eval/webapp/node_modules/math-intrinsics/constants/maxSafeInteger.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/constants/maxSafeInteger.js +5 -0
- gaia/eval/webapp/node_modules/math-intrinsics/constants/maxValue.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/constants/maxValue.js +5 -0
- gaia/eval/webapp/node_modules/math-intrinsics/floor.d.ts +1 -0
- gaia/eval/webapp/node_modules/math-intrinsics/floor.js +4 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isFinite.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isFinite.js +12 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isInteger.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isInteger.js +16 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isNaN.d.ts +1 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isNaN.js +6 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isNegativeZero.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/isNegativeZero.js +6 -0
- gaia/eval/webapp/node_modules/math-intrinsics/max.d.ts +1 -0
- gaia/eval/webapp/node_modules/math-intrinsics/max.js +4 -0
- gaia/eval/webapp/node_modules/math-intrinsics/min.d.ts +1 -0
- gaia/eval/webapp/node_modules/math-intrinsics/min.js +4 -0
- gaia/eval/webapp/node_modules/math-intrinsics/mod.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/mod.js +9 -0
- gaia/eval/webapp/node_modules/math-intrinsics/package.json +86 -0
- gaia/eval/webapp/node_modules/math-intrinsics/pow.d.ts +1 -0
- gaia/eval/webapp/node_modules/math-intrinsics/pow.js +4 -0
- gaia/eval/webapp/node_modules/math-intrinsics/round.d.ts +1 -0
- gaia/eval/webapp/node_modules/math-intrinsics/round.js +4 -0
- gaia/eval/webapp/node_modules/math-intrinsics/sign.d.ts +3 -0
- gaia/eval/webapp/node_modules/math-intrinsics/sign.js +11 -0
- gaia/eval/webapp/node_modules/math-intrinsics/test/index.js +192 -0
- gaia/eval/webapp/node_modules/math-intrinsics/tsconfig.json +3 -0
- gaia/eval/webapp/node_modules/media-typer/HISTORY.md +22 -0
- gaia/eval/webapp/node_modules/media-typer/LICENSE +22 -0
- gaia/eval/webapp/node_modules/media-typer/README.md +81 -0
- gaia/eval/webapp/node_modules/media-typer/index.js +270 -0
- gaia/eval/webapp/node_modules/media-typer/package.json +26 -0
- gaia/eval/webapp/node_modules/merge-descriptors/HISTORY.md +21 -0
- gaia/eval/webapp/node_modules/merge-descriptors/LICENSE +23 -0
- gaia/eval/webapp/node_modules/merge-descriptors/README.md +49 -0
- gaia/eval/webapp/node_modules/merge-descriptors/index.js +60 -0
- gaia/eval/webapp/node_modules/merge-descriptors/package.json +39 -0
- gaia/eval/webapp/node_modules/methods/HISTORY.md +29 -0
- gaia/eval/webapp/node_modules/methods/LICENSE +24 -0
- gaia/eval/webapp/node_modules/methods/README.md +51 -0
- gaia/eval/webapp/node_modules/methods/index.js +69 -0
- gaia/eval/webapp/node_modules/methods/package.json +36 -0
- gaia/eval/webapp/node_modules/mime/.npmignore +0 -0
- gaia/eval/webapp/node_modules/mime/CHANGELOG.md +164 -0
- gaia/eval/webapp/node_modules/mime/LICENSE +21 -0
- gaia/eval/webapp/node_modules/mime/README.md +90 -0
- gaia/eval/webapp/node_modules/mime/cli.js +8 -0
- gaia/eval/webapp/node_modules/mime/mime.js +108 -0
- gaia/eval/webapp/node_modules/mime/package.json +44 -0
- gaia/eval/webapp/node_modules/mime/src/build.js +53 -0
- gaia/eval/webapp/node_modules/mime/src/test.js +60 -0
- gaia/eval/webapp/node_modules/mime/types.json +1 -0
- gaia/eval/webapp/node_modules/mime-db/HISTORY.md +507 -0
- gaia/eval/webapp/node_modules/mime-db/LICENSE +23 -0
- gaia/eval/webapp/node_modules/mime-db/README.md +100 -0
- gaia/eval/webapp/node_modules/mime-db/db.json +8519 -0
- gaia/eval/webapp/node_modules/mime-db/index.js +12 -0
- gaia/eval/webapp/node_modules/mime-db/package.json +60 -0
- gaia/eval/webapp/node_modules/mime-types/HISTORY.md +397 -0
- gaia/eval/webapp/node_modules/mime-types/LICENSE +23 -0
- gaia/eval/webapp/node_modules/mime-types/README.md +113 -0
- gaia/eval/webapp/node_modules/mime-types/index.js +188 -0
- gaia/eval/webapp/node_modules/mime-types/package.json +44 -0
- gaia/eval/webapp/node_modules/ms/index.js +152 -0
- gaia/eval/webapp/node_modules/ms/license.md +21 -0
- gaia/eval/webapp/node_modules/ms/package.json +37 -0
- gaia/eval/webapp/node_modules/ms/readme.md +51 -0
- gaia/eval/webapp/node_modules/negotiator/HISTORY.md +108 -0
- gaia/eval/webapp/node_modules/negotiator/LICENSE +24 -0
- gaia/eval/webapp/node_modules/negotiator/README.md +203 -0
- gaia/eval/webapp/node_modules/negotiator/index.js +82 -0
- gaia/eval/webapp/node_modules/negotiator/lib/charset.js +169 -0
- gaia/eval/webapp/node_modules/negotiator/lib/encoding.js +184 -0
- gaia/eval/webapp/node_modules/negotiator/lib/language.js +179 -0
- gaia/eval/webapp/node_modules/negotiator/lib/mediaType.js +294 -0
- gaia/eval/webapp/node_modules/negotiator/package.json +42 -0
- gaia/eval/webapp/node_modules/object-inspect/.eslintrc +53 -0
- gaia/eval/webapp/node_modules/object-inspect/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/object-inspect/.nycrc +13 -0
- gaia/eval/webapp/node_modules/object-inspect/CHANGELOG.md +424 -0
- gaia/eval/webapp/node_modules/object-inspect/LICENSE +21 -0
- gaia/eval/webapp/node_modules/object-inspect/example/all.js +23 -0
- gaia/eval/webapp/node_modules/object-inspect/example/circular.js +6 -0
- gaia/eval/webapp/node_modules/object-inspect/example/fn.js +5 -0
- gaia/eval/webapp/node_modules/object-inspect/example/inspect.js +10 -0
- gaia/eval/webapp/node_modules/object-inspect/index.js +544 -0
- gaia/eval/webapp/node_modules/object-inspect/package-support.json +20 -0
- gaia/eval/webapp/node_modules/object-inspect/package.json +105 -0
- gaia/eval/webapp/node_modules/object-inspect/readme.markdown +84 -0
- gaia/eval/webapp/node_modules/object-inspect/test/bigint.js +58 -0
- gaia/eval/webapp/node_modules/object-inspect/test/browser/dom.js +15 -0
- gaia/eval/webapp/node_modules/object-inspect/test/circular.js +16 -0
- gaia/eval/webapp/node_modules/object-inspect/test/deep.js +12 -0
- gaia/eval/webapp/node_modules/object-inspect/test/element.js +53 -0
- gaia/eval/webapp/node_modules/object-inspect/test/err.js +48 -0
- gaia/eval/webapp/node_modules/object-inspect/test/fakes.js +29 -0
- gaia/eval/webapp/node_modules/object-inspect/test/fn.js +76 -0
- gaia/eval/webapp/node_modules/object-inspect/test/global.js +17 -0
- gaia/eval/webapp/node_modules/object-inspect/test/has.js +15 -0
- gaia/eval/webapp/node_modules/object-inspect/test/holes.js +15 -0
- gaia/eval/webapp/node_modules/object-inspect/test/indent-option.js +271 -0
- gaia/eval/webapp/node_modules/object-inspect/test/inspect.js +139 -0
- gaia/eval/webapp/node_modules/object-inspect/test/lowbyte.js +12 -0
- gaia/eval/webapp/node_modules/object-inspect/test/number.js +58 -0
- gaia/eval/webapp/node_modules/object-inspect/test/quoteStyle.js +26 -0
- gaia/eval/webapp/node_modules/object-inspect/test/toStringTag.js +40 -0
- gaia/eval/webapp/node_modules/object-inspect/test/undef.js +12 -0
- gaia/eval/webapp/node_modules/object-inspect/test/values.js +261 -0
- gaia/eval/webapp/node_modules/object-inspect/test-core-js.js +26 -0
- gaia/eval/webapp/node_modules/object-inspect/util.inspect.js +1 -0
- gaia/eval/webapp/node_modules/on-finished/HISTORY.md +98 -0
- gaia/eval/webapp/node_modules/on-finished/LICENSE +23 -0
- gaia/eval/webapp/node_modules/on-finished/README.md +162 -0
- gaia/eval/webapp/node_modules/on-finished/index.js +234 -0
- gaia/eval/webapp/node_modules/on-finished/package.json +39 -0
- gaia/eval/webapp/node_modules/parseurl/HISTORY.md +58 -0
- gaia/eval/webapp/node_modules/parseurl/LICENSE +24 -0
- gaia/eval/webapp/node_modules/parseurl/README.md +133 -0
- gaia/eval/webapp/node_modules/parseurl/index.js +158 -0
- gaia/eval/webapp/node_modules/parseurl/package.json +40 -0
- gaia/eval/webapp/node_modules/path/.npmignore +1 -0
- gaia/eval/webapp/node_modules/path/LICENSE +18 -0
- gaia/eval/webapp/node_modules/path/README.md +15 -0
- gaia/eval/webapp/node_modules/path/package.json +24 -0
- gaia/eval/webapp/node_modules/path/path.js +628 -0
- gaia/eval/webapp/node_modules/path-to-regexp/LICENSE +21 -0
- gaia/eval/webapp/node_modules/path-to-regexp/Readme.md +35 -0
- gaia/eval/webapp/node_modules/path-to-regexp/index.js +156 -0
- gaia/eval/webapp/node_modules/path-to-regexp/package.json +30 -0
- gaia/eval/webapp/node_modules/process/.eslintrc +21 -0
- gaia/eval/webapp/node_modules/process/LICENSE +22 -0
- gaia/eval/webapp/node_modules/process/README.md +26 -0
- gaia/eval/webapp/node_modules/process/browser.js +184 -0
- gaia/eval/webapp/node_modules/process/index.js +2 -0
- gaia/eval/webapp/node_modules/process/package.json +27 -0
- gaia/eval/webapp/node_modules/process/test.js +199 -0
- gaia/eval/webapp/node_modules/proxy-addr/HISTORY.md +161 -0
- gaia/eval/webapp/node_modules/proxy-addr/LICENSE +22 -0
- gaia/eval/webapp/node_modules/proxy-addr/README.md +139 -0
- gaia/eval/webapp/node_modules/proxy-addr/index.js +327 -0
- gaia/eval/webapp/node_modules/proxy-addr/package.json +47 -0
- gaia/eval/webapp/node_modules/qs/.editorconfig +46 -0
- gaia/eval/webapp/node_modules/qs/.eslintrc +38 -0
- gaia/eval/webapp/node_modules/qs/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/qs/.nycrc +13 -0
- gaia/eval/webapp/node_modules/qs/CHANGELOG.md +600 -0
- gaia/eval/webapp/node_modules/qs/LICENSE.md +29 -0
- gaia/eval/webapp/node_modules/qs/README.md +709 -0
- gaia/eval/webapp/node_modules/qs/dist/qs.js +90 -0
- gaia/eval/webapp/node_modules/qs/lib/formats.js +23 -0
- gaia/eval/webapp/node_modules/qs/lib/index.js +11 -0
- gaia/eval/webapp/node_modules/qs/lib/parse.js +296 -0
- gaia/eval/webapp/node_modules/qs/lib/stringify.js +351 -0
- gaia/eval/webapp/node_modules/qs/lib/utils.js +265 -0
- gaia/eval/webapp/node_modules/qs/package.json +91 -0
- gaia/eval/webapp/node_modules/qs/test/empty-keys-cases.js +267 -0
- gaia/eval/webapp/node_modules/qs/test/parse.js +1170 -0
- gaia/eval/webapp/node_modules/qs/test/stringify.js +1298 -0
- gaia/eval/webapp/node_modules/qs/test/utils.js +136 -0
- gaia/eval/webapp/node_modules/range-parser/HISTORY.md +56 -0
- gaia/eval/webapp/node_modules/range-parser/LICENSE +23 -0
- gaia/eval/webapp/node_modules/range-parser/README.md +84 -0
- gaia/eval/webapp/node_modules/range-parser/index.js +162 -0
- gaia/eval/webapp/node_modules/range-parser/package.json +44 -0
- gaia/eval/webapp/node_modules/raw-body/HISTORY.md +308 -0
- gaia/eval/webapp/node_modules/raw-body/LICENSE +22 -0
- gaia/eval/webapp/node_modules/raw-body/README.md +223 -0
- gaia/eval/webapp/node_modules/raw-body/SECURITY.md +24 -0
- gaia/eval/webapp/node_modules/raw-body/index.d.ts +87 -0
- gaia/eval/webapp/node_modules/raw-body/index.js +336 -0
- gaia/eval/webapp/node_modules/raw-body/package.json +49 -0
- gaia/eval/webapp/node_modules/safe-buffer/LICENSE +21 -0
- gaia/eval/webapp/node_modules/safe-buffer/README.md +584 -0
- gaia/eval/webapp/node_modules/safe-buffer/index.d.ts +187 -0
- gaia/eval/webapp/node_modules/safe-buffer/index.js +65 -0
- gaia/eval/webapp/node_modules/safe-buffer/package.json +51 -0
- gaia/eval/webapp/node_modules/safer-buffer/LICENSE +21 -0
- gaia/eval/webapp/node_modules/safer-buffer/Porting-Buffer.md +268 -0
- gaia/eval/webapp/node_modules/safer-buffer/Readme.md +156 -0
- gaia/eval/webapp/node_modules/safer-buffer/dangerous.js +58 -0
- gaia/eval/webapp/node_modules/safer-buffer/package.json +34 -0
- gaia/eval/webapp/node_modules/safer-buffer/safer.js +77 -0
- gaia/eval/webapp/node_modules/safer-buffer/tests.js +406 -0
- gaia/eval/webapp/node_modules/send/HISTORY.md +526 -0
- gaia/eval/webapp/node_modules/send/LICENSE +23 -0
- gaia/eval/webapp/node_modules/send/README.md +327 -0
- gaia/eval/webapp/node_modules/send/SECURITY.md +24 -0
- gaia/eval/webapp/node_modules/send/index.js +1142 -0
- gaia/eval/webapp/node_modules/send/node_modules/encodeurl/HISTORY.md +14 -0
- gaia/eval/webapp/node_modules/send/node_modules/encodeurl/LICENSE +22 -0
- gaia/eval/webapp/node_modules/send/node_modules/encodeurl/README.md +128 -0
- gaia/eval/webapp/node_modules/send/node_modules/encodeurl/index.js +60 -0
- gaia/eval/webapp/node_modules/send/node_modules/encodeurl/package.json +40 -0
- gaia/eval/webapp/node_modules/send/node_modules/ms/index.js +162 -0
- gaia/eval/webapp/node_modules/send/node_modules/ms/license.md +21 -0
- gaia/eval/webapp/node_modules/send/node_modules/ms/package.json +38 -0
- gaia/eval/webapp/node_modules/send/node_modules/ms/readme.md +59 -0
- gaia/eval/webapp/node_modules/send/package.json +62 -0
- gaia/eval/webapp/node_modules/serve-static/HISTORY.md +487 -0
- gaia/eval/webapp/node_modules/serve-static/LICENSE +25 -0
- gaia/eval/webapp/node_modules/serve-static/README.md +257 -0
- gaia/eval/webapp/node_modules/serve-static/index.js +209 -0
- gaia/eval/webapp/node_modules/serve-static/package.json +42 -0
- gaia/eval/webapp/node_modules/setprototypeof/LICENSE +13 -0
- gaia/eval/webapp/node_modules/setprototypeof/README.md +31 -0
- gaia/eval/webapp/node_modules/setprototypeof/index.d.ts +2 -0
- gaia/eval/webapp/node_modules/setprototypeof/index.js +17 -0
- gaia/eval/webapp/node_modules/setprototypeof/package.json +38 -0
- gaia/eval/webapp/node_modules/setprototypeof/test/index.js +24 -0
- gaia/eval/webapp/node_modules/side-channel/.editorconfig +9 -0
- gaia/eval/webapp/node_modules/side-channel/.eslintrc +12 -0
- gaia/eval/webapp/node_modules/side-channel/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/side-channel/.nycrc +13 -0
- gaia/eval/webapp/node_modules/side-channel/CHANGELOG.md +110 -0
- gaia/eval/webapp/node_modules/side-channel/LICENSE +21 -0
- gaia/eval/webapp/node_modules/side-channel/README.md +61 -0
- gaia/eval/webapp/node_modules/side-channel/index.d.ts +14 -0
- gaia/eval/webapp/node_modules/side-channel/index.js +43 -0
- gaia/eval/webapp/node_modules/side-channel/package.json +85 -0
- gaia/eval/webapp/node_modules/side-channel/test/index.js +104 -0
- gaia/eval/webapp/node_modules/side-channel/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/side-channel-list/.editorconfig +9 -0
- gaia/eval/webapp/node_modules/side-channel-list/.eslintrc +11 -0
- gaia/eval/webapp/node_modules/side-channel-list/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/side-channel-list/.nycrc +13 -0
- gaia/eval/webapp/node_modules/side-channel-list/CHANGELOG.md +15 -0
- gaia/eval/webapp/node_modules/side-channel-list/LICENSE +21 -0
- gaia/eval/webapp/node_modules/side-channel-list/README.md +62 -0
- gaia/eval/webapp/node_modules/side-channel-list/index.d.ts +13 -0
- gaia/eval/webapp/node_modules/side-channel-list/index.js +113 -0
- gaia/eval/webapp/node_modules/side-channel-list/list.d.ts +14 -0
- gaia/eval/webapp/node_modules/side-channel-list/package.json +77 -0
- gaia/eval/webapp/node_modules/side-channel-list/test/index.js +104 -0
- gaia/eval/webapp/node_modules/side-channel-list/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/side-channel-map/.editorconfig +9 -0
- gaia/eval/webapp/node_modules/side-channel-map/.eslintrc +11 -0
- gaia/eval/webapp/node_modules/side-channel-map/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/side-channel-map/.nycrc +13 -0
- gaia/eval/webapp/node_modules/side-channel-map/CHANGELOG.md +22 -0
- gaia/eval/webapp/node_modules/side-channel-map/LICENSE +21 -0
- gaia/eval/webapp/node_modules/side-channel-map/README.md +62 -0
- gaia/eval/webapp/node_modules/side-channel-map/index.d.ts +15 -0
- gaia/eval/webapp/node_modules/side-channel-map/index.js +68 -0
- gaia/eval/webapp/node_modules/side-channel-map/package.json +80 -0
- gaia/eval/webapp/node_modules/side-channel-map/test/index.js +114 -0
- gaia/eval/webapp/node_modules/side-channel-map/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/.editorconfig +9 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/.eslintrc +12 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/.github/FUNDING.yml +12 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/.nycrc +13 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/CHANGELOG.md +28 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/LICENSE +21 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/README.md +62 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/index.d.ts +15 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/index.js +84 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/package.json +87 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/test/index.js +114 -0
- gaia/eval/webapp/node_modules/side-channel-weakmap/tsconfig.json +9 -0
- gaia/eval/webapp/node_modules/statuses/HISTORY.md +82 -0
- gaia/eval/webapp/node_modules/statuses/LICENSE +23 -0
- gaia/eval/webapp/node_modules/statuses/README.md +136 -0
- gaia/eval/webapp/node_modules/statuses/codes.json +65 -0
- gaia/eval/webapp/node_modules/statuses/index.js +146 -0
- gaia/eval/webapp/node_modules/statuses/package.json +49 -0
- gaia/eval/webapp/node_modules/toidentifier/HISTORY.md +9 -0
- gaia/eval/webapp/node_modules/toidentifier/LICENSE +21 -0
- gaia/eval/webapp/node_modules/toidentifier/README.md +61 -0
- gaia/eval/webapp/node_modules/toidentifier/index.js +32 -0
- gaia/eval/webapp/node_modules/toidentifier/package.json +38 -0
- gaia/eval/webapp/node_modules/type-is/HISTORY.md +259 -0
- gaia/eval/webapp/node_modules/type-is/LICENSE +23 -0
- gaia/eval/webapp/node_modules/type-is/README.md +170 -0
- gaia/eval/webapp/node_modules/type-is/index.js +266 -0
- gaia/eval/webapp/node_modules/type-is/package.json +45 -0
- gaia/eval/webapp/node_modules/unpipe/HISTORY.md +4 -0
- gaia/eval/webapp/node_modules/unpipe/LICENSE +22 -0
- gaia/eval/webapp/node_modules/unpipe/README.md +43 -0
- gaia/eval/webapp/node_modules/unpipe/index.js +69 -0
- gaia/eval/webapp/node_modules/unpipe/package.json +27 -0
- gaia/eval/webapp/node_modules/util/LICENSE +18 -0
- gaia/eval/webapp/node_modules/util/README.md +15 -0
- gaia/eval/webapp/node_modules/util/node_modules/inherits/LICENSE +16 -0
- gaia/eval/webapp/node_modules/util/node_modules/inherits/README.md +42 -0
- gaia/eval/webapp/node_modules/util/node_modules/inherits/inherits.js +7 -0
- gaia/eval/webapp/node_modules/util/node_modules/inherits/inherits_browser.js +23 -0
- gaia/eval/webapp/node_modules/util/node_modules/inherits/package.json +29 -0
- gaia/eval/webapp/node_modules/util/package.json +35 -0
- gaia/eval/webapp/node_modules/util/support/isBuffer.js +3 -0
- gaia/eval/webapp/node_modules/util/support/isBufferBrowser.js +6 -0
- gaia/eval/webapp/node_modules/util/util.js +586 -0
- gaia/eval/webapp/node_modules/utils-merge/.npmignore +9 -0
- gaia/eval/webapp/node_modules/utils-merge/LICENSE +20 -0
- gaia/eval/webapp/node_modules/utils-merge/README.md +34 -0
- gaia/eval/webapp/node_modules/utils-merge/index.js +23 -0
- gaia/eval/webapp/node_modules/utils-merge/package.json +40 -0
- gaia/eval/webapp/node_modules/vary/HISTORY.md +39 -0
- gaia/eval/webapp/node_modules/vary/LICENSE +22 -0
- gaia/eval/webapp/node_modules/vary/README.md +101 -0
- gaia/eval/webapp/node_modules/vary/index.js +149 -0
- gaia/eval/webapp/node_modules/vary/package.json +43 -0
- gaia/eval/webapp/package-lock.json +875 -0
- gaia/eval/webapp/package.json +21 -0
- gaia/eval/webapp/public/app.js +3403 -0
- gaia/eval/webapp/public/index.html +88 -0
- gaia/eval/webapp/public/styles.css +3661 -0
- gaia/eval/webapp/server.js +416 -0
- gaia/eval/webapp/test-setup.js +73 -0
- gaia/llm/__init__.py +2 -0
- gaia/llm/lemonade_client.py +3083 -0
- gaia/llm/lemonade_manager.py +269 -0
- gaia/llm/llm_client.py +729 -0
- gaia/llm/vlm_client.py +307 -0
- gaia/logger.py +189 -0
- gaia/mcp/agent_mcp_server.py +245 -0
- gaia/mcp/blender_mcp_client.py +138 -0
- gaia/mcp/blender_mcp_server.py +648 -0
- gaia/mcp/context7_cache.py +332 -0
- gaia/mcp/external_services.py +518 -0
- gaia/mcp/mcp_bridge.py +550 -0
- gaia/mcp/servers/__init__.py +6 -0
- gaia/mcp/servers/docker_mcp.py +83 -0
- gaia/rag/__init__.py +10 -0
- gaia/rag/app.py +293 -0
- gaia/rag/demo.py +304 -0
- gaia/rag/pdf_utils.py +235 -0
- gaia/rag/sdk.py +2194 -0
- gaia/security.py +163 -0
- gaia/talk/app.py +289 -0
- gaia/talk/sdk.py +538 -0
- gaia/util.py +46 -0
- 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}
|