Skip to content
Merged
Show file tree
Hide file tree
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 Feb 4, 2026
cfca37d
fix: Auth logout shows success message when not authenticated (incons…
Serhan-Asad Feb 4, 2026
36bdcab
Delete pdd/prompts/commands/auth_python.prompt
Serhan-Asad Feb 4, 2026
c3e65f5
refactor: Address Copilot PR review comments
Serhan-Asad Feb 5, 2026
026d5c3
test(llm): skip DeepSeek MaaS structured output test when model not i…
beknobloch Jan 6, 2026
417f0d7
test(llm): skip structured output tests for all models when model is …
beknobloch Jan 6, 2026
63d5808
feat(sync): add optional interactive steering
beknobloch Jan 7, 2026
b612f20
test(tui): add test and example for sync_tui
beknobloch Jan 7, 2026
0c05210
added missing meta files
beknobloch Jan 7, 2026
391ee5e
fix(tui): Make sync animation robust to horizontal terminal resizes a…
beknobloch Jan 8, 2026
a3c69c7
doc: update README.md to reflect new "pdd sync --steer" option
beknobloch Jan 8, 2026
dabb213
fix(tui): Make sync animation robust to horizontal terminal resizes a…
beknobloch Jan 8, 2026
88db3a5
Update pdd/fix_code_loop.py
beknobloch Jan 9, 2026
9c3eccb
Update tests/test_sync_tui.py
beknobloch Jan 9, 2026
57bba23
Update tests/test_llm_invoke.py
beknobloch Jan 9, 2026
6b80b7e
feat(steer_timeout): added CLI option --steer-timeout that allows the…
beknobloch Jan 11, 2026
d4d073f
chore: remove .pdd/meta files from tracking (now in .gitignore)
beknobloch Jan 11, 2026
89ef7bd
chore: remove calculator files from PR (not relevant to steering feat…
beknobloch Jan 11, 2026
7288d9b
chore: restore .pdd/meta files to match main (no changes in PR)
beknobloch Jan 11, 2026
931aed4
chore(dependencies): resolved obsolete project_dependencies.csv struc…
beknobloch Jan 12, 2026
18385f5
chore(dependencies): remove obsolete project_dependencies structure
beknobloch Jan 12, 2026
2657e46
Update pdd/sync_tui.py
beknobloch Jan 21, 2026
1e43093
fix: Add missing DEFAULT_STEER_TIMEOUT_S import in sync_orchestration
jiaminc-cmu Jan 24, 2026
e1e6560
Update pdd/sync_tui.py
beknobloch Jan 26, 2026
1579ce1
Update pdd/sync_orchestration.py
beknobloch Jan 26, 2026
ee89c0c
fix(sync tests)
beknobloch Jan 26, 2026
727ed46
chore: Remove redundant app running verification in sync_tui
beknobloch Jan 26, 2026
e2e2ba8
fix: add no_steer option and customizable steer timeout removed by co…
beknobloch Jan 26, 2026
fe3e204
chore: update .gitignore and fix regression script
beknobloch Jan 26, 2026
c58e576
chore(.gitignore): restore upstream gitignore
beknobloch Jan 26, 2026
1a529cc
fix: Refactor SyncApp initialization in sync_tui_example.py to use in…
beknobloch Jan 29, 2026
6f416cb
fix(tests): enhance error handling in end-to-end tests for SSH and LL…
beknobloch Feb 5, 2026
64df84a
Merge pull request #461 from Serhan-Asad/fix/issue-449
gltanaka Feb 6, 2026
dc35a9e
refactor: update operation_log.py to use Path for directory handling …
beknobloch Feb 6, 2026
7cea041
Bump version
gltanaka Feb 6, 2026
e3ccff8
delete: remove backup files
beknobloch Feb 6, 2026
6d1e2b3
refactor: enhance sync orchestration and TUI error handling
beknobloch Feb 6, 2026
f5ee829
chore: move agentic_fix changes to separate branch
beknobloch Feb 6, 2026
c5ec2f7
chore: drop unrelated changes
beknobloch Feb 6, 2026
a106f15
chore: revert examples submodule pointer
beknobloch Feb 6, 2026
1643726
test(llm): skip DeepSeek MaaS structured output test when model not i…
beknobloch Jan 6, 2026
923180d
test(llm): skip structured output tests for all models when model is …
beknobloch Jan 6, 2026
e5d1a25
feat(sync): add optional interactive steering
beknobloch Jan 7, 2026
d9537bf
test(tui): add test and example for sync_tui
beknobloch Jan 7, 2026
19bb684
fix(tui): Make sync animation robust to horizontal terminal resizes a…
beknobloch Jan 8, 2026
6c829a5
doc: update README.md to reflect new "pdd sync --steer" option
beknobloch Jan 8, 2026
75b8a91
fix(tui): Make sync animation robust to horizontal terminal resizes a…
beknobloch Jan 8, 2026
638a9d9
Update pdd/fix_code_loop.py
beknobloch Jan 9, 2026
3a19222
Update tests/test_sync_tui.py
beknobloch Jan 9, 2026
c3d6c39
Update tests/test_llm_invoke.py
beknobloch Jan 9, 2026
a107de5
feat(steer_timeout): added CLI option --steer-timeout that allows the…
beknobloch Jan 11, 2026
f0e37f2
Update pdd/sync_tui.py
beknobloch Jan 21, 2026
0696bdd
fix: Add missing DEFAULT_STEER_TIMEOUT_S import in sync_orchestration
jiaminc-cmu Jan 24, 2026
5f14372
Update pdd/sync_tui.py
beknobloch Jan 26, 2026
09cad77
Update pdd/sync_orchestration.py
beknobloch Jan 26, 2026
e3bb740
fix(sync tests)
beknobloch Jan 26, 2026
c655abd
chore: Remove redundant app running verification in sync_tui
beknobloch Jan 26, 2026
6fbc0c2
fix: add no_steer option and customizable steer timeout removed by co…
beknobloch Jan 26, 2026
34077d9
chore: update .gitignore and fix regression script
beknobloch Jan 26, 2026
884d479
chore(.gitignore): restore upstream gitignore
beknobloch Jan 26, 2026
45cecb6
fix: Refactor SyncApp initialization in sync_tui_example.py to use in…
beknobloch Jan 29, 2026
ef91340
fix(tests): enhance error handling in end-to-end tests for SSH and LL…
beknobloch Feb 5, 2026
1ba83e8
delete: remove backup files
beknobloch Feb 6, 2026
58667c2
refactor: enhance sync orchestration and TUI error handling
beknobloch Feb 6, 2026
d169b53
chore: move agentic_fix changes to separate branch
beknobloch Feb 6, 2026
69a06c7
chore: drop unrelated changes
beknobloch Feb 6, 2026
103029d
chore: remove stray lock files
beknobloch Feb 6, 2026
1898800
Merge branch 'steering-sync' of https://github.com/beknobloch/pdd int…
beknobloch Feb 6, 2026
db241a5
feat(sync_orchestration): add logging for sync start event
beknobloch Feb 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 0 additions & 8 deletions .pdd/meta/admin_get_users_python_run.json

This file was deleted.

8 changes: 0 additions & 8 deletions .pdd/meta/my_module_python_run.json

This file was deleted.

9 changes: 0 additions & 9 deletions .pdd/meta/simple_math_python.json

This file was deleted.

8 changes: 0 additions & 8 deletions .pdd/meta/simple_math_python_run.json

This file was deleted.

8 changes: 0 additions & 8 deletions .pdd/meta/test_broken_fixture_python_run.json

This file was deleted.

8 changes: 0 additions & 8 deletions .pdd/meta/test_mixed_python_run.json

This file was deleted.

24 changes: 22 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,29 @@
## v0.0.140 (2026-02-05)

### Feat

- Add comprehensive agentic workflow logging

### Fix

- Correct docstring to reference Step 10 instead of Step 5.5
- Step 10 prompt now stages all files from files_to_stage, not just test files (#429)
- Address Copilot review feedback on agentic logging tests
- Auth logout shows success message when not authenticated (inconsistent with clear-cache)

### Refactor

- Address Copilot PR review comments

## v0.0.139 (2026-02-04)

### Fix

- validate JWT token expiry in cloud E2E test skip check (#402)
- Resolve agentic orchestrator context key and prompt formatting issues, improve E2E test skipping, and add package data sync deletions.
- **test_cmd_test_main, test_fix_main**: Validate JWT token expiry when checking cloud credentials for E2E test skipping. Previously checked only for file existence; now uses `_get_cached_jwt()` to verify the token is not expired, preventing test failures with stale tokens.

### Build

- **.sync-config.yml**: Simplify test file patterns from 4 specific patterns to one recursive glob (`tests/**/*.py`). Ensures test subdirectories are included in package data sync. 3088 tests in public vs. 2,483.

## v0.0.138 (2026-02-03)

Expand Down
4 changes: 2 additions & 2 deletions README.md
Copy link
Contributor

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

Copy link
Contributor Author

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

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# PDD (Prompt-Driven Development) Command Line Interface

![PDD-CLI Version](https://img.shields.io/badge/pdd--cli-v0.0.139-blue) [![Discord](https://img.shields.io/badge/Discord-join%20chat-7289DA.svg?logo=discord&logoColor=white)](https://discord.gg/Yp4RTh8bG7)
![PDD-CLI Version](https://img.shields.io/badge/pdd--cli-v0.0.140-blue) [![Discord](https://img.shields.io/badge/Discord-join%20chat-7289DA.svg?logo=discord&logoColor=white)](https://discord.gg/Yp4RTh8bG7)

## Introduction

Expand Down Expand Up @@ -367,7 +367,7 @@ export PDD_TEST_OUTPUT_PATH=/path/to/tests/

## Version

Current version: 0.0.139
Current version: 0.0.140

To check your installed version, run:
```
Expand Down
14 changes: 7 additions & 7 deletions examples/hello/.pdd/meta/hello_python.json
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"
}
}
4 changes: 2 additions & 2 deletions examples/hello/.pdd/meta/hello_python_run.json
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
}
33 changes: 13 additions & 20 deletions examples/hello/examples/hello_example.py
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()
2 changes: 1 addition & 1 deletion examples/hello/repo_root
Submodule repo_root updated from 7bfa85 to 9f5289
4 changes: 1 addition & 3 deletions examples/hello/src/hello.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
from __future__ import annotations

def hello() -> None:
"""Prints 'hello' to standard output."""
"""Prints a hello message to the console."""
print("hello")

if __name__ == "__main__":
Expand Down
161 changes: 17 additions & 144 deletions examples/hello/tests/test_hello.py
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
2 changes: 1 addition & 1 deletion pdd/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import os

__version__ = "0.0.139"
__version__ = "0.0.140"

# Strength parameter used for LLM extraction across the codebase
# Used in postprocessing, XML tagging, code generation, and other extraction
Expand Down
Loading