claude-dev-env 4.3.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.
Files changed (480) hide show
  1. package/.agents/agents/pr-description-writer.md +2 -2
  2. package/.agents/agents/test_agent_frontmatter.py +2 -2
  3. package/.agents/agents/test_pr_description_writer_style.py +1 -3
  4. package/.agents/skills/e-code-review/SKILL.md +12 -12
  5. package/.agents/skills/e-code-review/preflight-proposal.contract.test.mjs +20 -0
  6. package/.agents/skills/e-code-review/reference/fix.md +15 -17
  7. package/.agents/skills/e-code-review/reference/loop.md +35 -39
  8. package/.agents/skills/e-code-review/reference/mode-contract.test.mjs +2 -1
  9. package/.agents/skills/e-code-review/reference/preflight-proposal.md +44 -9
  10. package/.agents/skills/e-code-review/reference/runner-selection.md +13 -14
  11. package/.agents/skills/issue-tracker/SKILL.md +5 -4
  12. package/.agents/skills/pull-request/SKILL.md +11 -13
  13. package/.agents/skills/pull-request/reference/publication-tasks.md +3 -3
  14. package/.agents/skills/pull-request/scripts/github_pr_command_constants/config/constants.py +9 -1
  15. package/.agents/skills/pull-request/scripts/pull_request.py +35 -44
  16. package/.agents/skills/pull-request/scripts/test_github_pr_command_constants.py +9 -0
  17. package/.agents/skills/pull-request/scripts/test_pull_request.py +35 -3
  18. package/.agents/skills/session-continuity/README.md +189 -0
  19. package/.agents/skills/session-continuity/SKILL.md +114 -0
  20. package/.agents/skills/session-continuity/continuity.mjs +375 -0
  21. package/.agents/skills/session-continuity/continuity.test.mjs +303 -0
  22. package/.agents/skills/skill-builder/SKILL.md +3 -196
  23. package/.agents/skills/syncing-submodules/scripts/test_sync_parent_pointer.py +0 -7
  24. package/.agents/skills/windows-scheduled-task/SKILL.md +153 -0
  25. package/_shared/pr-loop/scripts/pr_loop_shared_constants/terminology_sweep_constants.py +6 -0
  26. package/_shared/pr-loop/scripts/terminology_sweep.py +64 -19
  27. package/_shared/pr-loop/scripts/tests/test_terminology_sweep.py +59 -0
  28. package/bin/cde.mjs +36 -8
  29. package/bin/cde.test.mjs +48 -0
  30. package/bin/ever-shipped-skills.mjs +2 -20
  31. package/bin/ever-shipped-skills.test.mjs +8 -0
  32. package/bin/expand_home_directory_tokens.mjs +4 -5
  33. package/bin/expand_home_directory_tokens.test.mjs +128 -0
  34. package/bin/git_hooks_installer.mjs +22 -3
  35. package/bin/git_hooks_installer.test.mjs +159 -5
  36. package/bin/install-session-continuity.mjs +78 -0
  37. package/bin/install-session-continuity.test.mjs +42 -0
  38. package/bin/install.agents-home.test.mjs +15 -13
  39. package/bin/install.codex-rules.test.mjs +5 -2
  40. package/bin/install.cursor-rules.test.mjs +5 -2
  41. package/bin/install.mjs +506 -63
  42. package/bin/install.policy-lint.test.mjs +130 -0
  43. package/bin/install.profiles.test.mjs +10 -0
  44. package/bin/install.prune.test.mjs +286 -37
  45. package/bin/install.pstack-plugin.test.mjs +114 -0
  46. package/bin/install.test.mjs +537 -120
  47. package/bin/install.transaction.test.mjs +3 -3
  48. package/bin/refresh-pstack-plugin-skills.test.mjs +211 -0
  49. package/docs/CODE_RULES.md +1 -1
  50. package/hooks/advisory/pr_done_reminder.py +342 -0
  51. package/hooks/advisory/test_pr_done_reminder.py +249 -0
  52. package/hooks/blocking/bash_post_call_dispatcher.py +53 -6
  53. package/hooks/blocking/code_rules_banned_identifiers.py +3 -0
  54. package/hooks/blocking/code_rules_paired_test.py +22 -15
  55. package/hooks/blocking/precommit_code_rules_gate.py +5 -8
  56. package/hooks/blocking/test_bash_dispatcher_interpreter_starts.py +7 -52
  57. package/hooks/blocking/test_bash_post_call_dispatcher.py +65 -4
  58. package/hooks/blocking/test_bash_pre_tool_use_dispatcher.py +0 -69
  59. package/hooks/blocking/test_code_rules_banned_identifiers.py +64 -0
  60. package/hooks/blocking/test_code_rules_enforcer_paired_test.py +36 -29
  61. package/hooks/blocking/test_code_rules_js_resume_task_enumeration.py +4 -4
  62. package/hooks/blocking/test_code_rules_js_returns_object_schemaless.py +5 -5
  63. package/hooks/blocking/test_pre_tool_use_dispatcher.py +43 -342
  64. package/hooks/blocking/test_pre_tool_use_dispatcher_native.py +20 -51
  65. package/hooks/blocking/test_shared_stdin_adoption.py +1 -47
  66. package/hooks/git-hooks/git_hooks_constants/staged_policy_lint.py +12 -0
  67. package/hooks/git-hooks/git_hooks_constants/verification_notice_constants.py +116 -0
  68. package/hooks/git-hooks/post_commit.py +33 -0
  69. package/hooks/git-hooks/pre_commit.py +18 -49
  70. package/hooks/git-hooks/pre_push.py +45 -541
  71. package/hooks/git-hooks/test_installed_policy_lint.py +208 -0
  72. package/hooks/git-hooks/test_native_hook_support.py +129 -0
  73. package/hooks/git-hooks/test_native_policy_commit.py +120 -0
  74. package/hooks/git-hooks/test_post_commit.py +43 -0
  75. package/hooks/git-hooks/test_pre_commit.py +38 -148
  76. package/hooks/git-hooks/test_pre_push.py +48 -1631
  77. package/hooks/git-hooks/test_verification_notice.py +60 -0
  78. package/hooks/git-hooks/test_verification_start.py +173 -0
  79. package/hooks/git-hooks/verification_notice.py +192 -0
  80. package/hooks/git-hooks/verification_notice_context.py +253 -0
  81. package/hooks/git-hooks/verification_notice_state.py +237 -0
  82. package/hooks/git-hooks/verification_start.py +100 -0
  83. package/hooks/hooks.json +1 -120
  84. package/hooks/hooks_constants/banned_identifiers_constants.py +4 -0
  85. package/hooks/hooks_constants/bash_post_call_dispatcher_constants.py +14 -1
  86. package/hooks/hooks_constants/bash_pre_tool_use_dispatcher_constants.py +1 -15
  87. package/hooks/hooks_constants/post_tool_use_dispatcher_constants.py +0 -4
  88. package/hooks/hooks_constants/pr_done_reminder_constants.py +98 -0
  89. package/hooks/hooks_constants/pre_tool_use_dispatcher_constants.py +10 -93
  90. package/hooks/hooks_constants/stop_dispatcher_constants.py +1 -4
  91. package/hooks/hooks_constants/test_bash_post_call_dispatcher_constants.py +19 -2
  92. package/hooks/hooks_constants/test_bash_pre_tool_use_dispatcher_constants.py +3 -66
  93. package/hooks/hooks_constants/test_pr_done_reminder_constants.py +40 -0
  94. package/hooks/hooks_constants/test_pre_tool_use_dispatcher_constants.py +46 -201
  95. package/hooks/hooks_constants/test_stop_dispatcher_constants.py +3 -25
  96. package/hooks/validation/test_post_tool_use_dispatcher.py +35 -298
  97. package/hooks/validators/run_all_validators.py +5 -1
  98. package/hooks/validators/security_checks.py +57 -2
  99. package/hooks/validators/test_hook_timing_harness.py +2 -5
  100. package/hooks/validators/test_run_all_validators_mutation_tool_parity.py +3 -11
  101. package/hooks/validators/test_run_all_validators_policy_lint.py +36 -0
  102. package/hooks/validators/test_security_checks.py +57 -0
  103. package/package.json +2 -2
  104. package/rules/confirm-implementation-forks.md +2 -0
  105. package/rules/durable-post-artifacts.md +2 -1
  106. package/rules/git-workflow.md +18 -6
  107. package/rules/pstack-host-mapping.md +48 -0
  108. package/rules/vault-context.md +3 -5
  109. package/rules/verify-runtime-state.md +7 -0
  110. package/scripts/audit-hooks-cli.mjs +5 -0
  111. package/scripts/audit-hooks.mjs +72 -16
  112. package/scripts/automatic_advisory/__init__.py +1 -0
  113. package/scripts/automatic_advisory/checkout.py +51 -0
  114. package/scripts/automatic_advisory/cli.py +334 -0
  115. package/scripts/automatic_advisory/config/__init__.py +1 -0
  116. package/scripts/automatic_advisory/config/constants.py +93 -0
  117. package/scripts/automatic_advisory/config/timing.py +4 -0
  118. package/scripts/automatic_advisory/configuration.py +197 -0
  119. package/scripts/automatic_advisory/execution.py +350 -0
  120. package/scripts/automatic_advisory/git.py +69 -0
  121. package/scripts/automatic_advisory/model.py +107 -0
  122. package/scripts/automatic_advisory/process_host.py +32 -0
  123. package/scripts/automatic_advisory/publisher.py +84 -0
  124. package/scripts/automatic_advisory/runner.py +399 -0
  125. package/scripts/automatic_advisory/state.py +116 -0
  126. package/scripts/automatic_advisory/window_flags.py +41 -0
  127. package/scripts/automatic_advisory/windows_job.py +122 -0
  128. package/scripts/check.ps1 +0 -1
  129. package/{.agents/skills/run-claude-dev-env/driver.mjs → scripts/ci/installer-lifecycle.mjs} +3 -28
  130. package/scripts/ci/installer-lifecycle.test.mjs +26 -0
  131. package/scripts/ci/windows-installer-lifecycle.ps1 +1 -11
  132. package/scripts/codex_compat_materializer.py +99 -13
  133. package/scripts/dev_env_scripts_constants/shared_tree_constants.py +4 -5
  134. package/{.agents/skills/_shared/pr-loop/scripts → scripts}/durable_post_lint.py +35 -43
  135. package/{.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/durable_post_lint_constants.py → scripts/durable_post_lint_config/config/constants.py} +10 -10
  136. package/{.agents/skills/_shared/pr-loop/scripts/test_durable_post_lint_constants.py → scripts/durable_post_lint_config/config/test_constants.py} +14 -1
  137. package/scripts/local_report_cli.py +184 -0
  138. package/scripts/local_report_core.py +247 -0
  139. package/scripts/local_report_publisher.py +12 -0
  140. package/scripts/local_report_validation.py +357 -0
  141. package/scripts/local_verification/__init__.py +23 -0
  142. package/scripts/local_verification/check_runner.py +364 -0
  143. package/scripts/local_verification/check_support.py +99 -0
  144. package/scripts/local_verification/cli.py +158 -0
  145. package/scripts/local_verification/command_runner.py +84 -0
  146. package/scripts/local_verification/config/__init__.py +1 -0
  147. package/scripts/local_verification/config/constants.py +89 -0
  148. package/scripts/local_verification/config/timing.py +1 -0
  149. package/scripts/local_verification/git_state.py +146 -0
  150. package/scripts/local_verification/manifest.py +224 -0
  151. package/scripts/local_verification/model.py +174 -0
  152. package/scripts/local_verification/runner.py +234 -0
  153. package/scripts/policy_lint/adapter_detectors.py +13 -6
  154. package/scripts/policy_lint/adapter_pairing.py +58 -3
  155. package/scripts/policy_lint/adapters.py +7 -4
  156. package/scripts/policy_lint/config/approved_test_pairs.py +323 -0
  157. package/scripts/policy_lint/config/constants.py +5 -0
  158. package/scripts/policy_lint/engine.py +48 -4
  159. package/scripts/policy_lint/model.py +1 -0
  160. package/scripts/policy_lint/registry.py +1 -1
  161. package/scripts/policy_lint/selection.py +2 -1
  162. package/scripts/policy_lint/selection_git.py +2 -0
  163. package/scripts/pr_verification/__init__.py +1 -0
  164. package/scripts/pr_verification/branch_refs.py +114 -0
  165. package/scripts/pr_verification/config/__init__.py +1 -0
  166. package/scripts/pr_verification/config/constants.py +84 -0
  167. package/scripts/pr_verification/config/timing.py +5 -0
  168. package/scripts/pr_verification/github.py +137 -0
  169. package/scripts/pr_verification/github_api.py +376 -0
  170. package/scripts/pr_verification/github_labels.py +88 -0
  171. package/scripts/pr_verification/github_parsing.py +182 -0
  172. package/scripts/pr_verification/github_transport.py +91 -0
  173. package/scripts/pr_verification/lock.py +122 -0
  174. package/scripts/pr_verification/model.py +43 -0
  175. package/scripts/pr_verification/requirements.txt +1 -0
  176. package/scripts/refresh_pstack_plugin_skills.mjs +200 -0
  177. package/scripts/shared_tree_paths.py +32 -3
  178. package/{.agents/skills/_shared/pr-loop/scripts → scripts}/test_durable_post_lint.py +97 -0
  179. package/scripts/test_shared_tree_paths.py +33 -0
  180. package/scripts/tests/test-audit-hooks-cli.mjs +150 -0
  181. package/scripts/tests/test-audit-hooks.mjs +94 -2
  182. package/scripts/tests/test_automatic_advisory.py +376 -0
  183. package/scripts/tests/test_automatic_advisory_job_cleanup.py +71 -0
  184. package/scripts/tests/test_automatic_advisory_polling.py +216 -0
  185. package/scripts/tests/test_automatic_advisory_recovery.py +320 -0
  186. package/scripts/tests/test_automatic_advisory_repairs.py +400 -0
  187. package/scripts/tests/test_automatic_advisory_settings.py +48 -0
  188. package/scripts/tests/test_automatic_advisory_window_flags.py +163 -0
  189. package/scripts/tests/test_closed_pr_label.py +157 -0
  190. package/scripts/tests/test_codex_compat_materializer.py +189 -6
  191. package/scripts/tests/test_github_labels.py +101 -0
  192. package/scripts/tests/test_github_transport.py +125 -0
  193. package/scripts/tests/test_local_report_publisher.py +396 -0
  194. package/scripts/tests/test_local_report_publisher_cli.py +85 -0
  195. package/scripts/tests/test_local_verification.py +348 -0
  196. package/scripts/tests/test_local_verification_cli.py +98 -0
  197. package/scripts/tests/test_policy_lint_rules_archive.py +120 -0
  198. package/scripts/tests/test_policy_lint_rules_engine.py +25 -4
  199. package/scripts/tests/test_policy_lint_rules_installed_loader.py +29 -0
  200. package/scripts/tests/test_policy_lint_rules_pairing.py +163 -0
  201. package/scripts/tests/test_policy_lint_rules_registry.py +227 -13
  202. package/scripts/tests/test_policy_lint_selection.py +25 -2
  203. package/scripts/tests/test_policy_lint_selection_native_index.py +30 -0
  204. package/scripts/tests/test_pr_verification_github.py +392 -0
  205. package/scripts/tests/test_pr_verification_lock.py +168 -0
  206. package/scripts/tests/test_rules.py +3 -7
  207. package/scripts/tests/test_verification_notice.py +347 -0
  208. package/.agents/skills/_shared/pr-loop/.claude/CLAUDE.md +0 -1
  209. package/.agents/skills/_shared/pr-loop/audit-contract.md +0 -5
  210. package/.agents/skills/_shared/pr-loop/audit-reply-template.md +0 -5
  211. package/.agents/skills/_shared/pr-loop/code-rules-gate.md +0 -5
  212. package/.agents/skills/_shared/pr-loop/fix-protocol.md +0 -5
  213. package/.agents/skills/_shared/pr-loop/gh-payloads.md +0 -5
  214. package/.agents/skills/_shared/pr-loop/portable-driver.md +0 -149
  215. package/.agents/skills/_shared/pr-loop/post-audit-thread-contract.md +0 -5
  216. package/.agents/skills/_shared/pr-loop/precatch-rubric.md +0 -5
  217. package/.agents/skills/_shared/pr-loop/preflight-proposal.contract.test.mjs +0 -119
  218. package/.agents/skills/_shared/pr-loop/preflight-proposal.md +0 -5
  219. package/.agents/skills/_shared/pr-loop/prompts/.claude/CLAUDE.md +0 -1
  220. package/.agents/skills/_shared/pr-loop/prompts/AGENTS.md +0 -1
  221. package/.agents/skills/_shared/pr-loop/prompts/pr-consistency-audit.xml +0 -324
  222. package/.agents/skills/_shared/pr-loop/scripts/.claude/CLAUDE.md +0 -1
  223. package/.agents/skills/_shared/pr-loop/scripts/AGENTS.md +0 -1
  224. package/.agents/skills/_shared/pr-loop/scripts/RUNTIME_SCRIPTS.md +0 -29
  225. package/.agents/skills/_shared/pr-loop/scripts/_cli_utils.py +0 -22
  226. package/.agents/skills/_shared/pr-loop/scripts/_path_resolver.py +0 -186
  227. package/.agents/skills/_shared/pr-loop/scripts/_xml_utils.py +0 -20
  228. package/.agents/skills/_shared/pr-loop/scripts/audit_category_schema.py +0 -355
  229. package/.agents/skills/_shared/pr-loop/scripts/build_audit_prompt.py +0 -289
  230. package/.agents/skills/_shared/pr-loop/scripts/build_converge_task_list.py +0 -310
  231. package/.agents/skills/_shared/pr-loop/scripts/build_fix_prompt.py +0 -292
  232. package/.agents/skills/_shared/pr-loop/scripts/init_loop_state.py +0 -134
  233. package/.agents/skills/_shared/pr-loop/scripts/portable_converge_driver.py +0 -1646
  234. package/.agents/skills/_shared/pr-loop/scripts/preflight_worktree.py +0 -392
  235. package/.agents/skills/_shared/pr-loop/scripts/select_converge_pacer.py +0 -215
  236. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/.claude/CLAUDE.md +0 -1
  237. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/AGENTS.md +0 -1
  238. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/__init__.py +0 -0
  239. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/audit_category_schema_constants.py +0 -37
  240. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/converge_task_list_constants.py +0 -56
  241. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/handoff_constants.py +0 -45
  242. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/pacer_constants.py +0 -47
  243. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/path_resolver_constants.py +0 -157
  244. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/portable_driver_constants.py +0 -177
  245. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/preflight_constants.py +0 -70
  246. package/.agents/skills/_shared/pr-loop/scripts/teardown_worktrees.py +0 -172
  247. package/.agents/skills/_shared/pr-loop/scripts/test__path_resolver.py +0 -106
  248. package/.agents/skills/_shared/pr-loop/scripts/test_audit_category_schema.py +0 -94
  249. package/.agents/skills/_shared/pr-loop/scripts/test_build_audit_prompt.py +0 -499
  250. package/.agents/skills/_shared/pr-loop/scripts/test_build_converge_task_list.py +0 -140
  251. package/.agents/skills/_shared/pr-loop/scripts/test_build_fix_prompt.py +0 -262
  252. package/.agents/skills/_shared/pr-loop/scripts/test_init_loop_state.py +0 -71
  253. package/.agents/skills/_shared/pr-loop/scripts/test_portable_converge_driver.py +0 -1119
  254. package/.agents/skills/_shared/pr-loop/scripts/test_preflight_worktree.py +0 -287
  255. package/.agents/skills/_shared/pr-loop/scripts/test_select_converge_pacer.py +0 -207
  256. package/.agents/skills/_shared/pr-loop/scripts/test_teardown_worktrees.py +0 -59
  257. package/.agents/skills/_shared/pr-loop/scripts/test_write_handoff.py +0 -201
  258. package/.agents/skills/_shared/pr-loop/scripts/write_audit_outcomes.py +0 -182
  259. package/.agents/skills/_shared/pr-loop/scripts/write_fix_outcomes.py +0 -206
  260. package/.agents/skills/_shared/pr-loop/scripts/write_handoff.py +0 -309
  261. package/.agents/skills/_shared/pr-loop/state-schema.md +0 -5
  262. package/.agents/skills/_shared/pr-loop/worker-spawn.md +0 -5
  263. package/.agents/skills/autoconverge/.claude/CLAUDE.md +0 -1
  264. package/.agents/skills/autoconverge/AGENTS.md +0 -1
  265. package/.agents/skills/autoconverge/SKILL.md +0 -431
  266. package/.agents/skills/autoconverge/reference/.claude/CLAUDE.md +0 -1
  267. package/.agents/skills/autoconverge/reference/AGENTS.md +0 -1
  268. package/.agents/skills/autoconverge/reference/closing-report.md +0 -93
  269. package/.agents/skills/autoconverge/reference/convergence-gates.md +0 -31
  270. package/.agents/skills/autoconverge/reference/convergence.md +0 -219
  271. package/.agents/skills/autoconverge/reference/copilot-findings.md +0 -51
  272. package/.agents/skills/autoconverge/reference/gotchas.md +0 -66
  273. package/.agents/skills/autoconverge/reference/headless-safety.md +0 -44
  274. package/.agents/skills/autoconverge/reference/multi-pr.md +0 -128
  275. package/.agents/skills/autoconverge/reference/self-closing-loop.md +0 -84
  276. package/.agents/skills/autoconverge/reference/stop-conditions.md +0 -127
  277. package/.agents/skills/autoconverge/test_portable_pacer_gate.py +0 -54
  278. package/.agents/skills/autoconverge/workflow/.claude/CLAUDE.md +0 -1
  279. package/.agents/skills/autoconverge/workflow/AGENTS.md +0 -1
  280. package/.agents/skills/autoconverge/workflow/aggregate_runs.py +0 -371
  281. package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/.claude/CLAUDE.md +0 -1
  282. package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/AGENTS.md +0 -1
  283. package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/__init__.py +0 -0
  284. package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/render_report_constants.py +0 -250
  285. package/.agents/skills/autoconverge/workflow/converge.clean-audit.test.mjs +0 -665
  286. package/.agents/skills/autoconverge/workflow/converge.codex-gate.test.mjs +0 -472
  287. package/.agents/skills/autoconverge/workflow/converge.contract.test.mjs +0 -64
  288. package/.agents/skills/autoconverge/workflow/converge.copilot-gate.test.mjs +0 -1009
  289. package/.agents/skills/autoconverge/workflow/converge.fix-progress.test.mjs +0 -107
  290. package/.agents/skills/autoconverge/workflow/converge.fix-recovery.test.mjs +0 -33
  291. package/.agents/skills/autoconverge/workflow/converge.merge-conflict.test.mjs +0 -15
  292. package/.agents/skills/autoconverge/workflow/converge.mjs +0 -3132
  293. package/.agents/skills/autoconverge/workflow/converge.p2-advance.test.mjs +0 -202
  294. package/.agents/skills/autoconverge/workflow/converge.path-aware.test.mjs +0 -47
  295. package/.agents/skills/autoconverge/workflow/converge.precatch.test.mjs +0 -152
  296. package/.agents/skills/autoconverge/workflow/converge.run-input.test.mjs +0 -116
  297. package/.agents/skills/autoconverge/workflow/converge_multi.mjs +0 -169
  298. package/.agents/skills/autoconverge/workflow/converge_multi.run-input.test.mjs +0 -173
  299. package/.agents/skills/autoconverge/workflow/convergence_summary.py +0 -110
  300. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a11d903476b803493.jsonl +0 -2
  301. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a26213978adeef6fb.jsonl +0 -2
  302. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a3def0d15ed9d9110.jsonl +0 -2
  303. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a41f41b1b708ee3b7.jsonl +0 -2
  304. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a758b880abecc3ff7.jsonl +0 -2
  305. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a8897b89656b1bd16.jsonl +0 -2
  306. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-ab1c2d3e4f5a6b7c8.jsonl +0 -2
  307. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-abd463d744a1437bc.jsonl +0 -2
  308. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-ad19d027ae8ee1816.jsonl +0 -2
  309. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/workflows/wf_881252e6-700.json +0 -266
  310. package/.agents/skills/autoconverge/workflow/render_report.py +0 -1024
  311. package/.agents/skills/autoconverge/workflow/test_aggregate_runs.py +0 -134
  312. package/.agents/skills/autoconverge/workflow/test_convergence_summary.py +0 -149
  313. package/.agents/skills/autoconverge/workflow/test_render_report.py +0 -812
  314. package/.agents/skills/hitl/SKILL.md +0 -45
  315. package/.agents/skills/pr-cleanup/SKILL.md +0 -140
  316. package/.agents/skills/pr-cleanup/reference/process-inventory.md +0 -17
  317. package/.agents/skills/pr-cleanup/reference/task-seeds.md +0 -22
  318. package/.agents/skills/pr-name-by-capability/SKILL.md +0 -73
  319. package/.agents/skills/pr-name-by-capability/reference/fetch-commands.md +0 -29
  320. package/.agents/skills/pr-name-by-capability/reference/offense-examples.md +0 -32
  321. package/.agents/skills/pr-name-by-capability/reference/report-template.md +0 -29
  322. package/.agents/skills/pr-name-by-capability/reference/rule-checklist.md +0 -38
  323. package/.agents/skills/pr-name-by-capability/reference/task-seeds.md +0 -10
  324. package/.agents/skills/pr-plain-language-cleanup/SKILL.md +0 -93
  325. package/.agents/skills/pr-refinement/SKILL.md +0 -31
  326. package/.agents/skills/pr-shared-extraction/SKILL.md +0 -177
  327. package/.agents/skills/pr-shared-extraction/reference/examples.md +0 -46
  328. package/.agents/skills/pr-shared-extraction/reference/offense-taxonomy.md +0 -100
  329. package/.agents/skills/pr-small-cl/SKILL.md +0 -52
  330. package/.agents/skills/pr-title-description/SKILL.md +0 -96
  331. package/.agents/skills/prototype/SKILL.md +0 -85
  332. package/.agents/skills/prototype/reference/honest-limitations.md +0 -23
  333. package/.agents/skills/prototype/reference/promotion-tasks.md +0 -23
  334. package/.agents/skills/prototype/scripts/build_sandbox_settings.py +0 -249
  335. package/.agents/skills/prototype/scripts/conftest.py +0 -15
  336. package/.agents/skills/prototype/scripts/launch_sandbox.py +0 -205
  337. package/.agents/skills/prototype/scripts/probe_sandbox_safety.py +0 -311
  338. package/.agents/skills/prototype/scripts/prototype_scripts_constants/__init__.py +0 -1
  339. package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/__init__.py +0 -0
  340. package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/build_sandbox_settings_constants.py +0 -41
  341. package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/launch_sandbox_constants.py +0 -23
  342. package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/probe_sandbox_safety_constants.py +0 -45
  343. package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/prototype_common_constants.py +0 -10
  344. package/.agents/skills/prototype/scripts/test_build_sandbox_settings.py +0 -275
  345. package/.agents/skills/prototype/scripts/test_launch_sandbox.py +0 -303
  346. package/.agents/skills/prototype/scripts/test_probe_sandbox_safety.py +0 -312
  347. package/.agents/skills/prototype/workflows/promotion.md +0 -25
  348. package/.agents/skills/prototype/workflows/sandbox.md +0 -35
  349. package/.agents/skills/rebase/.claude/CLAUDE.md +0 -1
  350. package/.agents/skills/rebase/AGENTS.md +0 -1
  351. package/.agents/skills/rebase/SKILL.md +0 -178
  352. package/.agents/skills/review-router/SKILL.md +0 -51
  353. package/.agents/skills/review-router/reference/route-policy.json +0 -7
  354. package/.agents/skills/review-router/reference/task-seeds.md +0 -1
  355. package/.agents/skills/review-router/scripts/conftest.py +0 -4
  356. package/.agents/skills/review-router/scripts/review_router.py +0 -50
  357. package/.agents/skills/review-router/scripts/review_router_cli.py +0 -211
  358. package/.agents/skills/review-router/scripts/review_router_constants/__init__.py +0 -1
  359. package/.agents/skills/review-router/scripts/review_router_constants/config/__init__.py +0 -0
  360. package/.agents/skills/review-router/scripts/review_router_constants/config/constants.py +0 -13
  361. package/.agents/skills/review-router/scripts/test_review_router.py +0 -23
  362. package/.agents/skills/review-router/scripts/test_review_router_cli.py +0 -47
  363. package/.agents/skills/review-tier/SKILL.md +0 -56
  364. package/.agents/skills/review-tier/reference/task-seeds.md +0 -1
  365. package/.agents/skills/review-tier/reference/tier-policy.json +0 -9
  366. package/.agents/skills/review-tier/scripts/conftest.py +0 -4
  367. package/.agents/skills/review-tier/scripts/review_tier.py +0 -359
  368. package/.agents/skills/review-tier/scripts/review_tier_constants/__init__.py +0 -1
  369. package/.agents/skills/review-tier/scripts/review_tier_constants/config/__init__.py +0 -0
  370. package/.agents/skills/review-tier/scripts/review_tier_constants/config/constants.py +0 -29
  371. package/.agents/skills/review-tier/scripts/test_generation.py +0 -159
  372. package/.agents/skills/review-tier/scripts/test_review_tier.py +0 -33
  373. package/.agents/skills/run-claude-dev-env/SKILL.md +0 -84
  374. package/.agents/skills/session-log/.claude/CLAUDE.md +0 -1
  375. package/.agents/skills/session-log/AGENTS.md +0 -1
  376. package/.agents/skills/session-log/SKILL.md +0 -170
  377. package/.agents/skills/session-log/templates/frontmatter.md +0 -40
  378. package/.agents/skills/session-tidy/.claude/CLAUDE.md +0 -1
  379. package/.agents/skills/session-tidy/AGENTS.md +0 -1
  380. package/.agents/skills/session-tidy/SKILL.md +0 -191
  381. package/.agents/skills/skill-builder/references/.claude/CLAUDE.md +0 -1
  382. package/.agents/skills/skill-builder/references/AGENTS.md +0 -1
  383. package/.agents/skills/skill-builder/references/delegation-map.md +0 -130
  384. package/.agents/skills/skill-builder/references/description-field.md +0 -111
  385. package/.agents/skills/skill-builder/references/deterministic-elements.md +0 -218
  386. package/.agents/skills/skill-builder/references/progressive-disclosure.md +0 -122
  387. package/.agents/skills/skill-builder/references/self-audit-checklist.md +0 -126
  388. package/.agents/skills/skill-builder/references/skill-modularity.md +0 -111
  389. package/.agents/skills/skill-builder/references/skill-types.md +0 -232
  390. package/.agents/skills/skill-builder/references/thariq-x-post-skills.json +0 -33
  391. package/.agents/skills/skill-builder/templates/.claude/CLAUDE.md +0 -1
  392. package/.agents/skills/skill-builder/templates/AGENTS.md +0 -1
  393. package/.agents/skills/skill-builder/templates/gap-analysis.md +0 -87
  394. package/.agents/skills/skill-builder/workflows/.claude/CLAUDE.md +0 -1
  395. package/.agents/skills/skill-builder/workflows/AGENTS.md +0 -1
  396. package/.agents/skills/skill-builder/workflows/improve-skill.md +0 -136
  397. package/.agents/skills/skill-builder/workflows/new-skill.md +0 -179
  398. package/.agents/skills/skill-builder/workflows/polish-skill.md +0 -139
  399. package/.agents/skills/source-command-sr-loop/SKILL.md +0 -82
  400. package/.agents/skills/update/.claude/CLAUDE.md +0 -1
  401. package/.agents/skills/update/AGENTS.md +0 -1
  402. package/.agents/skills/update/SKILL.md +0 -190
  403. package/_shared/pr-loop/AGENTS.md +0 -1
  404. package/_shared/pr-loop/audit-contract.md +0 -183
  405. package/_shared/pr-loop/audit-reply-template.md +0 -151
  406. package/_shared/pr-loop/code-rules-gate.md +0 -65
  407. package/_shared/pr-loop/fix-protocol.md +0 -60
  408. package/_shared/pr-loop/gh-payloads.md +0 -75
  409. package/_shared/pr-loop/post-audit-thread-contract.md +0 -51
  410. package/_shared/pr-loop/precatch-rubric.md +0 -66
  411. package/_shared/pr-loop/preflight-proposal.md +0 -56
  412. package/_shared/pr-loop/scripts/post_audit_thread.py +0 -1242
  413. package/_shared/pr-loop/scripts/pr_loop_shared_constants/post_audit_thread_constants.py +0 -199
  414. package/_shared/pr-loop/scripts/tests/test_post_audit_thread.py +0 -1115
  415. package/_shared/pr-loop/scripts/tests/test_post_audit_thread_constants.py +0 -129
  416. package/_shared/pr-loop/state-schema.md +0 -45
  417. package/_shared/pr-loop/worker-spawn.md +0 -189
  418. package/hooks/blocking/ask_user_question_shape_blocker.py +0 -83
  419. package/hooks/blocking/bot_mention_comment_blocker.py +0 -76
  420. package/hooks/blocking/claude_md_orphan_file_blocker.py +0 -129
  421. package/hooks/blocking/cursor_cli_python_misfire_blocker.py +0 -108
  422. package/hooks/blocking/destructive_command_blocker.py +0 -2073
  423. package/hooks/blocking/fable_spawn_gate.py +0 -187
  424. package/hooks/blocking/luna_fast_mode_gate.py +0 -160
  425. package/hooks/blocking/nas_ssh_binary_enforcer.py +0 -163
  426. package/hooks/blocking/orchestrator_refresh_reschedule_gate.py +0 -260
  427. package/hooks/blocking/package_inventory_stale_blocker.py +0 -107
  428. package/hooks/blocking/pii_prevention_blocker.py +0 -365
  429. package/hooks/blocking/piped_pytest_blocker.py +0 -1223
  430. package/hooks/blocking/question_to_user_enforcer.py +0 -130
  431. package/hooks/blocking/send_user_file_open_locally_blocker.py +0 -71
  432. package/hooks/blocking/sensitive_file_protector.py +0 -167
  433. package/hooks/blocking/session_edit_stage_gate.py +0 -684
  434. package/hooks/blocking/session_handoff_blocker.py +0 -182
  435. package/hooks/blocking/shell_substitution_blocker.py +0 -350
  436. package/hooks/blocking/test_ask_user_question_shape.py +0 -69
  437. package/hooks/blocking/test_bot_mention_comment_blocker.py +0 -131
  438. package/hooks/blocking/test_claude_md_orphan_file_blocker.py +0 -1277
  439. package/hooks/blocking/test_cursor_cli_python_misfire_blocker.py +0 -208
  440. package/hooks/blocking/test_destructive_command_blocker.py +0 -2024
  441. package/hooks/blocking/test_destructive_command_blocker_deny_mode.py +0 -105
  442. package/hooks/blocking/test_destructive_command_blocker_no_verify.py +0 -122
  443. package/hooks/blocking/test_destructive_command_blocker_patterns.py +0 -133
  444. package/hooks/blocking/test_fable_spawn_gate.py +0 -381
  445. package/hooks/blocking/test_inventory_deadlock_resolution.py +0 -154
  446. package/hooks/blocking/test_luna_fast_mode_gate.py +0 -211
  447. package/hooks/blocking/test_nas_ssh_binary_enforcer.py +0 -225
  448. package/hooks/blocking/test_orchestrator_refresh_reschedule_gate.py +0 -231
  449. package/hooks/blocking/test_package_inventory_stale_blocker.py +0 -382
  450. package/hooks/blocking/test_pii_prevention_blocker.py +0 -1222
  451. package/hooks/blocking/test_pii_prevention_windows_git_path.py +0 -41
  452. package/hooks/blocking/test_pii_write_surface_ephemeral.py +0 -221
  453. package/hooks/blocking/test_piped_pytest_blocker.py +0 -587
  454. package/hooks/blocking/test_precommit_code_rules_gate_native_owner.py +0 -233
  455. package/hooks/blocking/test_question_to_user_enforcer.py +0 -169
  456. package/hooks/blocking/test_send_user_file_open_locally_blocker.py +0 -118
  457. package/hooks/blocking/test_sensitive_file_protector.py +0 -365
  458. package/hooks/blocking/test_session_edit_stage_gate.py +0 -537
  459. package/hooks/blocking/test_session_edit_stage_gate_staging.py +0 -64
  460. package/hooks/blocking/test_session_edit_stage_gate_support.py +0 -204
  461. package/hooks/blocking/test_session_edit_stage_gate_tracker.py +0 -116
  462. package/hooks/blocking/test_session_handoff_blocker.py +0 -318
  463. package/hooks/blocking/test_shell_substitution_blocker.py +0 -298
  464. package/hooks/blocking/test_unscoped_search_blocker.py +0 -102
  465. package/hooks/blocking/test_write_existing_file_blocker.py +0 -122
  466. package/hooks/blocking/tests/test_pii_prevention_blocker.py +0 -259
  467. package/hooks/blocking/unscoped_search_blocker.py +0 -391
  468. package/hooks/blocking/write_existing_file_blocker.py +0 -124
  469. package/hooks/hooks_constants/bot_mention_comment_blocker_constants.py +0 -19
  470. package/hooks/hooks_constants/cursor_cli_python_misfire_blocker_constants.py +0 -79
  471. package/hooks/hooks_constants/fable_spawn_gate_constants.py +0 -61
  472. package/hooks/hooks_constants/luna_fast_mode_gate_constants.py +0 -45
  473. package/hooks/hooks_constants/nas_ssh_binary_enforcer_constants.py +0 -20
  474. package/hooks/hooks_constants/orchestrator_refresh_reschedule_gate_constants.py +0 -57
  475. package/hooks/hooks_constants/send_user_file_open_locally_blocker_constants.py +0 -17
  476. package/hooks/hooks_constants/sensitive_file_protector_constants.py +0 -40
  477. package/hooks/hooks_constants/session_handoff_blocker_constants.py +0 -10
  478. package/hooks/hooks_constants/shell_substitution_blocker_constants.py +0 -80
  479. /package/.agents/skills/{_shared/pr-loop → session-continuity}/AGENTS.md +0 -0
  480. /package/{_shared/pr-loop → .agents/skills/session-continuity}/CLAUDE.md +0 -0
@@ -0,0 +1,323 @@
1
+ from __future__ import annotations
2
+
3
+ from pathlib import PurePosixPath
4
+
5
+ APPROVED_TEST_PATHS_BY_PRODUCTION_PATH: dict[
6
+ PurePosixPath, frozenset[PurePosixPath]
7
+ ] = {
8
+ PurePosixPath(
9
+ "packages/claude-dev-env/hooks/git-hooks/verification_notice_context.py"
10
+ ): frozenset(
11
+ {
12
+ PurePosixPath(
13
+ "packages/claude-dev-env/scripts/tests/test_verification_notice.py"
14
+ ),
15
+ }
16
+ ),
17
+ PurePosixPath(
18
+ "packages/claude-dev-env/hooks/git-hooks/verification_notice_state.py"
19
+ ): frozenset(
20
+ {
21
+ PurePosixPath(
22
+ "packages/claude-dev-env/scripts/tests/test_verification_notice.py"
23
+ ),
24
+ }
25
+ ),
26
+ PurePosixPath(
27
+ "packages/claude-dev-env/hooks/hooks_constants/post_tool_use_dispatcher_constants.py"
28
+ ): frozenset(
29
+ {
30
+ PurePosixPath(
31
+ "packages/claude-dev-env/hooks/validation/test_post_tool_use_dispatcher.py"
32
+ ),
33
+ }
34
+ ),
35
+ PurePosixPath(
36
+ "packages/claude-dev-env/scripts/automatic_advisory/checkout.py"
37
+ ): frozenset(
38
+ {
39
+ PurePosixPath(
40
+ "packages/claude-dev-env/scripts/tests/test_automatic_advisory_window_flags.py"
41
+ ),
42
+ PurePosixPath(
43
+ "packages/claude-dev-env/scripts/tests/test_automatic_advisory.py"
44
+ ),
45
+ }
46
+ ),
47
+ PurePosixPath(
48
+ "packages/claude-dev-env/scripts/automatic_advisory/cli.py"
49
+ ): frozenset(
50
+ {
51
+ PurePosixPath(
52
+ "packages/claude-dev-env/scripts/tests/test_automatic_advisory_window_flags.py"
53
+ ),
54
+ PurePosixPath(
55
+ "packages/claude-dev-env/scripts/tests/test_automatic_advisory_recovery.py"
56
+ ),
57
+ PurePosixPath(
58
+ "packages/claude-dev-env/scripts/tests/test_automatic_advisory_repairs.py"
59
+ ),
60
+ }
61
+ ),
62
+ PurePosixPath(
63
+ "packages/claude-dev-env/scripts/automatic_advisory/configuration.py"
64
+ ): frozenset(
65
+ {
66
+ PurePosixPath(
67
+ "packages/claude-dev-env/scripts/tests/test_automatic_advisory_recovery.py"
68
+ ),
69
+ }
70
+ ),
71
+ PurePosixPath(
72
+ "packages/claude-dev-env/scripts/automatic_advisory/execution.py"
73
+ ): frozenset(
74
+ {
75
+ PurePosixPath(
76
+ "packages/claude-dev-env/scripts/tests/test_automatic_advisory_window_flags.py"
77
+ ),
78
+ PurePosixPath(
79
+ "packages/claude-dev-env/scripts/tests/test_automatic_advisory.py"
80
+ ),
81
+ PurePosixPath(
82
+ "packages/claude-dev-env/scripts/tests/test_automatic_advisory_recovery.py"
83
+ ),
84
+ PurePosixPath(
85
+ "packages/claude-dev-env/scripts/tests/test_automatic_advisory_repairs.py"
86
+ ),
87
+ }
88
+ ),
89
+ PurePosixPath(
90
+ "packages/claude-dev-env/scripts/automatic_advisory/git.py"
91
+ ): frozenset(
92
+ {
93
+ PurePosixPath(
94
+ "packages/claude-dev-env/scripts/tests/test_automatic_advisory_window_flags.py"
95
+ ),
96
+ PurePosixPath(
97
+ "packages/claude-dev-env/scripts/tests/test_automatic_advisory_repairs.py"
98
+ ),
99
+ }
100
+ ),
101
+ PurePosixPath(
102
+ "packages/claude-dev-env/scripts/automatic_advisory/model.py"
103
+ ): frozenset(
104
+ {
105
+ PurePosixPath(
106
+ "packages/claude-dev-env/scripts/tests/test_automatic_advisory.py"
107
+ ),
108
+ PurePosixPath(
109
+ "packages/claude-dev-env/scripts/tests/test_closed_pr_label.py"
110
+ ),
111
+ }
112
+ ),
113
+ PurePosixPath(
114
+ "packages/claude-dev-env/scripts/automatic_advisory/process_host.py"
115
+ ): frozenset(
116
+ {
117
+ PurePosixPath(
118
+ "packages/claude-dev-env/scripts/tests/test_automatic_advisory_repairs.py"
119
+ ),
120
+ }
121
+ ),
122
+ PurePosixPath(
123
+ "packages/claude-dev-env/scripts/automatic_advisory/publisher.py"
124
+ ): frozenset(
125
+ {
126
+ PurePosixPath(
127
+ "packages/claude-dev-env/scripts/tests/test_automatic_advisory_repairs.py"
128
+ ),
129
+ }
130
+ ),
131
+ PurePosixPath(
132
+ "packages/claude-dev-env/scripts/automatic_advisory/runner.py"
133
+ ): frozenset(
134
+ {
135
+ PurePosixPath(
136
+ "packages/claude-dev-env/scripts/tests/test_automatic_advisory.py"
137
+ ),
138
+ PurePosixPath(
139
+ "packages/claude-dev-env/scripts/tests/test_automatic_advisory_recovery.py"
140
+ ),
141
+ PurePosixPath(
142
+ "packages/claude-dev-env/scripts/tests/test_closed_pr_label.py"
143
+ ),
144
+ }
145
+ ),
146
+ PurePosixPath(
147
+ "packages/claude-dev-env/scripts/automatic_advisory/state.py"
148
+ ): frozenset(
149
+ {
150
+ PurePosixPath(
151
+ "packages/claude-dev-env/scripts/tests/test_closed_pr_label.py"
152
+ ),
153
+ }
154
+ ),
155
+ PurePosixPath(
156
+ "packages/claude-dev-env/scripts/automatic_advisory/window_flags.py"
157
+ ): frozenset(
158
+ {
159
+ PurePosixPath(
160
+ "packages/claude-dev-env/scripts/tests/test_automatic_advisory_window_flags.py"
161
+ ),
162
+ }
163
+ ),
164
+ PurePosixPath(
165
+ "packages/claude-dev-env/scripts/automatic_advisory/windows_job.py"
166
+ ): frozenset(
167
+ {
168
+ PurePosixPath(
169
+ "packages/claude-dev-env/scripts/tests/test_automatic_advisory_job_cleanup.py"
170
+ ),
171
+ }
172
+ ),
173
+ PurePosixPath("packages/claude-dev-env/scripts/local_report_cli.py"): frozenset(
174
+ {
175
+ PurePosixPath(
176
+ "packages/claude-dev-env/scripts/tests/test_local_report_publisher_cli.py"
177
+ ),
178
+ }
179
+ ),
180
+ PurePosixPath("packages/claude-dev-env/scripts/local_report_core.py"): frozenset(
181
+ {
182
+ PurePosixPath(
183
+ "packages/claude-dev-env/scripts/tests/test_local_report_publisher.py"
184
+ ),
185
+ }
186
+ ),
187
+ PurePosixPath(
188
+ "packages/claude-dev-env/scripts/local_report_validation.py"
189
+ ): frozenset(
190
+ {
191
+ PurePosixPath(
192
+ "packages/claude-dev-env/scripts/tests/test_local_report_publisher.py"
193
+ ),
194
+ }
195
+ ),
196
+ PurePosixPath(
197
+ "packages/claude-dev-env/scripts/local_verification/check_runner.py"
198
+ ): frozenset(
199
+ {
200
+ PurePosixPath(
201
+ "packages/claude-dev-env/scripts/tests/test_local_verification.py"
202
+ ),
203
+ }
204
+ ),
205
+ PurePosixPath(
206
+ "packages/claude-dev-env/scripts/local_verification/check_support.py"
207
+ ): frozenset(
208
+ {
209
+ PurePosixPath(
210
+ "packages/claude-dev-env/scripts/tests/test_local_verification.py"
211
+ ),
212
+ }
213
+ ),
214
+ PurePosixPath(
215
+ "packages/claude-dev-env/scripts/local_verification/cli.py"
216
+ ): frozenset(
217
+ {
218
+ PurePosixPath(
219
+ "packages/claude-dev-env/scripts/tests/test_local_verification_cli.py"
220
+ ),
221
+ }
222
+ ),
223
+ PurePosixPath(
224
+ "packages/claude-dev-env/scripts/local_verification/command_runner.py"
225
+ ): frozenset(
226
+ {
227
+ PurePosixPath(
228
+ "packages/claude-dev-env/scripts/tests/test_local_verification.py"
229
+ ),
230
+ }
231
+ ),
232
+ PurePosixPath(
233
+ "packages/claude-dev-env/scripts/local_verification/git_state.py"
234
+ ): frozenset(
235
+ {
236
+ PurePosixPath(
237
+ "packages/claude-dev-env/scripts/tests/test_local_verification.py"
238
+ ),
239
+ }
240
+ ),
241
+ PurePosixPath(
242
+ "packages/claude-dev-env/scripts/local_verification/manifest.py"
243
+ ): frozenset(
244
+ {
245
+ PurePosixPath(
246
+ "packages/claude-dev-env/scripts/tests/test_local_verification.py"
247
+ ),
248
+ }
249
+ ),
250
+ PurePosixPath(
251
+ "packages/claude-dev-env/scripts/local_verification/model.py"
252
+ ): frozenset(
253
+ {
254
+ PurePosixPath(
255
+ "packages/claude-dev-env/scripts/tests/test_local_verification.py"
256
+ ),
257
+ }
258
+ ),
259
+ PurePosixPath(
260
+ "packages/claude-dev-env/scripts/local_verification/runner.py"
261
+ ): frozenset(
262
+ {
263
+ PurePosixPath(
264
+ "packages/claude-dev-env/scripts/tests/test_local_verification.py"
265
+ ),
266
+ PurePosixPath(
267
+ "packages/claude-dev-env/scripts/tests/test_local_verification_cli.py"
268
+ ),
269
+ }
270
+ ),
271
+ PurePosixPath(
272
+ "packages/claude-dev-env/scripts/pr_verification/branch_refs.py"
273
+ ): frozenset(
274
+ {
275
+ PurePosixPath(
276
+ "packages/claude-dev-env/scripts/tests/test_pr_verification_github.py"
277
+ ),
278
+ }
279
+ ),
280
+ PurePosixPath(
281
+ "packages/claude-dev-env/scripts/pr_verification/github_api.py"
282
+ ): frozenset(
283
+ {
284
+ PurePosixPath(
285
+ "packages/claude-dev-env/scripts/tests/test_pr_verification_github.py"
286
+ ),
287
+ }
288
+ ),
289
+ PurePosixPath(
290
+ "packages/claude-dev-env/scripts/pr_verification/github_parsing.py"
291
+ ): frozenset(
292
+ {
293
+ PurePosixPath(
294
+ "packages/claude-dev-env/scripts/tests/test_pr_verification_github.py"
295
+ ),
296
+ }
297
+ ),
298
+ PurePosixPath(
299
+ "packages/claude-dev-env/scripts/pr_verification/github.py"
300
+ ): frozenset(
301
+ {
302
+ PurePosixPath(
303
+ "packages/claude-dev-env/scripts/tests/test_pr_verification_github.py"
304
+ ),
305
+ }
306
+ ),
307
+ PurePosixPath("packages/claude-dev-env/scripts/pr_verification/lock.py"): frozenset(
308
+ {
309
+ PurePosixPath(
310
+ "packages/claude-dev-env/scripts/tests/test_pr_verification_lock.py"
311
+ ),
312
+ }
313
+ ),
314
+ PurePosixPath(
315
+ "packages/claude-dev-env/scripts/pr_verification/model.py"
316
+ ): frozenset(
317
+ {
318
+ PurePosixPath(
319
+ "packages/claude-dev-env/scripts/tests/test_pr_verification_github.py"
320
+ ),
321
+ }
322
+ ),
323
+ }
@@ -5,6 +5,7 @@ INVALID_INPUT_EXIT_CODE = 2
5
5
  GIT_EXECUTABLE = "git"
6
6
  UTF8_ENCODING = "utf-8"
7
7
  PATH_SEPARATOR = "/"
8
+ ARCHIVED_SKILLS_DIRECTORY_NAME = "skill-archive"
8
9
  NUL_BYTE = b"\0"
9
10
  ALL_GIT_ROOT_ARGUMENTS = ("rev-parse", "--show-toplevel")
10
11
  ALL_GIT_HEAD_ARGUMENTS = ("rev-parse", "--verify", "HEAD")
@@ -13,6 +14,7 @@ GIT_MERGE_BASE_ARGUMENT = "merge-base"
13
14
  GIT_HEAD_REFERENCE = "HEAD"
14
15
  GIT_INDEX_REFERENCE_PREFIX = ""
15
16
  GIT_ENVIRONMENT_VARIABLE_PREFIX = "GIT_"
17
+ GIT_INDEX_ENVIRONMENT_VARIABLE = "GIT_INDEX_FILE"
16
18
  ALL_GIT_BLOB_ARGUMENTS = ("cat-file", "blob")
17
19
  ALL_MISSING_BLOB_ERROR_FRAGMENTS = (
18
20
  "does not exist in",
@@ -75,3 +77,6 @@ TERMINOLOGY_FINDING_PATTERN = re.compile(
75
77
  TERMINOLOGY_PATH_GROUP = "path"
76
78
  TERMINOLOGY_LINE_NUMBER_GROUP = "line_number"
77
79
  TERMINOLOGY_MESSAGE_GROUP = "message"
80
+
81
+ PR_LOOP_DIRECTORY_NAME = "pr-loop"
82
+ SHARED_ROOT_PARENT_INDEX = 2
@@ -1,8 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from collections.abc import Iterable, Sequence
4
- from pathlib import Path
4
+ from pathlib import Path, PurePosixPath
5
5
 
6
+ from .config.constants import ARCHIVED_SKILLS_DIRECTORY_NAME
6
7
  from .model import (
7
8
  ChangeSetRule,
8
9
  Diagnostic,
@@ -25,6 +26,9 @@ def lint(
25
26
  ) -> LintReport:
26
27
  """Run the selected rules on one source selection.
27
28
 
29
+ Repository and diff selections check active code. File and editor
30
+ selections include archived skills.
31
+
28
32
  Args:
29
33
  request: Repository root, source, and rule sets.
30
34
  all_registry: Optional registry replacement.
@@ -32,10 +36,14 @@ def lint(
32
36
  Returns:
33
37
  A report of diagnostics and rule execution state.
34
38
  """
35
- document_set = select_documents(request)
36
- candidate_rules = tuple(all_registry) if all_registry is not None else default_registry()
39
+ document_set = _runtime_document_set(select_documents(request))
40
+ candidate_rules = (
41
+ tuple(all_registry) if all_registry is not None else default_registry()
42
+ )
37
43
  selected = selected_rules(candidate_rules, request.rule_sets)
38
- all_diagnostics, executed, failed, skipped = _run_selected_rules(selected, document_set)
44
+ all_diagnostics, executed, failed, skipped = _run_selected_rules(
45
+ selected, document_set
46
+ )
39
47
  return LintReport(
40
48
  1,
41
49
  tuple(sorted(all_diagnostics, key=_diagnostic_sort_key)),
@@ -46,6 +54,42 @@ def lint(
46
54
  )
47
55
 
48
56
 
57
+ def _is_runtime_path(path: PurePosixPath) -> bool:
58
+ return path.parts[0] != ARCHIVED_SKILLS_DIRECTORY_NAME
59
+
60
+
61
+ def _runtime_document_set(document_set: DocumentSet) -> DocumentSet:
62
+ if document_set.selection in {SelectionKind.FILES, SelectionKind.TEXT}:
63
+ return document_set
64
+ all_documents = tuple(
65
+ each_document
66
+ for each_document in document_set.documents
67
+ if _is_runtime_path(each_document.path)
68
+ )
69
+ all_deleted_paths = tuple(
70
+ each_path
71
+ for each_path in document_set.deleted_paths
72
+ if _is_runtime_path(each_path)
73
+ ) + tuple(
74
+ old_path
75
+ for old_path, new_path in document_set.renamed_paths
76
+ if _is_runtime_path(old_path) and not _is_runtime_path(new_path)
77
+ )
78
+ all_renamed_paths = tuple(
79
+ each_pair
80
+ for each_pair in document_set.renamed_paths
81
+ if _is_runtime_path(each_pair[1])
82
+ )
83
+ return DocumentSet(
84
+ all_documents,
85
+ document_set.selection,
86
+ document_set.repository_root,
87
+ all_deleted_paths,
88
+ all_renamed_paths,
89
+ document_set.base_revision,
90
+ )
91
+
92
+
49
93
  def _run_selected_rules(
50
94
  all_rules: tuple[Rule, ...], document_set: DocumentSet
51
95
  ) -> tuple[list[Diagnostic], tuple[str, ...], tuple[str, ...], tuple[str, ...]]:
@@ -106,6 +106,7 @@ class DocumentSet:
106
106
  repository_root: Path
107
107
  deleted_paths: tuple[PurePosixPath, ...] = ()
108
108
  renamed_paths: tuple[tuple[PurePosixPath, PurePosixPath], ...] = ()
109
+ base_revision: str | None = None
109
110
 
110
111
 
111
112
  @dataclass(frozen=True)
@@ -141,7 +141,7 @@ def default_registry() -> tuple[model.Rule, ...]:
141
141
  model.ChangeSetRule(
142
142
  "terminology-sweep",
143
143
  frozenset({"changed"}),
144
- frozenset({model.SelectionKind.STAGED}),
144
+ frozenset({model.SelectionKind.STAGED, model.SelectionKind.BASE}),
145
145
  adapters.terminology_diagnostics,
146
146
  ),
147
147
  model.RepositoryRule(
@@ -172,7 +172,7 @@ def _documents_from_changes(
172
172
  selection_kind = SelectionKind.STAGED if is_staged else SelectionKind.BASE
173
173
  return DocumentSet(
174
174
  tuple(all_documents), selection_kind, repository_root,
175
- tuple(all_deleted_paths), tuple(all_renamed_paths),
175
+ tuple(all_deleted_paths), tuple(all_renamed_paths), base_revision,
176
176
  )
177
177
 
178
178
 
@@ -354,6 +354,7 @@ def _normalize_document_set(repository_root: Path, document_set: DocumentSet) ->
354
354
  repository_root,
355
355
  all_deleted_paths,
356
356
  all_renamed_paths,
357
+ document_set.base_revision,
357
358
  )
358
359
 
359
360
 
@@ -10,6 +10,7 @@ from .config.constants import (
10
10
  ALL_MISSING_BLOB_ERROR_FRAGMENTS,
11
11
  ALL_UNBORN_HEAD_ERROR_FRAGMENTS,
12
12
  GIT_ENVIRONMENT_VARIABLE_PREFIX,
13
+ GIT_INDEX_ENVIRONMENT_VARIABLE,
13
14
  GIT_EXECUTABLE,
14
15
  NUL_BYTE,
15
16
  UTF8_ENCODING,
@@ -105,6 +106,7 @@ def _git_subprocess_environment() -> dict[str, str]:
105
106
  each_name: each_environment_text
106
107
  for each_name, each_environment_text in os.environ.items()
107
108
  if not each_name.upper().startswith(git_prefix)
109
+ or each_name.upper() == GIT_INDEX_ENVIRONMENT_VARIABLE
108
110
  }
109
111
 
110
112
 
@@ -0,0 +1 @@
1
+ """Trusted host supervisor for local pull request verification."""
@@ -0,0 +1,114 @@
1
+ from __future__ import annotations
2
+
3
+ import urllib.parse
4
+ from collections.abc import Callable
5
+ from dataclasses import replace
6
+
7
+ from .config.constants import (
8
+ GIT_BRANCH_REF_SAFE_CHARACTERS,
9
+ GIT_BRANCH_REFERENCE_ENDPOINT_TEMPLATE,
10
+ GIT_REFERENCE_OBJECT_KEY,
11
+ GIT_REFERENCE_RESOURCE_NAME,
12
+ PULL_SHA_KEY,
13
+ )
14
+ from .github_parsing import require_mapping, require_text
15
+ from .model import PullRequestCandidate, RepositorySettings
16
+
17
+ GetJson = Callable[[str], object]
18
+
19
+
20
+ def _read_branch_sha(
21
+ repository: RepositorySettings,
22
+ base_ref: str,
23
+ get_json: GetJson,
24
+ ) -> str:
25
+ endpoint = GIT_BRANCH_REFERENCE_ENDPOINT_TEMPLATE.format(
26
+ repository=repository.slug,
27
+ base_ref=urllib.parse.quote(
28
+ base_ref,
29
+ safe=GIT_BRANCH_REF_SAFE_CHARACTERS,
30
+ ),
31
+ )
32
+ reference = require_mapping(get_json(endpoint), GIT_REFERENCE_RESOURCE_NAME)
33
+ target = require_mapping(
34
+ reference.get(GIT_REFERENCE_OBJECT_KEY),
35
+ GIT_REFERENCE_RESOURCE_NAME,
36
+ )
37
+ return require_text(target, PULL_SHA_KEY, GIT_REFERENCE_RESOURCE_NAME)
38
+
39
+
40
+ def replace_candidate_base_sha(
41
+ candidate: PullRequestCandidate,
42
+ repository: RepositorySettings,
43
+ get_json: GetJson,
44
+ ) -> PullRequestCandidate:
45
+ """Replace one pull request base SHA with its current branch tip.
46
+
47
+ Args:
48
+ candidate: Pull request candidate from the pulls API.
49
+ repository: Repository containing the target branch.
50
+ get_json: Authenticated GitHub JSON reader.
51
+
52
+ Returns:
53
+ Candidate carrying the current target branch SHA.
54
+ """
55
+ current_base_sha = _read_branch_sha(repository, candidate.base_ref, get_json)
56
+ return replace(candidate, base_sha=current_base_sha)
57
+
58
+
59
+ def replace_candidate_base_shas(
60
+ all_candidates: tuple[PullRequestCandidate, ...],
61
+ repository: RepositorySettings,
62
+ get_json: GetJson,
63
+ ) -> tuple[PullRequestCandidate, ...]:
64
+ """Replace pull request base SHAs with current unique branch tips.
65
+
66
+ Args:
67
+ all_candidates: Pull request candidates from the pulls API.
68
+ repository: Repository containing the target branches.
69
+ get_json: Authenticated GitHub JSON reader.
70
+
71
+ Returns:
72
+ Candidates carrying current target branch SHAs.
73
+ """
74
+ base_sha_by_ref = _read_unique_branch_shas(
75
+ all_candidates,
76
+ repository,
77
+ get_json,
78
+ )
79
+ return tuple(
80
+ replace(
81
+ each_candidate,
82
+ base_sha=base_sha_by_ref[each_candidate.base_ref],
83
+ )
84
+ for each_candidate in all_candidates
85
+ )
86
+
87
+
88
+ def _resolve_candidate_base_shas(
89
+ all_candidates: list[PullRequestCandidate],
90
+ repository: RepositorySettings,
91
+ get_json: GetJson,
92
+ should_require_merge_commit: bool,
93
+ ) -> tuple[PullRequestCandidate, ...]:
94
+ candidates = tuple(all_candidates)
95
+ if should_require_merge_commit:
96
+ return candidates
97
+ return replace_candidate_base_shas(candidates, repository, get_json)
98
+
99
+
100
+ def _read_unique_branch_shas(
101
+ all_candidates: tuple[PullRequestCandidate, ...],
102
+ repository: RepositorySettings,
103
+ get_json: GetJson,
104
+ ) -> dict[str, str]:
105
+ base_sha_by_ref: dict[str, str] = {}
106
+ for each_candidate in all_candidates:
107
+ if each_candidate.base_ref in base_sha_by_ref:
108
+ continue
109
+ base_sha_by_ref[each_candidate.base_ref] = _read_branch_sha(
110
+ repository,
111
+ each_candidate.base_ref,
112
+ get_json,
113
+ )
114
+ return base_sha_by_ref
@@ -0,0 +1 @@
1
+ """Configuration constants for pull request verification."""
@@ -0,0 +1,84 @@
1
+ import re
2
+
3
+ SUCCESS_EXIT_CODE = 0
4
+ INCOMPLETE_EXIT_CODE = 3
5
+ HTTP_OK = 200
6
+ HTTP_CREATED = 201
7
+ HTTP_NO_CONTENT = 204
8
+ GITHUB_API_URL = "https://api.github.com"
9
+ GITHUB_PAGE_SIZE = 100
10
+ UTF8_ENCODING = "utf-8"
11
+ JSON_CONTENT_TYPE = "application/json"
12
+ GITHUB_ACCEPT_TYPE = "application/vnd.github+json"
13
+ GITHUB_API_VERSION = "2022-11-28"
14
+ AUTHORIZATION_HEADER = "Authorization"
15
+ ACCEPT_HEADER = "Accept"
16
+ CONTENT_TYPE_HEADER = "Content-Type"
17
+ API_VERSION_HEADER = "X-GitHub-Api-Version"
18
+ BEARER_PREFIX = "Bearer "
19
+ APP_JWT_ALGORITHM = "RS256"
20
+ APP_ISSUER_CLAIM = "iss"
21
+ APP_ISSUED_AT_CLAIM = "iat"
22
+ APP_EXPIRATION_CLAIM = "exp"
23
+ PULL_NUMBER_KEY = "number"
24
+ PULL_DRAFT_KEY = "draft"
25
+ PULL_MERGE_SHA_KEY = "merge_commit_sha"
26
+ PULL_BASE_KEY = "base"
27
+ PULL_HEAD_KEY = "head"
28
+ PULL_REF_KEY = "ref"
29
+ PULL_SHA_KEY = "sha"
30
+ COMMIT_PARENTS_KEY = "parents"
31
+ TOKEN_KEY = "token"
32
+ REPOSITORIES_KEY = "repositories"
33
+ PERMISSIONS_KEY = "permissions"
34
+ CONTENTS_PERMISSION_KEY = "contents"
35
+ PULL_REQUESTS_PERMISSION_KEY = "pull_requests"
36
+ STATUSES_PERMISSION_KEY = "statuses"
37
+ ISSUES_PERMISSION_KEY = "issues"
38
+ READ_PERMISSION = "read"
39
+ WRITE_PERMISSION = "write"
40
+ STATUS_STATE_KEY = "state"
41
+ STATUS_CONTEXT_KEY = "context"
42
+ STATUS_DESCRIPTION_KEY = "description"
43
+ STATUS_PENDING = "pending"
44
+ STATUS_ERROR = "error"
45
+ STATUS_FAILURE = "failure"
46
+ STATUS_SUCCESS = "success"
47
+ LOCAL_CHECKS_CONTEXT = "local-checks"
48
+ LOCAL_CHECKS_PASSED_LABEL = "local-checks:passed"
49
+ PULLS_ENDPOINT_TEMPLATE = (
50
+ "/repos/{repository}/pulls?state=open&per_page={page_size}&page={page}"
51
+ )
52
+ PULL_ENDPOINT_TEMPLATE = "/repos/{repository}/pulls/{pull_number}"
53
+ GIT_BRANCH_REFERENCE_ENDPOINT_TEMPLATE = "/repos/{repository}/git/ref/heads/{base_ref}"
54
+ GIT_BRANCH_REF_SAFE_CHARACTERS = "/"
55
+ GIT_REFERENCE_OBJECT_KEY = "object"
56
+ GIT_REFERENCE_RESOURCE_NAME = "git reference"
57
+ COMMIT_ENDPOINT_TEMPLATE = "/repos/{repository}/git/commits/{commit_sha}"
58
+ STATUS_ENDPOINT_TEMPLATE = "/repos/{repository}/statuses/{commit_sha}"
59
+ ISSUE_LABELS_ENDPOINT_TEMPLATE = "/repos/{repository}/issues/{pull_number}/labels"
60
+ ISSUE_LABELS_PAGE_ENDPOINT_TEMPLATE = (
61
+ "/repos/{repository}/issues/{pull_number}/labels?per_page={page_size}&page={page}"
62
+ )
63
+ ISSUE_LABEL_ENDPOINT_TEMPLATE = (
64
+ "/repos/{repository}/issues/{pull_number}/labels/{label}"
65
+ )
66
+ ISSUE_LABELS_KEY = "labels"
67
+ INSTALLATION_TOKEN_ENDPOINT_TEMPLATE = (
68
+ "/app/installations/{installation_id}/access_tokens"
69
+ )
70
+ GITHUB_REQUEST_ERROR_TEMPLATE = "GitHub {method} {url} returned {status_code}"
71
+ GITHUB_JSON_ERROR_TEMPLATE = "GitHub returned invalid JSON from {url}"
72
+ GITHUB_SHAPE_ERROR_TEMPLATE = "GitHub returned an invalid {resource} payload"
73
+ PULL_RESOURCE_NAME = "pull request"
74
+ PULL_LIST_RESOURCE_NAME = "pull request list"
75
+ TOKEN_RESOURCE_NAME = "installation token"
76
+ PENDING_DESCRIPTION = "Local verification is running"
77
+ FAILURE_DESCRIPTION = "A required local check failed"
78
+ ERROR_DESCRIPTION = "Local verification did not complete"
79
+ GIT_BARE_SUFFIX = ".git"
80
+ SUPERVISOR_LOCK_FILENAME = "supervisor.lock"
81
+ SUPERVISOR_LOCK_ERROR = "Another verification supervisor owns this cache root"
82
+ SUPERVISOR_LOCK_IO_ERROR = "Verification supervisor lock file is unavailable"
83
+ SUPERVISOR_LOCK_FILE_MODE = 0o600
84
+ REPOSITORY_SLUG_PATTERN = re.compile(r"^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$")
@@ -0,0 +1,5 @@
1
+ APP_JWT_LIFETIME_SECONDS = 540
2
+ APP_JWT_CLOCK_SKEW_SECONDS = 60
3
+ HTTP_TIMEOUT_SECONDS = 30
4
+ DOCKER_CLEANUP_TIMEOUT_SECONDS = 30
5
+ CHECK_TIMEOUT_GRACE_SECONDS = 15