diagram-to-iac 1.9.0__py3-none-any.whl → 1.12.0__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.
@@ -101,12 +101,12 @@ class PersistentFileMemory(MemoryInterface):
101
101
 
102
102
  def __init__(self, file_path: Optional[str] = None):
103
103
  if file_path is None:
104
- # Get workspace base from config with fallback
105
- workspace_base = get_config_value("system.workspace_base", "/workspace")
104
+ # Get workspace base from environment variable first, then config with fallback
105
+ workspace_base = os.environ.get("WORKSPACE_BASE") or get_config_value("system.workspace_base", "/workspace")
106
106
 
107
107
  # Default to workspace or /tmp directory for container safety
108
108
  try:
109
- # Try workspace first (from config)
109
+ # Try workspace first (from environment or config)
110
110
  base_dir = Path(workspace_base) if Path(workspace_base).exists() else Path.cwd()
111
111
  data_dir = base_dir / "data" / "db"
112
112
  data_dir.mkdir(parents=True, exist_ok=True)
@@ -1,5 +1,4 @@
1
1
  import json
2
- import os
3
2
  from pathlib import Path
4
3
  from typing import Dict, Optional
5
4
 
@@ -8,18 +7,8 @@ class IssueTracker:
8
7
 
9
8
  def __init__(self, file_path: Optional[str] = None):
10
9
  if file_path is None:
11
- # Check environment variable first
12
- if os.environ.get('ISSUE_TRACKER_FILE'):
13
- file_path = os.environ['ISSUE_TRACKER_FILE']
14
- else:
15
- # Check for workspace-based path first (for containers)
16
- workspace_base = os.environ.get('WORKSPACE_BASE', '/workspace')
17
- if os.path.exists(workspace_base):
18
- base_dir = Path(workspace_base)
19
- else:
20
- # Fallback to package-relative path
21
- base_dir = Path(__file__).resolve().parents[3]
22
- file_path = base_dir / "data" / "db" / "issue_tracker.json"
10
+ base_dir = Path(__file__).resolve().parents[3]
11
+ file_path = base_dir / "data" / "db" / "issue_tracker.json"
23
12
  self.file_path = Path(file_path)
24
13
  self._table: Dict[str, Dict[str, int]] = {}
25
14
  self._load()
@@ -87,15 +87,12 @@ class EnhancedMemory(Memory):
87
87
 
88
88
  # Default path for the persistent agent state JSON file. Allows override via
89
89
  # `AGENT_STATE_FILE` environment variable for testing.
90
- def _get_default_agent_state_path():
91
- """Get the default agent state path, checking workspace first."""
92
- workspace_base = os.environ.get('WORKSPACE_BASE', '/workspace')
93
- if os.path.exists(workspace_base):
94
- return Path(workspace_base) / "data" / "state" / "agent_state.json"
95
- else:
96
- return Path(__file__).resolve().parents[3] / "state" / ".agent_state" / "agent_state.json"
97
-
98
- _DEFAULT_AGENT_STATE_PATH = _get_default_agent_state_path()
90
+ _DEFAULT_AGENT_STATE_PATH = (
91
+ Path(__file__).resolve().parents[3]
92
+ / "state"
93
+ / ".agent_state"
94
+ / "agent_state.json"
95
+ )
99
96
  AGENT_STATE_PATH = Path(os.environ.get("AGENT_STATE_FILE", _DEFAULT_AGENT_STATE_PATH))
100
97
 
101
98
 
@@ -1,123 +0,0 @@
1
- """
2
- Configuration loader for diagram-to-iac tests.
3
-
4
- This module provides utilities to load test configuration from the main config.yaml file,
5
- making test repository URLs and other test settings configurable and centralized.
6
- """
7
-
8
- import os
9
- import yaml
10
- from pathlib import Path
11
- from typing import Dict, Any
12
-
13
-
14
- def load_test_config() -> Dict[str, Any]:
15
- """
16
- Load test configuration from the main config.yaml file.
17
-
18
- Returns:
19
- Dict containing test configuration settings
20
- """
21
- # Find the config file relative to this module
22
- # The config.yaml is at src/diagram_to_iac/config.yaml
23
- # This file is at src/diagram_to_iac/core/test_config.py
24
- # So we need to go up one directory
25
- current_dir = Path(__file__).parent
26
- config_path = current_dir.parent / "config.yaml"
27
-
28
- if not config_path.exists():
29
- raise FileNotFoundError(f"Config file not found at {config_path}")
30
-
31
- with open(config_path, 'r') as f:
32
- config = yaml.safe_load(f)
33
-
34
- return config.get('test', {})
35
-
36
-
37
- def get_test_repo_url() -> str:
38
- """
39
- Get the test repository URL from configuration.
40
-
41
- Returns:
42
- The configured test repository URL
43
- """
44
- config = load_test_config()
45
- return config.get('github', {}).get('test_repo_url', 'https://github.com/amartyamandal/test_iac_agent_private.git')
46
-
47
-
48
- def get_test_repo_owner() -> str:
49
- """
50
- Get the test repository owner from configuration.
51
-
52
- Returns:
53
- The configured test repository owner
54
- """
55
- config = load_test_config()
56
- return config.get('github', {}).get('test_repo_owner', 'amartyamandal')
57
-
58
-
59
- def get_test_repo_name() -> str:
60
- """
61
- Get the test repository name from configuration.
62
-
63
- Returns:
64
- The configured test repository name
65
- """
66
- config = load_test_config()
67
- return config.get('github', {}).get('test_repo_name', 'test_iac_agent_private')
68
-
69
-
70
- def get_public_test_repo_url() -> str:
71
- """
72
- Get the public test repository URL from configuration.
73
-
74
- Returns:
75
- The configured public test repository URL
76
- """
77
- config = load_test_config()
78
- return config.get('github', {}).get('public_test_repo_url', 'https://github.com/amartyamandal/test_iac_agent_public.git')
79
-
80
-
81
- def should_skip_integration_tests() -> bool:
82
- """
83
- Check if integration tests should be skipped when no GitHub token is available.
84
-
85
- Returns:
86
- True if integration tests should be skipped without a token
87
- """
88
- config = load_test_config()
89
- return config.get('settings', {}).get('skip_integration_tests_without_token', True)
90
-
91
-
92
- def should_use_real_github_api() -> bool:
93
- """
94
- Check if tests should use real GitHub API calls.
95
-
96
- Returns:
97
- True if real GitHub API calls should be used
98
- """
99
- config = load_test_config()
100
- return config.get('settings', {}).get('use_real_github_api', False)
101
-
102
-
103
- def should_mock_network_calls() -> bool:
104
- """
105
- Check if network calls should be mocked by default.
106
-
107
- Returns:
108
- True if network calls should be mocked
109
- """
110
- config = load_test_config()
111
- return config.get('settings', {}).get('mock_network_calls', True)
112
-
113
-
114
- # Convenience function for backwards compatibility
115
- def get_test_github_repo() -> str:
116
- """
117
- Get the test GitHub repository URL.
118
- Alias for get_test_repo_url() for backwards compatibility.
119
-
120
- Returns:
121
- The configured test repository URL
122
- """
123
- return get_test_repo_url()
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import json
4
- import os
5
4
  from datetime import datetime, timezone
6
5
  from pathlib import Path
7
6
  import threading
@@ -12,17 +11,7 @@ class LogBus:
12
11
  """Simple JSONL logging service."""
13
12
 
14
13
  def __init__(self, log_dir: str | Path | None = None) -> None:
15
- if log_dir:
16
- self.log_dir = Path(log_dir)
17
- else:
18
- # Check for workspace-based path first (for containers)
19
- workspace_base = os.environ.get('WORKSPACE_BASE', '/workspace')
20
- if os.path.exists(workspace_base):
21
- self.log_dir = Path(workspace_base) / "logs"
22
- else:
23
- # Fallback to package-relative path
24
- self.log_dir = Path(__file__).resolve().parents[3] / "logs"
25
-
14
+ self.log_dir = Path(log_dir) if log_dir else Path(__file__).resolve().parents[3] / "logs"
26
15
  self.log_dir.mkdir(parents=True, exist_ok=True)
27
16
  timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
28
17
  self.log_path = self.log_dir / f"run-{timestamp}.jsonl"
@@ -3,14 +3,8 @@ import os
3
3
  from openai import OpenAI
4
4
  from anthropic import Anthropic
5
5
  import requests
6
- try:
7
- import google.generativeai as genai
8
- except ImportError:
9
- genai = None
10
- try:
11
- import googleapiclient.discovery
12
- except ImportError:
13
- googleapiclient = None
6
+ import google.generativeai as genai
7
+ import googleapiclient.discovery
14
8
  from concurrent.futures import ThreadPoolExecutor, TimeoutError
15
9
 
16
10
  # Import centralized configuration
@@ -51,10 +45,6 @@ def test_openai_api():
51
45
 
52
46
  def test_gemini_api():
53
47
  try:
54
- if genai is None:
55
- print("❌ Gemini API error: google-generativeai package not installed.")
56
- return False
57
-
58
48
  google_api_key = os.environ.get("GOOGLE_API_KEY")
59
49
  if not google_api_key:
60
50
  print("❌ Gemini API error: GOOGLE_API_KEY environment variable not set.")
@@ -767,86 +767,27 @@ class GitExecutor:
767
767
  labels_str = ",".join(gh_input.labels)
768
768
  gh_command += f" --label \"{labels_str}\""
769
769
 
770
- # Load GitHub assignee configuration from config
771
- github_config = self.config.get('github', {})
772
- issue_assignment_config = github_config.get('issue_assignment', {})
773
- copilot_assignee = github_config.get('copilot_assignee', 'Copilot')
774
- prefer_copilot = issue_assignment_config.get('prefer_copilot', True)
775
- auto_assign_when_empty = issue_assignment_config.get('auto_assign_when_empty', True)
776
- smart_prioritization = issue_assignment_config.get('smart_prioritization', True)
777
- fallback_strategy = github_config.get('fallback_assignee_strategy', 'owner')
778
-
779
- # Smart assignee prioritization logic
770
+ # Handle assignees - auto-assign to repository owner or github-copilot if none provided
780
771
  assignees_to_use = gh_input.assignees or []
781
-
782
- if assignees_to_use:
783
- # If assignees are provided, apply smart prioritization (if enabled)
784
- if smart_prioritization:
785
- if copilot_assignee in assignees_to_use:
786
- # Multiple assignees with Copilot -> assign to Copilot only
787
- assignees_to_use = [copilot_assignee]
788
- self.logger.info(f"Multiple assignees detected with @{copilot_assignee} - assigning to @{copilot_assignee} only")
789
- elif len(assignees_to_use) == 1 and assignees_to_use[0] == owner:
790
- # Only owner as assignee -> keep as owner
791
- self.logger.info(f"Single assignee is repository owner - assigning to @{owner}")
792
- elif len(assignees_to_use) > 1 and copilot_assignee not in assignees_to_use:
793
- # Multiple assignees without Copilot -> assign to owner only
794
- assignees_to_use = [owner]
795
- self.logger.info(f"Multiple assignees without @{copilot_assignee} - assigning to repository owner @{owner} only")
796
- # Single non-owner assignee -> keep as provided
797
- else:
798
- self.logger.info("Smart prioritization disabled - using assignees as provided")
799
- else:
800
- # No assignees provided - auto-assign based on configuration
801
- if auto_assign_when_empty and prefer_copilot:
802
- try:
803
- # Check if configured Copilot user exists
804
- check_copilot_cmd = f"gh api /users/{copilot_assignee}"
805
- check_shell_input = ShellExecInput(command=check_copilot_cmd, timeout=10)
806
- check_result = self.shell_executor.shell_exec(check_shell_input)
807
-
808
- if check_result.exit_code == 0:
809
- assignees_to_use = [copilot_assignee]
810
- self.logger.info(f"No assignees provided - auto-assigning to @{copilot_assignee}")
811
- else:
812
- # Fallback based on strategy
813
- if fallback_strategy == "owner":
814
- assignees_to_use = [owner]
815
- self.logger.info(f"No assignees provided, @{copilot_assignee} not available - auto-assigning to repository owner @{owner}")
816
- elif fallback_strategy == "default_assignees":
817
- default_assignees = github_config.get('default_assignees', [])
818
- assignees_to_use = default_assignees if default_assignees else [owner]
819
- self.logger.info(f"No assignees provided, @{copilot_assignee} not available - using default assignees: {assignees_to_use}")
820
- else: # fallback_strategy == "none"
821
- assignees_to_use = []
822
- self.logger.info(f"No assignees provided, @{copilot_assignee} not available - no assignee set")
823
- except Exception as e:
824
- # Fallback to configured strategy if check fails
825
- if fallback_strategy == "owner":
826
- assignees_to_use = [owner]
827
- self.logger.info(f"Failed to check @{copilot_assignee}, assigning to repository owner @{owner}. Error: {e}")
828
- elif fallback_strategy == "default_assignees":
829
- default_assignees = github_config.get('default_assignees', [])
830
- assignees_to_use = default_assignees if default_assignees else [owner]
831
- self.logger.info(f"Failed to check @{copilot_assignee}, using default assignees: {assignees_to_use}. Error: {e}")
832
- else: # fallback_strategy == "none"
833
- assignees_to_use = []
834
- self.logger.info(f"Failed to check @{copilot_assignee}, no assignee set. Error: {e}")
835
- elif auto_assign_when_empty:
836
- # Auto-assign but don't prefer Copilot
837
- if fallback_strategy == "owner":
772
+ if not assignees_to_use:
773
+ # Try to assign to @github-copilot first, fallback to repository owner
774
+ try:
775
+ # Check if github-copilot exists as a user
776
+ check_copilot_cmd = "gh api /users/github-copilot"
777
+ check_shell_input = ShellExecInput(command=check_copilot_cmd, timeout=10)
778
+ check_result = self.shell_executor.shell_exec(check_shell_input)
779
+
780
+ if check_result.exit_code == 0:
781
+ assignees_to_use = ["github-copilot"]
782
+ self.logger.info("Auto-assigning issue to @github-copilot")
783
+ else:
784
+ # Fallback to repository owner
838
785
  assignees_to_use = [owner]
839
- self.logger.info(f"No assignees provided - auto-assigning to repository owner @{owner}")
840
- elif fallback_strategy == "default_assignees":
841
- default_assignees = github_config.get('default_assignees', [])
842
- assignees_to_use = default_assignees if default_assignees else [owner]
843
- self.logger.info(f"No assignees provided - using default assignees: {assignees_to_use}")
844
- else: # fallback_strategy == "none"
845
- assignees_to_use = []
846
- self.logger.info("No assignees provided - no auto-assignment configured")
847
- else:
848
- assignees_to_use = []
849
- self.logger.info("No assignees provided - auto-assignment disabled")
786
+ self.logger.info(f"Auto-assigning issue to repository owner: @{owner}")
787
+ except Exception as e:
788
+ # Fallback to repository owner if check fails
789
+ assignees_to_use = [owner]
790
+ self.logger.info(f"Failed to check @github-copilot, assigning to repository owner: @{owner}. Error: {e}")
850
791
 
851
792
  if assignees_to_use:
852
793
  assignees_str = ",".join(assignees_to_use)
@@ -37,77 +37,44 @@ except ImportError:
37
37
  # Path inside container where the encoded YAML is mounted (dev only)
38
38
  _YAML_PATH = pathlib.Path("/run/secrets.yaml")
39
39
 
40
- def _load_config_secrets():
41
- """Load secret configuration from config.yaml."""
42
- try:
43
- # Try to load from config.yaml
44
- config_path = pathlib.Path(__file__).parent.parent / "config.yaml"
45
- if config_path.exists() and yaml:
46
- config_data = yaml.safe_load(config_path.read_text())
47
- security_config = config_data.get("security", {})
48
-
49
- required_secrets = security_config.get("required_secrets", ["REPO_API_KEY"])
50
- optional_secrets = security_config.get("optional_secrets", [])
51
- secret_mappings = security_config.get("secret_mappings", {})
52
-
53
- # Combine required and optional secrets
54
- expected_secrets = required_secrets + optional_secrets
55
-
56
- # Create full mapping (defaults to same name if not mapped)
57
- full_mapping = {}
58
- for secret in expected_secrets:
59
- full_mapping[secret] = secret_mappings.get(secret, secret)
60
-
61
- # AI API secrets (hardcoded as they're specific to AI functionality)
62
- ai_secrets = [
63
- "OPENAI_API_KEY",
64
- "GOOGLE_API_KEY",
65
- "ANTHROPIC_API_KEY",
66
- "GROK_API_KEY"
67
- ]
68
-
69
- return expected_secrets, required_secrets, ai_secrets, full_mapping
70
- except Exception as e:
71
- print(f"⚠️ Warning: Could not load secret config from config.yaml: {e}")
72
-
73
- # Fallback to hardcoded values
74
- expected_secrets = [
75
- "DOCKERHUB_API_KEY",
76
- "DOCKERHUB_USERNAME",
77
- "TF_API_KEY",
78
- "PYPI_API_KEY",
79
- "OPENAI_API_KEY",
80
- "GOOGLE_API_KEY",
81
- "ANTHROPIC_API_KEY",
82
- "GROK_API_KEY",
83
- "REPO_API_KEY"
84
- ]
85
-
86
- required_secrets = ["REPO_API_KEY"]
87
-
88
- ai_secrets = [
89
- "OPENAI_API_KEY",
90
- "GOOGLE_API_KEY",
91
- "ANTHROPIC_API_KEY",
92
- "GROK_API_KEY"
93
- ]
94
-
95
- secret_mapping = {
96
- "REPO_API_KEY": "GITHUB_TOKEN",
97
- "TF_API_KEY": "TFE_TOKEN",
98
- "DOCKERHUB_API_KEY": "DOCKERHUB_API_KEY",
99
- "DOCKERHUB_USERNAME": "DOCKERHUB_USERNAME",
100
- "PYPI_API_KEY": "PYPI_API_KEY",
101
- "OPENAI_API_KEY": "OPENAI_API_KEY",
102
- "GOOGLE_API_KEY": "GOOGLE_API_KEY",
103
- "ANTHROPIC_API_KEY": "ANTHROPIC_API_KEY",
104
- "GROK_API_KEY": "GROK_API_KEY"
105
- }
106
-
107
- return expected_secrets, required_secrets, ai_secrets, secret_mapping
40
+ # Expected secrets based on secrets_example.yaml
41
+ EXPECTED_SECRETS = [
42
+ "DOCKERHUB_API_KEY",
43
+ "DOCKERHUB_USERNAME",
44
+ "TF_API_KEY",
45
+ "PYPI_API_KEY",
46
+ "OPENAI_API_KEY",
47
+ "GOOGLE_API_KEY",
48
+ "ANTHROPIC_API_KEY",
49
+ "GROK_API_KEY",
50
+ "REPO_API_KEY"
51
+ ]
52
+
53
+ # Required secrets that must be present (others are optional)
54
+ REQUIRED_SECRETS = [
55
+ "REPO_API_KEY" # GITHUB_TOKEN is required for repo operations
56
+ ]
57
+
58
+ # Optional AI API secrets (at least one should be present for AI functionality)
59
+ AI_API_SECRETS = [
60
+ "OPENAI_API_KEY",
61
+ "GOOGLE_API_KEY",
62
+ "ANTHROPIC_API_KEY",
63
+ "GROK_API_KEY"
64
+ ]
108
65
 
109
- # Load configuration at module level
110
- EXPECTED_SECRETS, REQUIRED_SECRETS, AI_API_SECRETS, SECRET_ENV_MAPPING = _load_config_secrets()
66
+ # Map internal secret names to environment variable names
67
+ SECRET_ENV_MAPPING = {
68
+ "REPO_API_KEY": "GITHUB_TOKEN",
69
+ "TF_API_KEY": "TFE_TOKEN",
70
+ "DOCKERHUB_API_KEY": "DOCKERHUB_API_KEY",
71
+ "DOCKERHUB_USERNAME": "DOCKERHUB_USERNAME",
72
+ "PYPI_API_KEY": "PYPI_API_KEY",
73
+ "OPENAI_API_KEY": "OPENAI_API_KEY",
74
+ "GOOGLE_API_KEY": "GOOGLE_API_KEY",
75
+ "ANTHROPIC_API_KEY": "ANTHROPIC_API_KEY",
76
+ "GROK_API_KEY": "GROK_API_KEY"
77
+ }
111
78
 
112
79
 
113
80
  def _decode_b64(enc: str) -> str:
@@ -140,35 +107,12 @@ def _is_dev_environment() -> bool:
140
107
  )
141
108
 
142
109
 
143
- def _is_ci_environment() -> bool:
144
- """Check if running in CI environment."""
145
- return os.environ.get("CI") == "true" or os.environ.get("GITHUB_ACTIONS") == "true"
146
-
147
-
148
110
  def _get_env_secrets() -> Dict[str, Optional[str]]:
149
111
  """Get secrets from environment variables."""
150
112
  env_secrets = {}
151
- is_ci = _is_ci_environment()
152
-
153
113
  for secret_key in EXPECTED_SECRETS:
154
114
  env_name = SECRET_ENV_MAPPING.get(secret_key, secret_key)
155
- raw_value = None
156
-
157
- if is_ci:
158
- # In CI, check for _ENCODED variant first (since that's how they're provided)
159
- encoded_env_name = f"{secret_key}_ENCODED" # Use secret_key directly for CI
160
- raw_value = os.environ.get(encoded_env_name)
161
-
162
- # If not found with secret_key, try with env_name
163
- if raw_value is None:
164
- encoded_env_name = f"{env_name}_ENCODED"
165
- raw_value = os.environ.get(encoded_env_name)
166
-
167
- # If still not found, try the direct environment variable name
168
- if raw_value is None:
169
- raw_value = os.environ.get(env_name)
170
-
171
- # If we found a value, process it
115
+ raw_value = os.environ.get(env_name)
172
116
  if raw_value:
173
117
  # Check if value is already decoded, use as-is; otherwise decode it
174
118
  if (secret_key == "TF_API_KEY" and ".atlasv1." in raw_value) or \
@@ -182,7 +126,6 @@ def _get_env_secrets() -> Dict[str, Optional[str]]:
182
126
  env_secrets[secret_key] = _decode_b64(raw_value)
183
127
  else:
184
128
  env_secrets[secret_key] = None
185
-
186
129
  return env_secrets
187
130
 
188
131
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: diagram-to-iac
3
- Version: 1.9.0
3
+ Version: 1.12.0
4
4
  Summary: Convert architecture diagrams into IaC modules
5
5
  Author-email: vindpro <admin@vindpro.com>
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,5 @@
1
1
  diagram_to_iac/__init__.py,sha256=gQanRC5O_7AMB-NQFEEd-MU0GICa-dBsgvcJgquKBfs,1427
2
2
  diagram_to_iac/cli.py,sha256=uumG1frF42eCkdLIZxyxQB1x6lDwtG-qKL4vcHnLLXY,400
3
- diagram_to_iac/config.yaml,sha256=w_XxgZgl-Esjp25bXJDD_LSYXBL-95t2reO4hzjheRI,7936
4
3
  diagram_to_iac/r2d.py,sha256=I7XSuUtu8TdvAhK4tCMLc3U_3ZtP7DJGfq168aeI3Mk,13208
5
4
  diagram_to_iac/actions/__init__.py,sha256=P1CjjY4FYUA0Tcx8FQNLYYSI9fhv8yKd_TmRGtmhW50,229
6
5
  diagram_to_iac/actions/git_entry.py,sha256=mhY6gYquUPVvyvnTC2S90z_uXEe1asqWLoi1989aB_Q,5403
@@ -9,17 +8,13 @@ diagram_to_iac/actions/terraform_agent_entry.py,sha256=gKkX4fIRdBDZpwPQO_v2t1SSO
9
8
  diagram_to_iac/agents/__init__.py,sha256=GHInKSPq56ZPYSKsyti6_wk82dhn2hOqfxNHkZZOj_0,735
10
9
  diagram_to_iac/agents/demonstrator_langgraph/__init__.py,sha256=nghMYMEEarfkR0V6AH1fDCV-mXBLnmFP2sO4OPxJ4cI,371
11
10
  diagram_to_iac/agents/demonstrator_langgraph/agent.py,sha256=9ZH2H5iAB2DfMhCr-OzImVZlwoeXIP8RKl6_VG47W2I,35349
12
- diagram_to_iac/agents/demonstrator_langgraph/config.yaml,sha256=T1nMi9AQwZxdIWU6NWxttl9CcyEf_Pu6_F-_zCjdVUc,2050
13
11
  diagram_to_iac/agents/git_langgraph/__init__.py,sha256=x6nCnOu-Vcl-qVqW1swhdaE_sQqUSvEUUtWk4eePBUo,295
14
12
  diagram_to_iac/agents/git_langgraph/agent.py,sha256=_lGwyTTgTsS4ZtaQLCceGJa5zeLvux_Hqda1-fqAgXg,49288
15
- diagram_to_iac/agents/git_langgraph/config.yaml,sha256=yjxIsD5b5TushF-Yc3iSVJl1fK4GuhErQ0tWRHdkQYc,3690
16
13
  diagram_to_iac/agents/git_langgraph/pr.py,sha256=qXopN5XAF1DIac5vbH-QasihkuAiWmC9JY8pLYlm-sQ,8601
17
14
  diagram_to_iac/agents/hello_langgraph/__init__.py,sha256=lviuDAPJezmpaXR-H7JxfIT9wvg1xO2t6JLyeKSSx0Y,266
18
15
  diagram_to_iac/agents/hello_langgraph/agent.py,sha256=R49yfFGxqMPBBu36ztDH9lBE_-s7VFyRB33gnNSXxek,33777
19
- diagram_to_iac/agents/hello_langgraph/config.yaml,sha256=PCOwG9FrbrZdtnc7zM3D43jP-TjudW656_qAz-G_lH0,227
20
16
  diagram_to_iac/agents/policy_agent/__init__.py,sha256=E6QEyIpSHh0PMRNnM0dXuYtz2HZdCJaY5W7UbEwPZBA,380
21
17
  diagram_to_iac/agents/policy_agent/agent.py,sha256=dJLX3q2sYmwUGjs_qQOAlAvTfkEEYUalNCnBz1eeaBw,22296
22
- diagram_to_iac/agents/policy_agent/config.yaml,sha256=VmNucLT1JXBSh2FJIeJfAW740AvHAoH-sAGpbjUiYCM,1333
23
18
  diagram_to_iac/agents/policy_agent/integration_example.py,sha256=LtOGshT0VL6yuu5p8UtJ5xqKNweRsLqeyCZK18dnwBA,6703
24
19
  diagram_to_iac/agents/policy_agent/tools/__init__.py,sha256=C9ez49BmMiaAlYs_QrtC0ypMLm1S-Sf9RCRI40-KuCA,282
25
20
  diagram_to_iac/agents/policy_agent/tools/tfsec_tool.py,sha256=YYCRhwVLegeCzJrbah3BYhpKwYPh7PtDxB3kYW8qt10,10116
@@ -28,7 +23,6 @@ diagram_to_iac/agents/shell_langgraph/agent.py,sha256=dZWzjVQ9oX_BtNHQ1Zrzy2oQpu
28
23
  diagram_to_iac/agents/shell_langgraph/detector.py,sha256=wLw0uDP_V2m1z6SRk7QNCzoUMYCfXwu3DNg8EWue9yk,1493
29
24
  diagram_to_iac/agents/supervisor_langgraph/__init__.py,sha256=iLN60d20cqoXOLyuLvJkiwrzapE84em222Tnyndq2dc,385
30
25
  diagram_to_iac/agents/supervisor_langgraph/agent.py,sha256=1qfgYSQQx1JNgN9ORFCl35NrklRbN7ZcUdP5AbGBsGo,101342
31
- diagram_to_iac/agents/supervisor_langgraph/config.yaml,sha256=tdItteHrgTWU3xeHiZ9DVblO5j0G_2Wo63nb-wG8eIo,2334
32
26
  diagram_to_iac/agents/supervisor_langgraph/demonstrator.py,sha256=OT-bElEyLZBedzcc5DtZnp1yhjYVjx4jRzt52f5SoSU,803
33
27
  diagram_to_iac/agents/supervisor_langgraph/github_listener.py,sha256=Ko9dOnS9CUqbjTogEyhEmVhkiaW8OiwLzX6k18lSrac,16377
34
28
  diagram_to_iac/agents/supervisor_langgraph/guards.py,sha256=XzBgjXnwbOgLkGm7AqXX4tQdGBerq_6pKvduKPqIwF0,720
@@ -36,29 +30,26 @@ diagram_to_iac/agents/supervisor_langgraph/pat_loop.py,sha256=feY8ZPGQxqkUuHOMSd
36
30
  diagram_to_iac/agents/supervisor_langgraph/router.py,sha256=7hZXXEmtvG__w7UAaOhoPaHdubUv-oMKbQdMTMXk-qY,276
37
31
  diagram_to_iac/agents/terraform_langgraph/__init__.py,sha256=N4_cTgk1wNZMS9WU5xZMEm6Dt5GiJ2b0iLx-QUhJd10,390
38
32
  diagram_to_iac/agents/terraform_langgraph/agent.py,sha256=lDaRCLcqShZiUGN25R-T94JTCLYaz4UgT_di3tDA0nE,50593
39
- diagram_to_iac/agents/terraform_langgraph/config.yaml,sha256=_jZ0hEegZcXRkm3pDwkPzZkOEi4Gt8ONYwsoFPNc5FQ,643
40
33
  diagram_to_iac/agents/terraform_langgraph/parser.py,sha256=J56CPlpIEIPuDHeAOL3sz4TiIgqLi7raPlX7jwFrAms,2039
41
34
  diagram_to_iac/core/__init__.py,sha256=VjXPYLIS2SAPIDniBkeA2EDK0VHJvdaKIC8dzVneaTM,140
42
35
  diagram_to_iac/core/agent_base.py,sha256=DjZjcfzDpEhfIOki00XwQ-4lPli3OBcQ_7RNKsT7JSI,505
43
36
  diagram_to_iac/core/config_loader.py,sha256=6WWOp6G7_xYUhm1x62sVa-7kFlCthcthbppmeGz1YsM,9276
44
- diagram_to_iac/core/enhanced_memory.py,sha256=fJ8r-MREZRnm6Rg01CDCicMEx-dDxDEjJgrk8rnVc5Y,11761
37
+ diagram_to_iac/core/enhanced_memory.py,sha256=PI7GPpgo4APeRZ7b9t0MqWKqthRI4_iAg-GLCykDhtU,11845
45
38
  diagram_to_iac/core/errors.py,sha256=gZwZocnIcBlS4YccIBdjG8XztRCtMe4Cu6KWxLzebDM,115
46
- diagram_to_iac/core/issue_tracker.py,sha256=WLp2cJD9PNV0WwWqU0dyHtuNiyKHI9HQvGmRsdnh2c8,2193
47
- diagram_to_iac/core/memory.py,sha256=nV0LxDnU1Or41oF3sZzmxpYPknu8lICqkjFGJ8fBs9c,4772
39
+ diagram_to_iac/core/issue_tracker.py,sha256=0eo289hn94yCoFCkLaYiDOIJBjk33i2dk6eLeYe_9YE,1659
40
+ diagram_to_iac/core/memory.py,sha256=P9URX8m2nab65ZPF36uf6Z9hEXQGXrjrXa8dPXG7pm8,4444
48
41
  diagram_to_iac/core/registry.py,sha256=ibdMz68W7qkwF0dprt4ni5pekgJfAPuRgL85uRU7wHY,26632
49
- diagram_to_iac/core/test_config.py,sha256=hktJ2NcRK2i24xinN4slHpH2-WV8w8PoMXgJnDYeCtQ,3467
42
+ diagram_to_iac/core/test_config.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
43
  diagram_to_iac/services/__init__.py,sha256=I5R8g7vYX4tCldRf1Jf9vEhm5mylc-MfFicqLnY6a3E,238
51
44
  diagram_to_iac/services/commenter.py,sha256=iXvHXOeih64FbE34PuGPk6fhI4RmC62ZSVtFwmMqiOA,22146
52
- diagram_to_iac/services/observability.py,sha256=ci2EV7IlC-RinDL8u8S8JGB78ZBN39Q2EXCyiqIbWWc,2250
45
+ diagram_to_iac/services/observability.py,sha256=yxbnjMc4TO1SM8RZZMHf2E8uVOLpxFhiTjsTkymDi6Y,1856
53
46
  diagram_to_iac/services/step_summary.py,sha256=g3MuMZ51IDubI0oWcF7qMvseNgDS6D90AsKK_1s5xDQ,2808
54
- diagram_to_iac/templates/issue_frontmatter.yml,sha256=qjyjUT8jszRIbiX6wmACfhzF-4yTvY1cRtY371o4Ung,7012
55
47
  diagram_to_iac/tools/__init__.py,sha256=F2pcKhoPP5KDeQIGcqKXD1J30KFKc9qxMw1jxzrs9qY,434
56
- diagram_to_iac/tools/api_utils.py,sha256=c3nOK3eZdUuik5IVvMyGIEG-3oILnyOVd-RubtPdpgE,9616
57
- diagram_to_iac/tools/sec_utils.py,sha256=Zzb-I3_qZblv0nIEm4TO0xQCga3Phq44SOGx1ga_wOc,12463
48
+ diagram_to_iac/tools/api_utils.py,sha256=5Grroc0Sbu3UXQB5rv4in6LMkyU_NkOwLbu9F2tmB18,9364
49
+ diagram_to_iac/tools/sec_utils.py,sha256=BeKM1k8e8BHw5BMyghDvwB8tlyV7g3rr-civIprmLDY,10032
58
50
  diagram_to_iac/tools/text_utils.py,sha256=cnwOXWndd1QAlZC4zOO9jtF3_j4xozDLUTfzfJE9wWQ,9959
59
51
  diagram_to_iac/tools/git/__init__.py,sha256=1V3_Kg_KzQ6er60N-1hqQeigkV8c4AvYq-R60_xmQ4o,1316
60
- diagram_to_iac/tools/git/git.py,sha256=0kENjsjTT_DlHltSESW1NnBxZ5zTy2JWPOvw9DzSMRc,51317
61
- diagram_to_iac/tools/git/git_config.yaml,sha256=ekww9EEZigEfZBv-HNSEYP__SDT61yOdBQ0u-Lhquv0,4272
52
+ diagram_to_iac/tools/git/git.py,sha256=0NYz9NqQWf-5YTX7R3nBPyLmzvih-jhd0gYY8KZDmTM,46501
62
53
  diagram_to_iac/tools/hello/__init__.py,sha256=f6GpkiQxvuGaRMm34yQilGACxUI4c5edJQTDjZtskjQ,891
63
54
  diagram_to_iac/tools/hello/cal_utils.py,sha256=B-0iOJHNL1IgYPlWUdrAwEf1r9LUKBAnGyx1xQz05ZE,1507
64
55
  diagram_to_iac/tools/hello/text_utils.py,sha256=ZaVQYw6GVqaq9EDTQfG3gTAudeN8CuFUUb7IETZhUCA,3952
@@ -71,11 +62,9 @@ diagram_to_iac/tools/llm_utils/openai_driver.py,sha256=ZqzXEYEutwqRw3qWx-GH85Mj2
71
62
  diagram_to_iac/tools/llm_utils/router.py,sha256=ga8xfmPMl_SGINDwazeAAFYTAx9L_IQcVV5AdvqD0dQ,22643
72
63
  diagram_to_iac/tools/shell/__init__.py,sha256=6UZjBcnbPabA6Qy7t4j-dCi3S2sE6sB2bTE9PIL98bA,292
73
64
  diagram_to_iac/tools/shell/shell.py,sha256=ZOJ7Vo3l_R2Gm6Ml2FL0RX__-C_JOsUrLJVvBMwAy9E,21122
74
- diagram_to_iac/tools/shell/shell_config.yaml,sha256=9mV1mpOD9mwOx50TXF-ACafeJmBSZaqPo4v-TQxB5U4,1722
75
65
  diagram_to_iac/tools/tf/terraform.py,sha256=j1boWRo6JKpNGf1OwnWoWboO0gMYTizCOHDSxozoFZw,37343
76
- diagram_to_iac/tools/tf/terraform_config.yaml,sha256=Mj5rp5hwLLZ3VmKIqwnjoKvPlaA20OX5plH40DfGG7k,610
77
- diagram_to_iac-1.9.0.dist-info/METADATA,sha256=dnmZu8V4EyjxG51CF1yHOXLJ2B7jgj32hynd_wJS0TQ,10689
78
- diagram_to_iac-1.9.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
79
- diagram_to_iac-1.9.0.dist-info/entry_points.txt,sha256=DfGCnmgWWGHtQpqU8VqcUWs5k_be-bfO67z1vOuTitA,277
80
- diagram_to_iac-1.9.0.dist-info/top_level.txt,sha256=k1cV0YODiCUU46qlmbQaquMcbMXhNm05NZLxsinDUBA,15
81
- diagram_to_iac-1.9.0.dist-info/RECORD,,
66
+ diagram_to_iac-1.12.0.dist-info/METADATA,sha256=gGbCo0fGsBfPtBduANnDl2iLG7bURx7sT1i9gdwJR8w,10690
67
+ diagram_to_iac-1.12.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
68
+ diagram_to_iac-1.12.0.dist-info/entry_points.txt,sha256=DfGCnmgWWGHtQpqU8VqcUWs5k_be-bfO67z1vOuTitA,277
69
+ diagram_to_iac-1.12.0.dist-info/top_level.txt,sha256=k1cV0YODiCUU46qlmbQaquMcbMXhNm05NZLxsinDUBA,15
70
+ diagram_to_iac-1.12.0.dist-info/RECORD,,