Skip to content

Commit 4567570

Browse files
committed
Bump version
1 parent 11fbc66 commit 4567570

File tree

11 files changed

+301
-105
lines changed

11 files changed

+301
-105
lines changed

CHANGELOG.md

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,55 @@
1+
## v0.0.158 (2026-02-23)
2+
3+
### Feat
4+
5+
- Implement comprehensive API routes for the video pipeline and add a new E2E test for Stage 8 Composition Generation.
6+
- Add comprehensive Playwright E2E tests for all video editor stages and enhance the script API to support TTS script management.
7+
- add E2E test for non-recursive circular include detection and update project configuration defaults for video editor.
8+
- Update test durations and modify `test_llm_invoke_integration.py`.
9+
10+
### Fix
11+
12+
- make sync regression cases 5 and 9 non-fatal on LLM failures
13+
- handle multi-language sync failure gracefully in case 4
14+
- increase timeouts and add --max-attempts to sync regression tests
15+
16+
### Refactor
17+
18+
- improve color readability assertion in review tab E2E test by using canvas for RGB extraction.
19+
- Split audit results API into a dedicated route, implement the Stage 10 Audit UI, and add comprehensive E2E tests including dark theme readability checks.
20+
- Restructure ProjectConfig schema for output resolution, TTS, audio sync, VEO, and render settings, updating relevant UI and tests.
21+
- Centralize cost and model extraction logic in Python and update video project configuration.
22+
- Update Stage1ProjectSetup for StagePanelProps compatibility, correct annotation fetching API parameter, and switch to 'server-only' directive for database utilities.
23+
124
## v0.0.157 (2026-02-22)
225

326
### Feat
427

5-
- Implement command timeouts in sync regression and add retry logic for prerequisite generation in cloud regression.
6-
- Implement smooth quadratic bezier curves for waypoint edges and enhance graph layout with wire-length minimization, column reordering, and gravity refinement passes.
7-
- Introduce waypoint edges for improved dependency graph rendering and ensure backend layout operations are non-mutating.
8-
- Enhance graph layout with new column-split rules and ensure proper discard of rearranged positions.
9-
- Implement frontend job management with `useJobs` hook and `JobDashboard` component, alongside prompt file path refactoring.
10-
- Introduce a comprehensive set of prompts for generating frontend components, hooks, and backend commands, and update related frontend files and configuration.
11-
- Implement agentic graph layout rearrangement using an LLM to automatically position architecture modules.
12-
- Implement prompt refresh in ArchitectureView on sync completion and integrate Vitest for frontend testing.
28+
- **Deadline-aware agentic retry budgeting**`run_agentic_task` now accepts a `deadline` parameter (also read from `PDD_JOB_DEADLINE` env var). Each retry attempt checks remaining budget against `JOB_TIMEOUT_MARGIN_SECONDS` and `MIN_ATTEMPT_TIMEOUT_SECONDS`, skipping attempts that cannot finish in time. `JobManager` sets a 30-minute job timeout and propagates the deadline to subprocess jobs, with graceful SIGTERM→SIGKILL escalation and zombie process detection.
29+
- **Agentic graph layout rearrangement** — New `/api/v1/architecture/rearrange` endpoint runs `arrange_graph_layout_LLM.prompt` via `run_agentic_task` to automatically assign swimlane positions to architecture modules. Changes are returned to the frontend without persisting to disk until explicitly saved.
30+
- **Waypoint edges and improved graph rendering** — Dependency graph now renders smooth quadratic bezier curves through waypoint nodes, with wire-length minimization, column reordering, gravity refinement passes, and new column-split rules. Backend layout operations are non-mutating (original positions preserved for discard).
31+
- **Frontend job management** — New `useJobs` hook and `JobDashboard` component for monitoring server-side job execution. Prompt refresh triggers automatically on sync completion via `syncCompletedCounter`.
32+
- **`get_language_outputs()` for config-type language detection** — New function in `construct_paths.py` distinguishes config/data/markup languages (JSON, YAML, CSS, etc.) that produce only `code` from executable languages that produce `code`, `test`, and `example`. Uses the `outputs` column from `language_format.csv` with a built-in fallback set. `moduleNeedsSync` in the frontend uses `expected_outputs` to avoid counting config modules as needing sync.
33+
- **Comprehensive frontend prompt coverage** — Added 60+ prompts covering all frontend components, hooks, pages, and backend command modules (`checkup`, `firecrawl`, `report`, `which`), plus `config_resolution`, `remote_session`, `generate_model_catalog`, `pin_example_hack`, and `template_expander`.
34+
- **Vitest integration** — Frontend testing now supports Vitest alongside Jest, with 5 new test suites: waypoint edges, rearrange positions, rearrange discard, sync-completed refresh, and module-needs-sync.
35+
- **Command timeouts in sync regression**`run_pdd_command_base` now wraps commands with `PDD_CMD_TIMEOUT` (default 600s). Cloud regression adds retry logic for prerequisite generation failures.
1336
- Increase LLM call timeout and add project dependencies CSV.
14-
- Implement the video editor frontend application structure, including Stages 9 and 10, and add deadline propagation to agentic verification.
15-
- introduce multi-stage video editing workflow with components, examples, and tests for each stage.
16-
- Implement `VideoPlayer` component with rich annotation capabilities and add `StageSidebar` component, including examples and tests.
17-
- Add API endpoints for batch annotation resolution and video serving, introduce an SSE log panel component, and update related configuration and job processing.
18-
- Add annotation API routes for management and analysis, including tests and examples, and update LLM model ELO scores.
1937

2038
### Fix
2139

22-
- Improve job timeout handling by logging potential zombie processes, add a corresponding test, and enhance error logging and progress reporting for section rendering.
23-
- Sync Remaining count no longer includes config-type dev units (JSON, YAML, CSS)
24-
- remove inaccurate RichLog max_lines claim from sync_tui prompt
25-
- add ADC fallback for VERTEX_CREDENTIALS in Cloud Build CI
26-
- save RunReport after agentic verify to prevent false crash-verify cycle
27-
- Correct ELO scores for codex models and expand model catalog
40+
- **Job timeout handling** — Jobs now enforce a 30-minute wall-clock timeout with SIGTERM→SIGKILL escalation, zombie process logging, and signal-killed process detection (`exit_code < 0`).
41+
- **Sync Remaining count** — No longer includes config-type dev units (JSON, YAML, CSS) that only produce code output.
42+
- **RunReport saved after agentic verify** — Prevents false crash-verify cycle where a successful agentic verify was not recorded, causing the state machine to re-enter the fix loop.
43+
- **Rich markup escaping in error messages**`fix_verification_errors_loop` now escapes file paths and error messages with `rich_escape()` to prevent Rich markup injection from unusual filenames or error strings.
44+
- **ADC fallback for Vertex AI**`_ensure_api_key()` now falls back to Application Default Credentials when `VERTEX_CREDENTIALS` is unset but a GCP project env var is available.
45+
- Remove inaccurate RichLog `max_lines` claim from `sync_tui` prompt.
46+
- **Updated ELO scores** — Refreshed from LMArena Code Arena (Feb 22, 2026). Notable changes: `claude-sonnet-4.6` jumps to #3 (1524), new entries for `gpt-5.2-codex`, `gpt-5.1-codex-mini/max`, `gpt-5.3-codex`, `gpt-5-nano`, `gemini-3.1-pro`, and GitHub Copilot naming aliases.
2847

2948
### Refactor
3049

31-
- update architecture diagram component positions and replace Unicode escape sequences with actual characters."
32-
- apply custom theme to console output and adjust TypeScript import paths after removing baseUrl.
50+
- **`_echo_rich` for CliRunner-compatible Rich output**`templates.py` now renders Rich objects through an in-memory `Console` and outputs via `click.echo`, fixing test capture under `CliRunner`.
51+
- Update architecture diagram component positions and replace Unicode escape sequences with actual characters.
52+
- Apply custom theme to console output and adjust TypeScript import paths after removing `baseUrl`.
3353

3454
## v0.0.156 (2026-02-21)
3555

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# PDD (Prompt-Driven Development) Command Line Interface
22

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

55
## Introduction
66

@@ -352,7 +352,7 @@ For proper model identifiers to use in your custom configuration, refer to the [
352352

353353
## Version
354354

355-
Current version: 0.0.157
355+
Current version: 0.0.158
356356

357357
To check your installed version, run:
358358
```

examples/hello/repo_root

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Subproject commit dff3772e2073ec0a14de9c24062d1d9d44a16032
1+
Subproject commit ff62a8bfdec28c16dc4bee0f9ebb6f325b24bc3f

pdd/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import os
44

5-
__version__ = "0.0.157"
5+
__version__ = "0.0.158"
66

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

pdd/llm_invoke.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1210,14 +1210,22 @@ def _ensure_api_key(model_info: Dict[str, Any], newly_acquired_keys: Dict[str, b
12101210
newly_acquired_keys[api_key_field] = False
12111211
return True
12121212

1213-
# Vertex AI ADC fallback: GOOGLE_APPLICATION_CREDENTIALS may be unset
1214-
# if the user ran ``gcloud auth application-default login`` instead.
1215-
if "GOOGLE_APPLICATION_CREDENTIALS" in env_vars and "GOOGLE_APPLICATION_CREDENTIALS" in missing:
1213+
# Vertex AI fallback: resolve missing VERTEXAI_PROJECT from
1214+
# GOOGLE_CLOUD_PROJECT and missing VERTEXAI_LOCATION from CSV location column
1215+
# (the invocation code already reads CSV location).
1216+
if "GOOGLE_APPLICATION_CREDENTIALS" in env_vars:
12161217
project = os.getenv("VERTEXAI_PROJECT") or os.getenv("GOOGLE_CLOUD_PROJECT")
1217-
if project:
1218-
remaining = [v for v in missing if v != "GOOGLE_APPLICATION_CREDENTIALS"]
1218+
has_location = (
1219+
"VERTEXAI_LOCATION" not in missing
1220+
or bool(model_info.get("location"))
1221+
)
1222+
if project and has_location:
1223+
remaining = [
1224+
v for v in missing
1225+
if v not in ("GOOGLE_APPLICATION_CREDENTIALS", "VERTEXAI_PROJECT", "VERTEXAI_LOCATION")
1226+
]
12191227
if not remaining:
1220-
logger.info(f"Using ADC for Vertex AI (project={project}).")
1228+
logger.info(f"Using Vertex AI credentials (project={project}).")
12211229
newly_acquired_keys[api_key_field] = False
12221230
return True
12231231

@@ -2000,6 +2008,11 @@ def calc_strength(candidate):
20002008
if verbose:
20012009
logger.info(f"[INFO] No API key for '{model_name_litellm}'; using device flow or default auth.")
20022010

2011+
# Pass vertex_location from CSV (e.g., "global" for gemini-3-flash-preview)
2012+
location = model_info.get('location')
2013+
if pd.notna(location) and location:
2014+
litellm_kwargs["vertex_location"] = str(location)
2015+
20032016
# Add base_url/api_base override if present in CSV
20042017
api_base = model_info.get('base_url')
20052018
if pd.notna(api_base) and api_base:

pdd/preprocess.py

Lines changed: 14 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
install()
1616
console = Console()
1717

18+
# Maximum iterations for the non-recursive convergence loop.
19+
# Diamond includes converge quickly; true cycles never converge.
20+
_MAX_INCLUDE_ITERATIONS = 50
21+
1822
# Debug/Instrumentation controls
1923
_DEBUG_PREPROCESS = str(os.getenv("PDD_PREPROCESS_DEBUG", "")).lower() in ("1", "true", "yes", "on")
2024
_DEBUG_OUTPUT_FILE = os.getenv("PDD_PREPROCESS_DEBUG_FILE") # Optional path to write a debug report
@@ -197,30 +201,15 @@ def replace_include(match):
197201
console.print(f"[bold red]Error processing include:[/bold red] {str(e)}")
198202
_dbg(f"Error processing backtick include {file_path}: {e}")
199203
return f"```[Error processing include: {file_path}]```"
200-
_expanded_prior = set()
201-
_expanded_current = set()
202-
203-
def replace_include_tracked(match):
204-
file_path = match.group(1).strip()
205-
try:
206-
full_path = get_file_path(file_path)
207-
resolved = os.path.realpath(full_path)
208-
if resolved in _expanded_prior:
209-
raise ValueError(f"Circular include detected: {file_path} is already in the include chain")
210-
_expanded_current.add(resolved)
211-
except (FileNotFoundError, ValueError):
212-
raise
213-
except Exception:
214-
pass
215-
return replace_include(match)
216-
217204
prev_text = ""
218205
current_text = text
206+
iterations = 0
219207
while prev_text != current_text:
208+
if iterations >= _MAX_INCLUDE_ITERATIONS:
209+
raise ValueError("Circular include detected: maximum include depth exceeded")
220210
prev_text = current_text
221-
_expanded_current = set()
222-
current_text = re.sub(pattern, replace_include_tracked, current_text, flags=re.DOTALL)
223-
_expanded_prior.update(_expanded_current)
211+
current_text = re.sub(pattern, replace_include, current_text, flags=re.DOTALL)
212+
iterations += 1
224213
return current_text
225214

226215
def process_xml_tags(text: str, recursive: bool, _seen: Optional[set] = None) -> str:
@@ -309,35 +298,20 @@ def replace_include(match):
309298
console.print(f"[bold red]Error processing include:[/bold red] {str(e)}")
310299
_dbg(f"Error processing XML include {file_path}: {e}")
311300
return f"[Error processing include: {file_path}]"
312-
_expanded_prior = set()
313-
_expanded_current = set()
314-
315-
def replace_include_tracked(match):
316-
file_path = match.group(1).strip()
317-
try:
318-
full_path = get_file_path(file_path)
319-
resolved = os.path.realpath(full_path)
320-
if resolved in _expanded_prior:
321-
raise ValueError(f"Circular include detected: {file_path} is already in the include chain")
322-
_expanded_current.add(resolved)
323-
except (FileNotFoundError, ValueError):
324-
raise
325-
except Exception:
326-
pass
327-
return replace_include(match)
328-
329301
prev_text = ""
330302
current_text = text
303+
iterations = 0
331304
while prev_text != current_text:
305+
if iterations >= _MAX_INCLUDE_ITERATIONS:
306+
raise ValueError("Circular include detected: maximum include depth exceeded")
332307
prev_text = current_text
333-
_expanded_current = set()
334308
code_spans = _extract_code_spans(current_text)
335309
def replace_include_with_spans(match):
336310
if _intersects_any_span(match.start(), match.end(), code_spans):
337311
return match.group(0)
338-
return replace_include_tracked(match)
312+
return replace_include(match)
339313
current_text = re.sub(pattern, replace_include_with_spans, current_text, flags=re.DOTALL)
340-
_expanded_prior.update(_expanded_current)
314+
iterations += 1
341315
return current_text
342316

343317
def process_pdd_tags(text: str) -> str:

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
77

88
[project]
99
name = "pdd-cli"
10-
version = "0.0.157"
10+
version = "0.0.158"
1111
description = "PDD (Prompt-Driven Development) Command Line Interface"
1212
readme = {file = "pypi_description.rst", content-type = "text/x-rst"}
1313
authors = [
@@ -127,7 +127,7 @@ filterwarnings = [
127127

128128
[tool.commitizen]
129129
name = "cz_conventional_commits"
130-
version = "0.0.157"
130+
version = "0.0.158"
131131
tag_format = "v$version"
132132
version_files = [
133133
"pyproject.toml:version",

0 commit comments

Comments
 (0)