-
Notifications
You must be signed in to change notification settings - Fork 53
Add steerable option to pdd sync + fix textual sync animation resize issues #267
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
69 commits
Select commit
Hold shift + click to select a range
f605ef4
Add failing tests for issue #449: auth logout misleading message
Serhan-Asad cfca37d
fix: Auth logout shows success message when not authenticated (incons…
Serhan-Asad 36bdcab
Delete pdd/prompts/commands/auth_python.prompt
Serhan-Asad c3e65f5
refactor: Address Copilot PR review comments
Serhan-Asad 026d5c3
test(llm): skip DeepSeek MaaS structured output test when model not i…
beknobloch 417f0d7
test(llm): skip structured output tests for all models when model is …
beknobloch 63d5808
feat(sync): add optional interactive steering
beknobloch b612f20
test(tui): add test and example for sync_tui
beknobloch 0c05210
added missing meta files
beknobloch 391ee5e
fix(tui): Make sync animation robust to horizontal terminal resizes a…
beknobloch a3c69c7
doc: update README.md to reflect new "pdd sync --steer" option
beknobloch dabb213
fix(tui): Make sync animation robust to horizontal terminal resizes a…
beknobloch 88db3a5
Update pdd/fix_code_loop.py
beknobloch 9c3eccb
Update tests/test_sync_tui.py
beknobloch 57bba23
Update tests/test_llm_invoke.py
beknobloch 6b80b7e
feat(steer_timeout): added CLI option --steer-timeout that allows the…
beknobloch d4d073f
chore: remove .pdd/meta files from tracking (now in .gitignore)
beknobloch 89ef7bd
chore: remove calculator files from PR (not relevant to steering feat…
beknobloch 7288d9b
chore: restore .pdd/meta files to match main (no changes in PR)
beknobloch 931aed4
chore(dependencies): resolved obsolete project_dependencies.csv struc…
beknobloch 18385f5
chore(dependencies): remove obsolete project_dependencies structure
beknobloch 2657e46
Update pdd/sync_tui.py
beknobloch 1e43093
fix: Add missing DEFAULT_STEER_TIMEOUT_S import in sync_orchestration
jiaminc-cmu e1e6560
Update pdd/sync_tui.py
beknobloch 1579ce1
Update pdd/sync_orchestration.py
beknobloch ee89c0c
fix(sync tests)
beknobloch 727ed46
chore: Remove redundant app running verification in sync_tui
beknobloch e2e2ba8
fix: add no_steer option and customizable steer timeout removed by co…
beknobloch fe3e204
chore: update .gitignore and fix regression script
beknobloch c58e576
chore(.gitignore): restore upstream gitignore
beknobloch 1a529cc
fix: Refactor SyncApp initialization in sync_tui_example.py to use in…
beknobloch 6f416cb
fix(tests): enhance error handling in end-to-end tests for SSH and LL…
beknobloch 64df84a
Merge pull request #461 from Serhan-Asad/fix/issue-449
gltanaka dc35a9e
refactor: update operation_log.py to use Path for directory handling …
beknobloch 7cea041
Bump version
gltanaka e3ccff8
delete: remove backup files
beknobloch 6d1e2b3
refactor: enhance sync orchestration and TUI error handling
beknobloch f5ee829
chore: move agentic_fix changes to separate branch
beknobloch c5ec2f7
chore: drop unrelated changes
beknobloch a106f15
chore: revert examples submodule pointer
beknobloch 1643726
test(llm): skip DeepSeek MaaS structured output test when model not i…
beknobloch 923180d
test(llm): skip structured output tests for all models when model is …
beknobloch e5d1a25
feat(sync): add optional interactive steering
beknobloch d9537bf
test(tui): add test and example for sync_tui
beknobloch 19bb684
fix(tui): Make sync animation robust to horizontal terminal resizes a…
beknobloch 6c829a5
doc: update README.md to reflect new "pdd sync --steer" option
beknobloch 75b8a91
fix(tui): Make sync animation robust to horizontal terminal resizes a…
beknobloch 638a9d9
Update pdd/fix_code_loop.py
beknobloch 3a19222
Update tests/test_sync_tui.py
beknobloch c3d6c39
Update tests/test_llm_invoke.py
beknobloch a107de5
feat(steer_timeout): added CLI option --steer-timeout that allows the…
beknobloch f0e37f2
Update pdd/sync_tui.py
beknobloch 0696bdd
fix: Add missing DEFAULT_STEER_TIMEOUT_S import in sync_orchestration
jiaminc-cmu 5f14372
Update pdd/sync_tui.py
beknobloch 09cad77
Update pdd/sync_orchestration.py
beknobloch e3bb740
fix(sync tests)
beknobloch c655abd
chore: Remove redundant app running verification in sync_tui
beknobloch 6fbc0c2
fix: add no_steer option and customizable steer timeout removed by co…
beknobloch 34077d9
chore: update .gitignore and fix regression script
beknobloch 884d479
chore(.gitignore): restore upstream gitignore
beknobloch 45cecb6
fix: Refactor SyncApp initialization in sync_tui_example.py to use in…
beknobloch ef91340
fix(tests): enhance error handling in end-to-end tests for SSH and LL…
beknobloch 1ba83e8
delete: remove backup files
beknobloch 58667c2
refactor: enhance sync orchestration and TUI error handling
beknobloch d169b53
chore: move agentic_fix changes to separate branch
beknobloch 69a06c7
chore: drop unrelated changes
beknobloch 103029d
chore: remove stray lock files
beknobloch 1898800
Merge branch 'steering-sync' of https://github.com/beknobloch/pdd int…
beknobloch db241a5
feat(sync_orchestration): add logging for sync start event
beknobloch File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,12 +1,12 @@ | ||
| { | ||
| "pdd_version": "0.0.129", | ||
| "timestamp": "2026-01-26T04:48:17.409528+00:00", | ||
| "command": "test_extend", | ||
| "pdd_version": "0.0.140", | ||
| "timestamp": "2026-02-06T05:34:33.478714+00:00", | ||
| "command": "test", | ||
| "prompt_hash": "f8df355ee1c6e73a393a00c18232048a83fde694b33c472771246631a3724bf6", | ||
| "code_hash": "78974ec6c31e7981613eebfa51a65d6924e454af06545f8b0d4e6d397cea2505", | ||
| "example_hash": "e56e6ff0a51cb99e4df40ef97471946651c5d2fee85797611a910b723eb04418", | ||
| "test_hash": "d40dff068671e406bf0b4c99a052ec45f6d763abccd66d48c38248d8fd654de9", | ||
| "code_hash": "c85e92148d60665e9828e266ab41b764cf5a6c455a40bf187b53f4fbed8a78af", | ||
| "example_hash": "48aaaf809e7452223ccfd787bca259cdb98b99d56a6c8cda1765d6b6997ae3b3", | ||
| "test_hash": "8ce14028b3bc9de41f7c5cc1a13ae1f4c92b791b4070f5ca7cb2a0ba27fa0792", | ||
| "test_files": { | ||
| "test_hello.py": "d40dff068671e406bf0b4c99a052ec45f6d763abccd66d48c38248d8fd654de9" | ||
| "test_hello.py": "8ce14028b3bc9de41f7c5cc1a13ae1f4c92b791b4070f5ca7cb2a0ba27fa0792" | ||
| } | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,9 +1,9 @@ | ||
| { | ||
| "timestamp": "2026-02-03T06:03:13.211344+00:00", | ||
| "timestamp": "2026-02-06T05:34:33.478212+00:00", | ||
| "exit_code": 0, | ||
| "tests_passed": 1, | ||
| "tests_failed": 0, | ||
| "coverage": 0.0, | ||
| "test_hash": "bbfdeb8751089d6d0b25856e5c96bdcc792f661fed71fc1f731e3efe4309ca9d", | ||
| "test_hash": "8ce14028b3bc9de41f7c5cc1a13ae1f4c92b791b4070f5ca7cb2a0ba27fa0792", | ||
| "test_files": null | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,32 +1,25 @@ | ||
| import sys | ||
| import os | ||
|
|
||
| # The program is in examples/, the module is in src/ | ||
| # We need to go up one level from examples/ to the project root, then into src/ | ||
| current_dir = os.path.dirname(os.path.abspath(__file__)) | ||
| project_root = os.path.dirname(current_dir) | ||
| src_dir = os.path.join(project_root, "src") | ||
| # Add the src directory containing the module to the Python path | ||
| module_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'src') | ||
| sys.path.append(module_dir) | ||
|
|
||
| # Add the src directory to the Python path | ||
| sys.path.append(src_dir) | ||
|
|
||
| # Import hello from the hello.py file | ||
| from hello import hello | ||
|
|
||
| def main() -> None: | ||
| def run_example() -> None: | ||
| """ | ||
| Demonstrates how to import and call the hello function from the module. | ||
|
|
||
| Input Parameters: | ||
| - None | ||
| Demonstrates how to use the hello function from the module. | ||
|
|
||
| Output: | ||
| - Prints 'hello' to the standard output. | ||
| The hello function takes no input parameters and returns None. | ||
| It prints a greeting message directly to the standard output. | ||
| """ | ||
| print("Calling the hello function from the imported module:") | ||
| # Execute the function defined in the module | ||
| print("--- Executing hello() from the module ---") | ||
|
|
||
| # Call the imported function | ||
| hello() | ||
|
|
||
| print("--- Execution complete ---") | ||
|
|
||
| if __name__ == "__main__": | ||
| main() | ||
| run_example() |
Submodule repo_root
updated
from 7bfa85 to 9f5289
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,155 +1,28 @@ | ||
| import sys | ||
| import os | ||
| import pytest | ||
| from z3 import Solver, String, StringVal, Length, sat | ||
|
|
||
| # Add the source directory to the path to import the module | ||
| sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), 'src'))) | ||
|
|
||
| try: | ||
| from hello import hello | ||
| except ImportError: | ||
| # Fallback for environments where the src/hello.py structure isn't strictly followed | ||
| def hello(): | ||
| print("hello") | ||
|
|
||
| def test_hello_output(capsys): | ||
| """ | ||
| Verifies that the hello function prints 'hello' to stdout. | ||
| """ | ||
| # Act | ||
| hello() | ||
|
|
||
| # Assert | ||
| captured = capsys.readouterr() | ||
| # print() adds a newline by default | ||
| assert captured.out == "hello\n" | ||
| assert captured.err == "" | ||
|
|
||
| def test_hello_return_value(): | ||
| """ | ||
| Verifies that the hello function returns None. | ||
| """ | ||
| # Act | ||
| result = hello() | ||
|
|
||
| # Assert | ||
| assert result is None | ||
|
|
||
| def test_hello_z3_properties(capsys): | ||
| """ | ||
| Uses Z3 to formally verify properties of the hello output. | ||
| """ | ||
| # Act | ||
| hello() | ||
| captured = capsys.readouterr() | ||
| actual_output = captured.out.strip() # Remove the newline for string content verification | ||
| """Tests for hello module. | ||
|
|
||
| # Z3 Setup | ||
| s = Solver() | ||
|
|
||
| # Define a Z3 String variable representing the output | ||
| z3_output = String('output') | ||
|
|
||
| # Constraint: The Z3 string variable must equal the actual string we got | ||
| s.add(z3_output == StringVal(actual_output)) | ||
|
|
||
| # Formal Property 1: Length must be exactly 5 | ||
| s.add(Length(z3_output) == 5) | ||
|
|
||
| # Formal Property 2: Content must match 'hello' | ||
| s.add(z3_output == StringVal("hello")) | ||
|
|
||
| # Check if these constraints are satisfiable | ||
| result = s.check() | ||
|
|
||
| assert str(result) == 'sat', "The output string did not satisfy formal constraints (length 5, content 'hello')" | ||
| Verifies behavior defined in hello_python.prompt: | ||
| - A python function 'hello' that prints "hello" | ||
| """ | ||
|
|
||
| def test_hello_main_block(capsys): | ||
| """ | ||
| Verifies the output when the script is run as a main module. | ||
| This effectively tests the if __name__ == \"__main__\": block logic. | ||
| """ | ||
| # Act | ||
| # We can simulate the __main__ block behavior by calling hello() | ||
| hello() | ||
| captured = capsys.readouterr() | ||
| assert "hello" in captured.out | ||
| from io import StringIO | ||
| from unittest.mock import patch | ||
|
|
||
| import sys | ||
| import os | ||
| import pytest | ||
| from z3 import Solver, String, StringVal, Length, sat | ||
|
|
||
| # Add the source directory to the path to import the module | ||
| sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), 'src'))) | ||
| sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "src")) | ||
|
|
||
| try: | ||
| from hello import hello | ||
| except ImportError: | ||
| # Fallback for environments where the src/hello.py structure isn't strictly followed | ||
| def hello(): | ||
| print("hello") | ||
| from hello import hello | ||
|
|
||
| def test_hello_output(capsys): | ||
| """ | ||
| Verifies that the hello function prints 'hello' to stdout. | ||
| """ | ||
| # Act | ||
| hello() | ||
|
|
||
| # Assert | ||
| captured = capsys.readouterr() | ||
| # print() adds a newline by default | ||
| assert captured.out == "hello\n" | ||
| assert captured.err == "" | ||
|
|
||
| def test_hello_return_value(): | ||
| """ | ||
| Verifies that the hello function returns None. | ||
| """ | ||
| # Act | ||
| result = hello() | ||
|
|
||
| # Assert | ||
| assert result is None | ||
| def test_hello_prints_hello(): | ||
| """Test that hello() prints exactly 'hello'.""" | ||
| with patch("sys.stdout", new_callable=StringIO) as mock_stdout: | ||
| hello() | ||
| assert mock_stdout.getvalue() == "hello\n" | ||
|
|
||
| def test_hello_z3_properties(capsys): | ||
| """ | ||
| Uses Z3 to formally verify properties of the hello output. | ||
| """ | ||
| # Act | ||
| hello() | ||
| captured = capsys.readouterr() | ||
| actual_output = captured.out.strip() # Remove the newline for string content verification | ||
|
|
||
| # Z3 Setup | ||
| s = Solver() | ||
|
|
||
| # Define a Z3 String variable representing the output | ||
| z3_output = String('output') | ||
|
|
||
| # Constraint: The Z3 string variable must equal the actual string we got | ||
| s.add(z3_output == StringVal(actual_output)) | ||
|
|
||
| # Formal Property 1: Length must be exactly 5 | ||
| s.add(Length(z3_output) == 5) | ||
|
|
||
| # Formal Property 2: Content must match 'hello' | ||
| s.add(z3_output == StringVal("hello")) | ||
|
|
||
| # Check if these constraints are satisfiable | ||
| result = s.check() | ||
|
|
||
| assert str(result) == 'sat', "The output string did not satisfy formal constraints (length 5, content 'hello')" | ||
|
|
||
| def test_hello_main_block(capsys): | ||
| """ | ||
| Verifies the output when the script is run as a main module. | ||
| This effectively tests the if __name__ == \"__main__\": block logic. | ||
| """ | ||
| # Act | ||
| # We can simulate the __main__ block behavior by calling hello() | ||
| hello() | ||
| captured = capsys.readouterr() | ||
| assert "hello" in captured.out | ||
| def test_hello_returns_none(): | ||
| """Test that hello() returns None.""" | ||
| result = hello() | ||
| assert result is None |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
maybe make steer the default and have no steer if the user doesn't want delays
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
sure, I'll make that change