amd-gaia 0.15.0__py3-none-any.whl → 0.15.2__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.15.0.dist-info → amd_gaia-0.15.2.dist-info}/METADATA +222 -223
- amd_gaia-0.15.2.dist-info/RECORD +182 -0
- {amd_gaia-0.15.0.dist-info → amd_gaia-0.15.2.dist-info}/WHEEL +1 -1
- {amd_gaia-0.15.0.dist-info → amd_gaia-0.15.2.dist-info}/entry_points.txt +1 -0
- {amd_gaia-0.15.0.dist-info → amd_gaia-0.15.2.dist-info}/licenses/LICENSE.md +20 -20
- gaia/__init__.py +29 -29
- gaia/agents/__init__.py +19 -19
- gaia/agents/base/__init__.py +9 -9
- gaia/agents/base/agent.py +2132 -2177
- gaia/agents/base/api_agent.py +119 -120
- gaia/agents/base/console.py +1967 -1841
- gaia/agents/base/errors.py +237 -237
- gaia/agents/base/mcp_agent.py +86 -86
- gaia/agents/base/tools.py +88 -83
- gaia/agents/blender/__init__.py +7 -0
- gaia/agents/blender/agent.py +553 -556
- gaia/agents/blender/agent_simple.py +133 -135
- gaia/agents/blender/app.py +211 -211
- gaia/agents/blender/app_simple.py +41 -41
- gaia/agents/blender/core/__init__.py +16 -16
- gaia/agents/blender/core/materials.py +506 -506
- gaia/agents/blender/core/objects.py +316 -316
- gaia/agents/blender/core/rendering.py +225 -225
- gaia/agents/blender/core/scene.py +220 -220
- gaia/agents/blender/core/view.py +146 -146
- gaia/agents/chat/__init__.py +9 -9
- gaia/agents/chat/agent.py +809 -835
- gaia/agents/chat/app.py +1065 -1058
- gaia/agents/chat/session.py +508 -508
- gaia/agents/chat/tools/__init__.py +15 -15
- gaia/agents/chat/tools/file_tools.py +96 -96
- gaia/agents/chat/tools/rag_tools.py +1744 -1729
- gaia/agents/chat/tools/shell_tools.py +437 -436
- gaia/agents/code/__init__.py +7 -7
- gaia/agents/code/agent.py +549 -549
- gaia/agents/code/cli.py +377 -0
- gaia/agents/code/models.py +135 -135
- gaia/agents/code/orchestration/__init__.py +24 -24
- gaia/agents/code/orchestration/checklist_executor.py +1763 -1763
- gaia/agents/code/orchestration/checklist_generator.py +713 -713
- gaia/agents/code/orchestration/factories/__init__.py +9 -9
- gaia/agents/code/orchestration/factories/base.py +63 -63
- gaia/agents/code/orchestration/factories/nextjs_factory.py +118 -118
- gaia/agents/code/orchestration/factories/python_factory.py +106 -106
- gaia/agents/code/orchestration/orchestrator.py +841 -841
- gaia/agents/code/orchestration/project_analyzer.py +391 -391
- gaia/agents/code/orchestration/steps/__init__.py +67 -67
- gaia/agents/code/orchestration/steps/base.py +188 -188
- gaia/agents/code/orchestration/steps/error_handler.py +314 -314
- gaia/agents/code/orchestration/steps/nextjs.py +828 -828
- gaia/agents/code/orchestration/steps/python.py +307 -307
- gaia/agents/code/orchestration/template_catalog.py +469 -469
- gaia/agents/code/orchestration/workflows/__init__.py +14 -14
- gaia/agents/code/orchestration/workflows/base.py +80 -80
- gaia/agents/code/orchestration/workflows/nextjs.py +186 -186
- gaia/agents/code/orchestration/workflows/python.py +94 -94
- gaia/agents/code/prompts/__init__.py +11 -11
- gaia/agents/code/prompts/base_prompt.py +77 -77
- gaia/agents/code/prompts/code_patterns.py +2034 -2036
- gaia/agents/code/prompts/nextjs_prompt.py +40 -40
- gaia/agents/code/prompts/python_prompt.py +109 -109
- gaia/agents/code/schema_inference.py +365 -365
- gaia/agents/code/system_prompt.py +41 -41
- gaia/agents/code/tools/__init__.py +42 -42
- gaia/agents/code/tools/cli_tools.py +1138 -1138
- gaia/agents/code/tools/code_formatting.py +319 -319
- gaia/agents/code/tools/code_tools.py +769 -769
- gaia/agents/code/tools/error_fixing.py +1347 -1347
- gaia/agents/code/tools/external_tools.py +180 -180
- gaia/agents/code/tools/file_io.py +845 -845
- gaia/agents/code/tools/prisma_tools.py +190 -190
- gaia/agents/code/tools/project_management.py +1016 -1016
- gaia/agents/code/tools/testing.py +321 -321
- gaia/agents/code/tools/typescript_tools.py +122 -122
- gaia/agents/code/tools/validation_parsing.py +461 -461
- gaia/agents/code/tools/validation_tools.py +806 -806
- gaia/agents/code/tools/web_dev_tools.py +1758 -1758
- gaia/agents/code/validators/__init__.py +16 -16
- gaia/agents/code/validators/antipattern_checker.py +241 -241
- gaia/agents/code/validators/ast_analyzer.py +197 -197
- gaia/agents/code/validators/requirements_validator.py +145 -145
- gaia/agents/code/validators/syntax_validator.py +171 -171
- gaia/agents/docker/__init__.py +7 -7
- gaia/agents/docker/agent.py +643 -642
- gaia/agents/emr/__init__.py +8 -8
- gaia/agents/emr/agent.py +1504 -1506
- gaia/agents/emr/cli.py +1322 -1322
- gaia/agents/emr/constants.py +475 -475
- gaia/agents/emr/dashboard/__init__.py +4 -4
- gaia/agents/emr/dashboard/server.py +1972 -1974
- gaia/agents/jira/__init__.py +11 -11
- gaia/agents/jira/agent.py +894 -894
- gaia/agents/jira/jql_templates.py +299 -299
- gaia/agents/routing/__init__.py +7 -7
- gaia/agents/routing/agent.py +567 -570
- gaia/agents/routing/system_prompt.py +75 -75
- gaia/agents/summarize/__init__.py +11 -0
- gaia/agents/summarize/agent.py +885 -0
- gaia/agents/summarize/prompts.py +129 -0
- gaia/api/__init__.py +23 -23
- gaia/api/agent_registry.py +238 -238
- gaia/api/app.py +305 -305
- gaia/api/openai_server.py +575 -575
- gaia/api/schemas.py +186 -186
- gaia/api/sse_handler.py +373 -373
- gaia/apps/__init__.py +4 -4
- gaia/apps/llm/__init__.py +6 -6
- gaia/apps/llm/app.py +184 -169
- gaia/apps/summarize/app.py +116 -633
- gaia/apps/summarize/html_viewer.py +133 -133
- gaia/apps/summarize/pdf_formatter.py +284 -284
- gaia/audio/__init__.py +2 -2
- gaia/audio/audio_client.py +439 -439
- gaia/audio/audio_recorder.py +269 -269
- gaia/audio/kokoro_tts.py +599 -599
- gaia/audio/whisper_asr.py +432 -432
- gaia/chat/__init__.py +16 -16
- gaia/chat/app.py +428 -430
- gaia/chat/prompts.py +522 -522
- gaia/chat/sdk.py +1228 -1225
- gaia/cli.py +5659 -5632
- gaia/database/__init__.py +10 -10
- gaia/database/agent.py +176 -176
- gaia/database/mixin.py +290 -290
- gaia/database/testing.py +64 -64
- gaia/eval/batch_experiment.py +2332 -2332
- gaia/eval/claude.py +542 -542
- gaia/eval/config.py +37 -37
- gaia/eval/email_generator.py +512 -512
- gaia/eval/eval.py +3179 -3179
- gaia/eval/groundtruth.py +1130 -1130
- gaia/eval/transcript_generator.py +582 -582
- gaia/eval/webapp/README.md +167 -167
- gaia/eval/webapp/package-lock.json +875 -875
- gaia/eval/webapp/package.json +20 -20
- gaia/eval/webapp/public/app.js +3402 -3402
- gaia/eval/webapp/public/index.html +87 -87
- gaia/eval/webapp/public/styles.css +3661 -3661
- gaia/eval/webapp/server.js +415 -415
- gaia/eval/webapp/test-setup.js +72 -72
- gaia/installer/__init__.py +23 -0
- gaia/installer/init_command.py +1275 -0
- gaia/installer/lemonade_installer.py +619 -0
- gaia/llm/__init__.py +10 -2
- gaia/llm/base_client.py +60 -0
- gaia/llm/exceptions.py +12 -0
- gaia/llm/factory.py +70 -0
- gaia/llm/lemonade_client.py +3421 -3221
- gaia/llm/lemonade_manager.py +294 -294
- gaia/llm/providers/__init__.py +9 -0
- gaia/llm/providers/claude.py +108 -0
- gaia/llm/providers/lemonade.py +118 -0
- gaia/llm/providers/openai_provider.py +79 -0
- gaia/llm/vlm_client.py +382 -382
- gaia/logger.py +189 -189
- gaia/mcp/agent_mcp_server.py +245 -245
- gaia/mcp/blender_mcp_client.py +138 -138
- gaia/mcp/blender_mcp_server.py +648 -648
- gaia/mcp/context7_cache.py +332 -332
- gaia/mcp/external_services.py +518 -518
- gaia/mcp/mcp_bridge.py +811 -550
- gaia/mcp/servers/__init__.py +6 -6
- gaia/mcp/servers/docker_mcp.py +83 -83
- gaia/perf_analysis.py +361 -0
- gaia/rag/__init__.py +10 -10
- gaia/rag/app.py +293 -293
- gaia/rag/demo.py +304 -304
- gaia/rag/pdf_utils.py +235 -235
- gaia/rag/sdk.py +2194 -2194
- gaia/security.py +183 -163
- gaia/talk/app.py +287 -289
- gaia/talk/sdk.py +538 -538
- gaia/testing/__init__.py +87 -87
- gaia/testing/assertions.py +330 -330
- gaia/testing/fixtures.py +333 -333
- gaia/testing/mocks.py +493 -493
- gaia/util.py +46 -46
- gaia/utils/__init__.py +33 -33
- gaia/utils/file_watcher.py +675 -675
- gaia/utils/parsing.py +223 -223
- gaia/version.py +100 -100
- amd_gaia-0.15.0.dist-info/RECORD +0 -168
- gaia/agents/code/app.py +0 -266
- gaia/llm/llm_client.py +0 -723
- {amd_gaia-0.15.0.dist-info → amd_gaia-0.15.2.dist-info}/top_level.txt +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
"""Factory implementations for workflow creation."""
|
|
4
|
-
|
|
5
|
-
from .base import ProjectFactory
|
|
6
|
-
from .nextjs_factory import NextJSFactory
|
|
7
|
-
from .python_factory import PythonFactory
|
|
8
|
-
|
|
9
|
-
__all__ = ["ProjectFactory", "NextJSFactory", "PythonFactory"]
|
|
1
|
+
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
"""Factory implementations for workflow creation."""
|
|
4
|
+
|
|
5
|
+
from .base import ProjectFactory
|
|
6
|
+
from .nextjs_factory import NextJSFactory
|
|
7
|
+
from .python_factory import PythonFactory
|
|
8
|
+
|
|
9
|
+
__all__ = ["ProjectFactory", "NextJSFactory", "PythonFactory"]
|
|
@@ -1,63 +1,63 @@
|
|
|
1
|
-
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
"""
|
|
4
|
-
Base factory for creating project workflows.
|
|
5
|
-
|
|
6
|
-
Factories define project-specific step sequences and configurations.
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
from abc import ABC, abstractmethod
|
|
10
|
-
from typing import List, Optional
|
|
11
|
-
|
|
12
|
-
from ..steps.base import UserContext
|
|
13
|
-
from ..workflows.base import WorkflowPhase
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class ProjectFactory(ABC):
|
|
17
|
-
"""Abstract factory for creating project-specific workflows.
|
|
18
|
-
|
|
19
|
-
Subclasses implement create_workflow() to return phases appropriate
|
|
20
|
-
for their project type (Next.js, Python, etc.).
|
|
21
|
-
"""
|
|
22
|
-
|
|
23
|
-
@property
|
|
24
|
-
@abstractmethod
|
|
25
|
-
def project_type(self) -> str:
|
|
26
|
-
"""Return the project type this factory handles."""
|
|
27
|
-
|
|
28
|
-
@abstractmethod
|
|
29
|
-
def create_workflow(self, context: UserContext) -> List[WorkflowPhase]:
|
|
30
|
-
"""Create workflow phases for the given context.
|
|
31
|
-
|
|
32
|
-
Args:
|
|
33
|
-
context: User context with request details and accumulated state
|
|
34
|
-
|
|
35
|
-
Returns:
|
|
36
|
-
List of WorkflowPhases to execute in order
|
|
37
|
-
"""
|
|
38
|
-
|
|
39
|
-
@abstractmethod
|
|
40
|
-
def detect_project(self, project_dir: str) -> bool:
|
|
41
|
-
"""Check if this factory should handle the given project.
|
|
42
|
-
|
|
43
|
-
Args:
|
|
44
|
-
project_dir: Path to project directory
|
|
45
|
-
|
|
46
|
-
Returns:
|
|
47
|
-
True if this factory can handle the project
|
|
48
|
-
"""
|
|
49
|
-
|
|
50
|
-
def get_validation_config(self, phase_name: str) -> Optional[dict]: # noqa: ARG002
|
|
51
|
-
"""Get validation configuration for a specific phase.
|
|
52
|
-
|
|
53
|
-
Override to customize validation per phase.
|
|
54
|
-
|
|
55
|
-
Args:
|
|
56
|
-
phase_name: Name of the phase
|
|
57
|
-
|
|
58
|
-
Returns:
|
|
59
|
-
Dict with validation settings or None for defaults
|
|
60
|
-
"""
|
|
61
|
-
# Default: no custom config. Subclasses override per phase.
|
|
62
|
-
del phase_name # Unused in base class
|
|
63
|
-
return None
|
|
1
|
+
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
"""
|
|
4
|
+
Base factory for creating project workflows.
|
|
5
|
+
|
|
6
|
+
Factories define project-specific step sequences and configurations.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from abc import ABC, abstractmethod
|
|
10
|
+
from typing import List, Optional
|
|
11
|
+
|
|
12
|
+
from ..steps.base import UserContext
|
|
13
|
+
from ..workflows.base import WorkflowPhase
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ProjectFactory(ABC):
|
|
17
|
+
"""Abstract factory for creating project-specific workflows.
|
|
18
|
+
|
|
19
|
+
Subclasses implement create_workflow() to return phases appropriate
|
|
20
|
+
for their project type (Next.js, Python, etc.).
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
@property
|
|
24
|
+
@abstractmethod
|
|
25
|
+
def project_type(self) -> str:
|
|
26
|
+
"""Return the project type this factory handles."""
|
|
27
|
+
|
|
28
|
+
@abstractmethod
|
|
29
|
+
def create_workflow(self, context: UserContext) -> List[WorkflowPhase]:
|
|
30
|
+
"""Create workflow phases for the given context.
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
context: User context with request details and accumulated state
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
List of WorkflowPhases to execute in order
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
@abstractmethod
|
|
40
|
+
def detect_project(self, project_dir: str) -> bool:
|
|
41
|
+
"""Check if this factory should handle the given project.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
project_dir: Path to project directory
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
True if this factory can handle the project
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
def get_validation_config(self, phase_name: str) -> Optional[dict]: # noqa: ARG002
|
|
51
|
+
"""Get validation configuration for a specific phase.
|
|
52
|
+
|
|
53
|
+
Override to customize validation per phase.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
phase_name: Name of the phase
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
Dict with validation settings or None for defaults
|
|
60
|
+
"""
|
|
61
|
+
# Default: no custom config. Subclasses override per phase.
|
|
62
|
+
del phase_name # Unused in base class
|
|
63
|
+
return None
|
|
@@ -1,118 +1,118 @@
|
|
|
1
|
-
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
"""
|
|
4
|
-
Next.js project factory.
|
|
5
|
-
|
|
6
|
-
Creates workflow phases for Next.js CRUD applications.
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
from pathlib import Path
|
|
10
|
-
from typing import List
|
|
11
|
-
|
|
12
|
-
from ..steps.base import UserContext
|
|
13
|
-
from ..workflows.base import WorkflowPhase
|
|
14
|
-
from ..workflows.nextjs import create_nextjs_workflow
|
|
15
|
-
from .base import ProjectFactory
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class NextJSFactory(ProjectFactory):
|
|
19
|
-
"""Factory for creating Next.js CRUD workflows."""
|
|
20
|
-
|
|
21
|
-
@property
|
|
22
|
-
def project_type(self) -> str:
|
|
23
|
-
"""Return the project type."""
|
|
24
|
-
return "nextjs"
|
|
25
|
-
|
|
26
|
-
def detect_project(self, project_dir: str) -> bool:
|
|
27
|
-
"""Check if this is a Next.js project or should be one.
|
|
28
|
-
|
|
29
|
-
Detection logic:
|
|
30
|
-
1. Existing Next.js project: has next.config.* file
|
|
31
|
-
2. Empty directory: can be initialized as Next.js
|
|
32
|
-
3. Has package.json with next dependency
|
|
33
|
-
|
|
34
|
-
Args:
|
|
35
|
-
project_dir: Path to project directory
|
|
36
|
-
|
|
37
|
-
Returns:
|
|
38
|
-
True if this factory should handle the project
|
|
39
|
-
"""
|
|
40
|
-
project_path = Path(project_dir)
|
|
41
|
-
|
|
42
|
-
# Check for next.config.js or next.config.mjs
|
|
43
|
-
if (project_path / "next.config.js").exists():
|
|
44
|
-
return True
|
|
45
|
-
if (project_path / "next.config.mjs").exists():
|
|
46
|
-
return True
|
|
47
|
-
if (project_path / "next.config.ts").exists():
|
|
48
|
-
return True
|
|
49
|
-
|
|
50
|
-
# Check package.json for next dependency
|
|
51
|
-
package_json = project_path / "package.json"
|
|
52
|
-
if package_json.exists():
|
|
53
|
-
try:
|
|
54
|
-
import json
|
|
55
|
-
|
|
56
|
-
data = json.loads(package_json.read_text())
|
|
57
|
-
deps = data.get("dependencies", {})
|
|
58
|
-
dev_deps = data.get("devDependencies", {})
|
|
59
|
-
if "next" in deps or "next" in dev_deps:
|
|
60
|
-
return True
|
|
61
|
-
except (json.JSONDecodeError, IOError):
|
|
62
|
-
# Ignore errors reading/parsing package.json; treat as not a Next.js project
|
|
63
|
-
pass
|
|
64
|
-
|
|
65
|
-
# Empty directory can be initialized as Next.js
|
|
66
|
-
if project_path.exists() and not any(project_path.iterdir()):
|
|
67
|
-
return True
|
|
68
|
-
|
|
69
|
-
return False
|
|
70
|
-
|
|
71
|
-
def create_workflow(self, context: UserContext) -> List[WorkflowPhase]:
|
|
72
|
-
"""Create Next.js workflow phases.
|
|
73
|
-
|
|
74
|
-
Args:
|
|
75
|
-
context: User context with request details
|
|
76
|
-
|
|
77
|
-
Returns:
|
|
78
|
-
List of workflow phases
|
|
79
|
-
"""
|
|
80
|
-
return create_nextjs_workflow(context)
|
|
81
|
-
|
|
82
|
-
def get_validation_config(self, phase_name: str) -> dict:
|
|
83
|
-
"""Get validation configuration for a phase.
|
|
84
|
-
|
|
85
|
-
Args:
|
|
86
|
-
phase_name: Name of the phase
|
|
87
|
-
|
|
88
|
-
Returns:
|
|
89
|
-
Validation configuration dict
|
|
90
|
-
"""
|
|
91
|
-
configs = {
|
|
92
|
-
"initialization": {
|
|
93
|
-
"run_lint": False,
|
|
94
|
-
"run_typecheck": False,
|
|
95
|
-
"run_tests": False,
|
|
96
|
-
},
|
|
97
|
-
"data_layer": {
|
|
98
|
-
"run_lint": False,
|
|
99
|
-
"run_typecheck": True,
|
|
100
|
-
"run_tests": False,
|
|
101
|
-
},
|
|
102
|
-
"ui_components": {
|
|
103
|
-
"run_lint": False,
|
|
104
|
-
"run_typecheck": True,
|
|
105
|
-
"run_tests": False,
|
|
106
|
-
},
|
|
107
|
-
"validation": {
|
|
108
|
-
"run_lint": True,
|
|
109
|
-
"run_typecheck": True,
|
|
110
|
-
"run_tests": True,
|
|
111
|
-
},
|
|
112
|
-
"testing": {
|
|
113
|
-
"run_lint": False,
|
|
114
|
-
"run_typecheck": False,
|
|
115
|
-
"run_tests": True,
|
|
116
|
-
},
|
|
117
|
-
}
|
|
118
|
-
return configs.get(phase_name, {})
|
|
1
|
+
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
"""
|
|
4
|
+
Next.js project factory.
|
|
5
|
+
|
|
6
|
+
Creates workflow phases for Next.js CRUD applications.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import List
|
|
11
|
+
|
|
12
|
+
from ..steps.base import UserContext
|
|
13
|
+
from ..workflows.base import WorkflowPhase
|
|
14
|
+
from ..workflows.nextjs import create_nextjs_workflow
|
|
15
|
+
from .base import ProjectFactory
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class NextJSFactory(ProjectFactory):
|
|
19
|
+
"""Factory for creating Next.js CRUD workflows."""
|
|
20
|
+
|
|
21
|
+
@property
|
|
22
|
+
def project_type(self) -> str:
|
|
23
|
+
"""Return the project type."""
|
|
24
|
+
return "nextjs"
|
|
25
|
+
|
|
26
|
+
def detect_project(self, project_dir: str) -> bool:
|
|
27
|
+
"""Check if this is a Next.js project or should be one.
|
|
28
|
+
|
|
29
|
+
Detection logic:
|
|
30
|
+
1. Existing Next.js project: has next.config.* file
|
|
31
|
+
2. Empty directory: can be initialized as Next.js
|
|
32
|
+
3. Has package.json with next dependency
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
project_dir: Path to project directory
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
True if this factory should handle the project
|
|
39
|
+
"""
|
|
40
|
+
project_path = Path(project_dir)
|
|
41
|
+
|
|
42
|
+
# Check for next.config.js or next.config.mjs
|
|
43
|
+
if (project_path / "next.config.js").exists():
|
|
44
|
+
return True
|
|
45
|
+
if (project_path / "next.config.mjs").exists():
|
|
46
|
+
return True
|
|
47
|
+
if (project_path / "next.config.ts").exists():
|
|
48
|
+
return True
|
|
49
|
+
|
|
50
|
+
# Check package.json for next dependency
|
|
51
|
+
package_json = project_path / "package.json"
|
|
52
|
+
if package_json.exists():
|
|
53
|
+
try:
|
|
54
|
+
import json
|
|
55
|
+
|
|
56
|
+
data = json.loads(package_json.read_text())
|
|
57
|
+
deps = data.get("dependencies", {})
|
|
58
|
+
dev_deps = data.get("devDependencies", {})
|
|
59
|
+
if "next" in deps or "next" in dev_deps:
|
|
60
|
+
return True
|
|
61
|
+
except (json.JSONDecodeError, IOError):
|
|
62
|
+
# Ignore errors reading/parsing package.json; treat as not a Next.js project
|
|
63
|
+
pass
|
|
64
|
+
|
|
65
|
+
# Empty directory can be initialized as Next.js
|
|
66
|
+
if project_path.exists() and not any(project_path.iterdir()):
|
|
67
|
+
return True
|
|
68
|
+
|
|
69
|
+
return False
|
|
70
|
+
|
|
71
|
+
def create_workflow(self, context: UserContext) -> List[WorkflowPhase]:
|
|
72
|
+
"""Create Next.js workflow phases.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
context: User context with request details
|
|
76
|
+
|
|
77
|
+
Returns:
|
|
78
|
+
List of workflow phases
|
|
79
|
+
"""
|
|
80
|
+
return create_nextjs_workflow(context)
|
|
81
|
+
|
|
82
|
+
def get_validation_config(self, phase_name: str) -> dict:
|
|
83
|
+
"""Get validation configuration for a phase.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
phase_name: Name of the phase
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
Validation configuration dict
|
|
90
|
+
"""
|
|
91
|
+
configs = {
|
|
92
|
+
"initialization": {
|
|
93
|
+
"run_lint": False,
|
|
94
|
+
"run_typecheck": False,
|
|
95
|
+
"run_tests": False,
|
|
96
|
+
},
|
|
97
|
+
"data_layer": {
|
|
98
|
+
"run_lint": False,
|
|
99
|
+
"run_typecheck": True,
|
|
100
|
+
"run_tests": False,
|
|
101
|
+
},
|
|
102
|
+
"ui_components": {
|
|
103
|
+
"run_lint": False,
|
|
104
|
+
"run_typecheck": True,
|
|
105
|
+
"run_tests": False,
|
|
106
|
+
},
|
|
107
|
+
"validation": {
|
|
108
|
+
"run_lint": True,
|
|
109
|
+
"run_typecheck": True,
|
|
110
|
+
"run_tests": True,
|
|
111
|
+
},
|
|
112
|
+
"testing": {
|
|
113
|
+
"run_lint": False,
|
|
114
|
+
"run_typecheck": False,
|
|
115
|
+
"run_tests": True,
|
|
116
|
+
},
|
|
117
|
+
}
|
|
118
|
+
return configs.get(phase_name, {})
|
|
@@ -1,106 +1,106 @@
|
|
|
1
|
-
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
"""
|
|
4
|
-
Python project factory.
|
|
5
|
-
|
|
6
|
-
Creates workflow phases for Python applications.
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
from pathlib import Path
|
|
10
|
-
from typing import List
|
|
11
|
-
|
|
12
|
-
from ..steps.base import UserContext
|
|
13
|
-
from ..workflows.base import WorkflowPhase
|
|
14
|
-
from ..workflows.python import create_python_workflow
|
|
15
|
-
from .base import ProjectFactory
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class PythonFactory(ProjectFactory):
|
|
19
|
-
"""Factory for creating Python development workflows."""
|
|
20
|
-
|
|
21
|
-
@property
|
|
22
|
-
def project_type(self) -> str:
|
|
23
|
-
"""Return the project type."""
|
|
24
|
-
return "python"
|
|
25
|
-
|
|
26
|
-
def detect_project(self, project_dir: str) -> bool:
|
|
27
|
-
"""Check if this is a Python project or should be one.
|
|
28
|
-
|
|
29
|
-
Detection logic:
|
|
30
|
-
1. Existing Python project: has setup.py, pyproject.toml, or requirements.txt
|
|
31
|
-
2. Has .py files
|
|
32
|
-
3. Empty directory: default to Python
|
|
33
|
-
|
|
34
|
-
Args:
|
|
35
|
-
project_dir: Path to project directory
|
|
36
|
-
|
|
37
|
-
Returns:
|
|
38
|
-
True if this factory should handle the project
|
|
39
|
-
"""
|
|
40
|
-
project_path = Path(project_dir)
|
|
41
|
-
|
|
42
|
-
# Check for Python project markers
|
|
43
|
-
if (project_path / "setup.py").exists():
|
|
44
|
-
return True
|
|
45
|
-
if (project_path / "pyproject.toml").exists():
|
|
46
|
-
return True
|
|
47
|
-
if (project_path / "requirements.txt").exists():
|
|
48
|
-
return True
|
|
49
|
-
|
|
50
|
-
# Check for .py files
|
|
51
|
-
if list(project_path.glob("*.py")):
|
|
52
|
-
return True
|
|
53
|
-
if list(project_path.glob("**/*.py")):
|
|
54
|
-
return True
|
|
55
|
-
|
|
56
|
-
# Empty directory defaults to Python (script mode)
|
|
57
|
-
if project_path.exists() and not any(project_path.iterdir()):
|
|
58
|
-
return True
|
|
59
|
-
|
|
60
|
-
return False
|
|
61
|
-
|
|
62
|
-
def create_workflow(self, context: UserContext) -> List[WorkflowPhase]:
|
|
63
|
-
"""Create Python workflow phases.
|
|
64
|
-
|
|
65
|
-
Args:
|
|
66
|
-
context: User context with request details
|
|
67
|
-
|
|
68
|
-
Returns:
|
|
69
|
-
List of workflow phases
|
|
70
|
-
"""
|
|
71
|
-
return create_python_workflow(context)
|
|
72
|
-
|
|
73
|
-
def get_validation_config(self, phase_name: str) -> dict:
|
|
74
|
-
"""Get validation configuration for a phase.
|
|
75
|
-
|
|
76
|
-
Args:
|
|
77
|
-
phase_name: Name of the phase
|
|
78
|
-
|
|
79
|
-
Returns:
|
|
80
|
-
Validation configuration dict
|
|
81
|
-
"""
|
|
82
|
-
configs = {
|
|
83
|
-
"creation": {
|
|
84
|
-
"run_lint": False,
|
|
85
|
-
"run_typecheck": False,
|
|
86
|
-
"run_tests": False,
|
|
87
|
-
},
|
|
88
|
-
"validation": {
|
|
89
|
-
"run_lint": False,
|
|
90
|
-
"run_typecheck": False,
|
|
91
|
-
"run_tests": False,
|
|
92
|
-
},
|
|
93
|
-
"quality": {
|
|
94
|
-
"run_lint": True,
|
|
95
|
-
"run_typecheck": False,
|
|
96
|
-
"run_tests": False,
|
|
97
|
-
"lint_command": "pylint",
|
|
98
|
-
},
|
|
99
|
-
"testing": {
|
|
100
|
-
"run_lint": False,
|
|
101
|
-
"run_typecheck": False,
|
|
102
|
-
"run_tests": True,
|
|
103
|
-
"test_command": "pytest",
|
|
104
|
-
},
|
|
105
|
-
}
|
|
106
|
-
return configs.get(phase_name, {})
|
|
1
|
+
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
"""
|
|
4
|
+
Python project factory.
|
|
5
|
+
|
|
6
|
+
Creates workflow phases for Python applications.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import List
|
|
11
|
+
|
|
12
|
+
from ..steps.base import UserContext
|
|
13
|
+
from ..workflows.base import WorkflowPhase
|
|
14
|
+
from ..workflows.python import create_python_workflow
|
|
15
|
+
from .base import ProjectFactory
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class PythonFactory(ProjectFactory):
|
|
19
|
+
"""Factory for creating Python development workflows."""
|
|
20
|
+
|
|
21
|
+
@property
|
|
22
|
+
def project_type(self) -> str:
|
|
23
|
+
"""Return the project type."""
|
|
24
|
+
return "python"
|
|
25
|
+
|
|
26
|
+
def detect_project(self, project_dir: str) -> bool:
|
|
27
|
+
"""Check if this is a Python project or should be one.
|
|
28
|
+
|
|
29
|
+
Detection logic:
|
|
30
|
+
1. Existing Python project: has setup.py, pyproject.toml, or requirements.txt
|
|
31
|
+
2. Has .py files
|
|
32
|
+
3. Empty directory: default to Python
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
project_dir: Path to project directory
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
True if this factory should handle the project
|
|
39
|
+
"""
|
|
40
|
+
project_path = Path(project_dir)
|
|
41
|
+
|
|
42
|
+
# Check for Python project markers
|
|
43
|
+
if (project_path / "setup.py").exists():
|
|
44
|
+
return True
|
|
45
|
+
if (project_path / "pyproject.toml").exists():
|
|
46
|
+
return True
|
|
47
|
+
if (project_path / "requirements.txt").exists():
|
|
48
|
+
return True
|
|
49
|
+
|
|
50
|
+
# Check for .py files
|
|
51
|
+
if list(project_path.glob("*.py")):
|
|
52
|
+
return True
|
|
53
|
+
if list(project_path.glob("**/*.py")):
|
|
54
|
+
return True
|
|
55
|
+
|
|
56
|
+
# Empty directory defaults to Python (script mode)
|
|
57
|
+
if project_path.exists() and not any(project_path.iterdir()):
|
|
58
|
+
return True
|
|
59
|
+
|
|
60
|
+
return False
|
|
61
|
+
|
|
62
|
+
def create_workflow(self, context: UserContext) -> List[WorkflowPhase]:
|
|
63
|
+
"""Create Python workflow phases.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
context: User context with request details
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
List of workflow phases
|
|
70
|
+
"""
|
|
71
|
+
return create_python_workflow(context)
|
|
72
|
+
|
|
73
|
+
def get_validation_config(self, phase_name: str) -> dict:
|
|
74
|
+
"""Get validation configuration for a phase.
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
phase_name: Name of the phase
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
Validation configuration dict
|
|
81
|
+
"""
|
|
82
|
+
configs = {
|
|
83
|
+
"creation": {
|
|
84
|
+
"run_lint": False,
|
|
85
|
+
"run_typecheck": False,
|
|
86
|
+
"run_tests": False,
|
|
87
|
+
},
|
|
88
|
+
"validation": {
|
|
89
|
+
"run_lint": False,
|
|
90
|
+
"run_typecheck": False,
|
|
91
|
+
"run_tests": False,
|
|
92
|
+
},
|
|
93
|
+
"quality": {
|
|
94
|
+
"run_lint": True,
|
|
95
|
+
"run_typecheck": False,
|
|
96
|
+
"run_tests": False,
|
|
97
|
+
"lint_command": "pylint",
|
|
98
|
+
},
|
|
99
|
+
"testing": {
|
|
100
|
+
"run_lint": False,
|
|
101
|
+
"run_typecheck": False,
|
|
102
|
+
"run_tests": True,
|
|
103
|
+
"test_command": "pytest",
|
|
104
|
+
},
|
|
105
|
+
}
|
|
106
|
+
return configs.get(phase_name, {})
|