claude-dev-env 1.73.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.
- package/CLAUDE.md +2 -0
- package/audit-rubrics/category_rubrics/category-o-docstring-vs-impl-drift.md +1 -1
- package/hooks/blocking/CLAUDE.md +4 -0
- package/hooks/blocking/block_main_commit.py +14 -0
- package/hooks/blocking/bot_mention_comment_blocker.py +7 -0
- package/hooks/blocking/claude_md_orphan_file_blocker.py +14 -42
- package/hooks/blocking/code_rules_docstrings.py +223 -0
- package/hooks/blocking/code_rules_enforcer.py +16 -0
- package/hooks/blocking/code_verifier_spawn_preflight_gate.py +12 -5
- package/hooks/blocking/convergence_gate_blocker.py +17 -3
- package/hooks/blocking/destructive_command_blocker.py +7 -0
- package/hooks/blocking/docstring_rule_gate_count_blocker.py +321 -0
- package/hooks/blocking/duplicate_rmtree_helper_blocker.py +155 -0
- package/hooks/blocking/gh_body_arg_blocker.py +8 -0
- package/hooks/blocking/gh_pr_author_enforcer.py +7 -0
- package/hooks/blocking/hedging_language_blocker.py +17 -23
- package/hooks/blocking/hook_prose_detector_consistency.py +7 -0
- package/hooks/blocking/intent_only_ending_blocker.py +18 -26
- package/hooks/blocking/md_to_html_blocker.py +10 -2
- package/hooks/blocking/open_questions_in_plans_blocker.py +10 -2
- package/hooks/blocking/package_inventory_stale_blocker.py +398 -0
- package/hooks/blocking/plain_language_blocker.py +6 -0
- package/hooks/blocking/pr_converge_bugteam_enforcer.py +6 -0
- package/hooks/blocking/pr_description_enforcer.py +6 -0
- package/hooks/blocking/pre_tool_use_dispatcher.py +5 -6
- package/hooks/blocking/precommit_code_rules_gate.py +10 -1
- package/hooks/blocking/pytest_testpaths_orphan_blocker.py +8 -0
- package/hooks/blocking/question_to_user_enforcer.py +19 -23
- package/hooks/blocking/send_user_file_open_locally_blocker.py +70 -0
- package/hooks/blocking/sensitive_file_protector.py +15 -1
- package/hooks/blocking/session_handoff_blocker.py +15 -23
- package/hooks/blocking/state_description_blocker.py +6 -0
- package/hooks/blocking/subprocess_budget_completeness.py +9 -3
- package/hooks/blocking/tdd_enforcer.py +6 -0
- package/hooks/blocking/test_code_rules_enforcer_docstring_returns_plural_cardinality.py +207 -0
- package/hooks/blocking/test_code_rules_enforcer_docstring_unguarded_payload.py +188 -0
- package/hooks/blocking/test_code_verifier_spawn_preflight_gate.py +61 -0
- package/hooks/blocking/test_docstring_rule_gate_count_blocker.py +203 -0
- package/hooks/blocking/test_duplicate_rmtree_helper_blocker.py +328 -0
- package/hooks/blocking/test_hedging_language_blocker.py +6 -0
- package/hooks/blocking/test_hook_block_logger_coverage.py +53 -0
- package/hooks/blocking/test_intent_only_ending_blocker.py +5 -0
- package/hooks/blocking/test_package_inventory_stale_blocker.py +329 -0
- package/hooks/blocking/test_plain_language_blocker.py +36 -0
- package/hooks/blocking/test_pre_tool_use_dispatcher.py +55 -8
- package/hooks/blocking/test_question_to_user_enforcer.py +6 -0
- package/hooks/blocking/test_send_user_file_open_locally_blocker.py +114 -0
- package/hooks/blocking/test_session_handoff_blocker.py +6 -0
- package/hooks/blocking/test_shared_stdin_adoption.py +42 -0
- package/hooks/blocking/test_state_description_blocker.py +41 -0
- package/hooks/blocking/test_verdict_directory_write_blocker.py +49 -0
- package/hooks/blocking/test_workflow_substitution_slot_blocker.py +4 -19
- package/hooks/blocking/verdict_directory_write_blocker.py +10 -1
- package/hooks/blocking/verified_commit_gate.py +11 -0
- package/hooks/blocking/verified_commit_message_accuracy_blocker.py +16 -1
- package/hooks/blocking/windows_rmtree_blocker.py +7 -0
- package/hooks/blocking/workflow_substitution_slot_blocker.py +10 -5
- package/hooks/blocking/write_existing_file_blocker.py +16 -1
- package/hooks/hooks.json +10 -0
- package/hooks/hooks_constants/CLAUDE.md +8 -1
- package/hooks/hooks_constants/blocking_check_limits.py +13 -0
- package/hooks/hooks_constants/code_rules_enforcer_constants.py +3 -0
- package/hooks/hooks_constants/code_verifier_spawn_preflight_gate_constants.py +2 -1
- package/hooks/hooks_constants/docstring_rule_gate_count_blocker_constants.py +90 -0
- package/hooks/hooks_constants/duplicate_rmtree_helper_blocker_constants.py +27 -0
- package/hooks/hooks_constants/hook_block_logger.py +59 -0
- package/hooks/hooks_constants/multi_edit_reconstruction.py +56 -0
- package/hooks/hooks_constants/package_inventory_stale_blocker_constants.py +111 -0
- package/hooks/hooks_constants/post_tool_use_dispatcher_constants.py +3 -2
- package/hooks/hooks_constants/pre_tool_use_dispatcher_constants.py +17 -3
- package/hooks/hooks_constants/send_user_file_open_locally_blocker_constants.py +18 -0
- package/hooks/hooks_constants/test_dispatcher_constants_docstrings.py +44 -0
- package/hooks/hooks_constants/test_hook_block_logger.py +159 -0
- package/hooks/hooks_constants/test_post_tool_use_dispatcher_constants.py +43 -0
- package/hooks/hooks_constants/test_pre_tool_use_dispatcher_constants.py +99 -0
- package/hooks/hooks_constants/test_text_stripping.py +39 -0
- package/hooks/hooks_constants/text_stripping.py +36 -0
- package/hooks/lifecycle/config_change_guard.py +12 -0
- package/hooks/lifecycle/test_config_change_guard.py +23 -0
- package/hooks/validation/CLAUDE.md +1 -0
- package/hooks/validation/hook_format_validator.py +13 -0
- package/hooks/validation/mypy_validator.py +30 -1
- package/hooks/validation/post_tool_use_dispatcher.py +2 -2
- package/hooks/validation/test_hook_format_validator.py +64 -0
- package/hooks/validation/test_mypy_validator.py +23 -1
- package/hooks/validation/test_post_tool_use_dispatcher.py +6 -0
- package/hooks/workflow/auto_formatter.py +8 -5
- package/hooks/workflow/test_auto_formatter.py +33 -0
- package/package.json +1 -1
- package/rules/CLAUDE.md +1 -0
- package/rules/docstring-prose-matches-implementation.md +2 -1
- package/rules/package-inventory-stale-entry.md +24 -0
- package/rules/windows-filesystem-safe.md +2 -0
- package/skills/autoconverge/SKILL.md +21 -1
- package/skills/autoconverge/reference/stop-conditions.md +7 -0
- package/skills/autoconverge/workflow/converge.clean-audit.test.mjs +5 -4
- package/skills/autoconverge/workflow/converge.contract.test.mjs +398 -116
- package/skills/autoconverge/workflow/converge.copilot-gate.test.mjs +16 -16
- package/skills/autoconverge/workflow/converge.fix-recovery.test.mjs +36 -44
- package/skills/autoconverge/workflow/converge.merge-conflict.test.mjs +16 -24
- package/skills/autoconverge/workflow/converge.mjs +599 -606
- package/skills/autoconverge/workflow/convergence_summary.py +1 -1
- package/skills/autoconverge/workflow/render_report.py +2 -6
- package/skills/autoconverge/workflow/test_convergence_summary.py +17 -0
- 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
|
|
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
|
|
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,
|
|
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:
|