pdd-cli 0.0.56__py3-none-any.whl → 0.0.57__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/trace.py CHANGED
@@ -1,4 +1,4 @@
1
- from typing import Tuple, Optional
1
+ from typing import Tuple, Optional, List
2
2
  from rich import print
3
3
  from rich.console import Console
4
4
  from pydantic import BaseModel, Field
@@ -10,6 +10,39 @@ from .llm_invoke import llm_invoke
10
10
  from . import DEFAULT_TIME, DEFAULT_STRENGTH
11
11
  console = Console()
12
12
 
13
+
14
+ def _normalize_text(value: str) -> str:
15
+ if value is None:
16
+ return ""
17
+ value = value.replace("\u201c", '"').replace("\u201d", '"')
18
+ value = value.replace("\u2018", "'").replace("\u2019", "'")
19
+ value = value.replace("\u00A0", " ")
20
+ value = re.sub(r"\s+", " ", value.strip())
21
+ return value
22
+
23
+
24
+ def _fallback_prompt_line(prompt_lines: List[str], code_str: str) -> int:
25
+ """Best-effort deterministic fallback to select a prompt line."""
26
+ normalized_code = _normalize_text(code_str).casefold()
27
+ tokens = [tok for tok in re.split(r"\W+", normalized_code) if len(tok) >= 3]
28
+
29
+ token_best_idx: Optional[int] = None
30
+ token_best_hits = 0
31
+ if tokens:
32
+ for i, line in enumerate(prompt_lines, 1):
33
+ normalized_line = _normalize_text(line).casefold()
34
+ hits = sum(1 for tok in tokens if tok in normalized_line)
35
+ if hits > token_best_hits:
36
+ token_best_hits = hits
37
+ token_best_idx = i
38
+ if token_best_idx is not None and token_best_hits > 0:
39
+ return token_best_idx
40
+
41
+ for i, line in enumerate(prompt_lines, 1):
42
+ if _normalize_text(line):
43
+ return i
44
+ return 1
45
+
13
46
  class PromptLineOutput(BaseModel):
14
47
  prompt_line: str = Field(description="The line from the prompt file that matches the code")
15
48
 
@@ -109,15 +142,6 @@ def trace(
109
142
  console.print(f"Searching for line: {prompt_line_str}")
110
143
 
111
144
  # Robust normalization for comparison
112
- def normalize_text(s: str) -> str:
113
- if s is None:
114
- return ""
115
- s = s.replace("\u201c", '"').replace("\u201d", '"') # smart double quotes → straight
116
- s = s.replace("\u2018", "'").replace("\u2019", "'") # smart single quotes → straight
117
- s = s.replace("\u00A0", " ") # non-breaking space → space
118
- s = re.sub(r"\s+", " ", s.strip()) # collapse whitespace
119
- return s
120
-
121
145
  # If the model echoed wrapper tags like <llm_output>...</llm_output>, extract inner text
122
146
  raw_search = prompt_line_str
123
147
  try:
@@ -127,12 +151,12 @@ def trace(
127
151
  except Exception:
128
152
  pass
129
153
 
130
- normalized_search = normalize_text(raw_search).casefold()
154
+ normalized_search = _normalize_text(raw_search).casefold()
131
155
  best_candidate_idx = None
132
156
  best_candidate_len = 0
133
157
 
134
158
  for i, line in enumerate(prompt_lines, 1):
135
- normalized_line = normalize_text(line).casefold()
159
+ normalized_line = _normalize_text(line).casefold()
136
160
  line_len = len(normalized_line)
137
161
 
138
162
  # Base similarity
@@ -246,14 +270,26 @@ def trace(
246
270
  f"[yellow]Low-confidence multi-line match selected (ratio={win_best_ratio:.3f}).[/yellow]"
247
271
  )
248
272
 
273
+ # Step 7c: Deterministic fallback when LLM output cannot be matched reliably
274
+ fallback_used = False
275
+ if best_match is None:
276
+ best_match = _fallback_prompt_line(prompt_lines, code_str)
277
+ fallback_used = True
278
+
249
279
  # Step 8: Return results
250
280
  if verbose:
251
281
  console.print(f"[green]Found matching line: {best_match}[/green]")
252
282
  console.print(f"[green]Total cost: ${total_cost:.6f}[/green]")
253
283
  console.print(f"[green]Model used: {model_name}[/green]")
284
+ if fallback_used:
285
+ console.print("[yellow]Fallback matching heuristic was used.[/yellow]")
254
286
 
255
287
  return best_match, total_cost, model_name
256
288
 
257
289
  except Exception as e:
258
290
  console.print(f"[bold red]Error in trace function: {str(e)}[/bold red]")
259
- return None, 0.0, ""
291
+ try:
292
+ fallback_line = _fallback_prompt_line(prompt_file.splitlines(), code_file.splitlines()[code_line - 1] if 0 < code_line <= len(code_file.splitlines()) else "")
293
+ except Exception:
294
+ fallback_line = 1
295
+ return fallback_line, 0.0, "fallback"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pdd-cli
3
- Version: 0.0.56
3
+ Version: 0.0.57
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.56-blue
54
+ .. image:: https://img.shields.io/badge/pdd--cli-v0.0.57-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.56).
131
+ You'll see the current PDD version (e.g., 0.0.57).
132
132
 
133
133
  Getting Started with Examples
134
134
  -----------------------------
@@ -1,4 +1,4 @@
1
- pdd/__init__.py,sha256=ca8MfVovv1zfjBoDhLPWEWu1bOMwbT7XY3CcRF635Sg,633
1
+ pdd/__init__.py,sha256=c7_rZfVUGfMl_L9YRmXqSUq_hMgTOjG1KknWvXAR0JQ,633
2
2
  pdd/auto_deps_main.py,sha256=cpP3bbzVL3jomrGinpzTxzIDIC8tmDDYOwUAC1TKRaw,3970
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=EtaGTuucQ7VgqOhyg4o6GFG7_QtTsDPTrRdGJWT648M,4841
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=04VHiO_D-jlfeRn6rrVH7ZTA5agXPoJGm1StGI8--XY,27804
9
- pdd/cli.py,sha256=njGVezstZGTeinhrUdOQ2K21Wpt1jiA5jU6BT7OZpaY,46782
9
+ pdd/cli.py,sha256=kLmJZ-2ETIbbpclwM7cQuaVfAiUNTBxJ9RtB0CsF2h0,55355
10
10
  pdd/cmd_test_main.py,sha256=M-i5x26ORXurt_pu8x1sgLAyVIItbuRThiux4wBg3Ls,7768
11
11
  pdd/code_generator.py,sha256=AxMRZKGIlLh9xWdn2FA6b3zSoZ-5TIZNIAzqjFboAQs,4718
12
- pdd/code_generator_main.py,sha256=RwyjzrC1NHOfJJkfxdwWwJf_UNAy2lCWjSyasucG2KU,27997
12
+ pdd/code_generator_main.py,sha256=UtoskalEPpMAvCO-zd6xmr1lbQqSWQ7BvYgNJCybqok,35151
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=SK8eljbAY_wWT4dieRSsQwBrU1Dm90MImry3AGL-Dj4,3704
16
- pdd/construct_paths.py,sha256=BDXDazbMOwgSLbYhCmgUwYIg0QPrjj8AVRbmFGJQIm4,33966
16
+ pdd/construct_paths.py,sha256=JT0Mk-rkHoMaRdEdIbXy4sPYfg-eI3SWuxLh983_ACc,34252
17
17
  pdd/context_generator.py,sha256=HAptXNSFTGu4rHw2SceiCcoCunIemESNCMVNqY1w6hU,6107
18
18
  pdd/context_generator_main.py,sha256=ORpokRM9ZToBdMhFpM76iXkCGySyv2wsbQiyl4Ir5lQ,4147
19
19
  pdd/continue_generation.py,sha256=nEkAKZd9lM7OelQkffP99Y-JLxTFZeY3AH9VLRQCjHg,7854
@@ -50,7 +50,7 @@ pdd/pdd_completion.sh,sha256=DI2gJc7IxqjgKyEgjmoi8ev3f9Gs3LJrRgSQ-u2T6ms,5844
50
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=XdMSJDqkMQk_wO7ysOYELIpIXEIig-9pBqiEhm9QdsU,10108
53
+ pdd/preprocess.py,sha256=75-J1smdi1Uq7gRQRLtVdkIfwltkeIvIZE-TkxxxCz0,12326
54
54
  pdd/preprocess_main.py,sha256=WGhOB9qEu7MmFoyXNml_AmqGii73LJWngx4kTlZ526k,3262
55
55
  pdd/process_csv_change.py,sha256=ckNqVPRooWVyIvmqjdEgo2PDLnpoQ6Taa2dUaWGRlzU,27926
56
56
  pdd/pytest_output.py,sha256=IrRKYneW_F6zv9WaJwKFGnOBLFBFjk1CnhO_EVAjb9E,6612
@@ -62,7 +62,8 @@ pdd/sync_animation.py,sha256=e7Qb4m70BHYpl37CuuF-95j-APctPL4Zm_o1PSTTRFQ,28070
62
62
  pdd/sync_determine_operation.py,sha256=o4wQSaOP3rGzkPuB5aVySdzhYdHiMWQvXFZPHZl99pc,60248
63
63
  pdd/sync_main.py,sha256=MrQldtBDeClNPtBECRR4Sy5LM_-TkPSNSnuNXdTxb10,13744
64
64
  pdd/sync_orchestration.py,sha256=tQydUxozSikHbXWBb8GtZMEDR3aRwePKdEGZukuH6uM,69966
65
- pdd/trace.py,sha256=Ty-r3ZQC5k3PUCUacgfzg4sO8RgcH8kquSDau-jHkec,10874
65
+ pdd/template_registry.py,sha256=L8ZQ-apmdDe7Jj_JlgHv7fUoIiJnGDuE0V64Y-MO9vA,8099
66
+ pdd/trace.py,sha256=ArdyOuMqm1dZDEDCLF6UsTOyKeAwoPLpPwaE5HHIgIE,12232
66
67
  pdd/trace_main.py,sha256=SOnMEHta9WaMAxulMrk6aFojma4ti61ILvJp3NVhpbg,4992
67
68
  pdd/track_cost.py,sha256=vsLrQmipjG1BW4P9Wl33qoS8XFJDYBVY4ruQqKjPEx0,4238
68
69
  pdd/unfinished_prompt.py,sha256=8En5NZqg6eCL6b451T_ndJx5ln1XDtFJyieW4pKRakE,5955
@@ -70,7 +71,7 @@ pdd/update_main.py,sha256=SWCd7Us3YatrDR7B66dQCpRCIgQoMHysPzxa4dedVmk,4385
70
71
  pdd/update_model_costs.py,sha256=RfeOlAHtc1FCx47A7CjrH2t5WXQclQ_9uYtNjtQh75I,22998
71
72
  pdd/update_prompt.py,sha256=zc-HiI1cwGBkJHVmNDyoSZa13lZH90VdB9l8ajdj6Kk,4543
72
73
  pdd/xml_tagger.py,sha256=5Bc3HRm7iz_XjBdzQIcMb8KocUQ8PELI2NN5Gw4amd4,4825
73
- pdd/data/language_format.csv,sha256=pWF3yCh6xOFNmrr2TxTnye7EPKT3c-LPjmYV3Qc0a-Y,933
74
+ pdd/data/language_format.csv,sha256=shimgYTHMJtfKQ1wpjjLto27TaMKU4OzNJ4hLeoXHms,957
74
75
  pdd/data/llm_model.csv,sha256=UxllgS0btSpCKpPgPnaTFAtZsAynBhLeZyoIVo0Tpwc,1698
75
76
  pdd/prompts/auto_include_LLM.prompt,sha256=sNF2rdJu9wJ8c0lwjCfZ9ZReX8zGXRUNehRs1ZiyDoc,12108
76
77
  pdd/prompts/bug_to_unit_test_LLM.prompt,sha256=KdMkvRVnjVSf0NTYIaDXIMT93xPttXEwkMpjWx5leLs,1588
@@ -89,7 +90,7 @@ pdd/prompts/extract_program_code_fix_LLM.prompt,sha256=bXxYrVtxnjWKrmidVi3bT-o6w
89
90
  pdd/prompts/extract_prompt_change_LLM.prompt,sha256=1e3AxcVpZ85t7pVvXqCpBUJzGI995MIimXicClagSvw,366
90
91
  pdd/prompts/extract_prompt_split_LLM.prompt,sha256=rhStDroVxDYRcCjYq7XCCub8B-KmfCFj5_7PxhgMmz0,1097
91
92
  pdd/prompts/extract_prompt_update_LLM.prompt,sha256=htttAp-QC6YycnfhFVsLhTM0uvhyEz9TEoGdFyZS8Yw,910
92
- pdd/prompts/extract_promptline_LLM.prompt,sha256=owIBRaF2bWwg3S64uyMKzOFMdvvmI_EEGoF97Pa9118,813
93
+ pdd/prompts/extract_promptline_LLM.prompt,sha256=mPeTjVaYJtgz2ygO0TVeO3vgmoBvWOWFSrwd1wKXJ74,831
93
94
  pdd/prompts/extract_unit_code_fix_LLM.prompt,sha256=c4l6twMLC2YqDDvOj_DcaKmJQF8kIupeqvkueK_OQng,14301
94
95
  pdd/prompts/extract_xml_LLM.prompt,sha256=eRcHaL-khShpb7C1_b7wmBJHfo2Kh1Wvjo_aOcWZovU,561
95
96
  pdd/prompts/find_verification_errors_LLM.prompt,sha256=NwmJbAFkNwSWaJOsewznb7hbOljc9AJ-Sf6fB7xIACI,2863
@@ -102,15 +103,16 @@ pdd/prompts/insert_includes_LLM.prompt,sha256=g-p2gXKENsqvfK5Q9FYbqFsIJ5CP7rbxmd
102
103
  pdd/prompts/split_LLM.prompt,sha256=cMVyazsue6eerOPYeueqpSNRiITy1ht0HgGytPFiQIk,6244
103
104
  pdd/prompts/summarize_file_LLM.prompt,sha256=qb9K61XMVFy7hgGITglI37Xg7yLPAGQBm0rUBEqRnEc,387
104
105
  pdd/prompts/sync_analysis_LLM.prompt,sha256=tU_0MlvmS5OT2zMCaldkaL-kX2x6pzZSa3uuKHLwUg0,3925
105
- pdd/prompts/trace_LLM.prompt,sha256=XTPoQQpKrF7BtWkCJPIrinn448VyBGXJieibMsMP-y0,1231
106
+ pdd/prompts/trace_LLM.prompt,sha256=0fHSXQbUAqQ7ABRcyYxesA1SVPbDQWCDwcW4VLPuTBA,1233
106
107
  pdd/prompts/trim_results_LLM.prompt,sha256=w4aL0S7v7fPSi3L9XeQR3mUOgNv3hpTDqi4rOtu7L7I,4033
107
108
  pdd/prompts/trim_results_start_LLM.prompt,sha256=OKz8fAf1cYWKWgslFOHEkUpfaUDARh3DD9L7ud9FOVE,2177
108
109
  pdd/prompts/unfinished_prompt_LLM.prompt,sha256=vud_G9PlVv9Ig64uBC-hPEVFRk5lwpc8pW6tOIxJM4I,5082
109
110
  pdd/prompts/update_prompt_LLM.prompt,sha256=prIc8uLp2jqnLTHt6JvWDZGanPZipivhhYeXe0lVaYw,1328
110
111
  pdd/prompts/xml_convertor_LLM.prompt,sha256=YGRGXJeg6EhM9690f-SKqQrKqSJjLFD51UrPOlO0Frg,2786
111
- pdd_cli-0.0.56.dist-info/licenses/LICENSE,sha256=kvTJnnxPVTYlGKSY4ZN1kzdmJ0lxRdNWxgupaB27zsU,1066
112
- pdd_cli-0.0.56.dist-info/METADATA,sha256=xVQb-QcyhglRDa-RDyTZ4EuSvQccTUcdlfaL5L8PR9s,12597
113
- pdd_cli-0.0.56.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
114
- pdd_cli-0.0.56.dist-info/entry_points.txt,sha256=Kr8HtNVb8uHZtQJNH4DnF8j7WNgWQbb7_Pw5hECSR-I,36
115
- pdd_cli-0.0.56.dist-info/top_level.txt,sha256=xjnhIACeMcMeDfVNREgQZl4EbTni2T11QkL5r7E-sbE,4
116
- pdd_cli-0.0.56.dist-info/RECORD,,
112
+ pdd/templates/architecture/architecture_json.prompt,sha256=uSNSsKTL-cuMMhi5a4GSpC94DKkOFAlXh7R0CUlo-hg,8126
113
+ pdd_cli-0.0.57.dist-info/licenses/LICENSE,sha256=kvTJnnxPVTYlGKSY4ZN1kzdmJ0lxRdNWxgupaB27zsU,1066
114
+ pdd_cli-0.0.57.dist-info/METADATA,sha256=5c-XFXqAOnpojCQwch2BmM4JsxO3YrgVhPGq-bduSOU,12597
115
+ pdd_cli-0.0.57.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
116
+ pdd_cli-0.0.57.dist-info/entry_points.txt,sha256=Kr8HtNVb8uHZtQJNH4DnF8j7WNgWQbb7_Pw5hECSR-I,36
117
+ pdd_cli-0.0.57.dist-info/top_level.txt,sha256=xjnhIACeMcMeDfVNREgQZl4EbTni2T11QkL5r7E-sbE,4
118
+ pdd_cli-0.0.57.dist-info/RECORD,,