pdd-cli 0.0.54__py3-none-any.whl → 0.0.55__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.
- pdd/__init__.py +1 -1
- pdd/cli.py +34 -6
- pdd/code_generator_main.py +47 -7
- pdd/construct_paths.py +34 -0
- pdd/pdd_completion.fish +1 -0
- pdd/pdd_completion.sh +12 -2
- pdd/pdd_completion.zsh +9 -0
- pdd/preprocess.py +15 -1
- {pdd_cli-0.0.54.dist-info → pdd_cli-0.0.55.dist-info}/METADATA +3 -3
- {pdd_cli-0.0.54.dist-info → pdd_cli-0.0.55.dist-info}/RECORD +14 -14
- {pdd_cli-0.0.54.dist-info → pdd_cli-0.0.55.dist-info}/WHEEL +0 -0
- {pdd_cli-0.0.54.dist-info → pdd_cli-0.0.55.dist-info}/entry_points.txt +0 -0
- {pdd_cli-0.0.54.dist-info → pdd_cli-0.0.55.dist-info}/licenses/LICENSE +0 -0
- {pdd_cli-0.0.54.dist-info → pdd_cli-0.0.55.dist-info}/top_level.txt +0 -0
pdd/__init__.py
CHANGED
pdd/cli.py
CHANGED
|
@@ -281,11 +281,18 @@ def process_commands(ctx: click.Context, results: List[Optional[Tuple[Any, float
|
|
|
281
281
|
help="Path to the original prompt file for incremental generation.",
|
|
282
282
|
)
|
|
283
283
|
@click.option(
|
|
284
|
-
"--
|
|
285
|
-
"
|
|
284
|
+
"--incremental",
|
|
285
|
+
"incremental_flag",
|
|
286
286
|
is_flag=True,
|
|
287
287
|
default=False,
|
|
288
|
-
help="Force incremental
|
|
288
|
+
help="Force incremental patching even if changes are significant (requires existing output).",
|
|
289
|
+
)
|
|
290
|
+
@click.option(
|
|
291
|
+
"-e",
|
|
292
|
+
"--env",
|
|
293
|
+
"env_kv",
|
|
294
|
+
multiple=True,
|
|
295
|
+
help="Set template variable (KEY=VALUE) or read KEY from env",
|
|
289
296
|
)
|
|
290
297
|
@click.pass_context
|
|
291
298
|
@track_cost
|
|
@@ -294,16 +301,36 @@ def generate(
|
|
|
294
301
|
prompt_file: str,
|
|
295
302
|
output: Optional[str],
|
|
296
303
|
original_prompt_file_path: Optional[str],
|
|
297
|
-
|
|
304
|
+
incremental_flag: bool,
|
|
305
|
+
env_kv: Tuple[str, ...],
|
|
298
306
|
) -> Optional[Tuple[str, float, str]]:
|
|
299
307
|
"""Generate code from a prompt file."""
|
|
300
308
|
try:
|
|
309
|
+
# Parse -e/--env arguments into a dict
|
|
310
|
+
env_vars: Dict[str, str] = {}
|
|
311
|
+
import os as _os
|
|
312
|
+
for item in env_kv or ():
|
|
313
|
+
if "=" in item:
|
|
314
|
+
key, value = item.split("=", 1)
|
|
315
|
+
key = key.strip()
|
|
316
|
+
if key:
|
|
317
|
+
env_vars[key] = value
|
|
318
|
+
else:
|
|
319
|
+
key = item.strip()
|
|
320
|
+
if key:
|
|
321
|
+
val = _os.environ.get(key)
|
|
322
|
+
if val is not None:
|
|
323
|
+
env_vars[key] = val
|
|
324
|
+
else:
|
|
325
|
+
if ctx.obj.get("verbose") and not ctx.obj.get("quiet"):
|
|
326
|
+
console.print(f"[warning]-e {key} not found in environment; skipping[/warning]")
|
|
301
327
|
generated_code, incremental, total_cost, model_name = code_generator_main(
|
|
302
328
|
ctx=ctx,
|
|
303
329
|
prompt_file=prompt_file,
|
|
304
330
|
output=output,
|
|
305
331
|
original_prompt_file_path=original_prompt_file_path,
|
|
306
|
-
force_incremental_flag=
|
|
332
|
+
force_incremental_flag=incremental_flag,
|
|
333
|
+
env_vars=env_vars or None,
|
|
307
334
|
)
|
|
308
335
|
return generated_code, total_cost, model_name
|
|
309
336
|
except Exception as exception:
|
|
@@ -1022,7 +1049,8 @@ def auto_deps(
|
|
|
1022
1049
|
quiet = ctx.obj.get("quiet", False)
|
|
1023
1050
|
command_name = "auto-deps"
|
|
1024
1051
|
try:
|
|
1025
|
-
|
|
1052
|
+
# Strip both single and double quotes from the provided path
|
|
1053
|
+
clean_directory_path = directory_path.strip("'\"")
|
|
1026
1054
|
|
|
1027
1055
|
modified_prompt, total_cost, model_name = auto_deps_main(
|
|
1028
1056
|
ctx=ctx,
|
pdd/code_generator_main.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import os
|
|
2
|
+
import re
|
|
2
3
|
import asyncio
|
|
3
4
|
import json
|
|
4
5
|
import pathlib
|
|
@@ -59,6 +60,25 @@ def is_git_repository(path: Optional[str] = None) -> bool:
|
|
|
59
60
|
return False
|
|
60
61
|
|
|
61
62
|
|
|
63
|
+
def _expand_vars(text: str, vars_map: Optional[Dict[str, str]]) -> str:
|
|
64
|
+
"""Replace $KEY and ${KEY} in text when KEY exists in vars_map. Leave others unchanged."""
|
|
65
|
+
if not text or not vars_map:
|
|
66
|
+
return text
|
|
67
|
+
|
|
68
|
+
def repl_braced(m: re.Match) -> str:
|
|
69
|
+
key = m.group(1)
|
|
70
|
+
return vars_map.get(key, m.group(0))
|
|
71
|
+
|
|
72
|
+
def repl_simple(m: re.Match) -> str:
|
|
73
|
+
key = m.group(1)
|
|
74
|
+
return vars_map.get(key, m.group(0))
|
|
75
|
+
|
|
76
|
+
# Replace ${KEY} first, then $KEY
|
|
77
|
+
text = re.sub(r"\$\{([A-Za-z_][A-Za-z0-9_]*)\}", repl_braced, text)
|
|
78
|
+
text = re.sub(r"\$([A-Za-z_][A-Za-z0-9_]*)", repl_simple, text)
|
|
79
|
+
return text
|
|
80
|
+
|
|
81
|
+
|
|
62
82
|
def get_git_content_at_ref(file_path: str, git_ref: str = "HEAD") -> Optional[str]:
|
|
63
83
|
"""Gets the content of the file as it was at the specified git_ref."""
|
|
64
84
|
abs_file_path = pathlib.Path(file_path).resolve()
|
|
@@ -131,6 +151,7 @@ def code_generator_main(
|
|
|
131
151
|
output: Optional[str],
|
|
132
152
|
original_prompt_file_path: Optional[str],
|
|
133
153
|
force_incremental_flag: bool,
|
|
154
|
+
env_vars: Optional[Dict[str, str]] = None,
|
|
134
155
|
) -> Tuple[str, bool, float, str]:
|
|
135
156
|
"""
|
|
136
157
|
CLI wrapper for generating code from prompts. Handles full and incremental generation,
|
|
@@ -190,6 +211,10 @@ def code_generator_main(
|
|
|
190
211
|
existing_code_content: Optional[str] = None
|
|
191
212
|
original_prompt_content_for_incremental: Optional[str] = None
|
|
192
213
|
|
|
214
|
+
# Expand variables in output path if provided
|
|
215
|
+
if output_path:
|
|
216
|
+
output_path = _expand_vars(output_path, env_vars)
|
|
217
|
+
|
|
193
218
|
if output_path and pathlib.Path(output_path).exists():
|
|
194
219
|
try:
|
|
195
220
|
existing_code_content = pathlib.Path(output_path).read_text(encoding="utf-8")
|
|
@@ -337,9 +362,18 @@ def code_generator_main(
|
|
|
337
362
|
if files_to_stage_for_rollback:
|
|
338
363
|
git_add_files(files_to_stage_for_rollback, verbose=verbose)
|
|
339
364
|
|
|
365
|
+
# Preprocess both prompts: expand includes, substitute vars, then double
|
|
366
|
+
orig_proc = pdd_preprocess(original_prompt_content_for_incremental, recursive=True, double_curly_brackets=False)
|
|
367
|
+
orig_proc = _expand_vars(orig_proc, env_vars)
|
|
368
|
+
orig_proc = pdd_preprocess(orig_proc, recursive=False, double_curly_brackets=True)
|
|
369
|
+
|
|
370
|
+
new_proc = pdd_preprocess(prompt_content, recursive=True, double_curly_brackets=False)
|
|
371
|
+
new_proc = _expand_vars(new_proc, env_vars)
|
|
372
|
+
new_proc = pdd_preprocess(new_proc, recursive=False, double_curly_brackets=True)
|
|
373
|
+
|
|
340
374
|
generated_code_content, was_incremental_operation, total_cost, model_name = incremental_code_generator_func(
|
|
341
|
-
original_prompt=
|
|
342
|
-
new_prompt=
|
|
375
|
+
original_prompt=orig_proc,
|
|
376
|
+
new_prompt=new_proc,
|
|
343
377
|
existing_code=existing_code_content,
|
|
344
378
|
language=language,
|
|
345
379
|
strength=strength,
|
|
@@ -347,7 +381,7 @@ def code_generator_main(
|
|
|
347
381
|
time=time_budget,
|
|
348
382
|
force_incremental=force_incremental_flag,
|
|
349
383
|
verbose=verbose,
|
|
350
|
-
preprocess_prompt=
|
|
384
|
+
preprocess_prompt=False
|
|
351
385
|
)
|
|
352
386
|
|
|
353
387
|
if not was_incremental_operation:
|
|
@@ -364,8 +398,10 @@ def code_generator_main(
|
|
|
364
398
|
|
|
365
399
|
if not current_execution_is_local:
|
|
366
400
|
if verbose: console.print("Attempting cloud code generation...")
|
|
367
|
-
|
|
368
|
-
processed_prompt_for_cloud = pdd_preprocess(prompt_content, recursive=True, double_curly_brackets=
|
|
401
|
+
# Expand includes, substitute vars, then double
|
|
402
|
+
processed_prompt_for_cloud = pdd_preprocess(prompt_content, recursive=True, double_curly_brackets=False, exclude_keys=[])
|
|
403
|
+
processed_prompt_for_cloud = _expand_vars(processed_prompt_for_cloud, env_vars)
|
|
404
|
+
processed_prompt_for_cloud = pdd_preprocess(processed_prompt_for_cloud, recursive=False, double_curly_brackets=True, exclude_keys=[])
|
|
369
405
|
if verbose: console.print(Panel(Text(processed_prompt_for_cloud, overflow="fold"), title="[cyan]Preprocessed Prompt for Cloud[/cyan]", expand=False))
|
|
370
406
|
|
|
371
407
|
jwt_token: Optional[str] = None
|
|
@@ -421,14 +457,18 @@ def code_generator_main(
|
|
|
421
457
|
|
|
422
458
|
if current_execution_is_local:
|
|
423
459
|
if verbose: console.print("Executing code generator locally...")
|
|
460
|
+
# Expand includes, substitute vars, then double; pass to local generator with preprocess_prompt=False
|
|
461
|
+
local_prompt = pdd_preprocess(prompt_content, recursive=True, double_curly_brackets=False, exclude_keys=[])
|
|
462
|
+
local_prompt = _expand_vars(local_prompt, env_vars)
|
|
463
|
+
local_prompt = pdd_preprocess(local_prompt, recursive=False, double_curly_brackets=True, exclude_keys=[])
|
|
424
464
|
generated_code_content, total_cost, model_name = local_code_generator_func(
|
|
425
|
-
prompt=
|
|
465
|
+
prompt=local_prompt,
|
|
426
466
|
language=language,
|
|
427
467
|
strength=strength,
|
|
428
468
|
temperature=temperature,
|
|
429
469
|
time=time_budget,
|
|
430
470
|
verbose=verbose,
|
|
431
|
-
preprocess_prompt=
|
|
471
|
+
preprocess_prompt=False
|
|
432
472
|
)
|
|
433
473
|
was_incremental_operation = False
|
|
434
474
|
if verbose:
|
pdd/construct_paths.py
CHANGED
|
@@ -433,6 +433,23 @@ def construct_paths(
|
|
|
433
433
|
file_extension=".py", # Dummy extension
|
|
434
434
|
context_config=context_config,
|
|
435
435
|
)
|
|
436
|
+
|
|
437
|
+
# Honor .pddrc generate_output_path explicitly for sync discovery (robust to logger source)
|
|
438
|
+
try:
|
|
439
|
+
cfg_gen_dir = context_config.get("generate_output_path")
|
|
440
|
+
current_gen = output_paths_str.get("generate_output_path")
|
|
441
|
+
# Only override when generator placed code at CWD root (the problematic case)
|
|
442
|
+
if cfg_gen_dir and current_gen and Path(current_gen).parent.resolve() == Path.cwd().resolve():
|
|
443
|
+
# Preserve the filename selected by generate_output_paths (e.g., basename + ext)
|
|
444
|
+
gen_filename = Path(current_gen).name
|
|
445
|
+
base_dir = Path.cwd()
|
|
446
|
+
# Compose absolute path under configured directory
|
|
447
|
+
abs_cfg_gen_dir = (base_dir / cfg_gen_dir).resolve() if not Path(cfg_gen_dir).is_absolute() else Path(cfg_gen_dir)
|
|
448
|
+
output_paths_str["generate_output_path"] = str((abs_cfg_gen_dir / gen_filename).resolve())
|
|
449
|
+
except Exception:
|
|
450
|
+
# Best-effort override; fall back silently if anything goes wrong
|
|
451
|
+
pass
|
|
452
|
+
|
|
436
453
|
# Infer base directories from a sample output path
|
|
437
454
|
gen_path = Path(output_paths_str.get("generate_output_path", "src"))
|
|
438
455
|
|
|
@@ -627,6 +644,23 @@ def construct_paths(
|
|
|
627
644
|
file_extension=file_extension,
|
|
628
645
|
context_config=context_config,
|
|
629
646
|
)
|
|
647
|
+
|
|
648
|
+
# For sync, explicitly honor .pddrc generate_output_path even if generator logged as 'default'
|
|
649
|
+
if command == "sync":
|
|
650
|
+
try:
|
|
651
|
+
cfg_gen_dir = context_config.get("generate_output_path")
|
|
652
|
+
current_gen = output_paths_str.get("generate_output_path")
|
|
653
|
+
# Only override when generator placed code at CWD root (the problematic case)
|
|
654
|
+
if cfg_gen_dir and current_gen and Path(current_gen).parent.resolve() == Path.cwd().resolve():
|
|
655
|
+
# Keep the filename chosen by generate_output_paths
|
|
656
|
+
gen_filename = Path(current_gen).name
|
|
657
|
+
# Resolve configured directory relative to CWD (or prompt file directory if available)
|
|
658
|
+
base_dir = Path.cwd()
|
|
659
|
+
abs_cfg_gen_dir = (base_dir / cfg_gen_dir).resolve() if not Path(cfg_gen_dir).is_absolute() else Path(cfg_gen_dir)
|
|
660
|
+
output_paths_str["generate_output_path"] = str((abs_cfg_gen_dir / gen_filename).resolve())
|
|
661
|
+
except Exception:
|
|
662
|
+
# Non-fatal; fall back to whatever generate_output_paths returned
|
|
663
|
+
pass
|
|
630
664
|
# Convert to Path objects for internal use
|
|
631
665
|
output_paths_resolved: Dict[str, Path] = {k: Path(v) for k, v in output_paths_str.items()}
|
|
632
666
|
|
pdd/pdd_completion.fish
CHANGED
|
@@ -34,6 +34,7 @@ complete -c pdd -n "__fish_use_subcommand" -a verify -d "Verify functional corre
|
|
|
34
34
|
complete -c pdd -n "__fish_seen_subcommand_from generate" -l output -r -d "Output location for generated code"
|
|
35
35
|
complete -c pdd -n "__fish_seen_subcommand_from generate" -l original-prompt -r -d "Original prompt file for incremental generation"
|
|
36
36
|
complete -c pdd -n "__fish_seen_subcommand_from generate" -l incremental -d "Force incremental patching"
|
|
37
|
+
complete -c pdd -n "__fish_seen_subcommand_from generate" -s e -l env -xa "(env | cut -d= -f1 | sed 's/$/=/' | sort -u)" -d "Set template variable (KEY=VALUE) or read KEY from env"
|
|
37
38
|
complete -c pdd -n "__fish_seen_subcommand_from generate" -a "(__fish_complete_suffix .prompt)"
|
|
38
39
|
|
|
39
40
|
complete -c pdd -n "__fish_seen_subcommand_from example" -l output -r -d "Output location for example code"
|
pdd/pdd_completion.sh
CHANGED
|
@@ -21,7 +21,7 @@ _pdd() {
|
|
|
21
21
|
local commands="generate example test preprocess fix split change update detect conflicts crash trace bug auto-deps verify"
|
|
22
22
|
|
|
23
23
|
# Command-specific options
|
|
24
|
-
local generate_opts="--output --original-prompt --incremental"
|
|
24
|
+
local generate_opts="--output --original-prompt --incremental --env -e"
|
|
25
25
|
local example_opts="--output"
|
|
26
26
|
local test_opts="--output --language --coverage-report --existing-tests --target-coverage --merge"
|
|
27
27
|
local preprocess_opts="--output --xml --recursive --double --exclude"
|
|
@@ -46,6 +46,16 @@ _pdd() {
|
|
|
46
46
|
# Complete command-specific options
|
|
47
47
|
case ${words[1]} in
|
|
48
48
|
generate)
|
|
49
|
+
# If completing the value for -e/--env, suggest environment variable names (with and without '=')
|
|
50
|
+
if [[ $prev == "-e" || $prev == "--env" ]]; then
|
|
51
|
+
local vars
|
|
52
|
+
vars=$(env | cut -d= -f1 | sort -u)
|
|
53
|
+
# Offer both KEY and KEY=
|
|
54
|
+
local vars_with_eq
|
|
55
|
+
vars_with_eq=$(printf '%s=\n' $vars)
|
|
56
|
+
COMPREPLY=($(compgen -W "$vars $vars_with_eq" -- "$cur"))
|
|
57
|
+
return
|
|
58
|
+
fi
|
|
49
59
|
_complete_files ".prompt"
|
|
50
60
|
COMPREPLY+=($(compgen -W "$generate_opts" -- "$cur"))
|
|
51
61
|
;;
|
|
@@ -157,4 +167,4 @@ _complete_files() {
|
|
|
157
167
|
fi
|
|
158
168
|
}
|
|
159
169
|
|
|
160
|
-
complete -F _pdd pdd
|
|
170
|
+
complete -F _pdd pdd
|
pdd/pdd_completion.zsh
CHANGED
|
@@ -65,6 +65,14 @@ _pdd_global_opts=(
|
|
|
65
65
|
# Per-subcommand completion functions
|
|
66
66
|
##
|
|
67
67
|
|
|
68
|
+
# Helper: suggest environment variables (KEY and KEY=)
|
|
69
|
+
_pdd_env_vars() {
|
|
70
|
+
local -a envs envs_eq
|
|
71
|
+
envs=(${(f)"$(env | cut -d= -f1 | sort -u)"})
|
|
72
|
+
envs_eq=(${envs/%/=})
|
|
73
|
+
_describe -t envvars 'environment variables' envs_eq envs
|
|
74
|
+
}
|
|
75
|
+
|
|
68
76
|
# generate
|
|
69
77
|
# Usage: pdd [GLOBAL OPTIONS] generate [OPTIONS] PROMPT_FILE
|
|
70
78
|
# Options:
|
|
@@ -77,6 +85,7 @@ _pdd_generate() {
|
|
|
77
85
|
'--output=[Specify where to save the generated code.]:filename:_files' \
|
|
78
86
|
'--original-prompt=[The original prompt file used to generate existing code.]:filename:_files' \
|
|
79
87
|
'--incremental[Force incremental patching even if changes are significant.]' \
|
|
88
|
+
'(-e --env)'{-e,--env}'[Set template variable (KEY=VALUE) or read KEY from env]:template variable:_pdd_env_vars' \
|
|
80
89
|
'1:prompt-file:_files' \
|
|
81
90
|
'*:filename:_files'
|
|
82
91
|
}
|
pdd/preprocess.py
CHANGED
|
@@ -172,6 +172,14 @@ def double_curly(text: str, exclude_keys: Optional[List[str]] = None) -> str:
|
|
|
172
172
|
"2": {{"id": "2", "name": "Resource Two"}}
|
|
173
173
|
}}"""
|
|
174
174
|
|
|
175
|
+
# Protect ${IDENT} placeholders so they remain unchanged
|
|
176
|
+
# Use placeholders that won't collide with typical content
|
|
177
|
+
protected_vars: List[str] = []
|
|
178
|
+
def _protect_var(m):
|
|
179
|
+
protected_vars.append(m.group(0))
|
|
180
|
+
return f"__PDD_VAR_{len(protected_vars)-1}__"
|
|
181
|
+
text = re.sub(r"\$\{[A-Za-z_][A-Za-z0-9_]*\}", _protect_var, text)
|
|
182
|
+
|
|
175
183
|
# First, protect any existing double curly braces
|
|
176
184
|
text = re.sub(r'\{\{([^{}]*)\}\}', r'__ALREADY_DOUBLED__\1__END_ALREADY__', text)
|
|
177
185
|
|
|
@@ -188,6 +196,12 @@ def double_curly(text: str, exclude_keys: Optional[List[str]] = None) -> str:
|
|
|
188
196
|
|
|
189
197
|
# Restore already doubled brackets
|
|
190
198
|
text = re.sub(r'__ALREADY_DOUBLED__(.*?)__END_ALREADY__', r'{{\1}}', text)
|
|
199
|
+
|
|
200
|
+
# Restore protected ${IDENT} placeholders
|
|
201
|
+
def _restore_var(m):
|
|
202
|
+
idx = int(m.group(1))
|
|
203
|
+
return protected_vars[idx] if 0 <= idx < len(protected_vars) else m.group(0)
|
|
204
|
+
text = re.sub(r"__PDD_VAR_(\d+)__", _restore_var, text)
|
|
191
205
|
|
|
192
206
|
# Special handling for code blocks
|
|
193
207
|
code_block_pattern = r'```([\w\s]*)\n([\s\S]*?)```'
|
|
@@ -213,4 +227,4 @@ def double_curly(text: str, exclude_keys: Optional[List[str]] = None) -> str:
|
|
|
213
227
|
# Process code blocks
|
|
214
228
|
text = re.sub(code_block_pattern, process_code_block, text, flags=re.DOTALL)
|
|
215
229
|
|
|
216
|
-
return text
|
|
230
|
+
return text
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pdd-cli
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.55
|
|
4
4
|
Summary: PDD (Prompt-Driven Development) Command Line Interface
|
|
5
5
|
Author: Greg Tanaka
|
|
6
6
|
Author-email: glt@alumni.caltech.edu
|
|
@@ -51,7 +51,7 @@ Requires-Dist: build; extra == "dev"
|
|
|
51
51
|
Requires-Dist: twine; extra == "dev"
|
|
52
52
|
Dynamic: license-file
|
|
53
53
|
|
|
54
|
-
.. image:: https://img.shields.io/badge/pdd--cli-v0.0.
|
|
54
|
+
.. image:: https://img.shields.io/badge/pdd--cli-v0.0.55-blue
|
|
55
55
|
:alt: PDD-CLI Version
|
|
56
56
|
|
|
57
57
|
.. image:: https://img.shields.io/badge/Discord-join%20chat-7289DA.svg?logo=discord&logoColor=white&link=https://discord.gg/Yp4RTh8bG7
|
|
@@ -128,7 +128,7 @@ After installation, verify:
|
|
|
128
128
|
|
|
129
129
|
pdd --version
|
|
130
130
|
|
|
131
|
-
You'll see the current PDD version (e.g., 0.0.
|
|
131
|
+
You'll see the current PDD version (e.g., 0.0.55).
|
|
132
132
|
|
|
133
133
|
Getting Started with Examples
|
|
134
134
|
-----------------------------
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
pdd/__init__.py,sha256=
|
|
1
|
+
pdd/__init__.py,sha256=8100eVNrSFeW_1cEQnyzi8_VJRy0ugsp5qEgZxrIYI4,633
|
|
2
2
|
pdd/auto_deps_main.py,sha256=iV2khcgSejiXjh5hiQqeu_BJQOLfTKXhMx14j6vRlf8,3916
|
|
3
3
|
pdd/auto_include.py,sha256=OJcdcwTwJNqHPHKG9P4m9Ij-PiLex0EbuwJP0uiQi_Y,7484
|
|
4
4
|
pdd/auto_update.py,sha256=w6jzTnMiYRNpwQHQxWNiIAwQ0d6xh1iOB3xgDsabWtc,5236
|
|
@@ -6,14 +6,14 @@ pdd/bug_main.py,sha256=INFWwD3TU00cBmTqFcScAoK25LsZE1zkinmnSM7ElS0,4787
|
|
|
6
6
|
pdd/bug_to_unit_test.py,sha256=BoQqNyKQpBQDW8-JwBH_RX4RHRSiU8Kk3EplFrkECt0,6665
|
|
7
7
|
pdd/change.py,sha256=Hg_x0pa370-e6oDiczaTgFAy3Am9ReCPkqFrvqv4U38,6114
|
|
8
8
|
pdd/change_main.py,sha256=oTQz9DUy6pIqq5CJzHIk01NrC88Xrm4FNEu0e-1Hx5Y,27748
|
|
9
|
-
pdd/cli.py,sha256=
|
|
9
|
+
pdd/cli.py,sha256=qEUKzReooccQGIUNvoWAqMagW3NpbWZ63iyqToYgnyg,45299
|
|
10
10
|
pdd/cmd_test_main.py,sha256=5ftxDNNklDlHodkW8Rluvo3NKMHyMNhumG7G8mSoM9g,7716
|
|
11
11
|
pdd/code_generator.py,sha256=AxMRZKGIlLh9xWdn2FA6b3zSoZ-5TIZNIAzqjFboAQs,4718
|
|
12
|
-
pdd/code_generator_main.py,sha256=
|
|
12
|
+
pdd/code_generator_main.py,sha256=WmPdOUqkOy-P3apUsyBeFvRkObgXEZnmUBxA9h9cgTc,27945
|
|
13
13
|
pdd/comment_line.py,sha256=sX2hf4bG1fILi_rvI9MkkwCZ2IitgKkW7nOiw8aQKPY,1845
|
|
14
14
|
pdd/conflicts_in_prompts.py,sha256=9N3rZWdJUGayOTOgnHW9G_Jm1C9G4Y8hSLhnURc1BkY,4890
|
|
15
15
|
pdd/conflicts_main.py,sha256=U23aJqJ6pgLDDCz-AaejWnG-qsTGAhZ9024KsHR9pYU,3650
|
|
16
|
-
pdd/construct_paths.py,sha256=
|
|
16
|
+
pdd/construct_paths.py,sha256=RANlDYtLDp0YNqFPgpQBZvdp038wkkgvFkXGytWKyJw,33251
|
|
17
17
|
pdd/context_generator.py,sha256=HAptXNSFTGu4rHw2SceiCcoCunIemESNCMVNqY1w6hU,6107
|
|
18
18
|
pdd/context_generator_main.py,sha256=3riIDV2QskAMP-eq-uFicML79zQ5X-KMdw91g1RbP4E,4094
|
|
19
19
|
pdd/continue_generation.py,sha256=nEkAKZd9lM7OelQkffP99Y-JLxTFZeY3AH9VLRQCjHg,7854
|
|
@@ -45,12 +45,12 @@ pdd/llm_invoke.py,sha256=US8J9oZZdVgLIjcmOI-YyHu6z2un43ZN811IcQBmAIA,96728
|
|
|
45
45
|
pdd/load_prompt_template.py,sha256=stt42Og0PzXy0N_bsaivk5e2l5z_BnHiXIJZM14oVWw,2673
|
|
46
46
|
pdd/logo_animation.py,sha256=n6HJWzuFze2csAAW2-zbxfjvWFYRI4hIdwVBtHBOkj4,20782
|
|
47
47
|
pdd/mcp_config.json,sha256=D3ctWHlShvltbtH37zbYb6smVE0V80_lGjDKDIqsSBE,124
|
|
48
|
-
pdd/pdd_completion.fish,sha256=
|
|
49
|
-
pdd/pdd_completion.sh,sha256=
|
|
50
|
-
pdd/pdd_completion.zsh,sha256=
|
|
48
|
+
pdd/pdd_completion.fish,sha256=K4qT52-9LG6apKVH0Bgfqk1Kqfketb47ge_6mcacVFE,12089
|
|
49
|
+
pdd/pdd_completion.sh,sha256=DI2gJc7IxqjgKyEgjmoi8ev3f9Gs3LJrRgSQ-u2T6ms,5844
|
|
50
|
+
pdd/pdd_completion.zsh,sha256=f4BxXrLZUEcFeIUmXWdnFOTnTpJBFZ8KGpnIdjDdKFo,15353
|
|
51
51
|
pdd/postprocess.py,sha256=mNw3iSDxE-eTYo3QwJCj_EmdEnnB5ysUN62YPapC_IM,4433
|
|
52
52
|
pdd/postprocess_0.py,sha256=OW17GyCFLYErCyWh2tL4syuho3q2yFf2wyekQ4BLdPM,2168
|
|
53
|
-
pdd/preprocess.py,sha256=
|
|
53
|
+
pdd/preprocess.py,sha256=XdMSJDqkMQk_wO7ysOYELIpIXEIig-9pBqiEhm9QdsU,10108
|
|
54
54
|
pdd/preprocess_main.py,sha256=CwmU3WcXdsZ3vJN0Z0eCv_CbiybXu4O9BxFkCmZz6v4,3209
|
|
55
55
|
pdd/process_csv_change.py,sha256=ckNqVPRooWVyIvmqjdEgo2PDLnpoQ6Taa2dUaWGRlzU,27926
|
|
56
56
|
pdd/pytest_output.py,sha256=IrRKYneW_F6zv9WaJwKFGnOBLFBFjk1CnhO_EVAjb9E,6612
|
|
@@ -108,9 +108,9 @@ pdd/prompts/trim_results_start_LLM.prompt,sha256=OKz8fAf1cYWKWgslFOHEkUpfaUDARh3
|
|
|
108
108
|
pdd/prompts/unfinished_prompt_LLM.prompt,sha256=vud_G9PlVv9Ig64uBC-hPEVFRk5lwpc8pW6tOIxJM4I,5082
|
|
109
109
|
pdd/prompts/update_prompt_LLM.prompt,sha256=prIc8uLp2jqnLTHt6JvWDZGanPZipivhhYeXe0lVaYw,1328
|
|
110
110
|
pdd/prompts/xml_convertor_LLM.prompt,sha256=YGRGXJeg6EhM9690f-SKqQrKqSJjLFD51UrPOlO0Frg,2786
|
|
111
|
-
pdd_cli-0.0.
|
|
112
|
-
pdd_cli-0.0.
|
|
113
|
-
pdd_cli-0.0.
|
|
114
|
-
pdd_cli-0.0.
|
|
115
|
-
pdd_cli-0.0.
|
|
116
|
-
pdd_cli-0.0.
|
|
111
|
+
pdd_cli-0.0.55.dist-info/licenses/LICENSE,sha256=kvTJnnxPVTYlGKSY4ZN1kzdmJ0lxRdNWxgupaB27zsU,1066
|
|
112
|
+
pdd_cli-0.0.55.dist-info/METADATA,sha256=rTxcHx_5zGrZE1Wmt70PckDsEHfo6GGtV_0id6UraZc,12597
|
|
113
|
+
pdd_cli-0.0.55.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
114
|
+
pdd_cli-0.0.55.dist-info/entry_points.txt,sha256=Kr8HtNVb8uHZtQJNH4DnF8j7WNgWQbb7_Pw5hECSR-I,36
|
|
115
|
+
pdd_cli-0.0.55.dist-info/top_level.txt,sha256=xjnhIACeMcMeDfVNREgQZl4EbTni2T11QkL5r7E-sbE,4
|
|
116
|
+
pdd_cli-0.0.55.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|