claude-dev-env 7.0.0 → 7.1.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/.agents/skills/pull-request/scripts/pull_request.py +2 -0
- package/.agents/skills/pull-request/scripts/test_pull_request.py +34 -0
- package/.agents/skills/session-continuity/AGENTS.md +1 -0
- package/.agents/skills/session-continuity/CLAUDE.md +1 -0
- package/.agents/skills/session-continuity/README.md +189 -0
- package/.agents/skills/session-continuity/SKILL.md +114 -0
- package/.agents/skills/session-continuity/continuity.mjs +375 -0
- package/.agents/skills/session-continuity/continuity.test.mjs +303 -0
- package/.agents/skills/syncing-submodules/scripts/test_sync_parent_pointer.py +0 -7
- package/.agents/skills/windows-scheduled-task/SKILL.md +153 -0
- package/bin/cde.mjs +36 -8
- package/bin/cde.test.mjs +48 -0
- package/bin/ever-shipped-skills.mjs +2 -20
- package/bin/ever-shipped-skills.test.mjs +8 -0
- package/bin/expand_home_directory_tokens.mjs +4 -5
- package/bin/expand_home_directory_tokens.test.mjs +128 -0
- package/bin/git_hooks_installer.mjs +22 -3
- package/bin/git_hooks_installer.test.mjs +159 -5
- package/bin/install-session-continuity.mjs +78 -0
- package/bin/install-session-continuity.test.mjs +42 -0
- package/bin/install.codex-rules.test.mjs +5 -2
- package/bin/install.cursor-rules.test.mjs +5 -2
- package/bin/install.mjs +478 -63
- package/bin/install.policy-lint.test.mjs +56 -4
- package/bin/install.profiles.test.mjs +10 -0
- package/bin/install.prune.test.mjs +227 -17
- package/bin/install.test.mjs +500 -120
- package/bin/install.transaction.test.mjs +3 -3
- package/docs/CODE_RULES.md +1 -1
- package/hooks/blocking/code_rules_banned_identifiers.py +3 -0
- package/hooks/blocking/precommit_code_rules_gate.py +5 -8
- package/hooks/blocking/test_bash_dispatcher_interpreter_starts.py +7 -52
- package/hooks/blocking/test_bash_pre_tool_use_dispatcher.py +0 -69
- package/hooks/blocking/test_code_rules_banned_identifiers.py +64 -0
- package/hooks/blocking/test_pre_tool_use_dispatcher.py +10 -244
- package/hooks/blocking/test_shared_stdin_adoption.py +1 -47
- package/hooks/git-hooks/git_hooks_constants/verification_notice_constants.py +116 -0
- package/hooks/git-hooks/post_commit.py +33 -0
- package/hooks/git-hooks/pre_commit.py +18 -90
- package/hooks/git-hooks/pre_push.py +45 -541
- package/hooks/git-hooks/test_installed_policy_lint.py +55 -6
- package/hooks/git-hooks/test_native_hook_support.py +129 -0
- package/hooks/git-hooks/test_native_policy_commit.py +39 -6
- package/hooks/git-hooks/test_post_commit.py +43 -0
- package/hooks/git-hooks/test_pre_commit.py +36 -392
- package/hooks/git-hooks/test_pre_push.py +48 -1631
- package/hooks/git-hooks/test_verification_notice.py +60 -0
- package/hooks/git-hooks/test_verification_start.py +173 -0
- package/hooks/git-hooks/verification_notice.py +192 -0
- package/hooks/git-hooks/verification_notice_context.py +253 -0
- package/hooks/git-hooks/verification_notice_state.py +237 -0
- package/hooks/git-hooks/verification_start.py +100 -0
- package/hooks/hooks.json +0 -119
- package/hooks/hooks_constants/banned_identifiers_constants.py +4 -0
- package/hooks/hooks_constants/bash_pre_tool_use_dispatcher_constants.py +1 -15
- package/hooks/hooks_constants/post_tool_use_dispatcher_constants.py +0 -4
- package/hooks/hooks_constants/pre_tool_use_dispatcher_constants.py +0 -50
- package/hooks/hooks_constants/stop_dispatcher_constants.py +1 -4
- package/hooks/hooks_constants/test_bash_pre_tool_use_dispatcher_constants.py +3 -66
- package/hooks/hooks_constants/test_pre_tool_use_dispatcher_constants.py +42 -185
- package/hooks/hooks_constants/test_stop_dispatcher_constants.py +3 -25
- package/hooks/validation/test_post_tool_use_dispatcher.py +35 -298
- package/hooks/validators/run_all_validators.py +5 -1
- package/hooks/validators/security_checks.py +57 -2
- package/hooks/validators/test_hook_timing_harness.py +2 -5
- package/hooks/validators/test_run_all_validators_mutation_tool_parity.py +3 -11
- package/hooks/validators/test_run_all_validators_policy_lint.py +36 -0
- package/hooks/validators/test_security_checks.py +57 -0
- package/package.json +1 -1
- package/rules/confirm-implementation-forks.md +2 -0
- package/rules/git-workflow.md +12 -0
- package/rules/pstack-host-mapping.md +48 -0
- package/rules/vault-context.md +3 -5
- package/rules/verify-runtime-state.md +7 -0
- package/scripts/audit-hooks-cli.mjs +5 -0
- package/scripts/audit-hooks.mjs +72 -16
- package/scripts/automatic_advisory/__init__.py +1 -0
- package/scripts/automatic_advisory/checkout.py +51 -0
- package/scripts/automatic_advisory/cli.py +334 -0
- package/scripts/automatic_advisory/config/__init__.py +1 -0
- package/scripts/automatic_advisory/config/constants.py +93 -0
- package/scripts/automatic_advisory/config/timing.py +4 -0
- package/scripts/automatic_advisory/configuration.py +197 -0
- package/scripts/automatic_advisory/execution.py +350 -0
- package/scripts/automatic_advisory/git.py +69 -0
- package/scripts/automatic_advisory/model.py +107 -0
- package/scripts/automatic_advisory/process_host.py +32 -0
- package/scripts/automatic_advisory/publisher.py +84 -0
- package/scripts/automatic_advisory/runner.py +399 -0
- package/scripts/automatic_advisory/state.py +116 -0
- package/scripts/automatic_advisory/window_flags.py +41 -0
- package/scripts/automatic_advisory/windows_job.py +122 -0
- package/scripts/codex_compat_materializer.py +99 -13
- package/scripts/durable_post_lint.py +30 -2
- package/scripts/durable_post_lint_config/config/constants.py +10 -0
- package/scripts/durable_post_lint_config/config/test_constants.py +13 -0
- package/scripts/local_report_cli.py +184 -0
- package/scripts/local_report_core.py +247 -0
- package/scripts/local_report_publisher.py +12 -0
- package/scripts/local_report_validation.py +357 -0
- package/scripts/local_verification/__init__.py +23 -0
- package/scripts/local_verification/check_runner.py +364 -0
- package/scripts/local_verification/check_support.py +99 -0
- package/scripts/local_verification/cli.py +158 -0
- package/scripts/local_verification/command_runner.py +84 -0
- package/scripts/local_verification/config/__init__.py +1 -0
- package/scripts/local_verification/config/constants.py +89 -0
- package/scripts/local_verification/config/timing.py +1 -0
- package/scripts/local_verification/git_state.py +146 -0
- package/scripts/local_verification/manifest.py +224 -0
- package/scripts/local_verification/model.py +174 -0
- package/scripts/local_verification/runner.py +234 -0
- package/scripts/policy_lint/adapter_pairing.py +58 -3
- package/scripts/policy_lint/config/approved_test_pairs.py +323 -0
- package/scripts/pr_verification/__init__.py +1 -0
- package/scripts/pr_verification/branch_refs.py +114 -0
- package/scripts/pr_verification/config/__init__.py +1 -0
- package/scripts/pr_verification/config/constants.py +84 -0
- package/scripts/pr_verification/config/timing.py +5 -0
- package/scripts/pr_verification/github.py +137 -0
- package/scripts/pr_verification/github_api.py +376 -0
- package/scripts/pr_verification/github_labels.py +88 -0
- package/scripts/pr_verification/github_parsing.py +182 -0
- package/scripts/pr_verification/github_transport.py +91 -0
- package/scripts/pr_verification/lock.py +122 -0
- package/scripts/pr_verification/model.py +43 -0
- package/scripts/pr_verification/requirements.txt +1 -0
- package/scripts/test_durable_post_lint.py +97 -0
- package/scripts/tests/test-audit-hooks-cli.mjs +150 -0
- package/scripts/tests/test-audit-hooks.mjs +94 -2
- package/scripts/tests/test_automatic_advisory.py +376 -0
- package/scripts/tests/test_automatic_advisory_job_cleanup.py +71 -0
- package/scripts/tests/test_automatic_advisory_polling.py +216 -0
- package/scripts/tests/test_automatic_advisory_recovery.py +320 -0
- package/scripts/tests/test_automatic_advisory_repairs.py +400 -0
- package/scripts/tests/test_automatic_advisory_settings.py +48 -0
- package/scripts/tests/test_automatic_advisory_window_flags.py +163 -0
- package/scripts/tests/test_closed_pr_label.py +157 -0
- package/scripts/tests/test_codex_compat_materializer.py +189 -6
- package/scripts/tests/test_github_labels.py +101 -0
- package/scripts/tests/test_github_transport.py +125 -0
- package/scripts/tests/test_local_report_publisher.py +396 -0
- package/scripts/tests/test_local_report_publisher_cli.py +85 -0
- package/scripts/tests/test_local_verification.py +348 -0
- package/scripts/tests/test_local_verification_cli.py +98 -0
- package/scripts/tests/test_policy_lint_rules_pairing.py +163 -0
- package/scripts/tests/test_pr_verification_github.py +392 -0
- package/scripts/tests/test_pr_verification_lock.py +168 -0
- package/scripts/tests/test_verification_notice.py +347 -0
- package/hooks/blocking/ask_user_question_shape_blocker.py +0 -83
- package/hooks/blocking/bot_mention_comment_blocker.py +0 -76
- package/hooks/blocking/claude_md_orphan_file_blocker.py +0 -129
- package/hooks/blocking/cursor_cli_python_misfire_blocker.py +0 -108
- package/hooks/blocking/destructive_command_blocker.py +0 -2073
- package/hooks/blocking/fable_spawn_gate.py +0 -187
- package/hooks/blocking/luna_fast_mode_gate.py +0 -160
- package/hooks/blocking/nas_ssh_binary_enforcer.py +0 -163
- package/hooks/blocking/orchestrator_refresh_reschedule_gate.py +0 -260
- package/hooks/blocking/package_inventory_stale_blocker.py +0 -107
- package/hooks/blocking/pii_prevention_blocker.py +0 -365
- package/hooks/blocking/piped_pytest_blocker.py +0 -1223
- package/hooks/blocking/question_to_user_enforcer.py +0 -130
- package/hooks/blocking/send_user_file_open_locally_blocker.py +0 -71
- package/hooks/blocking/sensitive_file_protector.py +0 -167
- package/hooks/blocking/session_edit_stage_gate.py +0 -684
- package/hooks/blocking/session_handoff_blocker.py +0 -182
- package/hooks/blocking/shell_substitution_blocker.py +0 -350
- package/hooks/blocking/test_ask_user_question_shape.py +0 -69
- package/hooks/blocking/test_bot_mention_comment_blocker.py +0 -131
- package/hooks/blocking/test_claude_md_orphan_file_blocker.py +0 -1277
- package/hooks/blocking/test_cursor_cli_python_misfire_blocker.py +0 -208
- package/hooks/blocking/test_destructive_command_blocker.py +0 -2024
- package/hooks/blocking/test_destructive_command_blocker_deny_mode.py +0 -105
- package/hooks/blocking/test_destructive_command_blocker_no_verify.py +0 -122
- package/hooks/blocking/test_destructive_command_blocker_patterns.py +0 -133
- package/hooks/blocking/test_fable_spawn_gate.py +0 -381
- package/hooks/blocking/test_inventory_deadlock_resolution.py +0 -154
- package/hooks/blocking/test_luna_fast_mode_gate.py +0 -211
- package/hooks/blocking/test_nas_ssh_binary_enforcer.py +0 -225
- package/hooks/blocking/test_orchestrator_refresh_reschedule_gate.py +0 -231
- package/hooks/blocking/test_package_inventory_stale_blocker.py +0 -382
- package/hooks/blocking/test_pii_prevention_blocker.py +0 -1222
- package/hooks/blocking/test_pii_prevention_windows_git_path.py +0 -41
- package/hooks/blocking/test_pii_write_surface_ephemeral.py +0 -221
- package/hooks/blocking/test_piped_pytest_blocker.py +0 -587
- package/hooks/blocking/test_precommit_code_rules_gate_native_owner.py +0 -233
- package/hooks/blocking/test_question_to_user_enforcer.py +0 -169
- package/hooks/blocking/test_send_user_file_open_locally_blocker.py +0 -118
- package/hooks/blocking/test_sensitive_file_protector.py +0 -365
- package/hooks/blocking/test_session_edit_stage_gate.py +0 -537
- package/hooks/blocking/test_session_edit_stage_gate_staging.py +0 -64
- package/hooks/blocking/test_session_edit_stage_gate_support.py +0 -204
- package/hooks/blocking/test_session_edit_stage_gate_tracker.py +0 -116
- package/hooks/blocking/test_session_handoff_blocker.py +0 -318
- package/hooks/blocking/test_shell_substitution_blocker.py +0 -298
- package/hooks/blocking/test_unscoped_search_blocker.py +0 -102
- package/hooks/blocking/test_write_existing_file_blocker.py +0 -122
- package/hooks/blocking/tests/test_pii_prevention_blocker.py +0 -259
- package/hooks/blocking/unscoped_search_blocker.py +0 -391
- package/hooks/blocking/write_existing_file_blocker.py +0 -124
- package/hooks/hooks_constants/bot_mention_comment_blocker_constants.py +0 -19
- package/hooks/hooks_constants/cursor_cli_python_misfire_blocker_constants.py +0 -79
- package/hooks/hooks_constants/fable_spawn_gate_constants.py +0 -61
- package/hooks/hooks_constants/luna_fast_mode_gate_constants.py +0 -45
- package/hooks/hooks_constants/nas_ssh_binary_enforcer_constants.py +0 -20
- package/hooks/hooks_constants/orchestrator_refresh_reschedule_gate_constants.py +0 -57
- package/hooks/hooks_constants/send_user_file_open_locally_blocker_constants.py +0 -17
- package/hooks/hooks_constants/sensitive_file_protector_constants.py +0 -40
- package/hooks/hooks_constants/session_handoff_blocker_constants.py +0 -10
- package/hooks/hooks_constants/shell_substitution_blocker_constants.py +0 -80
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
"""Unit tests for bot-mention-comment-blocker PreToolUse hook."""
|
|
2
|
-
|
|
3
|
-
import importlib.util
|
|
4
|
-
import io
|
|
5
|
-
import json
|
|
6
|
-
import pathlib
|
|
7
|
-
import sys
|
|
8
|
-
|
|
9
|
-
_HOOK_DIR = pathlib.Path(__file__).parent
|
|
10
|
-
if str(_HOOK_DIR) not in sys.path:
|
|
11
|
-
sys.path.insert(0, str(_HOOK_DIR))
|
|
12
|
-
|
|
13
|
-
hook_spec = importlib.util.spec_from_file_location(
|
|
14
|
-
"bot_mention_comment_blocker",
|
|
15
|
-
_HOOK_DIR / "bot_mention_comment_blocker.py",
|
|
16
|
-
)
|
|
17
|
-
assert hook_spec is not None
|
|
18
|
-
assert hook_spec.loader is not None
|
|
19
|
-
hook_module = importlib.util.module_from_spec(hook_spec)
|
|
20
|
-
hook_spec.loader.exec_module(hook_module)
|
|
21
|
-
|
|
22
|
-
_detect_bot_mention = hook_module._detect_bot_mention
|
|
23
|
-
_body_contains_token = hook_module._body_contains_token
|
|
24
|
-
|
|
25
|
-
from hooks_constants.bot_mention_comment_blocker_constants import (
|
|
26
|
-
CORRECTIVE_MESSAGE_COPILOT,
|
|
27
|
-
CORRECTIVE_MESSAGE_CURSOR,
|
|
28
|
-
CURSOR_MENTION_TOKEN,
|
|
29
|
-
)
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
def test_passes_clean_body() -> None:
|
|
33
|
-
assert _detect_bot_mention("bugbot run") is None
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def test_passes_empty_body() -> None:
|
|
37
|
-
assert _detect_bot_mention("") is None
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
def test_passes_unrelated_body() -> None:
|
|
41
|
-
assert _detect_bot_mention("please review this PR") is None
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
def test_blocks_cursor_mention() -> None:
|
|
45
|
-
reason = _detect_bot_mention("@cursor bugbot run")
|
|
46
|
-
assert reason is not None
|
|
47
|
-
assert "bugbot run" in reason
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
def test_blocks_cursor_bracket_mention() -> None:
|
|
51
|
-
reason = _detect_bot_mention("@cursor[bot] bugbot run")
|
|
52
|
-
assert reason is not None
|
|
53
|
-
assert "bugbot run" in reason
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def test_blocks_copilot_mention() -> None:
|
|
57
|
-
reason = _detect_bot_mention("@copilot review this")
|
|
58
|
-
assert reason is not None
|
|
59
|
-
assert "copilot-pull-request-reviewer" in reason
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
def test_returns_cursor_message_for_cursor() -> None:
|
|
63
|
-
assert _detect_bot_mention("@cursor run") == CORRECTIVE_MESSAGE_CURSOR
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
def test_returns_copilot_message_for_copilot() -> None:
|
|
67
|
-
assert _detect_bot_mention("@copilot help") == CORRECTIVE_MESSAGE_COPILOT
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
def test_copilot_wins_when_both_present() -> None:
|
|
71
|
-
assert _detect_bot_mention("@cursor and @copilot") == CORRECTIVE_MESSAGE_COPILOT
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
def test_body_contains_token_case_insensitive() -> None:
|
|
75
|
-
assert _body_contains_token("Hello @CURSOR world", "@cursor")
|
|
76
|
-
assert _body_contains_token("Hello @CoPilot world", "@copilot")
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
def test_body_contains_token_no_at_sign() -> None:
|
|
80
|
-
assert not _body_contains_token("cursor without at-sign", CURSOR_MENTION_TOKEN)
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
from unittest import mock
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
def _run_main_with_io(input_text: str) -> str:
|
|
87
|
-
with mock.patch("sys.stdin", io.StringIO(input_text)):
|
|
88
|
-
with mock.patch("sys.stdout", new_callable=io.StringIO) as mock_stdout:
|
|
89
|
-
try:
|
|
90
|
-
hook_module.main()
|
|
91
|
-
except SystemExit:
|
|
92
|
-
pass
|
|
93
|
-
return mock_stdout.getvalue()
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
def test_main_blocks_matching_cursor_comment() -> None:
|
|
97
|
-
hook_input = {
|
|
98
|
-
"tool_name": "mcp__plugin_github_github__add_issue_comment",
|
|
99
|
-
"tool_input": {"body": "@cursor bugbot run"},
|
|
100
|
-
}
|
|
101
|
-
output_text = _run_main_with_io(json.dumps(hook_input))
|
|
102
|
-
output = json.loads(output_text)
|
|
103
|
-
assert output["hookSpecificOutput"]["permissionDecision"] == "deny"
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
def test_main_passes_wrong_tool_name() -> None:
|
|
107
|
-
hook_input = {
|
|
108
|
-
"tool_name": "some_other_tool",
|
|
109
|
-
"tool_input": {"body": "@cursor bugbot run"},
|
|
110
|
-
}
|
|
111
|
-
assert _run_main_with_io(json.dumps(hook_input)) == ""
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
def test_main_passes_empty_body() -> None:
|
|
115
|
-
hook_input = {
|
|
116
|
-
"tool_name": "mcp__plugin_github_github__add_issue_comment",
|
|
117
|
-
"tool_input": {"body": ""},
|
|
118
|
-
}
|
|
119
|
-
assert _run_main_with_io(json.dumps(hook_input)) == ""
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
def test_main_passes_non_matching_body() -> None:
|
|
123
|
-
hook_input = {
|
|
124
|
-
"tool_name": "mcp__plugin_github_github__add_issue_comment",
|
|
125
|
-
"tool_input": {"body": "please review this PR"},
|
|
126
|
-
}
|
|
127
|
-
assert _run_main_with_io(json.dumps(hook_input)) == ""
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
def test_main_passes_malformed_json() -> None:
|
|
131
|
-
assert _run_main_with_io("not valid json {{{") == ""
|