pdd-cli 0.0.19__py3-none-any.whl → 0.0.20__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.

Potentially problematic release.


This version of pdd-cli might be problematic. Click here for more details.

@@ -0,0 +1,287 @@
1
+ from rich import print as rprint
2
+ import re
3
+ import os
4
+ import subprocess
5
+ import requests
6
+ from bs4 import BeautifulSoup
7
+ from pathlib import Path
8
+ from typing import List, Optional
9
+
10
+ def get_file_path(file_name: str) -> str:
11
+ """
12
+ Resolves a file path using the current directory as the base path.
13
+
14
+ Args:
15
+ file_name: The name of the file to resolve
16
+
17
+ Returns:
18
+ The full path to the file
19
+ """
20
+ path = Path(file_name)
21
+
22
+ # If it's an absolute path, return it as is
23
+ if path.is_absolute():
24
+ return str(path)
25
+
26
+ # If path already exists relative to cwd, use it directly
27
+ if path.exists():
28
+ return str(path.resolve())
29
+
30
+ # Check if the path exists relative to PDD_PATH
31
+ if 'PDD_PATH' in os.environ:
32
+ pdd_path = Path(os.environ['PDD_PATH'])
33
+ if (pdd_path / path).exists():
34
+ return str(pdd_path / path)
35
+
36
+ # If the path has pdd in it, try removing one level
37
+ parts = list(path.parts)
38
+ if 'pdd' in parts:
39
+ if len(parts) > 1 and parts[0] == 'pdd':
40
+ adjusted_path = Path(*parts[1:])
41
+ if adjusted_path.exists():
42
+ return str(adjusted_path.resolve())
43
+
44
+ # If we got here, use the original path resolution logic
45
+ if 'PDD_PATH' in os.environ:
46
+ base_path = Path(os.environ['PDD_PATH'])
47
+ else:
48
+ base_path = Path.cwd()
49
+
50
+ # Get the project root - if we're in a directory named 'pdd' and we're including a file that might also have 'pdd' in its path
51
+ # Make sure we don't add 'pdd' twice
52
+ full_path = base_path / file_name
53
+
54
+ # Check if base_path already ends with 'pdd' and file_name starts with 'pdd/'
55
+ if base_path.name == 'pdd' and isinstance(file_name, str) and file_name.startswith('pdd/'):
56
+ # Remove the 'pdd/' prefix from file_name to avoid duplication
57
+ file_name_without_pdd = file_name[4:] # Skip 'pdd/'
58
+ full_path = base_path / file_name_without_pdd
59
+
60
+ return str(full_path)
61
+
62
+ def preprocess(
63
+ prompt: str,
64
+ recursive: bool = True,
65
+ double_curly_brackets: bool = True,
66
+ exclude_keys: Optional[List[str]] = None
67
+ ) -> str:
68
+ """
69
+ Preprocess a prompt string for an LLM by handling specific XML-like tags.
70
+
71
+ Args:
72
+ prompt: The prompt string to preprocess
73
+ recursive: Whether to recursively process includes in the prompt
74
+ double_curly_brackets: Whether to double curly brackets in the prompt
75
+ exclude_keys: List of keys to exclude from curly bracket doubling
76
+
77
+ Returns:
78
+ The preprocessed prompt string
79
+ """
80
+ if not prompt:
81
+ rprint("[bold red]Error:[/bold red] No prompt provided.")
82
+ return ""
83
+
84
+ if exclude_keys is None:
85
+ exclude_keys = []
86
+
87
+ try:
88
+ # Replace separate regex calls with a unified tag processing approach
89
+ def process_tags(prompt):
90
+ # Define a function to handle different tag types
91
+ def tag_handler(match):
92
+ pre_whitespace = match.group(1)
93
+ tag_type = match.group(2)
94
+ content = match.group(3) if match.group(3) else ""
95
+ post_whitespace = match.group(4)
96
+
97
+ # Skip processing if it looks like an example (contains backticks or is in code format)
98
+ if '`' in pre_whitespace or '`' in post_whitespace:
99
+ return match.group(0) # Return unchanged
100
+
101
+ if tag_type == 'pdd':
102
+ return pre_whitespace + post_whitespace # Remove pdd comments
103
+ elif tag_type == 'shell':
104
+ # Process shell commands
105
+ command = content.strip()
106
+ try:
107
+ result = subprocess.run(command, shell=True, check=True, text=True, capture_output=True)
108
+ return pre_whitespace + result.stdout + post_whitespace
109
+ except Exception as e:
110
+ # Return the original tag on error (critical for regression tests)
111
+ return match.group(0)
112
+ elif tag_type == 'web':
113
+ # Process web content
114
+ url = content.strip()
115
+ try:
116
+ response = requests.get(url)
117
+ response.raise_for_status()
118
+ soup = BeautifulSoup(response.text, 'html.parser')
119
+
120
+ # Remove scripts, styles, and navigation elements
121
+ for element in soup(['script', 'style', 'nav', 'header', 'footer', 'aside']):
122
+ element.decompose()
123
+
124
+ # Extract meaningful content
125
+ main_content = soup.find('main') or soup.find('article') or soup.find('div', {'id': 'content'})
126
+
127
+ if main_content:
128
+ result_content = main_content.get_text(strip=True)
129
+ else:
130
+ # Fallback to body content
131
+ result_content = soup.body.get_text(strip=True)
132
+ return pre_whitespace + result_content + post_whitespace
133
+ except Exception as e:
134
+ # Return the original tag on error
135
+ return match.group(0)
136
+ elif tag_type == 'include':
137
+ # Process file includes
138
+ file_name = content.strip()
139
+ # Skip if it contains invalid characters or looks like an example
140
+ if len(file_name) > 255 or any(c in file_name for c in '<>"\'|*?'):
141
+ return match.group(0) # Return unchanged
142
+
143
+ try:
144
+ file_path = get_file_path(file_name)
145
+ with open(file_path, 'r', encoding='utf-8') as file:
146
+ included_content = file.read()
147
+ if recursive:
148
+ # Recursive processing
149
+ included_content = preprocess(
150
+ included_content,
151
+ recursive=True,
152
+ double_curly_brackets=double_curly_brackets,
153
+ exclude_keys=exclude_keys
154
+ )
155
+ return pre_whitespace + included_content + post_whitespace
156
+ except Exception as e:
157
+ # Return the original tag on error
158
+ return match.group(0)
159
+
160
+ # Use a more specific regex pattern that properly handles tag structure
161
+ pattern = r'(\s*)<(include|pdd|shell|web)(?:\s+[^>]*)?(?:>(.*?)</\2>|/|>)(\s*)'
162
+ return re.sub(pattern, tag_handler, prompt, flags=re.DOTALL)
163
+
164
+ # Apply the unified tag processing approach
165
+ prompt = process_tags(prompt)
166
+
167
+ # Process angle brackets in triple backticks
168
+ def triple_backtick_include(match):
169
+ full_content = match.group(0) # The entire match including the backticks
170
+ backtick_content = match.group(1) # Just the content between backticks
171
+
172
+ # Find angle brackets within the backtick content
173
+ def angle_bracket_replace(inner_match):
174
+ file_name = inner_match.group(1)
175
+ try:
176
+ file_path = get_file_path(file_name)
177
+ with open(file_path, 'r', encoding='utf-8') as file:
178
+ content = file.read()
179
+ if recursive:
180
+ return preprocess(
181
+ content,
182
+ recursive=True,
183
+ double_curly_brackets=double_curly_brackets,
184
+ exclude_keys=exclude_keys
185
+ )
186
+ return content
187
+ except FileNotFoundError:
188
+ rprint(f"[bold red]File not found:[/bold red] {file_name}")
189
+ return f"<{file_name}>"
190
+ except Exception as e:
191
+ rprint(f"[bold red]Error including file {file_name}:[/bold red] {e}")
192
+ return f"<{file_name}>"
193
+
194
+ # Replace angle brackets in backtick content
195
+ processed_content = re.sub(r"<([^>]+)>", angle_bracket_replace, backtick_content)
196
+ return f"```{processed_content}```"
197
+
198
+ prompt = re.sub(r'```(.*?)```', triple_backtick_include, prompt, flags=re.DOTALL)
199
+
200
+ # Double curly brackets if needed
201
+ if double_curly_brackets:
202
+ # Initialize exclude_keys if it's None
203
+ exclude_keys = exclude_keys or []
204
+
205
+ # Handle simple cases first with character-by-character approach
206
+ if "\n" not in prompt and "```" not in prompt:
207
+ # Simple case: Character-by-character replacement
208
+ output = ""
209
+ i = 0
210
+ while i < len(prompt):
211
+ if prompt[i] == '{':
212
+ # Check if this is part of an excluded key
213
+ excluded = False
214
+ for key in exclude_keys:
215
+ if i + 1 + len(key) + 1 <= len(prompt) and prompt[i+1:i+1+len(key)] == key and prompt[i+1+len(key)] == '}':
216
+ output += '{' + key + '}'
217
+ i += 2 + len(key) # Skip the key and both braces
218
+ excluded = True
219
+ break
220
+ if not excluded:
221
+ output += '{{'
222
+ i += 1
223
+ elif prompt[i] == '}':
224
+ output += '}}'
225
+ i += 1
226
+ else:
227
+ output += prompt[i]
228
+ i += 1
229
+ return output.rstrip() if prompt.rstrip() == prompt else output
230
+
231
+ # More complex case: Use regex for structured text
232
+ # Step 1: Create a function to handle the pattern replacement
233
+ def replacer(match):
234
+ # Extract the content inside the curly braces
235
+ content = match.group(1)
236
+
237
+ # If the content is empty or in the exclude_keys list, don't double it
238
+ if not content: # Handle empty braces: {}
239
+ return "{{}}"
240
+ elif content in exclude_keys:
241
+ return f"{{{content}}}"
242
+ else:
243
+ return f"{{{{{content}}}}}"
244
+
245
+ # Step 2: Process code blocks and regular text separately
246
+ # Split the text into code blocks and non-code blocks
247
+ parts = re.split(r'(```.*?```)', prompt, flags=re.DOTALL)
248
+
249
+ for i in range(len(parts)):
250
+ if i % 2 == 0: # Not in a code block
251
+ # Handle JSON-like structures and nested braces more carefully
252
+ if ":" in parts[i] and "{" in parts[i] and "}" in parts[i]:
253
+ # For JSON-like structures, first preserve excluded keys
254
+ for key in exclude_keys:
255
+ pattern = r'\{' + re.escape(key) + r'\}'
256
+ # Use a unique placeholder that won't appear in normal text
257
+ placeholder = f"__EXCLUDED_KEY_{key}_PLACEHOLDER__"
258
+ parts[i] = re.sub(pattern, placeholder, parts[i])
259
+
260
+ # Then double all remaining braces
261
+ parts[i] = parts[i].replace("{", "{{").replace("}", "}}")
262
+
263
+ # Finally, restore the excluded keys
264
+ for key in exclude_keys:
265
+ placeholder = f"__EXCLUDED_KEY_{key}_PLACEHOLDER__"
266
+ parts[i] = parts[i].replace(placeholder, '{' + key + '}')
267
+ else:
268
+ # For regular text, use the replacer for simpler patterns
269
+ parts[i] = re.sub(r'{([^{}]*)}', replacer, parts[i])
270
+ else: # Inside a code block
271
+ # Double all curly brackets in code blocks
272
+ code_block = parts[i]
273
+ # Split the code block into the opening, content and closing
274
+ code_match = re.match(r'```(.*?)?\n(.*?)```', code_block, re.DOTALL)
275
+ if code_match:
276
+ language = code_match.group(1) or ""
277
+ content = code_match.group(2)
278
+ # Double all curly brackets in code blocks
279
+ content = content.replace("{", "{{").replace("}", "}}").replace("{{}}", "{{}}")
280
+ parts[i] = f"```{language}\n{content}```"
281
+
282
+ prompt = "".join(parts)
283
+
284
+ return prompt # Preserve whitespaces
285
+ except Exception as e:
286
+ rprint(f"[bold red]Error during prompt processing:[/bold red] {e}")
287
+ return f"Error: {str(e)}"
@@ -8,6 +8,8 @@
8
8
 
9
9
  % This prompt is run iteratively. Here are the current errors and past potential fix attempts, if any, from the unit test and verification program run(s): <errors>{errors}</errors>
10
10
 
11
+ % If the verfication program fails to run, the code_under_test and unit_test are unchanged from the previous iteration.
12
+
11
13
  <examples>
12
14
  <example_1>
13
15
  % Here is an example_unit_test for the example_code_under_test: <example_unit_test><include>context/fix_errors_from_unit_tests/1/test_conflicts_in_prompts.py</include></example_unit_test>
@@ -32,6 +34,7 @@
32
34
 
33
35
  % Here is the prompt that generated the example_code_under_test: <example_prompt><include>context/fix_errors_from_unit_tests/3/context_generator_python.prompt</include></example_prompt>
34
36
  </example_3>
37
+ <pdd>
35
38
 
36
39
  <example_4>
37
40
  % Here is an example_unit_test for the example_code_under_test: <example_unit_test><include>context/fix_errors_from_unit_tests/4/test_detect_change.py</include></example_unit_test>
@@ -48,13 +51,14 @@
48
51
 
49
52
  % Here is an example error/fix log showing how the issues were resolved: <example_error_fix_log><include>context/fix_errors_from_unit_tests/4/error.log</include></example_error_fix_log>
50
53
  </example_5>
54
+ </pdd>
51
55
  </examples>
52
56
 
53
57
  <instructions>
54
58
  % Follow these steps to solve these errors:
55
59
  Step 1. Compare the prompt to the code_under_test and explain differences, if any.
56
60
  Step 2. Compare the prompt to the unit_test and explain differences, if any.
57
- Step 3. For each prior attempted fix (if any), explain in a few paragraphs for each attempt why it might not have worked.
61
+ Step 3. For each prior attempted fix for the code_under_test and unit_test (if any), explain in a few paragraphs for each attempt why it might not have worked.
58
62
  Step 4. Write several paragraphs explaining the root cause of each of the errors and each of the warnings in the code_under_test and unit_test.
59
63
  Step 5. Explain in detail step by step how to solve each of the errors and warnings. For each error and warning, there should be several paragraphs description of the solution steps. Sometimes logging or print statements can help debug the code.
60
64
  Step 6. Review the above steps and correct for any errors and warnings in the code under test or unit test.
@@ -1,6 +1,7 @@
1
- % Here are some examples of splitting prompts:
2
- <examples>
3
1
  <pdd>
2
+ % Here are some examples of splitting prompts:
3
+ <examples>
4
+
4
5
  <example_1>
5
6
  <1_input_prompt><include>./context/split/1/initial_pdd_python.prompt</include></1_input_prompt>
6
7
  <1_input_code><include>./context/split/1/pdd.py</include></1_input_code>
@@ -40,7 +41,7 @@
40
41
  <5_sub_prompt><include>context/split/5/track_cost_python.prompt</include></5_sub_prompt>
41
42
  <5_modified_prompt><include>context/split/5/modified_cli_python.prompt</include></5_modified_prompt>
42
43
  </example_5>
43
- </pdd>
44
+
44
45
 
45
46
  <example_6>
46
47
  <6_input_prompt><include>context/split/6/cli_python.prompt</include></6_input_prompt>
@@ -57,8 +58,8 @@
57
58
  <7_sub_prompt><include>context/split/7/trace_main_python.prompt</include></7_sub_prompt>
58
59
  <7_modified_prompt><include>context/split/7/modified_cli_python.prompt</include></7_modified_prompt>
59
60
  </example_7>
60
-
61
61
  </examples>
62
+ </pdd>
62
63
 
63
64
  <context>
64
65
  % You are an expert LLM Prompt Engineer. Your goal is to split the input_prompt (a larger prompt) into a sub_prompt and modified_prompt (two smaller prompts) with no loss of functionality. This is to make it easier to generate and test the modules easier.
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: pdd-cli
3
- Version: 0.0.19
3
+ Version: 0.0.20
4
4
  Summary: PDD (Prompt-Driven Development) Command Line Interface
5
5
  Author: Greg Tanaka
6
6
  Author-email: glt@alumni.caltech.edu
@@ -39,8 +39,9 @@ Requires-Dist: rich==13.9.4
39
39
  Requires-Dist: semver==3.0.2
40
40
  Requires-Dist: setuptools==75.1.0
41
41
  Requires-Dist: python-Levenshtein
42
+ Dynamic: license-file
42
43
 
43
- .. image:: https://img.shields.io/badge/pdd--cli-v0.0.19-blue
44
+ .. image:: https://img.shields.io/badge/pdd--cli-v0.0.20-blue
44
45
  :alt: PDD-CLI Version
45
46
 
46
47
  PDD (Prompt-Driven Development) Command Line Interface
@@ -101,7 +102,7 @@ After installation, verify:
101
102
 
102
103
  pdd --version
103
104
 
104
- You'll see the current PDD version (e.g., 0.0.19).
105
+ You'll see the current PDD version (e.g., 0.0.20).
105
106
 
106
107
  Advanced Installation Tips
107
108
  --------------------------
@@ -1,12 +1,12 @@
1
1
  pdd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- pdd/auto_deps_main.py,sha256=2lZ-8WqzrPVMnzuVC-O7y1gazRLbY66fbmOdKnkYKNg,3630
2
+ pdd/auto_deps_main.py,sha256=NVLqL5FHxe2eorViXTuh8z2zH9Sb-b6MNN9aZ1hqevY,3552
3
3
  pdd/auto_include.py,sha256=aCa2QXDlOdKbh4vS3uDjWptkHB_Qv3QBNCbZe6mGWoo,6074
4
4
  pdd/auto_update.py,sha256=Pfav1hrqQIDjZIPuIvryBeM7k-Rc72feVUTJZPtigaU,2889
5
5
  pdd/bug_main.py,sha256=myKU9--QWdkV4Wf3mD2PoLPJFNgRjwf4z8s7TC28G_s,3720
6
6
  pdd/bug_to_unit_test.py,sha256=dsJNm6qAwx-m7RvFF5RquFJRzxzZGCWT4IKYnzVCUws,5569
7
7
  pdd/change.py,sha256=iqjWS5DrQ73yMkuUQlwIRIFlofmKdaK6t6-v3zHKL-4,4985
8
8
  pdd/change_main.py,sha256=yL_i1Ws5vt4vAkWiC826csNi2cHP6wKbwe_PfMqbbPY,11407
9
- pdd/cli.py,sha256=ss1X-yftpOmlA8Hqg9BSY3q-L5cEG6YDZlmMBdGCOlo,16593
9
+ pdd/cli.py,sha256=QwqeSs8SXVg8V7wxLcs0Tr7b920TMarueO2mRy9BWZA,16593
10
10
  pdd/cmd_test_main.py,sha256=aSCxRnSurg15AvPcJDAPp9xy8p_qqnjU1oV14Hi2R54,5301
11
11
  pdd/code_generator.py,sha256=n5akrX7VPe71X4RsD6kKqAVvzBLMlciJI4RtJA1PcgA,4375
12
12
  pdd/code_generator_main.py,sha256=G2eRBPXc1cGszkk0PbIPmJZHPaf_dw5d2yZbsvQZA3c,4793
@@ -14,18 +14,18 @@ pdd/comment_line.py,sha256=sX2hf4bG1fILi_rvI9MkkwCZ2IitgKkW7nOiw8aQKPY,1845
14
14
  pdd/conflicts_in_prompts.py,sha256=rwCHlsIOJeFniox-dAA3v6Xcc3fjcVP0nRY0BSb92Cc,4654
15
15
  pdd/conflicts_main.py,sha256=O87s9baSa9DJMndxPIdsnYO_spoajcv9jii3XYt_-fM,3473
16
16
  pdd/construct_paths.py,sha256=8hxkTI_AF5XNpGR4JqCsF4olDBtL8NslXdOZGQt78WM,10039
17
- pdd/context_generator.py,sha256=xLquyM6h40Xqg_wcdowqobrLFyZpIvGrOCJD-OBuoy4,5798
17
+ pdd/context_generator.py,sha256=2J1IMD_L0oQD4PZsDxcbpZuDgUou_whlgz4EIMhhB14,5788
18
18
  pdd/context_generator_main.py,sha256=TtsY3jHictdEjmB4cHyNwXmZW_LfHJp3KW3UXyzR2cU,2735
19
19
  pdd/continue_generation.py,sha256=hAVySc6oEsM_Zpj5AWBKEZqMWgoLlQBHcFtkAZ9sZ0E,5192
20
- pdd/crash_main.py,sha256=ZvOM-450KiTicSpqLIeJf52x6alx8t0Fq3C11LdQiZU,5464
20
+ pdd/crash_main.py,sha256=JFWEmFirHOAyUkHQ-IQJm6FJvSSARl1fPsGEW2urXg0,5198
21
21
  pdd/detect_change.py,sha256=ZtgGjGPrD0po-37TEzSbnzFyor7spXHjnT7G6NJ4aCI,5261
22
22
  pdd/detect_change_main.py,sha256=1Z4ymhjJaVr2aliGyqkqeqSmQ7QMgcl23p0wdsmBas0,3653
23
23
  pdd/find_section.py,sha256=lz_FPY4KDCRAGlL1pWVZiutUNv7E4KsDFK-ymDWA_Ec,962
24
24
  pdd/fix_code_loop.py,sha256=L0yxq2yAziPIyFGb8lIP2mvufu8a_gtc5nnN2LuMuKs,8596
25
25
  pdd/fix_code_module_errors.py,sha256=M6AnlR2jF5LI-nNg6gIO5LvSkxiaLIUGyTvfnUfe1cU,4625
26
- pdd/fix_error_loop.py,sha256=1_pW4MGy8FhLuq4RiGUBligev5IJg8Bs_-r2GaZN5Y8,17085
27
- pdd/fix_errors_from_unit_tests.py,sha256=8qCEyHZ6lUSBtV9vhQyhgAxDuhngmOy7vVy2HObckd0,8934
28
- pdd/fix_main.py,sha256=02OIViH12BcsykpDp4Osxw2ndEeThnNakMFkzdpYr48,5333
26
+ pdd/fix_error_loop.py,sha256=2DhqhIkw7YbU4UPca9CAyAOAJLuggj_BW7UV33XBDFc,16568
27
+ pdd/fix_errors_from_unit_tests.py,sha256=7YLBLm0Dnf7VVjHuqLh2IHig10M9Y7S04pvkQBxNTwA,9115
28
+ pdd/fix_main.py,sha256=VAC04KjjemhIuF2sQ_dkjKIR8v5X3rj3QSV_RsOFr4A,10848
29
29
  pdd/generate_output_paths.py,sha256=zz42GTx9eGyWIYSl3jcWvtJRGnieC3eoPM6DIVcWz2k,7219
30
30
  pdd/generate_test.py,sha256=BwmRnjaPDTlxUqJZ37N3bxTBHlLPCZIR5i1bwrNNv54,4791
31
31
  pdd/get_comment.py,sha256=yuRtk68-SDkMaGzOSyIFdldRoymJBRSKjOYkr0narVc,2627
@@ -34,7 +34,7 @@ pdd/get_jwt_token.py,sha256=BGxqMh7qf2mG-TFw7JlV941O9XtrW22L_dRoS_UZNjM,11560
34
34
  pdd/get_language.py,sha256=yxyQqVEb5H3ep3Hc6XgAl3vMLTHD5OIs8ZSekB493GA,1438
35
35
  pdd/git_update.py,sha256=Ya7eI7YFtGIpT7FdziFJfnFkiZlj8I9Lh98lqtXfClc,2855
36
36
  pdd/increase_tests.py,sha256=ZsBWkUBtZIsFfqTw3gOJLaYZMhNNRIKd-vu8Tv_AZG0,3243
37
- pdd/insert_includes.py,sha256=bocHBAzs4MAudtIw-JjyHO0kYajwlOLS9jBzV33_LRU,5224
37
+ pdd/insert_includes.py,sha256=UASoq_46UNL6l7VGB7DW2jb4kcWlP6Hbj2EWuh7210Q,5310
38
38
  pdd/install_completion.py,sha256=joTIKRkx0e6kRrXj9NXtMODnIG-G0Twt7wBmj8TirmE,5102
39
39
  pdd/llm_invoke.py,sha256=Yhpoom9Ptgl_hjfWOFA_AhNQE2VFy07J9qWiEuHTP4Y,17343
40
40
  pdd/load_prompt_template.py,sha256=4NH8_t5eon_vcyTznqtemJ_yAPkTJm_hSdTRgzj3qEQ,1907
@@ -43,7 +43,9 @@ pdd/pdd_completion.sh,sha256=qurWrEksqptjryBZszxHv6i0MqgnIqJenMBDrzMgI98,4535
43
43
  pdd/pdd_completion.zsh,sha256=gav5kYLizpMLe9H_MK34sisgFx6LFDgfBW49nsg-5P0,12304
44
44
  pdd/postprocess.py,sha256=7Dt4C7hZZbqCpYK0LG2Ui_vIUYw9UTN3w5Wgd_JZYBs,4021
45
45
  pdd/postprocess_0.py,sha256=OW17GyCFLYErCyWh2tL4syuho3q2yFf2wyekQ4BLdPM,2168
46
- pdd/preprocess.py,sha256=7_mkREBFlWjIUIyZsYBlnCvIGtpVgPeToHUpaq_ZHC0,8177
46
+ pdd/preprocess copy.py,sha256=2XPmQRR5afUJ3xBVCO9JRRoYsYGrkb4Y0rw8VzAT8Ds,10093
47
+ pdd/preprocess.py,sha256=bm8C_TSyx1S6G9AG-MwVyXrF4oPOArbDtWQs79so6F0,10499
48
+ pdd/preprocess_copy_bahrat.py,sha256=NGfCIjodWak8wpdbThPw05qXmnDl_DDW-u9lehiKNZ4,13409
47
49
  pdd/preprocess_main.py,sha256=dAgFGmjuJB1taZl31c1sY2jMGtQgjnWLbpeB7EFtojY,2977
48
50
  pdd/process_csv_change.py,sha256=10XTzVFQ0rE4lPSF93yhIW7VJmxmfe-hk1B7ui_qxJI,8415
49
51
  pdd/pytest_output.py,sha256=kmKiMHaQItrDVi_hTCtM5pfCgBuyZVEVRbxdchpS5CY,4796
@@ -58,7 +60,7 @@ pdd/update_main.py,sha256=5a4nsOOaAXULdk0BS9pj4blZ_QHBFeET37uaAqoJI2g,3912
58
60
  pdd/update_prompt.py,sha256=OdPRIAMu7OBx7E4SOU95hWgdtBY4oO8XOe1dvPChMlU,4351
59
61
  pdd/xml_tagger.py,sha256=NcyWacoXarRi6_16pchMhh1M7V-Gfz1cQImO_If2ia4,4241
60
62
  pdd/data/language_format.csv,sha256=xUTmFHXSBVBRfPV-NKG3oWo5_ped5ukP-ekFcIlVzJk,877
61
- pdd/data/llm_model.csv,sha256=wcdbyH82gCWf2yR5NHDUsU9C23sylOEqZ1bjJYStERI,1703
63
+ pdd/data/llm_model.csv,sha256=65xrg4hy6xnt-MIEKd5VP571LLY7IHrhCCa5fyXNYW4,1703
62
64
  pdd/prompts/auto_include_LLM.prompt,sha256=0t-Jmm5o6vVTmqsISTUiewqPT8bB389UZnJoHZvgtu4,13967
63
65
  pdd/prompts/bug_to_unit_test_LLM.prompt,sha256=--ysObDv9WzOEyJMuaKEdDHkRrR_1j0dmOtlAFr4YRg,1205
64
66
  pdd/prompts/change_LLM.prompt,sha256=W3sE6XZ2fb35XdqOykK1hDPtqkHSv9MZGD3sT8B8WjY,2083
@@ -78,11 +80,11 @@ pdd/prompts/extract_promptline_LLM.prompt,sha256=owIBRaF2bWwg3S64uyMKzOFMdvvmI_E
78
80
  pdd/prompts/extract_unit_code_fix_LLM.prompt,sha256=1gWS0-Qs6vMynNNqp1Xc-2hcsyH_NTLZPB1-lvyprm8,14143
79
81
  pdd/prompts/extract_xml_LLM.prompt,sha256=eRcHaL-khShpb7C1_b7wmBJHfo2Kh1Wvjo_aOcWZovU,561
80
82
  pdd/prompts/fix_code_module_errors_LLM.prompt,sha256=m-oqZ3cOkWbqke_l9z0Nmunf7NsnR9JWTNVVlfcteAY,1405
81
- pdd/prompts/fix_errors_from_unit_tests_LLM.prompt,sha256=xkQPMu2BumUmb_YFf7kPKpVqY4lI5ajlZsEKUaRZh-E,4779
83
+ pdd/prompts/fix_errors_from_unit_tests_LLM.prompt,sha256=1_nuUVr2E7DmJwHuLZ2A9KUxDFcsfLZvj9x0PcQ5FAg,4951
82
84
  pdd/prompts/generate_test_LLM.prompt,sha256=y9SZ40zrRDOdp9DJnqq5_IMpsTORhAOphlo3QZlq7Ac,895
83
85
  pdd/prompts/increase_tests_LLM.prompt,sha256=rekFzLRuZy99KifEKNlmPYoQdl8wa04112mtCdIY6S8,955
84
86
  pdd/prompts/insert_includes_LLM.prompt,sha256=g-p2gXKENsqvfK5Q9FYbqFsIJ5CP7rbxmd4rROA-W80,1453
85
- pdd/prompts/split_LLM.prompt,sha256=vhDLSqrfftvbDRagb0IfQpotnC-2z-xwKxGRsppkpDM,6135
87
+ pdd/prompts/split_LLM.prompt,sha256=T6KH6JWaMxRE1aA-IaVNlb2e85NfkYKRxqgDZZb2aBQ,6140
86
88
  pdd/prompts/summarize_file_LLM.prompt,sha256=qb9K61XMVFy7hgGITglI37Xg7yLPAGQBm0rUBEqRnEc,387
87
89
  pdd/prompts/trace_LLM.prompt,sha256=XTPoQQpKrF7BtWkCJPIrinn448VyBGXJieibMsMP-y0,1231
88
90
  pdd/prompts/trim_results_LLM.prompt,sha256=w4aL0S7v7fPSi3L9XeQR3mUOgNv3hpTDqi4rOtu7L7I,4033
@@ -90,9 +92,9 @@ pdd/prompts/trim_results_start_LLM.prompt,sha256=WwFlOHha4wzMLtRHDMI6GtcNdl2toE8
90
92
  pdd/prompts/unfinished_prompt_LLM.prompt,sha256=-JgBpiPTQZdWOAwOG1XpfpD9waynFTAT3Jo84eQ4bTw,1543
91
93
  pdd/prompts/update_prompt_LLM.prompt,sha256=_lGaxeVP4oF8yGqiN6yj6UE0j79lxfGdjsYr5w5KSYk,1261
92
94
  pdd/prompts/xml_convertor_LLM.prompt,sha256=YGRGXJeg6EhM9690f-SKqQrKqSJjLFD51UrPOlO0Frg,2786
93
- pdd_cli-0.0.19.dist-info/LICENSE,sha256=-1bjYH-CEjGEQ8VixtnRYuu37kN6F9NxmZSDkBuUQ9o,1062
94
- pdd_cli-0.0.19.dist-info/METADATA,sha256=wVt-JMByU3bNoQ-k2wXPrndPc76_k8a7qtPpI7Pj3Ak,6809
95
- pdd_cli-0.0.19.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
96
- pdd_cli-0.0.19.dist-info/entry_points.txt,sha256=Kr8HtNVb8uHZtQJNH4DnF8j7WNgWQbb7_Pw5hECSR-I,36
97
- pdd_cli-0.0.19.dist-info/top_level.txt,sha256=xjnhIACeMcMeDfVNREgQZl4EbTni2T11QkL5r7E-sbE,4
98
- pdd_cli-0.0.19.dist-info/RECORD,,
95
+ pdd_cli-0.0.20.dist-info/licenses/LICENSE,sha256=-1bjYH-CEjGEQ8VixtnRYuu37kN6F9NxmZSDkBuUQ9o,1062
96
+ pdd_cli-0.0.20.dist-info/METADATA,sha256=nRERBWbeSOEDSJcAL-zsh0vvgnR9SuNBWA7SiEY1SGM,6831
97
+ pdd_cli-0.0.20.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
98
+ pdd_cli-0.0.20.dist-info/entry_points.txt,sha256=Kr8HtNVb8uHZtQJNH4DnF8j7WNgWQbb7_Pw5hECSR-I,36
99
+ pdd_cli-0.0.20.dist-info/top_level.txt,sha256=xjnhIACeMcMeDfVNREgQZl4EbTni2T11QkL5r7E-sbE,4
100
+ pdd_cli-0.0.20.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (76.0.0)
2
+ Generator: setuptools (77.0.3)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5