pdd-cli 0.0.42__py3-none-any.whl → 0.0.90__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.
- pdd/__init__.py +4 -4
- pdd/agentic_common.py +863 -0
- pdd/agentic_crash.py +534 -0
- pdd/agentic_fix.py +1179 -0
- pdd/agentic_langtest.py +162 -0
- pdd/agentic_update.py +370 -0
- pdd/agentic_verify.py +183 -0
- pdd/auto_deps_main.py +15 -5
- pdd/auto_include.py +63 -5
- pdd/bug_main.py +3 -2
- pdd/bug_to_unit_test.py +2 -0
- pdd/change_main.py +11 -4
- pdd/cli.py +22 -1181
- pdd/cmd_test_main.py +80 -19
- pdd/code_generator.py +58 -18
- pdd/code_generator_main.py +672 -25
- pdd/commands/__init__.py +42 -0
- pdd/commands/analysis.py +248 -0
- pdd/commands/fix.py +140 -0
- pdd/commands/generate.py +257 -0
- pdd/commands/maintenance.py +174 -0
- pdd/commands/misc.py +79 -0
- pdd/commands/modify.py +230 -0
- pdd/commands/report.py +144 -0
- pdd/commands/templates.py +215 -0
- pdd/commands/utility.py +110 -0
- pdd/config_resolution.py +58 -0
- pdd/conflicts_main.py +8 -3
- pdd/construct_paths.py +281 -81
- pdd/context_generator.py +10 -2
- pdd/context_generator_main.py +113 -11
- pdd/continue_generation.py +47 -7
- pdd/core/__init__.py +0 -0
- pdd/core/cli.py +503 -0
- pdd/core/dump.py +554 -0
- pdd/core/errors.py +63 -0
- pdd/core/utils.py +90 -0
- pdd/crash_main.py +44 -11
- pdd/data/language_format.csv +71 -62
- pdd/data/llm_model.csv +20 -18
- pdd/detect_change_main.py +5 -4
- pdd/fix_code_loop.py +331 -77
- pdd/fix_error_loop.py +209 -60
- pdd/fix_errors_from_unit_tests.py +4 -3
- pdd/fix_main.py +75 -18
- pdd/fix_verification_errors.py +12 -100
- pdd/fix_verification_errors_loop.py +319 -272
- pdd/fix_verification_main.py +57 -17
- pdd/generate_output_paths.py +93 -10
- pdd/generate_test.py +16 -5
- pdd/get_jwt_token.py +48 -9
- pdd/get_run_command.py +73 -0
- pdd/get_test_command.py +68 -0
- pdd/git_update.py +70 -19
- pdd/increase_tests.py +7 -0
- pdd/incremental_code_generator.py +2 -2
- pdd/insert_includes.py +11 -3
- pdd/llm_invoke.py +1278 -110
- pdd/load_prompt_template.py +36 -10
- pdd/pdd_completion.fish +25 -2
- pdd/pdd_completion.sh +30 -4
- pdd/pdd_completion.zsh +79 -4
- pdd/postprocess.py +10 -3
- pdd/preprocess.py +228 -15
- pdd/preprocess_main.py +8 -5
- pdd/prompts/agentic_crash_explore_LLM.prompt +49 -0
- pdd/prompts/agentic_fix_explore_LLM.prompt +45 -0
- pdd/prompts/agentic_fix_harvest_only_LLM.prompt +48 -0
- pdd/prompts/agentic_fix_primary_LLM.prompt +85 -0
- pdd/prompts/agentic_update_LLM.prompt +1071 -0
- pdd/prompts/agentic_verify_explore_LLM.prompt +45 -0
- pdd/prompts/auto_include_LLM.prompt +98 -101
- pdd/prompts/change_LLM.prompt +1 -3
- pdd/prompts/detect_change_LLM.prompt +562 -3
- pdd/prompts/example_generator_LLM.prompt +22 -1
- pdd/prompts/extract_code_LLM.prompt +5 -1
- pdd/prompts/extract_program_code_fix_LLM.prompt +14 -2
- pdd/prompts/extract_prompt_update_LLM.prompt +7 -8
- pdd/prompts/extract_promptline_LLM.prompt +17 -11
- pdd/prompts/find_verification_errors_LLM.prompt +6 -0
- pdd/prompts/fix_code_module_errors_LLM.prompt +16 -4
- pdd/prompts/fix_errors_from_unit_tests_LLM.prompt +6 -41
- pdd/prompts/fix_verification_errors_LLM.prompt +22 -0
- pdd/prompts/generate_test_LLM.prompt +21 -6
- pdd/prompts/increase_tests_LLM.prompt +1 -2
- pdd/prompts/insert_includes_LLM.prompt +1181 -6
- pdd/prompts/split_LLM.prompt +1 -62
- pdd/prompts/trace_LLM.prompt +25 -22
- pdd/prompts/unfinished_prompt_LLM.prompt +85 -1
- pdd/prompts/update_prompt_LLM.prompt +22 -1
- pdd/prompts/xml_convertor_LLM.prompt +3246 -7
- pdd/pytest_output.py +188 -21
- pdd/python_env_detector.py +151 -0
- pdd/render_mermaid.py +236 -0
- pdd/setup_tool.py +648 -0
- pdd/simple_math.py +2 -0
- pdd/split_main.py +3 -2
- pdd/summarize_directory.py +56 -7
- pdd/sync_determine_operation.py +918 -186
- pdd/sync_main.py +82 -32
- pdd/sync_orchestration.py +1456 -453
- pdd/sync_tui.py +848 -0
- pdd/template_registry.py +264 -0
- pdd/templates/architecture/architecture_json.prompt +242 -0
- pdd/templates/generic/generate_prompt.prompt +174 -0
- pdd/trace.py +168 -12
- pdd/trace_main.py +4 -3
- pdd/track_cost.py +151 -61
- pdd/unfinished_prompt.py +49 -3
- pdd/update_main.py +549 -67
- pdd/update_model_costs.py +2 -2
- pdd/update_prompt.py +19 -4
- {pdd_cli-0.0.42.dist-info → pdd_cli-0.0.90.dist-info}/METADATA +20 -7
- pdd_cli-0.0.90.dist-info/RECORD +153 -0
- {pdd_cli-0.0.42.dist-info → pdd_cli-0.0.90.dist-info}/licenses/LICENSE +1 -1
- pdd_cli-0.0.42.dist-info/RECORD +0 -115
- {pdd_cli-0.0.42.dist-info → pdd_cli-0.0.90.dist-info}/WHEEL +0 -0
- {pdd_cli-0.0.42.dist-info → pdd_cli-0.0.90.dist-info}/entry_points.txt +0 -0
- {pdd_cli-0.0.42.dist-info → pdd_cli-0.0.90.dist-info}/top_level.txt +0 -0
pdd/summarize_directory.py
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
from typing import Optional, Tuple
|
|
2
|
-
from datetime import datetime
|
|
1
|
+
from typing import Callable, Optional, Tuple
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
try:
|
|
4
|
+
from datetime import UTC
|
|
5
|
+
except ImportError:
|
|
6
|
+
# Python < 3.11 compatibility
|
|
7
|
+
from datetime import timezone
|
|
8
|
+
UTC = timezone.utc
|
|
3
9
|
from io import StringIO
|
|
4
10
|
import os
|
|
5
11
|
import glob
|
|
@@ -82,7 +88,8 @@ def summarize_directory(
|
|
|
82
88
|
temperature: float,
|
|
83
89
|
verbose: bool,
|
|
84
90
|
time: float = DEFAULT_TIME,
|
|
85
|
-
csv_file: Optional[str] = None
|
|
91
|
+
csv_file: Optional[str] = None,
|
|
92
|
+
progress_callback: Optional[Callable[[int, int], None]] = None
|
|
86
93
|
) -> Tuple[str, float, str]:
|
|
87
94
|
"""
|
|
88
95
|
Summarize files in a directory and generate a CSV containing the summaries.
|
|
@@ -94,6 +101,8 @@ def summarize_directory(
|
|
|
94
101
|
verbose (bool): Whether to print out the details of the function.
|
|
95
102
|
time (float): Time budget for LLM calls.
|
|
96
103
|
csv_file (Optional[str]): Current CSV file contents if it already exists.
|
|
104
|
+
progress_callback (Optional[Callable[[int, int], None]]): Callback for progress updates.
|
|
105
|
+
Called with (current, total) for each file processed. Used by TUI ProgressBar.
|
|
97
106
|
|
|
98
107
|
Returns:
|
|
99
108
|
Tuple[str, float, str]: A tuple containing:
|
|
@@ -125,17 +134,57 @@ def summarize_directory(
|
|
|
125
134
|
raise ValueError("Invalid CSV file format.")
|
|
126
135
|
existing_data = parse_existing_csv(csv_file, verbose)
|
|
127
136
|
|
|
137
|
+
# Expand directory_path: support plain directories or glob patterns
|
|
138
|
+
try:
|
|
139
|
+
normalized_input = normalize_path(directory_path)
|
|
140
|
+
except Exception:
|
|
141
|
+
normalized_input = directory_path
|
|
142
|
+
|
|
143
|
+
if os.path.isdir(normalized_input):
|
|
144
|
+
# Recursively include all files under the directory
|
|
145
|
+
search_pattern = os.path.join(normalized_input, "**", "*")
|
|
146
|
+
else:
|
|
147
|
+
# Treat as a glob pattern (may be a single file path too)
|
|
148
|
+
search_pattern = directory_path
|
|
149
|
+
|
|
128
150
|
# Get list of files first to ensure consistent order
|
|
129
|
-
|
|
130
|
-
if not
|
|
151
|
+
all_files = sorted(glob.glob(search_pattern, recursive=True))
|
|
152
|
+
if not all_files:
|
|
131
153
|
if verbose:
|
|
132
154
|
print("[yellow]No files found.[/yellow]")
|
|
133
155
|
return csv_output, total_cost, model_name
|
|
134
156
|
|
|
157
|
+
# Pre-filter to get only processable files (for accurate progress count)
|
|
158
|
+
files = [
|
|
159
|
+
f for f in all_files
|
|
160
|
+
if not os.path.isdir(f)
|
|
161
|
+
and '__pycache__' not in f
|
|
162
|
+
and not f.endswith(('.pyc', '.pyo'))
|
|
163
|
+
]
|
|
164
|
+
|
|
165
|
+
if not files:
|
|
166
|
+
if verbose:
|
|
167
|
+
print("[yellow]No processable files found.[/yellow]")
|
|
168
|
+
return csv_output, total_cost, model_name
|
|
169
|
+
|
|
135
170
|
# Get all modification times at once to ensure consistent order
|
|
136
171
|
file_mod_times = {f: os.path.getmtime(f) for f in files}
|
|
137
172
|
|
|
138
|
-
|
|
173
|
+
# Determine iteration method: use callback if provided, else track()
|
|
174
|
+
# Disable track() when in TUI context (COLUMNS env var set) or callback provided
|
|
175
|
+
total_files = len(files)
|
|
176
|
+
use_track = progress_callback is None and "COLUMNS" not in os.environ
|
|
177
|
+
|
|
178
|
+
if use_track:
|
|
179
|
+
file_iterator = track(files, description="Processing files...")
|
|
180
|
+
else:
|
|
181
|
+
file_iterator = files
|
|
182
|
+
|
|
183
|
+
for idx, file_path in enumerate(file_iterator):
|
|
184
|
+
# Report progress if callback provided
|
|
185
|
+
if progress_callback is not None:
|
|
186
|
+
progress_callback(idx + 1, total_files)
|
|
187
|
+
|
|
139
188
|
try:
|
|
140
189
|
relative_path = os.path.relpath(file_path)
|
|
141
190
|
normalized_path = normalize_path(relative_path)
|
|
@@ -213,4 +262,4 @@ def summarize_directory(
|
|
|
213
262
|
|
|
214
263
|
except Exception as e:
|
|
215
264
|
print(f"[red]An error occurred: {str(e)}[/red]")
|
|
216
|
-
raise
|
|
265
|
+
raise
|