pdd-cli 0.0.45__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.
Files changed (114) hide show
  1. pdd/__init__.py +4 -4
  2. pdd/agentic_common.py +863 -0
  3. pdd/agentic_crash.py +534 -0
  4. pdd/agentic_fix.py +1179 -0
  5. pdd/agentic_langtest.py +162 -0
  6. pdd/agentic_update.py +370 -0
  7. pdd/agentic_verify.py +183 -0
  8. pdd/auto_deps_main.py +15 -5
  9. pdd/auto_include.py +63 -5
  10. pdd/bug_main.py +3 -2
  11. pdd/bug_to_unit_test.py +2 -0
  12. pdd/change_main.py +11 -4
  13. pdd/cli.py +22 -1181
  14. pdd/cmd_test_main.py +73 -21
  15. pdd/code_generator.py +58 -18
  16. pdd/code_generator_main.py +672 -25
  17. pdd/commands/__init__.py +42 -0
  18. pdd/commands/analysis.py +248 -0
  19. pdd/commands/fix.py +140 -0
  20. pdd/commands/generate.py +257 -0
  21. pdd/commands/maintenance.py +174 -0
  22. pdd/commands/misc.py +79 -0
  23. pdd/commands/modify.py +230 -0
  24. pdd/commands/report.py +144 -0
  25. pdd/commands/templates.py +215 -0
  26. pdd/commands/utility.py +110 -0
  27. pdd/config_resolution.py +58 -0
  28. pdd/conflicts_main.py +8 -3
  29. pdd/construct_paths.py +258 -82
  30. pdd/context_generator.py +10 -2
  31. pdd/context_generator_main.py +113 -11
  32. pdd/continue_generation.py +47 -7
  33. pdd/core/__init__.py +0 -0
  34. pdd/core/cli.py +503 -0
  35. pdd/core/dump.py +554 -0
  36. pdd/core/errors.py +63 -0
  37. pdd/core/utils.py +90 -0
  38. pdd/crash_main.py +44 -11
  39. pdd/data/language_format.csv +71 -63
  40. pdd/data/llm_model.csv +20 -18
  41. pdd/detect_change_main.py +5 -4
  42. pdd/fix_code_loop.py +330 -76
  43. pdd/fix_error_loop.py +207 -61
  44. pdd/fix_errors_from_unit_tests.py +4 -3
  45. pdd/fix_main.py +75 -18
  46. pdd/fix_verification_errors.py +12 -100
  47. pdd/fix_verification_errors_loop.py +306 -272
  48. pdd/fix_verification_main.py +28 -9
  49. pdd/generate_output_paths.py +93 -10
  50. pdd/generate_test.py +16 -5
  51. pdd/get_jwt_token.py +9 -2
  52. pdd/get_run_command.py +73 -0
  53. pdd/get_test_command.py +68 -0
  54. pdd/git_update.py +70 -19
  55. pdd/incremental_code_generator.py +2 -2
  56. pdd/insert_includes.py +11 -3
  57. pdd/llm_invoke.py +1269 -103
  58. pdd/load_prompt_template.py +36 -10
  59. pdd/pdd_completion.fish +25 -2
  60. pdd/pdd_completion.sh +30 -4
  61. pdd/pdd_completion.zsh +79 -4
  62. pdd/postprocess.py +10 -3
  63. pdd/preprocess.py +228 -15
  64. pdd/preprocess_main.py +8 -5
  65. pdd/prompts/agentic_crash_explore_LLM.prompt +49 -0
  66. pdd/prompts/agentic_fix_explore_LLM.prompt +45 -0
  67. pdd/prompts/agentic_fix_harvest_only_LLM.prompt +48 -0
  68. pdd/prompts/agentic_fix_primary_LLM.prompt +85 -0
  69. pdd/prompts/agentic_update_LLM.prompt +1071 -0
  70. pdd/prompts/agentic_verify_explore_LLM.prompt +45 -0
  71. pdd/prompts/auto_include_LLM.prompt +100 -905
  72. pdd/prompts/detect_change_LLM.prompt +122 -20
  73. pdd/prompts/example_generator_LLM.prompt +22 -1
  74. pdd/prompts/extract_code_LLM.prompt +5 -1
  75. pdd/prompts/extract_program_code_fix_LLM.prompt +7 -1
  76. pdd/prompts/extract_prompt_update_LLM.prompt +7 -8
  77. pdd/prompts/extract_promptline_LLM.prompt +17 -11
  78. pdd/prompts/find_verification_errors_LLM.prompt +6 -0
  79. pdd/prompts/fix_code_module_errors_LLM.prompt +4 -2
  80. pdd/prompts/fix_errors_from_unit_tests_LLM.prompt +8 -0
  81. pdd/prompts/fix_verification_errors_LLM.prompt +22 -0
  82. pdd/prompts/generate_test_LLM.prompt +21 -6
  83. pdd/prompts/increase_tests_LLM.prompt +1 -5
  84. pdd/prompts/insert_includes_LLM.prompt +228 -108
  85. pdd/prompts/trace_LLM.prompt +25 -22
  86. pdd/prompts/unfinished_prompt_LLM.prompt +85 -1
  87. pdd/prompts/update_prompt_LLM.prompt +22 -1
  88. pdd/pytest_output.py +127 -12
  89. pdd/render_mermaid.py +236 -0
  90. pdd/setup_tool.py +648 -0
  91. pdd/simple_math.py +2 -0
  92. pdd/split_main.py +3 -2
  93. pdd/summarize_directory.py +49 -6
  94. pdd/sync_determine_operation.py +543 -98
  95. pdd/sync_main.py +81 -31
  96. pdd/sync_orchestration.py +1334 -751
  97. pdd/sync_tui.py +848 -0
  98. pdd/template_registry.py +264 -0
  99. pdd/templates/architecture/architecture_json.prompt +242 -0
  100. pdd/templates/generic/generate_prompt.prompt +174 -0
  101. pdd/trace.py +168 -12
  102. pdd/trace_main.py +4 -3
  103. pdd/track_cost.py +151 -61
  104. pdd/unfinished_prompt.py +49 -3
  105. pdd/update_main.py +549 -67
  106. pdd/update_model_costs.py +2 -2
  107. pdd/update_prompt.py +19 -4
  108. {pdd_cli-0.0.45.dist-info → pdd_cli-0.0.90.dist-info}/METADATA +19 -6
  109. pdd_cli-0.0.90.dist-info/RECORD +153 -0
  110. {pdd_cli-0.0.45.dist-info → pdd_cli-0.0.90.dist-info}/licenses/LICENSE +1 -1
  111. pdd_cli-0.0.45.dist-info/RECORD +0 -116
  112. {pdd_cli-0.0.45.dist-info → pdd_cli-0.0.90.dist-info}/WHEEL +0 -0
  113. {pdd_cli-0.0.45.dist-info → pdd_cli-0.0.90.dist-info}/entry_points.txt +0 -0
  114. {pdd_cli-0.0.45.dist-info → pdd_cli-0.0.90.dist-info}/top_level.txt +0 -0
pdd/core/utils.py ADDED
@@ -0,0 +1,90 @@
1
+ """
2
+ Helper functions for the PDD CLI.
3
+ """
4
+ import os
5
+ import sys
6
+ import subprocess
7
+ from pathlib import Path
8
+ from typing import Optional
9
+ import click
10
+
11
+ from ..install_completion import (
12
+ get_current_shell,
13
+ get_shell_rc_path,
14
+ )
15
+
16
+ def _first_pending_command(ctx: click.Context) -> Optional[str]:
17
+ """Return the first subcommand scheduled for this invocation."""
18
+ for arg in ctx.protected_args:
19
+ if not arg.startswith("-"):
20
+ return arg
21
+ return None
22
+
23
+
24
+ def _api_env_exists() -> bool:
25
+ """Check whether the ~/.pdd/api-env file exists."""
26
+ return (Path.home() / ".pdd" / "api-env").exists()
27
+
28
+
29
+ def _completion_installed() -> bool:
30
+ """Check if the shell RC file already sources the PDD completion script."""
31
+ shell = get_current_shell()
32
+ rc_path = get_shell_rc_path(shell) if shell else None
33
+ if not rc_path:
34
+ return False
35
+
36
+ try:
37
+ content = Path(rc_path).read_text(encoding="utf-8")
38
+ except (OSError, UnicodeDecodeError):
39
+ return False
40
+
41
+ return "PDD CLI completion" in content or "pdd_completion" in content
42
+
43
+
44
+ def _project_has_local_configuration() -> bool:
45
+ """Detect project-level env configuration that should suppress reminders."""
46
+ cwd = Path.cwd()
47
+
48
+ env_file = cwd / ".env"
49
+ if env_file.exists():
50
+ try:
51
+ env_content = env_file.read_text(encoding="utf-8")
52
+ except (OSError, UnicodeDecodeError):
53
+ env_content = ""
54
+ if any(token in env_content for token in ("OPENAI_API_KEY=", "GOOGLE_API_KEY=", "ANTHROPIC_API_KEY=")):
55
+ return True
56
+
57
+ project_pdd_dir = cwd / ".pdd"
58
+ if project_pdd_dir.exists():
59
+ return True
60
+
61
+ return False
62
+
63
+
64
+ def _should_show_onboarding_reminder(ctx: click.Context) -> bool:
65
+ """Determine whether to display the onboarding reminder banner."""
66
+ suppress = os.getenv("PDD_SUPPRESS_SETUP_REMINDER", "").lower()
67
+ if suppress in {"1", "true", "yes"}:
68
+ return False
69
+
70
+ first_command = _first_pending_command(ctx)
71
+ if first_command == "setup":
72
+ return False
73
+
74
+ if _api_env_exists():
75
+ return False
76
+
77
+ if _project_has_local_configuration():
78
+ return False
79
+
80
+ if _completion_installed():
81
+ return False
82
+
83
+ return True
84
+
85
+
86
+ def _run_setup_utility() -> None:
87
+ """Execute the interactive setup utility script."""
88
+ result = subprocess.run([sys.executable, "-m", "pdd.setup_tool"])
89
+ if result.returncode not in (0, None):
90
+ raise RuntimeError(f"Setup utility exited with status {result.returncode}")
pdd/crash_main.py CHANGED
@@ -2,9 +2,9 @@ import sys
2
2
  from typing import Tuple, Optional, Dict, Any
3
3
  import click
4
4
  from rich import print as rprint
5
- from . import DEFAULT_STRENGTH, DEFAULT_TIME
6
5
  from pathlib import Path
7
6
 
7
+ from .config_resolution import resolve_effective_config
8
8
  from .construct_paths import construct_paths
9
9
  from .fix_code_loop import fix_code_loop
10
10
  # Import fix_code_module_errors conditionally or ensure it's always available
@@ -24,7 +24,10 @@ def crash_main(
24
24
  output_program: Optional[str] = None,
25
25
  loop: bool = False,
26
26
  max_attempts: Optional[int] = None,
27
- budget: Optional[float] = None
27
+ budget: Optional[float] = None,
28
+ agentic_fallback: bool = True,
29
+ strength: Optional[float] = None,
30
+ temperature: Optional[float] = None,
28
31
  ) -> Tuple[bool, str, str, int, float, str]:
29
32
  """
30
33
  Main function to fix errors in a code module and its calling program that caused a crash.
@@ -39,6 +42,7 @@ def crash_main(
39
42
  :param loop: Enable iterative fixing process.
40
43
  :param max_attempts: Maximum number of fix attempts before giving up.
41
44
  :param budget: Maximum cost allowed for the fixing process.
45
+ :param agentic_fallback: Enable agentic fallback if the primary fix mechanism fails.
42
46
  :return: A tuple containing:
43
47
  - bool: Success status
44
48
  - str: The final fixed code module
@@ -54,9 +58,9 @@ def crash_main(
54
58
  quiet = ctx.params.get("quiet", ctx.obj.get("quiet", False))
55
59
  verbose = ctx.params.get("verbose", ctx.obj.get("verbose", False))
56
60
 
57
- strength = ctx.obj.get("strength", DEFAULT_STRENGTH)
58
- temperature = ctx.obj.get("temperature", 0)
59
- time_param = ctx.obj.get("time", DEFAULT_TIME)
61
+ # Store parameter values for later resolution
62
+ param_strength = strength
63
+ param_temperature = temperature
60
64
 
61
65
  try:
62
66
  input_file_paths = {
@@ -77,8 +81,20 @@ def crash_main(
77
81
  force=force,
78
82
  quiet=quiet,
79
83
  command="crash",
80
- command_options=command_options
84
+ command_options=command_options,
85
+ context_override=ctx.obj.get('context'),
86
+ confirm_callback=ctx.obj.get('confirm_callback')
81
87
  )
88
+ # Use centralized config resolution with proper priority:
89
+ # CLI > pddrc > defaults
90
+ effective_config = resolve_effective_config(
91
+ ctx,
92
+ resolved_config,
93
+ param_overrides={"strength": param_strength, "temperature": param_temperature}
94
+ )
95
+ strength = effective_config["strength"]
96
+ temperature = effective_config["temperature"]
97
+ time_param = effective_config["time"]
82
98
 
83
99
  prompt_content = input_strings["prompt_file"]
84
100
  code_content = input_strings["code_file"]
@@ -94,7 +110,8 @@ def crash_main(
94
110
  if loop:
95
111
  success, final_program, final_code, attempts, cost, model = fix_code_loop(
96
112
  code_file, prompt_content, program_file, strength, temperature,
97
- max_attempts or 3, budget or 5.0, error_file, verbose, time_param
113
+ max_attempts if max_attempts is not None else 3, budget or 5.0, error_file, verbose, time_param,
114
+ prompt_file=prompt_file, agentic_fallback=agentic_fallback
98
115
  )
99
116
  # Always set final_code/final_program to something non-empty
100
117
  if not final_code:
@@ -161,20 +178,36 @@ def crash_main(
161
178
  if code_updated:
162
179
  rprint(f"[bold]Fixed code saved to:[/bold] {output_code_path_str}")
163
180
  else:
164
- rprint(f"[info]Code file '{Path(code_file).name}' was not modified (but output file was written).[/info]")
181
+ rprint(f"[bold]Code saved to:[/bold] {output_code_path_str} [dim](not modified)[/dim]")
165
182
  if output_program_path_str:
166
183
  if program_updated:
167
184
  rprint(f"[bold]Fixed program saved to:[/bold] {output_program_path_str}")
168
185
  else:
169
- rprint(f"[info]Program file '{Path(program_file).name}' was not modified (but output file was written).[/info]")
186
+ rprint(f"[bold]Program saved to:[/bold] {output_program_path_str} [dim](not modified)[/dim]")
187
+
188
+ if verbose:
189
+ rprint("\n[bold]Verbose diagnostics:[/bold]")
190
+ rprint(f" Code file: {code_file}")
191
+ rprint(f" Program file: {program_file}")
192
+ rprint(f" Code updated: {code_updated}")
193
+ rprint(f" Program updated: {program_updated}")
194
+ rprint(f" Original code length: {len(original_code_content)} chars")
195
+ rprint(f" Final code length: {len(final_code)} chars")
196
+ rprint(f" Original program length: {len(original_program_content)} chars")
197
+ rprint(f" Final program length: {len(final_program)} chars")
170
198
 
171
199
  return success, final_code, final_program, attempts, cost, model
172
200
 
173
201
  except FileNotFoundError as e:
174
202
  if not quiet:
175
203
  rprint(f"[bold red]Error:[/bold red] Input file not found: {e}")
176
- sys.exit(1)
204
+ # Return error result instead of sys.exit(1) to allow orchestrator to handle gracefully
205
+ return False, "", "", 0, 0.0, f"FileNotFoundError: {e}"
206
+ except click.Abort:
207
+ # User cancelled - re-raise to stop the sync loop
208
+ raise
177
209
  except Exception as e:
178
210
  if not quiet:
179
211
  rprint(f"[bold red]An unexpected error occurred:[/bold red] {str(e)}")
180
- sys.exit(1)
212
+ # Return error result instead of sys.exit(1) to allow orchestrator to handle gracefully
213
+ return False, "", "", 0, 0.0, f"Error: {e}"
@@ -1,63 +1,71 @@
1
- language,comment,extension
2
- Python,#,.py
3
- Java,//,.java
4
- C++,//,.cpp
5
- JavaScript,//,.js
6
- HTML,"<!-- -->",.html
7
- CSS,"/**/",.css
8
- Ruby,#,.rb
9
- PHP,//,.php
10
- Swift,//,.swift
11
- Go,//,.go
12
- Rust,//,.rs
13
- Kotlin,//,.kt
14
- TypeScript,//,.ts
15
- TypeScriptReact,//,.tsx
16
- C#,//,.cs
17
- SQL,--,.sql
18
- Shell,#,.sh
19
- Bash,#,.sh
20
- Fish,#,.fish
21
- Zsh,#,.zsh
22
- PowerShell,#,.ps1
23
- Perl,#,.pl
24
- R,#,.R
25
- MATLAB,%,.m
26
- Lua,--,.lua
27
- Haskell,--,.hs
28
- Scala,//,.scala
29
- Groovy,//,.groovy
30
- Dart,//,.dart
31
- F#,//,.fs
32
- YAML,#,.yml
33
- JSON,del,.json
34
- JSONL,del,.jsonl
35
- XML,"<!-- -->",.xml
36
- Makefile,#,
37
- CSV,del,.csv
38
- Markdown,del,.md
39
- LaTeX,%,.tex
40
- Assembly,;,.asm
41
- Fortran,!,.f90
42
- COBOL,*>,.cob
43
- Lisp,;,.lisp
44
- Prolog,%,.pl
45
- Erlang,%,.erl
46
- Clojure,;,.clj
47
- Julia,#,.jl
48
- Elixir,#,.ex
49
- Pascal,//,.pas
50
- VBScript,"'",.vbs
51
- CoffeeScript,#,.coffee
52
- Objective-C,//,.m
53
- Scheme,;,.scm
54
- Tcl,#,.tcl
55
- D,//,.d
56
- Ada,--,.ada
57
- Nim,#,.nim
58
- OCaml,"(**)",.ml
59
- LLM,del,.prompt
60
- prompt,del,.prompt
61
- TOML,#,.toml
62
- Log,del,.log
63
- reStructuredText,del,.rst
1
+ language,comment,extension,run_command,run_test_command
2
+ Python,#,.py,python {file},python -m pytest {file} -v
3
+ Java,//,.java,java {file},
4
+ C++,//,.cpp,,
5
+ JavaScript,//,.js,node {file},
6
+ HTML,"<!-- -->",.html,,
7
+ CSS,"/**/",.css,,
8
+ Ruby,#,.rb,ruby {file},
9
+ PHP,//,.php,php {file},
10
+ Swift,//,.swift,swift {file},swift test
11
+ Go,//,.go,go run {file},go test -v {file}
12
+ Rust,//,.rs,,cargo test
13
+ Kotlin,//,.kt,kotlin {file},
14
+ TypeScript,//,.ts,npx tsx {file},
15
+ TypeScriptReact,//,.tsx,npx tsx {file},
16
+ C#,//,.cs,dotnet run {file},dotnet test
17
+ SQL,--,.sql,,
18
+ Shell,#,.sh,sh {file},
19
+ Bash,#,.sh,bash {file},
20
+ Fish,#,.fish,fish {file},
21
+ Zsh,#,.zsh,zsh {file},
22
+ PowerShell,#,.ps1,pwsh {file},
23
+ Perl,#,.pl,perl {file},
24
+ R,#,.R,Rscript {file},
25
+ MATLAB,%,.m,,
26
+ Lua,--,.lua,lua {file},
27
+ Haskell,--,.hs,runhaskell {file},
28
+ Scala,//,.scala,scala {file},
29
+ Groovy,//,.groovy,groovy {file},
30
+ Dart,//,.dart,dart run {file},
31
+ F#,//,.fs,dotnet fsi {file},
32
+ YAML,#,.yml,,
33
+ YAML,#,.yaml,,
34
+ JSON,del,.json,,
35
+ JSONL,del,.jsonl,,
36
+ XML,"<!-- -->",.xml,,
37
+ Makefile,#,,,
38
+ CSV,del,.csv,,
39
+ Markdown,del,.md,,
40
+ LaTeX,%,.tex,,
41
+ Assembly,;,.asm,,
42
+ Fortran,!,.f90,gfortran -o {file}.out {file} && ./{file}.out,
43
+ COBOL,*>,.cob,,
44
+ Lisp,;,.lisp,sbcl --script {file},
45
+ Prolog,%,.pl,swipl -s {file},
46
+ Erlang,%,.erl,escript {file},
47
+ Clojure,;,.clj,clojure {file},
48
+ Julia,#,.jl,julia {file},
49
+ Elixir,#,.ex,elixir {file},
50
+ Pascal,//,.pas,fpc {file} && ./{file},
51
+ VBScript,"'",.vbs,cscript {file},
52
+ CoffeeScript,#,.coffee,coffee {file},
53
+ Objective-C,//,.m,,
54
+ Scheme,;,.scm,scheme --script {file},
55
+ Tcl,#,.tcl,tclsh {file},
56
+ D,//,.d,rdmd {file},
57
+ Ada,--,.ada,,
58
+ Nim,#,.nim,nim r {file},
59
+ OCaml,"(**)",.ml,ocaml {file},
60
+ LLM,del,.prompt,,
61
+ prompt,del,.prompt,,
62
+ TOML,#,.toml,,
63
+ Log,del,.log,,
64
+ reStructuredText,del,.rst,,
65
+ Text,del,.txt,,
66
+ INI,;,.ini,,
67
+ Verilog,//,.v,,
68
+ Systemverilog,//,.sv,,
69
+ Prisma,///,.prisma,,
70
+ Lean,--,.lean,lean {file},
71
+ Agda,--,.agda,,
pdd/data/llm_model.csv CHANGED
@@ -1,18 +1,20 @@
1
- provider,model,input,output,coding_arena_elo,base_url,api_key,max_reasoning_tokens,structured_output,reasoning_type
2
- OpenAI,gpt-4.1-nano,0.1,0.4,1249,,OPENAI_API_KEY,0,True,none
3
- xai,xai/grok-3-beta,3.0,15.0,1332,https://api.x.ai/v1,XAI_API_KEY,0,False,none
4
- Anthropic,claude-3-5-haiku-20241022,.8,4,1261,,ANTHROPIC_API_KEY,0,True,none
5
- OpenAI,deepseek/deepseek-chat,.27,1.1,1353,https://api.deepseek.com/beta,DEEPSEEK_API_KEY,0,False,none
6
- Google,vertex_ai/gemini-2.5-flash,0.15,0.6,1330,,VERTEX_CREDENTIALS,0,True,effort
7
- Google,gemini-2.5-pro,1.25,10.0,1360,,GOOGLE_API_KEY,0,True,none
8
- Anthropic,claude-sonnet-4-20250514,3.0,15.0,1340,,ANTHROPIC_API_KEY,64000,True,budget
9
- Google,vertex_ai/gemini-2.5-pro,1.25,10.0,1361,,VERTEX_CREDENTIALS,0,True,none
10
- OpenAI,o4-mini,1.1,4.4,1333,,OPENAI_API_KEY,0,True,effort
11
- OpenAI,o3,10.0,40.0,1389,,OPENAI_API_KEY,0,True,effort
12
- OpenAI,gpt-4.1,2.0,8.0,1335,,OPENAI_API_KEY,0,True,none
13
- OpenAI,deepseek/deepseek-reasoner,0.55,2.19,1337,https://api.deepseek.com/beta,DEEPSEEK_API_KEY,0,False,none
14
- Fireworks,fireworks_ai/accounts/fireworks/models/deepseek-r1,3.0,8.0,1338,,FIREWORKS_API_KEY,0,False,none
15
- OpenAI,chatgpt-4o-latest,5,15,1369,,OPENAI_API_KEY,0,False,none
16
- Anthropic,bedrock/us.anthropic.claude-3-7-sonnet-20250219-v1:0,3.0,15.0,1339,,,64000,True,budget
17
- OpenAI,azure/o4-mini,1.1,4.4,1334,,OPENAI_API_KEY,0,True,effort
18
- OpenAI,openai/mlx-community/Qwen3-30B-A3B-4bit,0,0,1293,http://localhost:8080,,0,False,none
1
+ provider,model,input,output,coding_arena_elo,base_url,api_key,max_reasoning_tokens,structured_output,reasoning_type,location
2
+ OpenAI,gpt-5-nano,0.05,0.4,1249,,OPENAI_API_KEY,0,True,none,
3
+ Google,vertex_ai/gemini-3-flash-preview,0.5,3.0,1430,,VERTEX_CREDENTIALS,0,True,effort,
4
+ Google,gemini/gemini-3-pro-preview,1.25,10.0,1487,,GEMINI_API_KEY,0,True,effort,
5
+ Google,vertex_ai/claude-sonnet-4-5,3.0,15.0,1370,,VERTEX_CREDENTIALS,128000,True,budget,
6
+ Google,vertex_ai/gemini-3-pro-preview,1.25,10.0,1487,,VERTEX_CREDENTIALS,0,True,effort,
7
+ OpenAI,gpt-5.1-codex-mini,0.25,2.0,1325,,OPENAI_API_KEY,0,True,effort,
8
+ OpenAI,gpt-5.2,1.75,14.0,1486,,OPENAI_API_KEY,0,True,effort,
9
+ OpenAI,gpt-5.1-codex,1.25,10.0,1478,,OPENAI_API_KEY,0,True,effort,
10
+ OpenAI,gpt-5.1-codex-max,1.25,10.0,1480,,OPENAI_API_KEY,0,True,effort,
11
+ Google,vertex_ai/deepseek-ai/deepseek-v3.2-maas,0.28,0.42,1450,,VERTEX_CREDENTIALS,0,False,effort,global
12
+ Fireworks,fireworks_ai/accounts/fireworks/models/qwen3-coder-480b-a35b-instruct,0.45,1.80,1363,,FIREWORKS_API_KEY,0,False,none,
13
+ Google,vertex_ai/claude-opus-4-5,5.0,25.0,1465,,VERTEX_CREDENTIALS,128000,True,budget,
14
+ OpenAI,openai/mlx-community/Qwen3-30B-A3B-4bit,0,0,1040,http://localhost:8080,,0,False,none,
15
+ lm_studio,lm_studio/openai-gpt-oss-120b-mlx-6,0.0001,0,1082,http://localhost:1234/v1,,0,True,effort,
16
+ Fireworks,fireworks_ai/accounts/fireworks/models/glm-4p6,0.55,2.19,1442,,FIREWORKS_API_KEY,0,False,none,
17
+ OpenAI,groq/moonshotai/kimi-k2-instruct-0905,1.0,3.0,1330,,GROQ_API_KEY,0,True,none,
18
+ Anthropic,anthropic/claude-sonnet-4-5-20250929,3.0,15.0,1370,,ANTHROPIC_API_KEY,128000,True,budget,
19
+ Anthropic,anthropic/claude-opus-4-5-20251101,5.0,25.0,1474,,ANTHROPIC_API_KEY,128000,True,budget,
20
+ Anthropic,anthropic/claude-haiku-4-5-20251001,1.0,5.0,1270,,ANTHROPIC_API_KEY,128000,True,budget,
pdd/detect_change_main.py CHANGED
@@ -6,7 +6,7 @@ from rich import print as rprint
6
6
 
7
7
  from .construct_paths import construct_paths
8
8
  from .detect_change import detect_change
9
- from . import DEFAULT_TIME
9
+ from . import DEFAULT_TIME, DEFAULT_STRENGTH
10
10
 
11
11
  def detect_change_main(
12
12
  ctx: click.Context,
@@ -44,7 +44,8 @@ def detect_change_main(
44
44
  force=ctx.obj.get('force', False),
45
45
  quiet=ctx.obj.get('quiet', False),
46
46
  command="detect",
47
- command_options=command_options
47
+ command_options=command_options,
48
+ context_override=ctx.obj.get('context')
48
49
  )
49
50
 
50
51
  # Get change description content
@@ -54,7 +55,7 @@ def detect_change_main(
54
55
  prompt_contents = [input_strings[f"prompt_file_{i}"] for i in range(len(prompt_files))]
55
56
 
56
57
  # Get model parameters from context
57
- strength = ctx.obj.get('strength', 0.9)
58
+ strength = ctx.obj.get('strength', DEFAULT_STRENGTH)
58
59
  temperature = ctx.obj.get('temperature', 0)
59
60
  time_budget = ctx.obj.get('time', DEFAULT_TIME)
60
61
 
@@ -100,4 +101,4 @@ def detect_change_main(
100
101
  except Exception as e:
101
102
  if not ctx.obj.get('quiet', False):
102
103
  rprint(f"[bold red]Error:[/bold red] {str(e)}")
103
- sys.exit(1)
104
+ sys.exit(1)