claude-dev-env 7.0.0 → 7.2.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 +213 -0
- package/.agents/skills/session-continuity/SKILL.md +125 -0
- package/.agents/skills/session-continuity/continuity.mjs +447 -0
- package/.agents/skills/session-continuity/continuity.test.mjs +373 -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 +88 -0
- package/bin/install-session-continuity.test.mjs +55 -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,208 +0,0 @@
|
|
|
1
|
-
"""Behavior tests for the Cursor-vs-Python gate misfire PreToolUse hook."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
import importlib.util
|
|
6
|
-
import io
|
|
7
|
-
import json
|
|
8
|
-
import pathlib
|
|
9
|
-
import sys
|
|
10
|
-
from unittest import mock
|
|
11
|
-
|
|
12
|
-
_HOOK_DIR = pathlib.Path(__file__).parent
|
|
13
|
-
if str(_HOOK_DIR) not in sys.path:
|
|
14
|
-
sys.path.insert(0, str(_HOOK_DIR))
|
|
15
|
-
|
|
16
|
-
_HOOKS_DIR = str(_HOOK_DIR.parent)
|
|
17
|
-
if _HOOKS_DIR not in sys.path:
|
|
18
|
-
sys.path.insert(0, _HOOKS_DIR)
|
|
19
|
-
|
|
20
|
-
hook_spec = importlib.util.spec_from_file_location(
|
|
21
|
-
"cursor_cli_python_misfire_blocker",
|
|
22
|
-
_HOOK_DIR / "cursor_cli_python_misfire_blocker.py",
|
|
23
|
-
)
|
|
24
|
-
assert hook_spec is not None
|
|
25
|
-
assert hook_spec.loader is not None
|
|
26
|
-
hook_module = importlib.util.module_from_spec(hook_spec)
|
|
27
|
-
hook_spec.loader.exec_module(hook_module)
|
|
28
|
-
|
|
29
|
-
is_cursor_python_gate_misfire = hook_module.is_cursor_python_gate_misfire
|
|
30
|
-
|
|
31
|
-
from hooks_constants.cursor_cli_python_misfire_blocker_constants import ( # noqa: E402
|
|
32
|
-
CORRECTIVE_MESSAGE,
|
|
33
|
-
DENY_DECISION,
|
|
34
|
-
)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def test_blocks_cursor_with_code_rules_gate_and_base_flag() -> None:
|
|
38
|
-
assert (
|
|
39
|
-
is_cursor_python_gate_misfire(
|
|
40
|
-
"cursor code_rules_gate.py --base origin/main"
|
|
41
|
-
)
|
|
42
|
-
is True
|
|
43
|
-
)
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
def test_blocks_cursor_exe_with_staged_flag_on_python_path() -> None:
|
|
47
|
-
assert (
|
|
48
|
-
is_cursor_python_gate_misfire(r"Cursor.exe C:\temp\helper.py --staged")
|
|
49
|
-
is True
|
|
50
|
-
)
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
def test_blocks_cursor_cmd_with_repo_root_flag() -> None:
|
|
54
|
-
assert (
|
|
55
|
-
is_cursor_python_gate_misfire("cursor.cmd path/to/module.py --repo-root .")
|
|
56
|
-
is True
|
|
57
|
-
)
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
def test_allows_code_rules_gate_path_without_extra_flags() -> None:
|
|
61
|
-
assert is_cursor_python_gate_misfire("cursor code_rules_gate.py") is False
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
def test_allows_cursor_goto_on_python_file() -> None:
|
|
65
|
-
assert is_cursor_python_gate_misfire("cursor -g file.py:10") is False
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
def test_allows_cursor_goto_on_code_rules_gate_without_gate_flags() -> None:
|
|
69
|
-
assert (
|
|
70
|
-
is_cursor_python_gate_misfire("cursor -g code_rules_gate.py:40") is False
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
def test_blocks_start_process_cursor_with_quoted_gate_flag() -> None:
|
|
75
|
-
command = (
|
|
76
|
-
r'Start-Process Cursor.exe -ArgumentList '
|
|
77
|
-
r'"C:\temp\helper.py","--staged"'
|
|
78
|
-
)
|
|
79
|
-
assert is_cursor_python_gate_misfire(command) is True
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
def test_blocks_quoted_full_path_cursor_exe_with_gate_flags() -> None:
|
|
83
|
-
command = (
|
|
84
|
-
r"& 'C:\Program Files\Cursor\Cursor.exe' "
|
|
85
|
-
r"code_rules_gate.py --base origin/main"
|
|
86
|
-
)
|
|
87
|
-
assert is_cursor_python_gate_misfire(command) is True
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
def test_blocks_unquoted_absolute_cursor_exe_with_gate_flags() -> None:
|
|
91
|
-
command = (
|
|
92
|
-
r"C:\Apps\Cursor\Cursor.exe code_rules_gate.py --base origin/main"
|
|
93
|
-
)
|
|
94
|
-
assert is_cursor_python_gate_misfire(command) is True
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
def test_allows_relative_path_under_cursor_directory() -> None:
|
|
98
|
-
assert (
|
|
99
|
-
is_cursor_python_gate_misfire(
|
|
100
|
-
r"cursor\fix\x\code_rules_gate.py --base origin/main"
|
|
101
|
-
)
|
|
102
|
-
is False
|
|
103
|
-
)
|
|
104
|
-
assert (
|
|
105
|
-
is_cursor_python_gate_misfire(
|
|
106
|
-
"cursor/fix/x/code_rules_gate.py --base origin/main"
|
|
107
|
-
)
|
|
108
|
-
is False
|
|
109
|
-
)
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
def test_allows_cursor_open_of_non_python_file() -> None:
|
|
113
|
-
assert is_cursor_python_gate_misfire("cursor README.md") is False
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
def test_allows_python_running_the_gate() -> None:
|
|
117
|
-
assert (
|
|
118
|
-
is_cursor_python_gate_misfire(
|
|
119
|
-
"python code_rules_gate.py --base origin/main"
|
|
120
|
-
)
|
|
121
|
-
is False
|
|
122
|
-
)
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
def test_allows_invoke_item() -> None:
|
|
126
|
-
assert (
|
|
127
|
-
is_cursor_python_gate_misfire("Invoke-Item -LiteralPath 'C:\\tmp\\a.py'")
|
|
128
|
-
is False
|
|
129
|
-
)
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
def test_allows_empty_command() -> None:
|
|
133
|
-
assert is_cursor_python_gate_misfire("") is False
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
def test_corrective_message_names_python_and_invoke_item() -> None:
|
|
137
|
-
assert "python" in CORRECTIVE_MESSAGE
|
|
138
|
-
assert "Invoke-Item -LiteralPath" in CORRECTIVE_MESSAGE
|
|
139
|
-
assert "EPIPE" in CORRECTIVE_MESSAGE
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
def _run_main_with_io(input_text: str) -> str:
|
|
143
|
-
with mock.patch("sys.stdin", io.StringIO(input_text)):
|
|
144
|
-
with mock.patch("sys.stdout", new_callable=io.StringIO) as mock_stdout:
|
|
145
|
-
try:
|
|
146
|
-
hook_module.main()
|
|
147
|
-
except SystemExit:
|
|
148
|
-
pass
|
|
149
|
-
return mock_stdout.getvalue()
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
def test_main_denies_bash_misfire() -> None:
|
|
153
|
-
hook_input = {
|
|
154
|
-
"tool_name": "Bash",
|
|
155
|
-
"tool_input": {
|
|
156
|
-
"command": "cursor code_rules_gate.py --base origin/main",
|
|
157
|
-
},
|
|
158
|
-
}
|
|
159
|
-
output_text = _run_main_with_io(json.dumps(hook_input))
|
|
160
|
-
output = json.loads(output_text)
|
|
161
|
-
assert output["hookSpecificOutput"]["permissionDecision"] == DENY_DECISION
|
|
162
|
-
assert "cursor-python-misfire" in output["hookSpecificOutput"][
|
|
163
|
-
"permissionDecisionReason"
|
|
164
|
-
]
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
def test_main_denies_powershell_misfire() -> None:
|
|
168
|
-
hook_input = {
|
|
169
|
-
"tool_name": "PowerShell",
|
|
170
|
-
"tool_input": {
|
|
171
|
-
"command": "cursor.cmd code_rules_gate.py --staged",
|
|
172
|
-
},
|
|
173
|
-
}
|
|
174
|
-
output_text = _run_main_with_io(json.dumps(hook_input))
|
|
175
|
-
output = json.loads(output_text)
|
|
176
|
-
assert output["hookSpecificOutput"]["permissionDecision"] == DENY_DECISION
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
def test_main_passes_python_gate_run() -> None:
|
|
180
|
-
hook_input = {
|
|
181
|
-
"tool_name": "Bash",
|
|
182
|
-
"tool_input": {
|
|
183
|
-
"command": "python code_rules_gate.py --base origin/main",
|
|
184
|
-
},
|
|
185
|
-
}
|
|
186
|
-
assert _run_main_with_io(json.dumps(hook_input)) == ""
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
def test_main_passes_wrong_tool_name() -> None:
|
|
190
|
-
hook_input = {
|
|
191
|
-
"tool_name": "Write",
|
|
192
|
-
"tool_input": {
|
|
193
|
-
"command": "cursor code_rules_gate.py --base origin/main",
|
|
194
|
-
},
|
|
195
|
-
}
|
|
196
|
-
assert _run_main_with_io(json.dumps(hook_input)) == ""
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
def test_main_passes_malformed_json() -> None:
|
|
200
|
-
assert _run_main_with_io("not valid json {{{") == ""
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
def test_main_passes_when_tool_input_is_null() -> None:
|
|
204
|
-
hook_input = {
|
|
205
|
-
"tool_name": "Bash",
|
|
206
|
-
"tool_input": None,
|
|
207
|
-
}
|
|
208
|
-
assert _run_main_with_io(json.dumps(hook_input)) == ""
|