claude-dev-env 1.74.0 → 1.75.0

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 (44) hide show
  1. package/hooks/blocking/CLAUDE.md +1 -0
  2. package/hooks/blocking/code_verifier_spawn_preflight_gate.py +2 -1
  3. package/hooks/blocking/duplicate_rmtree_helper_blocker.py +155 -0
  4. package/hooks/blocking/hedging_language_blocker.py +1 -13
  5. package/hooks/blocking/intent_only_ending_blocker.py +1 -15
  6. package/hooks/blocking/pre_tool_use_dispatcher.py +4 -5
  7. package/hooks/blocking/question_to_user_enforcer.py +1 -11
  8. package/hooks/blocking/session_handoff_blocker.py +1 -15
  9. package/hooks/blocking/test_code_verifier_spawn_preflight_gate.py +16 -0
  10. package/hooks/blocking/test_duplicate_rmtree_helper_blocker.py +328 -0
  11. package/hooks/blocking/test_hedging_language_blocker.py +6 -0
  12. package/hooks/blocking/test_intent_only_ending_blocker.py +5 -0
  13. package/hooks/blocking/test_pre_tool_use_dispatcher.py +52 -5
  14. package/hooks/blocking/test_question_to_user_enforcer.py +6 -0
  15. package/hooks/blocking/test_session_handoff_blocker.py +6 -0
  16. package/hooks/hooks_constants/CLAUDE.md +4 -1
  17. package/hooks/hooks_constants/code_verifier_spawn_preflight_gate_constants.py +2 -1
  18. package/hooks/hooks_constants/duplicate_rmtree_helper_blocker_constants.py +27 -0
  19. package/hooks/hooks_constants/post_tool_use_dispatcher_constants.py +2 -0
  20. package/hooks/hooks_constants/pre_tool_use_dispatcher_constants.py +8 -2
  21. package/hooks/hooks_constants/test_post_tool_use_dispatcher_constants.py +43 -0
  22. package/hooks/hooks_constants/test_pre_tool_use_dispatcher_constants.py +99 -0
  23. package/hooks/hooks_constants/test_text_stripping.py +39 -0
  24. package/hooks/hooks_constants/text_stripping.py +36 -0
  25. package/hooks/validation/CLAUDE.md +1 -0
  26. package/hooks/validation/post_tool_use_dispatcher.py +2 -2
  27. package/hooks/validation/test_mypy_validator.py +1 -1
  28. package/hooks/validation/test_post_tool_use_dispatcher.py +6 -0
  29. package/hooks/workflow/auto_formatter.py +8 -5
  30. package/hooks/workflow/test_auto_formatter.py +33 -0
  31. package/package.json +1 -1
  32. package/rules/windows-filesystem-safe.md +2 -0
  33. package/skills/autoconverge/SKILL.md +6 -3
  34. package/skills/autoconverge/reference/stop-conditions.md +7 -0
  35. package/skills/autoconverge/workflow/converge.clean-audit.test.mjs +5 -4
  36. package/skills/autoconverge/workflow/converge.contract.test.mjs +308 -132
  37. package/skills/autoconverge/workflow/converge.copilot-gate.test.mjs +16 -16
  38. package/skills/autoconverge/workflow/converge.fix-recovery.test.mjs +36 -44
  39. package/skills/autoconverge/workflow/converge.merge-conflict.test.mjs +16 -24
  40. package/skills/autoconverge/workflow/converge.mjs +598 -606
  41. package/skills/autoconverge/workflow/convergence_summary.py +1 -1
  42. package/skills/autoconverge/workflow/render_report.py +2 -6
  43. package/skills/autoconverge/workflow/test_convergence_summary.py +17 -0
  44. package/skills/autoconverge/workflow/test_render_report.py +1 -0
@@ -83,7 +83,7 @@ def build_summary_prompt(
83
83
  copilot_note: Outage note when the Copilot gate was bypassed, else None.
84
84
 
85
85
  Returns:
86
- The full agent prompt instructing a StructuredOutput convergence summary.
86
+ The full agent prompt instructing a plain-JSON convergence summary.
87
87
  """
88
88
  pr_url = GITHUB_PR_URL_TEMPLATE.format(owner=owner, repo=repo, number=pr_number)
89
89
  pr_coordinates = SUMMARY_PR_COORDINATES_TEMPLATE.format(
@@ -17,7 +17,6 @@ from autoconverge_report_constants.render_report_constants import (
17
17
  DEFAULT_FINDING_CATEGORY,
18
18
  DEFAULT_FINDING_SEVERITY,
19
19
  DEFAULT_ISSUE_ICON,
20
- GITHUB_PR_URL_TEMPLATE,
21
20
  HTML_DOCTYPE,
22
21
  HTML_HEAD_TEMPLATE,
23
22
  HTML_STYLE_BLOCK,
@@ -91,12 +90,11 @@ class FixRecord:
91
90
 
92
91
  @dataclass(frozen=True)
93
92
  class PrMetadata:
94
- """Owner, repo, number, and pre-built URL for the PR being reported on."""
93
+ """Owner, repo, number, final sha, and round count for the PR being reported on."""
95
94
 
96
95
  owner: str
97
96
  repo: str
98
97
  number: int
99
- url: str
100
98
  final_sha: str
101
99
  round_count: int
102
100
 
@@ -888,7 +886,7 @@ def render_report_html(
888
886
 
889
887
  Args:
890
888
  run_data: Aggregated metrics from the workflow journal and transcripts.
891
- pr_metadata: Owner, repo, number, URL, final sha, and round count for the PR.
889
+ pr_metadata: Owner, repo, number, final sha, and round count for the PR.
892
890
  generated_date: ISO date string derived from the journal timestamp.
893
891
 
894
892
  Returns:
@@ -1004,13 +1002,11 @@ def main(out_stream: TextIO = sys.stdout, err_stream: TextIO = sys.stderr) -> in
1004
1002
  return 1
1005
1003
 
1006
1004
  owner, repo, pr_number = parsed_pr
1007
- pr_url = GITHUB_PR_URL_TEMPLATE.format(owner=owner, repo=repo, number=pr_number)
1008
1005
 
1009
1006
  pr_metadata = PrMetadata(
1010
1007
  owner=owner,
1011
1008
  repo=repo,
1012
1009
  number=pr_number,
1013
- url=pr_url,
1014
1010
  final_sha=parsed_args.final_sha,
1015
1011
  round_count=parsed_args.rounds,
1016
1012
  )
@@ -47,6 +47,23 @@ def test_prompt_carries_pr_coordinates_and_round_count() -> None:
47
47
  assert "gh api repos/jl-cmd/claude-code-config/pulls/581" in prompt
48
48
 
49
49
 
50
+ def test_prompt_instructs_plain_json_object_not_structured_output() -> None:
51
+ """Should instruct a plain JSON object answer and never name the StructuredOutput tool."""
52
+ prompt = convergence_summary.build_summary_prompt(
53
+ owner="jl-cmd",
54
+ repo="claude-code-config",
55
+ pr_number=581,
56
+ round_count=39,
57
+ findings=SAMPLE_FINDINGS,
58
+ fix_summaries=[],
59
+ standards_note=None,
60
+ copilot_note=None,
61
+ )
62
+
63
+ assert "StructuredOutput" not in prompt
64
+ assert "Return strictly a JSON object with keys" in prompt
65
+
66
+
50
67
  def test_prompt_numbers_every_finding_with_severity_and_location() -> None:
51
68
  """Should list each aggregated finding numbered with severity, file, and line."""
52
69
  prompt = convergence_summary.build_summary_prompt(
@@ -448,6 +448,7 @@ def test_cli_injects_summary_from_file_bypassing_transcripts(tmp_path: Path) ->
448
448
  assert "An injected class the transcript never carried" in html_content
449
449
  assert 'class="pf-grid"' in html_content
450
450
  assert f"Raw findings ({EXPECTED_TOTAL_FINDINGS})" in html_content
451
+ assert "https://github.com/example-owner/example-repo/pull/211" not in html_content
451
452
 
452
453
 
453
454
  def test_html_contains_no_hedging_words(tmp_path: Path) -> None: