devflow-engine 1.2.3__py3-none-any.whl → 1.2.5__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.
@@ -1,3 +1,3 @@
1
1
  __all__ = ["__version__"]
2
2
 
3
- __version__ = "1.2.1"
3
+ __version__ = "1.2.5"
@@ -256,6 +256,32 @@ def _artifact_under_observability_sandbox(artifact: str, *, error_task_id: str)
256
256
  return marker in normalized
257
257
 
258
258
 
259
+ def _command_targets_observability_sandbox(command: str, *, error_task_id: str) -> bool:
260
+ normalized = command.replace("\\", "/").strip()
261
+ allowed_fragments = (
262
+ f".devflow/observability/{error_task_id}/",
263
+ ".devflow/observability/<id>/",
264
+ f"/.devflow/observability/{error_task_id}/",
265
+ )
266
+ return any(fragment in normalized for fragment in allowed_fragments)
267
+
268
+
269
+ def _repro_tests_under_observability_sandbox(
270
+ repro_tests: object,
271
+ *,
272
+ error_task_id: str,
273
+ ) -> bool:
274
+ if not isinstance(repro_tests, list):
275
+ return True
276
+ for test in repro_tests:
277
+ if not isinstance(test, dict):
278
+ continue
279
+ path = str(test.get("file") or test.get("path") or "").strip()
280
+ if path and not _artifact_under_observability_sandbox(path, error_task_id=error_task_id):
281
+ return False
282
+ return True
283
+
284
+
259
285
  def _validate_ui_observability_repro(
260
286
  observation: dict[str, Any],
261
287
  *,
@@ -274,6 +300,13 @@ def _validate_ui_observability_repro(
274
300
  return False, "ui_observability_requires_playwright_repro_command"
275
301
  if not _artifact_under_observability_sandbox(artifact, error_task_id=error_task_id):
276
302
  return False, "ui_observability_repro_artifact_outside_sandbox"
303
+ if not _command_targets_observability_sandbox(command, error_task_id=error_task_id):
304
+ return False, "ui_observability_repro_command_outside_sandbox"
305
+ if not _repro_tests_under_observability_sandbox(
306
+ observation.get("repro_tests"),
307
+ error_task_id=error_task_id,
308
+ ):
309
+ return False, "ui_observability_repro_test_outside_sandbox"
277
310
  if not output:
278
311
  return False, "ui_observability_missing_repro_output"
279
312
  if not isinstance(oracles, list) or not any(str(o or "").strip() for o in oracles):
@@ -644,7 +677,12 @@ def _git_changes_since(repo_root: Path, *, unix_ts: int | None) -> dict[str, Any
644
677
 
645
678
  def _load_prior_runs(*, store: ExecutionStore, repo_root: Path, error_task_id: str, fingerprint: str | None) -> dict[str, Any]:
646
679
  if not fingerprint:
647
- return {"resolvedSiblings": [], "latestResolved": None, "gitChangesSinceLatestResolved": {"summary": "", "commits": []}, "devJournal": _read_recent_journal(repo_root)}
680
+ return {
681
+ "resolvedSiblings": [],
682
+ "latestResolved": None,
683
+ "gitChangesSinceLatestResolved": {"summary": "", "commits": []},
684
+ "devJournal": {"entries": [], "summary": ""},
685
+ }
648
686
 
649
687
  resolved_rows: list[dict[str, Any]] = []
650
688
  with store._connect() as conn:
@@ -685,6 +723,13 @@ def _load_prior_runs(*, store: ExecutionStore, repo_root: Path, error_task_id: s
685
723
  )
686
724
 
687
725
  latest = resolved_rows[0] if resolved_rows else None
726
+ if latest is None:
727
+ return {
728
+ "resolvedSiblings": [],
729
+ "latestResolved": None,
730
+ "gitChangesSinceLatestResolved": {"summary": "", "commits": []},
731
+ "devJournal": {"entries": [], "summary": ""},
732
+ }
688
733
  latest_ts = int(latest["updatedAt"]) if latest and latest.get("updatedAt") else None
689
734
  return {
690
735
  "resolvedSiblings": resolved_rows,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devflow-engine
3
- Version: 1.2.3
3
+ Version: 1.2.5
4
4
  Summary: DevFlow v2 CLI-first engine (projects, stories, execution store, review packets)
5
5
  Author: DevFlow
6
6
  License: Proprietary
@@ -1,4 +1,4 @@
1
- devflow_engine/__init__.py,sha256=hz_kOos7gNdqtix8ceGqi-5Nj3sY-mR2aWwdAc1FQsE,49
1
+ devflow_engine/__init__.py,sha256=BjG-4A0W5jUNLQNn-VOizHHitPlUgD8ycR4OdIzqiVA,49
2
2
  devflow_engine/agentic_prompts.py,sha256=z5F0lzlrpscG4UBs8chZapF3iAk6eE16yv9i6m1tO3g,4424
3
3
  devflow_engine/agentic_runtime.py,sha256=omfRST0LB6jvULs6ItavtOnqhWI1ZujzWfYqpe57-yI,13912
4
4
  devflow_engine/api_key_flow_harness.py,sha256=LBvibkcgTcTWCgsesvkHXZ2t902iicOab_FlH-Qzdy4,21468
@@ -32,7 +32,7 @@ devflow_engine/devin2/agent_definition.py,sha256=pCp915tojwPlepRpvjlU1DoPuT_anxR
32
32
  devflow_engine/devin2/pi_runner.py,sha256=xRl-qA3RgMFgiR5fnG6fTwwL95PMk6zVdRdFa-fXy2E,7466
33
33
  devflow_engine/error/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
34
  devflow_engine/error/remediation.py,sha256=Z4LJQzZPzb7_6tea_XtasDvFYQiEdpkFlyxoCEO1I2k,548
35
- devflow_engine/errors/error_solver_dag.py,sha256=GZXVqssgqUgoqRqA5r7_fnz7noZVKD-g3NS5r0ShBms,60195
35
+ devflow_engine/errors/error_solver_dag.py,sha256=3AwSXowKCvN2qPfmdQpGlP1vZs1484K3ucFMg7gM5Zw,61744
36
36
  devflow_engine/errors/question_classifier.py,sha256=oBJ29hszG--TUna62BQHnNmi6hPwf-wEE8eGLmgS624,9729
37
37
  devflow_engine/errors/repo_quality_judge.py,sha256=LVBaXN6AsID-x8qb-IriQKYY1c9AMMRNo-tWMeiuMaA,9962
38
38
  devflow_engine/errors/runtime_observability.py,sha256=Do93Ah3vxLEocYtC0JpnRIRQN6uNAOkYjBz0pmOqg5g,29719
@@ -382,7 +382,7 @@ devflow_engine/prompts/source_doc_mutation/source_doc_enrichment_coherence/promp
382
382
  devflow_engine/prompts/source_doc_mutation/user_workflows/prompt.md,sha256=2Bv-EkZwzxtPSsDGdw9YuuuzT1c_2R9c6HPSMdP-MD0,406
383
383
  devflow_engine/prompts/source_scope/doctrine/prompt.md,sha256=AJk1gfePTdaBSw5DHvCr7Sigsk2orGaRVNZ3Dj3NdcQ,837
384
384
  devflow_engine/prompts/ui_grounding/doctrine/prompt.md,sha256=0L5y-QjjquPABqxAHZNPkcjyHMZQSDRVncNDQa2app0,409
385
- devflow_engine-1.2.3.dist-info/METADATA,sha256=spmTNfOipkpqYWkJx_uOVJjLtfYG_ZZ9PBs6aOWSjDM,7755
386
- devflow_engine-1.2.3.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
387
- devflow_engine-1.2.3.dist-info/entry_points.txt,sha256=U5Pw4y4v4u4xcRS5DbXfemBg0RKp74kMxcnEoL0MACY,99
388
- devflow_engine-1.2.3.dist-info/RECORD,,
385
+ devflow_engine-1.2.5.dist-info/METADATA,sha256=7Y7iTfjy7KVMpz9VahpEnY-SAPITRsNliQ7kNf3WQ5s,7755
386
+ devflow_engine-1.2.5.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
387
+ devflow_engine-1.2.5.dist-info/entry_points.txt,sha256=U5Pw4y4v4u4xcRS5DbXfemBg0RKp74kMxcnEoL0MACY,99
388
+ devflow_engine-1.2.5.dist-info/RECORD,,