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.
Files changed (210) hide show
  1. package/.agents/skills/pull-request/scripts/pull_request.py +2 -0
  2. package/.agents/skills/pull-request/scripts/test_pull_request.py +34 -0
  3. package/.agents/skills/session-continuity/AGENTS.md +1 -0
  4. package/.agents/skills/session-continuity/CLAUDE.md +1 -0
  5. package/.agents/skills/session-continuity/README.md +213 -0
  6. package/.agents/skills/session-continuity/SKILL.md +125 -0
  7. package/.agents/skills/session-continuity/continuity.mjs +447 -0
  8. package/.agents/skills/session-continuity/continuity.test.mjs +373 -0
  9. package/.agents/skills/syncing-submodules/scripts/test_sync_parent_pointer.py +0 -7
  10. package/.agents/skills/windows-scheduled-task/SKILL.md +153 -0
  11. package/bin/cde.mjs +36 -8
  12. package/bin/cde.test.mjs +48 -0
  13. package/bin/ever-shipped-skills.mjs +2 -20
  14. package/bin/ever-shipped-skills.test.mjs +8 -0
  15. package/bin/expand_home_directory_tokens.mjs +4 -5
  16. package/bin/expand_home_directory_tokens.test.mjs +128 -0
  17. package/bin/git_hooks_installer.mjs +22 -3
  18. package/bin/git_hooks_installer.test.mjs +159 -5
  19. package/bin/install-session-continuity.mjs +88 -0
  20. package/bin/install-session-continuity.test.mjs +55 -0
  21. package/bin/install.codex-rules.test.mjs +5 -2
  22. package/bin/install.cursor-rules.test.mjs +5 -2
  23. package/bin/install.mjs +478 -63
  24. package/bin/install.policy-lint.test.mjs +56 -4
  25. package/bin/install.profiles.test.mjs +10 -0
  26. package/bin/install.prune.test.mjs +227 -17
  27. package/bin/install.test.mjs +500 -120
  28. package/bin/install.transaction.test.mjs +3 -3
  29. package/docs/CODE_RULES.md +1 -1
  30. package/hooks/blocking/code_rules_banned_identifiers.py +3 -0
  31. package/hooks/blocking/precommit_code_rules_gate.py +5 -8
  32. package/hooks/blocking/test_bash_dispatcher_interpreter_starts.py +7 -52
  33. package/hooks/blocking/test_bash_pre_tool_use_dispatcher.py +0 -69
  34. package/hooks/blocking/test_code_rules_banned_identifiers.py +64 -0
  35. package/hooks/blocking/test_pre_tool_use_dispatcher.py +10 -244
  36. package/hooks/blocking/test_shared_stdin_adoption.py +1 -47
  37. package/hooks/git-hooks/git_hooks_constants/verification_notice_constants.py +116 -0
  38. package/hooks/git-hooks/post_commit.py +33 -0
  39. package/hooks/git-hooks/pre_commit.py +18 -90
  40. package/hooks/git-hooks/pre_push.py +45 -541
  41. package/hooks/git-hooks/test_installed_policy_lint.py +55 -6
  42. package/hooks/git-hooks/test_native_hook_support.py +129 -0
  43. package/hooks/git-hooks/test_native_policy_commit.py +39 -6
  44. package/hooks/git-hooks/test_post_commit.py +43 -0
  45. package/hooks/git-hooks/test_pre_commit.py +36 -392
  46. package/hooks/git-hooks/test_pre_push.py +48 -1631
  47. package/hooks/git-hooks/test_verification_notice.py +60 -0
  48. package/hooks/git-hooks/test_verification_start.py +173 -0
  49. package/hooks/git-hooks/verification_notice.py +192 -0
  50. package/hooks/git-hooks/verification_notice_context.py +253 -0
  51. package/hooks/git-hooks/verification_notice_state.py +237 -0
  52. package/hooks/git-hooks/verification_start.py +100 -0
  53. package/hooks/hooks.json +0 -119
  54. package/hooks/hooks_constants/banned_identifiers_constants.py +4 -0
  55. package/hooks/hooks_constants/bash_pre_tool_use_dispatcher_constants.py +1 -15
  56. package/hooks/hooks_constants/post_tool_use_dispatcher_constants.py +0 -4
  57. package/hooks/hooks_constants/pre_tool_use_dispatcher_constants.py +0 -50
  58. package/hooks/hooks_constants/stop_dispatcher_constants.py +1 -4
  59. package/hooks/hooks_constants/test_bash_pre_tool_use_dispatcher_constants.py +3 -66
  60. package/hooks/hooks_constants/test_pre_tool_use_dispatcher_constants.py +42 -185
  61. package/hooks/hooks_constants/test_stop_dispatcher_constants.py +3 -25
  62. package/hooks/validation/test_post_tool_use_dispatcher.py +35 -298
  63. package/hooks/validators/run_all_validators.py +5 -1
  64. package/hooks/validators/security_checks.py +57 -2
  65. package/hooks/validators/test_hook_timing_harness.py +2 -5
  66. package/hooks/validators/test_run_all_validators_mutation_tool_parity.py +3 -11
  67. package/hooks/validators/test_run_all_validators_policy_lint.py +36 -0
  68. package/hooks/validators/test_security_checks.py +57 -0
  69. package/package.json +1 -1
  70. package/rules/confirm-implementation-forks.md +2 -0
  71. package/rules/git-workflow.md +12 -0
  72. package/rules/pstack-host-mapping.md +48 -0
  73. package/rules/vault-context.md +3 -5
  74. package/rules/verify-runtime-state.md +7 -0
  75. package/scripts/audit-hooks-cli.mjs +5 -0
  76. package/scripts/audit-hooks.mjs +72 -16
  77. package/scripts/automatic_advisory/__init__.py +1 -0
  78. package/scripts/automatic_advisory/checkout.py +51 -0
  79. package/scripts/automatic_advisory/cli.py +334 -0
  80. package/scripts/automatic_advisory/config/__init__.py +1 -0
  81. package/scripts/automatic_advisory/config/constants.py +93 -0
  82. package/scripts/automatic_advisory/config/timing.py +4 -0
  83. package/scripts/automatic_advisory/configuration.py +197 -0
  84. package/scripts/automatic_advisory/execution.py +350 -0
  85. package/scripts/automatic_advisory/git.py +69 -0
  86. package/scripts/automatic_advisory/model.py +107 -0
  87. package/scripts/automatic_advisory/process_host.py +32 -0
  88. package/scripts/automatic_advisory/publisher.py +84 -0
  89. package/scripts/automatic_advisory/runner.py +399 -0
  90. package/scripts/automatic_advisory/state.py +116 -0
  91. package/scripts/automatic_advisory/window_flags.py +41 -0
  92. package/scripts/automatic_advisory/windows_job.py +122 -0
  93. package/scripts/codex_compat_materializer.py +99 -13
  94. package/scripts/durable_post_lint.py +30 -2
  95. package/scripts/durable_post_lint_config/config/constants.py +10 -0
  96. package/scripts/durable_post_lint_config/config/test_constants.py +13 -0
  97. package/scripts/local_report_cli.py +184 -0
  98. package/scripts/local_report_core.py +247 -0
  99. package/scripts/local_report_publisher.py +12 -0
  100. package/scripts/local_report_validation.py +357 -0
  101. package/scripts/local_verification/__init__.py +23 -0
  102. package/scripts/local_verification/check_runner.py +364 -0
  103. package/scripts/local_verification/check_support.py +99 -0
  104. package/scripts/local_verification/cli.py +158 -0
  105. package/scripts/local_verification/command_runner.py +84 -0
  106. package/scripts/local_verification/config/__init__.py +1 -0
  107. package/scripts/local_verification/config/constants.py +89 -0
  108. package/scripts/local_verification/config/timing.py +1 -0
  109. package/scripts/local_verification/git_state.py +146 -0
  110. package/scripts/local_verification/manifest.py +224 -0
  111. package/scripts/local_verification/model.py +174 -0
  112. package/scripts/local_verification/runner.py +234 -0
  113. package/scripts/policy_lint/adapter_pairing.py +58 -3
  114. package/scripts/policy_lint/config/approved_test_pairs.py +323 -0
  115. package/scripts/pr_verification/__init__.py +1 -0
  116. package/scripts/pr_verification/branch_refs.py +114 -0
  117. package/scripts/pr_verification/config/__init__.py +1 -0
  118. package/scripts/pr_verification/config/constants.py +84 -0
  119. package/scripts/pr_verification/config/timing.py +5 -0
  120. package/scripts/pr_verification/github.py +137 -0
  121. package/scripts/pr_verification/github_api.py +376 -0
  122. package/scripts/pr_verification/github_labels.py +88 -0
  123. package/scripts/pr_verification/github_parsing.py +182 -0
  124. package/scripts/pr_verification/github_transport.py +91 -0
  125. package/scripts/pr_verification/lock.py +122 -0
  126. package/scripts/pr_verification/model.py +43 -0
  127. package/scripts/pr_verification/requirements.txt +1 -0
  128. package/scripts/test_durable_post_lint.py +97 -0
  129. package/scripts/tests/test-audit-hooks-cli.mjs +150 -0
  130. package/scripts/tests/test-audit-hooks.mjs +94 -2
  131. package/scripts/tests/test_automatic_advisory.py +376 -0
  132. package/scripts/tests/test_automatic_advisory_job_cleanup.py +71 -0
  133. package/scripts/tests/test_automatic_advisory_polling.py +216 -0
  134. package/scripts/tests/test_automatic_advisory_recovery.py +320 -0
  135. package/scripts/tests/test_automatic_advisory_repairs.py +400 -0
  136. package/scripts/tests/test_automatic_advisory_settings.py +48 -0
  137. package/scripts/tests/test_automatic_advisory_window_flags.py +163 -0
  138. package/scripts/tests/test_closed_pr_label.py +157 -0
  139. package/scripts/tests/test_codex_compat_materializer.py +189 -6
  140. package/scripts/tests/test_github_labels.py +101 -0
  141. package/scripts/tests/test_github_transport.py +125 -0
  142. package/scripts/tests/test_local_report_publisher.py +396 -0
  143. package/scripts/tests/test_local_report_publisher_cli.py +85 -0
  144. package/scripts/tests/test_local_verification.py +348 -0
  145. package/scripts/tests/test_local_verification_cli.py +98 -0
  146. package/scripts/tests/test_policy_lint_rules_pairing.py +163 -0
  147. package/scripts/tests/test_pr_verification_github.py +392 -0
  148. package/scripts/tests/test_pr_verification_lock.py +168 -0
  149. package/scripts/tests/test_verification_notice.py +347 -0
  150. package/hooks/blocking/ask_user_question_shape_blocker.py +0 -83
  151. package/hooks/blocking/bot_mention_comment_blocker.py +0 -76
  152. package/hooks/blocking/claude_md_orphan_file_blocker.py +0 -129
  153. package/hooks/blocking/cursor_cli_python_misfire_blocker.py +0 -108
  154. package/hooks/blocking/destructive_command_blocker.py +0 -2073
  155. package/hooks/blocking/fable_spawn_gate.py +0 -187
  156. package/hooks/blocking/luna_fast_mode_gate.py +0 -160
  157. package/hooks/blocking/nas_ssh_binary_enforcer.py +0 -163
  158. package/hooks/blocking/orchestrator_refresh_reschedule_gate.py +0 -260
  159. package/hooks/blocking/package_inventory_stale_blocker.py +0 -107
  160. package/hooks/blocking/pii_prevention_blocker.py +0 -365
  161. package/hooks/blocking/piped_pytest_blocker.py +0 -1223
  162. package/hooks/blocking/question_to_user_enforcer.py +0 -130
  163. package/hooks/blocking/send_user_file_open_locally_blocker.py +0 -71
  164. package/hooks/blocking/sensitive_file_protector.py +0 -167
  165. package/hooks/blocking/session_edit_stage_gate.py +0 -684
  166. package/hooks/blocking/session_handoff_blocker.py +0 -182
  167. package/hooks/blocking/shell_substitution_blocker.py +0 -350
  168. package/hooks/blocking/test_ask_user_question_shape.py +0 -69
  169. package/hooks/blocking/test_bot_mention_comment_blocker.py +0 -131
  170. package/hooks/blocking/test_claude_md_orphan_file_blocker.py +0 -1277
  171. package/hooks/blocking/test_cursor_cli_python_misfire_blocker.py +0 -208
  172. package/hooks/blocking/test_destructive_command_blocker.py +0 -2024
  173. package/hooks/blocking/test_destructive_command_blocker_deny_mode.py +0 -105
  174. package/hooks/blocking/test_destructive_command_blocker_no_verify.py +0 -122
  175. package/hooks/blocking/test_destructive_command_blocker_patterns.py +0 -133
  176. package/hooks/blocking/test_fable_spawn_gate.py +0 -381
  177. package/hooks/blocking/test_inventory_deadlock_resolution.py +0 -154
  178. package/hooks/blocking/test_luna_fast_mode_gate.py +0 -211
  179. package/hooks/blocking/test_nas_ssh_binary_enforcer.py +0 -225
  180. package/hooks/blocking/test_orchestrator_refresh_reschedule_gate.py +0 -231
  181. package/hooks/blocking/test_package_inventory_stale_blocker.py +0 -382
  182. package/hooks/blocking/test_pii_prevention_blocker.py +0 -1222
  183. package/hooks/blocking/test_pii_prevention_windows_git_path.py +0 -41
  184. package/hooks/blocking/test_pii_write_surface_ephemeral.py +0 -221
  185. package/hooks/blocking/test_piped_pytest_blocker.py +0 -587
  186. package/hooks/blocking/test_precommit_code_rules_gate_native_owner.py +0 -233
  187. package/hooks/blocking/test_question_to_user_enforcer.py +0 -169
  188. package/hooks/blocking/test_send_user_file_open_locally_blocker.py +0 -118
  189. package/hooks/blocking/test_sensitive_file_protector.py +0 -365
  190. package/hooks/blocking/test_session_edit_stage_gate.py +0 -537
  191. package/hooks/blocking/test_session_edit_stage_gate_staging.py +0 -64
  192. package/hooks/blocking/test_session_edit_stage_gate_support.py +0 -204
  193. package/hooks/blocking/test_session_edit_stage_gate_tracker.py +0 -116
  194. package/hooks/blocking/test_session_handoff_blocker.py +0 -318
  195. package/hooks/blocking/test_shell_substitution_blocker.py +0 -298
  196. package/hooks/blocking/test_unscoped_search_blocker.py +0 -102
  197. package/hooks/blocking/test_write_existing_file_blocker.py +0 -122
  198. package/hooks/blocking/tests/test_pii_prevention_blocker.py +0 -259
  199. package/hooks/blocking/unscoped_search_blocker.py +0 -391
  200. package/hooks/blocking/write_existing_file_blocker.py +0 -124
  201. package/hooks/hooks_constants/bot_mention_comment_blocker_constants.py +0 -19
  202. package/hooks/hooks_constants/cursor_cli_python_misfire_blocker_constants.py +0 -79
  203. package/hooks/hooks_constants/fable_spawn_gate_constants.py +0 -61
  204. package/hooks/hooks_constants/luna_fast_mode_gate_constants.py +0 -45
  205. package/hooks/hooks_constants/nas_ssh_binary_enforcer_constants.py +0 -20
  206. package/hooks/hooks_constants/orchestrator_refresh_reschedule_gate_constants.py +0 -57
  207. package/hooks/hooks_constants/send_user_file_open_locally_blocker_constants.py +0 -17
  208. package/hooks/hooks_constants/sensitive_file_protector_constants.py +0 -40
  209. package/hooks/hooks_constants/session_handoff_blocker_constants.py +0 -10
  210. 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)) == ""