claude-dev-env 4.2.0 → 7.0.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 (350) 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 +7 -0
  12. package/.agents/skills/pull-request/SKILL.md +216 -0
  13. package/.agents/skills/pull-request/reference/publication-tasks.md +18 -0
  14. package/.agents/skills/pull-request/scripts/github_pr_command_constants/__init__.py +1 -0
  15. package/.agents/skills/pull-request/scripts/github_pr_command_constants/config/__init__.py +1 -0
  16. package/.agents/skills/pull-request/scripts/github_pr_command_constants/config/constants.py +69 -0
  17. package/.agents/skills/pull-request/scripts/pull_request.py +265 -0
  18. package/.agents/skills/pull-request/scripts/recover_legacy_author.py +251 -0
  19. package/.agents/skills/pull-request/scripts/test_github_pr_command_constants.py +58 -0
  20. package/.agents/skills/pull-request/scripts/test_pull_request.py +396 -0
  21. package/.agents/skills/pull-request/scripts/test_recover_legacy_author.py +221 -0
  22. package/.agents/skills/skill-builder/SKILL.md +3 -196
  23. package/.agents/skills/test-runner/SKILL.md +69 -0
  24. package/.agents/skills/test-runner/scripts/preflight_checks.py +365 -0
  25. package/.agents/skills/test-runner/scripts/run_tests.py +316 -0
  26. package/.agents/skills/test-runner/scripts/test_preflight_checks.py +185 -0
  27. package/.agents/skills/test-runner/scripts/test_run_tests.py +281 -0
  28. package/.agents/skills/test-runner/scripts/test_runner_constants/__init__.py +1 -0
  29. package/.agents/skills/test-runner/scripts/test_runner_constants/config/__init__.py +1 -0
  30. package/.agents/skills/test-runner/scripts/test_runner_constants/config/constants.py +96 -0
  31. package/.agents/skills-archived/pr-loop-cloud-transport/reference/identity-and-hooks.md +1 -1
  32. package/_shared/pr-loop/scripts/pr_loop_shared_constants/terminology_sweep_constants.py +6 -0
  33. package/_shared/pr-loop/scripts/terminology_sweep.py +64 -19
  34. package/_shared/pr-loop/scripts/tests/test_terminology_sweep.py +59 -0
  35. package/bin/ever-shipped-skills.mjs +2 -0
  36. package/bin/ever-shipped-skills.test.mjs +8 -0
  37. package/bin/install.agents-home.test.mjs +15 -13
  38. package/bin/install.mjs +37 -1
  39. package/bin/install.policy-lint.test.mjs +78 -0
  40. package/bin/install.prune.test.mjs +149 -20
  41. package/bin/install.pstack-plugin.test.mjs +114 -0
  42. package/bin/install.test.mjs +61 -7
  43. package/bin/refresh-pstack-plugin-skills.test.mjs +211 -0
  44. package/hooks/advisory/pr_done_reminder.py +342 -0
  45. package/hooks/advisory/test_pr_done_reminder.py +249 -0
  46. package/hooks/blocking/bash_post_call_dispatcher.py +53 -6
  47. package/hooks/blocking/code_rules_paired_test.py +22 -15
  48. package/hooks/blocking/pii_prevention_blocker.py +32 -51
  49. package/hooks/blocking/test_bash_post_call_dispatcher.py +55 -17
  50. package/hooks/blocking/test_bash_pre_tool_use_dispatcher.py +1 -4
  51. package/hooks/blocking/test_code_rules_command_dispatch.py +2 -2
  52. package/hooks/blocking/test_code_rules_enforcer_paired_test.py +36 -29
  53. package/hooks/blocking/test_code_rules_js_resume_task_enumeration.py +4 -4
  54. package/hooks/blocking/test_code_rules_js_returns_object_schemaless.py +5 -5
  55. package/hooks/blocking/test_pii_prevention_blocker.py +37 -89
  56. package/hooks/blocking/test_pre_tool_use_dispatcher.py +68 -133
  57. package/hooks/blocking/test_pre_tool_use_dispatcher_native.py +20 -51
  58. package/hooks/blocking/test_precommit_code_rules_gate_native_owner.py +18 -18
  59. package/hooks/gh_post_body_texts.py +195 -0
  60. package/hooks/git-hooks/git_hooks_constants/staged_policy_lint.py +12 -0
  61. package/hooks/git-hooks/pre_commit.py +52 -11
  62. package/hooks/git-hooks/test_installed_policy_lint.py +159 -0
  63. package/hooks/git-hooks/test_native_policy_commit.py +87 -0
  64. package/hooks/git-hooks/test_pre_commit.py +246 -0
  65. package/hooks/hooks.json +1 -16
  66. package/hooks/hooks_constants/bash_post_call_dispatcher_constants.py +14 -2
  67. package/hooks/hooks_constants/bash_pre_tool_use_dispatcher_constants.py +0 -8
  68. package/hooks/hooks_constants/gh_post_body_texts_constants.py +12 -0
  69. package/hooks/hooks_constants/pr_done_reminder_constants.py +98 -0
  70. package/hooks/hooks_constants/pre_tool_use_dispatcher_constants.py +10 -43
  71. package/hooks/hooks_constants/test_bash_post_call_dispatcher_constants.py +17 -7
  72. package/hooks/hooks_constants/test_bash_pre_tool_use_dispatcher_constants.py +0 -7
  73. package/hooks/hooks_constants/test_failure_recorder_constants.py +3 -3
  74. package/hooks/hooks_constants/test_gh_post_body_texts_constants.py +19 -0
  75. package/hooks/hooks_constants/test_pr_done_reminder_constants.py +40 -0
  76. package/hooks/hooks_constants/test_pre_tool_use_dispatcher_constants.py +20 -32
  77. package/hooks/observability/test_failure_recorder.py +1 -1
  78. package/hooks/pyproject.toml +1 -1
  79. package/hooks/test_gh_post_body_texts.py +79 -0
  80. package/package.json +2 -2
  81. package/rules/durable-post-artifacts.md +32 -20
  82. package/rules/gh-cli-conventions.md +23 -13
  83. package/rules/git-workflow.md +21 -8
  84. package/scripts/check.ps1 +0 -1
  85. package/{.agents/skills/run-claude-dev-env/driver.mjs → scripts/ci/installer-lifecycle.mjs} +3 -28
  86. package/scripts/ci/installer-lifecycle.test.mjs +26 -0
  87. package/scripts/ci/windows-installer-lifecycle.ps1 +1 -11
  88. package/scripts/dev_env_scripts_constants/shared_tree_constants.py +4 -5
  89. package/scripts/durable_post_lint.py +206 -0
  90. package/scripts/durable_post_lint_config/config/constants.py +96 -0
  91. package/scripts/durable_post_lint_config/config/test_constants.py +25 -0
  92. package/scripts/policy_lint/adapter_configuration.py +53 -12
  93. package/scripts/policy_lint/adapter_detectors.py +13 -6
  94. package/scripts/policy_lint/adapters.py +7 -4
  95. package/scripts/policy_lint/config/constants.py +5 -0
  96. package/scripts/policy_lint/engine.py +48 -4
  97. package/scripts/policy_lint/model.py +1 -0
  98. package/scripts/policy_lint/registry.py +1 -1
  99. package/scripts/policy_lint/selection.py +2 -1
  100. package/scripts/policy_lint/selection_git.py +2 -0
  101. package/scripts/refresh_pstack_plugin_skills.mjs +200 -0
  102. package/scripts/repository_checks/config/constants.py +0 -5
  103. package/scripts/shared_tree_paths.py +32 -3
  104. package/scripts/test_durable_post_lint.py +332 -0
  105. package/scripts/test_shared_tree_paths.py +33 -0
  106. package/scripts/tests/test_adapter_configuration.py +54 -0
  107. package/scripts/tests/test_policy_lint_rules_archive.py +120 -0
  108. package/scripts/tests/test_policy_lint_rules_engine.py +25 -4
  109. package/scripts/tests/test_policy_lint_rules_installed_loader.py +29 -0
  110. package/scripts/tests/test_policy_lint_rules_registry.py +227 -13
  111. package/scripts/tests/test_policy_lint_selection.py +25 -2
  112. package/scripts/tests/test_policy_lint_selection_native_index.py +30 -0
  113. package/scripts/tests/test_rules.py +3 -7
  114. package/.agents/skills/_shared/pr-loop/.claude/CLAUDE.md +0 -1
  115. package/.agents/skills/_shared/pr-loop/AGENTS.md +0 -1
  116. package/.agents/skills/_shared/pr-loop/audit-contract.md +0 -5
  117. package/.agents/skills/_shared/pr-loop/audit-reply-template.md +0 -5
  118. package/.agents/skills/_shared/pr-loop/code-rules-gate.md +0 -5
  119. package/.agents/skills/_shared/pr-loop/fix-protocol.md +0 -5
  120. package/.agents/skills/_shared/pr-loop/gh-payloads.md +0 -5
  121. package/.agents/skills/_shared/pr-loop/portable-driver.md +0 -149
  122. package/.agents/skills/_shared/pr-loop/post-audit-thread-contract.md +0 -5
  123. package/.agents/skills/_shared/pr-loop/precatch-rubric.md +0 -5
  124. package/.agents/skills/_shared/pr-loop/preflight-proposal.contract.test.mjs +0 -119
  125. package/.agents/skills/_shared/pr-loop/preflight-proposal.md +0 -5
  126. package/.agents/skills/_shared/pr-loop/prompts/.claude/CLAUDE.md +0 -1
  127. package/.agents/skills/_shared/pr-loop/prompts/AGENTS.md +0 -1
  128. package/.agents/skills/_shared/pr-loop/prompts/pr-consistency-audit.xml +0 -324
  129. package/.agents/skills/_shared/pr-loop/scripts/.claude/CLAUDE.md +0 -1
  130. package/.agents/skills/_shared/pr-loop/scripts/AGENTS.md +0 -1
  131. package/.agents/skills/_shared/pr-loop/scripts/RUNTIME_SCRIPTS.md +0 -29
  132. package/.agents/skills/_shared/pr-loop/scripts/_cli_utils.py +0 -22
  133. package/.agents/skills/_shared/pr-loop/scripts/_path_resolver.py +0 -186
  134. package/.agents/skills/_shared/pr-loop/scripts/_xml_utils.py +0 -20
  135. package/.agents/skills/_shared/pr-loop/scripts/audit_category_schema.py +0 -355
  136. package/.agents/skills/_shared/pr-loop/scripts/build_audit_prompt.py +0 -289
  137. package/.agents/skills/_shared/pr-loop/scripts/build_converge_task_list.py +0 -310
  138. package/.agents/skills/_shared/pr-loop/scripts/build_fix_prompt.py +0 -292
  139. package/.agents/skills/_shared/pr-loop/scripts/init_loop_state.py +0 -134
  140. package/.agents/skills/_shared/pr-loop/scripts/portable_converge_driver.py +0 -1646
  141. package/.agents/skills/_shared/pr-loop/scripts/preflight_worktree.py +0 -392
  142. package/.agents/skills/_shared/pr-loop/scripts/select_converge_pacer.py +0 -215
  143. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/.claude/CLAUDE.md +0 -1
  144. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/AGENTS.md +0 -1
  145. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/__init__.py +0 -0
  146. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/audit_category_schema_constants.py +0 -37
  147. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/converge_task_list_constants.py +0 -56
  148. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/handoff_constants.py +0 -45
  149. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/pacer_constants.py +0 -47
  150. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/path_resolver_constants.py +0 -157
  151. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/portable_driver_constants.py +0 -177
  152. package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/preflight_constants.py +0 -70
  153. package/.agents/skills/_shared/pr-loop/scripts/teardown_worktrees.py +0 -172
  154. package/.agents/skills/_shared/pr-loop/scripts/test__path_resolver.py +0 -106
  155. package/.agents/skills/_shared/pr-loop/scripts/test_audit_category_schema.py +0 -94
  156. package/.agents/skills/_shared/pr-loop/scripts/test_build_audit_prompt.py +0 -499
  157. package/.agents/skills/_shared/pr-loop/scripts/test_build_converge_task_list.py +0 -140
  158. package/.agents/skills/_shared/pr-loop/scripts/test_build_fix_prompt.py +0 -262
  159. package/.agents/skills/_shared/pr-loop/scripts/test_init_loop_state.py +0 -71
  160. package/.agents/skills/_shared/pr-loop/scripts/test_portable_converge_driver.py +0 -1119
  161. package/.agents/skills/_shared/pr-loop/scripts/test_preflight_worktree.py +0 -287
  162. package/.agents/skills/_shared/pr-loop/scripts/test_select_converge_pacer.py +0 -207
  163. package/.agents/skills/_shared/pr-loop/scripts/test_teardown_worktrees.py +0 -59
  164. package/.agents/skills/_shared/pr-loop/scripts/test_write_handoff.py +0 -201
  165. package/.agents/skills/_shared/pr-loop/scripts/write_audit_outcomes.py +0 -182
  166. package/.agents/skills/_shared/pr-loop/scripts/write_fix_outcomes.py +0 -206
  167. package/.agents/skills/_shared/pr-loop/scripts/write_handoff.py +0 -309
  168. package/.agents/skills/_shared/pr-loop/state-schema.md +0 -5
  169. package/.agents/skills/_shared/pr-loop/worker-spawn.md +0 -5
  170. package/.agents/skills/autoconverge/.claude/CLAUDE.md +0 -1
  171. package/.agents/skills/autoconverge/AGENTS.md +0 -1
  172. package/.agents/skills/autoconverge/SKILL.md +0 -431
  173. package/.agents/skills/autoconverge/reference/.claude/CLAUDE.md +0 -1
  174. package/.agents/skills/autoconverge/reference/AGENTS.md +0 -1
  175. package/.agents/skills/autoconverge/reference/closing-report.md +0 -93
  176. package/.agents/skills/autoconverge/reference/convergence-gates.md +0 -31
  177. package/.agents/skills/autoconverge/reference/convergence.md +0 -219
  178. package/.agents/skills/autoconverge/reference/copilot-findings.md +0 -51
  179. package/.agents/skills/autoconverge/reference/gotchas.md +0 -66
  180. package/.agents/skills/autoconverge/reference/headless-safety.md +0 -44
  181. package/.agents/skills/autoconverge/reference/multi-pr.md +0 -128
  182. package/.agents/skills/autoconverge/reference/self-closing-loop.md +0 -84
  183. package/.agents/skills/autoconverge/reference/stop-conditions.md +0 -127
  184. package/.agents/skills/autoconverge/test_portable_pacer_gate.py +0 -54
  185. package/.agents/skills/autoconverge/workflow/.claude/CLAUDE.md +0 -1
  186. package/.agents/skills/autoconverge/workflow/AGENTS.md +0 -1
  187. package/.agents/skills/autoconverge/workflow/aggregate_runs.py +0 -371
  188. package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/.claude/CLAUDE.md +0 -1
  189. package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/AGENTS.md +0 -1
  190. package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/__init__.py +0 -0
  191. package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/render_report_constants.py +0 -250
  192. package/.agents/skills/autoconverge/workflow/converge.clean-audit.test.mjs +0 -665
  193. package/.agents/skills/autoconverge/workflow/converge.codex-gate.test.mjs +0 -472
  194. package/.agents/skills/autoconverge/workflow/converge.contract.test.mjs +0 -64
  195. package/.agents/skills/autoconverge/workflow/converge.copilot-gate.test.mjs +0 -1009
  196. package/.agents/skills/autoconverge/workflow/converge.fix-progress.test.mjs +0 -107
  197. package/.agents/skills/autoconverge/workflow/converge.fix-recovery.test.mjs +0 -33
  198. package/.agents/skills/autoconverge/workflow/converge.merge-conflict.test.mjs +0 -15
  199. package/.agents/skills/autoconverge/workflow/converge.mjs +0 -3132
  200. package/.agents/skills/autoconverge/workflow/converge.p2-advance.test.mjs +0 -202
  201. package/.agents/skills/autoconverge/workflow/converge.path-aware.test.mjs +0 -47
  202. package/.agents/skills/autoconverge/workflow/converge.precatch.test.mjs +0 -152
  203. package/.agents/skills/autoconverge/workflow/converge.run-input.test.mjs +0 -116
  204. package/.agents/skills/autoconverge/workflow/converge_multi.mjs +0 -169
  205. package/.agents/skills/autoconverge/workflow/converge_multi.run-input.test.mjs +0 -173
  206. package/.agents/skills/autoconverge/workflow/convergence_summary.py +0 -110
  207. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a11d903476b803493.jsonl +0 -2
  208. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a26213978adeef6fb.jsonl +0 -2
  209. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a3def0d15ed9d9110.jsonl +0 -2
  210. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a41f41b1b708ee3b7.jsonl +0 -2
  211. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a758b880abecc3ff7.jsonl +0 -2
  212. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a8897b89656b1bd16.jsonl +0 -2
  213. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-ab1c2d3e4f5a6b7c8.jsonl +0 -2
  214. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-abd463d744a1437bc.jsonl +0 -2
  215. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-ad19d027ae8ee1816.jsonl +0 -2
  216. package/.agents/skills/autoconverge/workflow/fixtures/wf_run/workflows/wf_881252e6-700.json +0 -266
  217. package/.agents/skills/autoconverge/workflow/render_report.py +0 -1024
  218. package/.agents/skills/autoconverge/workflow/test_aggregate_runs.py +0 -134
  219. package/.agents/skills/autoconverge/workflow/test_convergence_summary.py +0 -149
  220. package/.agents/skills/autoconverge/workflow/test_render_report.py +0 -812
  221. package/.agents/skills/hitl/SKILL.md +0 -45
  222. package/.agents/skills/pr-cleanup/SKILL.md +0 -140
  223. package/.agents/skills/pr-cleanup/reference/process-inventory.md +0 -17
  224. package/.agents/skills/pr-cleanup/reference/task-seeds.md +0 -22
  225. package/.agents/skills/pr-name-by-capability/SKILL.md +0 -73
  226. package/.agents/skills/pr-name-by-capability/reference/fetch-commands.md +0 -29
  227. package/.agents/skills/pr-name-by-capability/reference/offense-examples.md +0 -32
  228. package/.agents/skills/pr-name-by-capability/reference/report-template.md +0 -29
  229. package/.agents/skills/pr-name-by-capability/reference/rule-checklist.md +0 -38
  230. package/.agents/skills/pr-name-by-capability/reference/task-seeds.md +0 -10
  231. package/.agents/skills/pr-plain-language-cleanup/SKILL.md +0 -93
  232. package/.agents/skills/pr-refinement/SKILL.md +0 -31
  233. package/.agents/skills/pr-shared-extraction/SKILL.md +0 -177
  234. package/.agents/skills/pr-shared-extraction/reference/examples.md +0 -46
  235. package/.agents/skills/pr-shared-extraction/reference/offense-taxonomy.md +0 -100
  236. package/.agents/skills/pr-small-cl/SKILL.md +0 -52
  237. package/.agents/skills/pr-title-description/SKILL.md +0 -96
  238. package/.agents/skills/prototype/SKILL.md +0 -85
  239. package/.agents/skills/prototype/reference/honest-limitations.md +0 -23
  240. package/.agents/skills/prototype/reference/promotion-tasks.md +0 -23
  241. package/.agents/skills/prototype/scripts/build_sandbox_settings.py +0 -249
  242. package/.agents/skills/prototype/scripts/conftest.py +0 -15
  243. package/.agents/skills/prototype/scripts/launch_sandbox.py +0 -205
  244. package/.agents/skills/prototype/scripts/probe_sandbox_safety.py +0 -311
  245. package/.agents/skills/prototype/scripts/prototype_scripts_constants/__init__.py +0 -1
  246. package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/__init__.py +0 -0
  247. package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/build_sandbox_settings_constants.py +0 -41
  248. package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/launch_sandbox_constants.py +0 -23
  249. package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/probe_sandbox_safety_constants.py +0 -45
  250. package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/prototype_common_constants.py +0 -10
  251. package/.agents/skills/prototype/scripts/test_build_sandbox_settings.py +0 -275
  252. package/.agents/skills/prototype/scripts/test_launch_sandbox.py +0 -303
  253. package/.agents/skills/prototype/scripts/test_probe_sandbox_safety.py +0 -312
  254. package/.agents/skills/prototype/workflows/promotion.md +0 -25
  255. package/.agents/skills/prototype/workflows/sandbox.md +0 -35
  256. package/.agents/skills/rebase/.claude/CLAUDE.md +0 -1
  257. package/.agents/skills/rebase/AGENTS.md +0 -1
  258. package/.agents/skills/rebase/SKILL.md +0 -178
  259. package/.agents/skills/review-router/SKILL.md +0 -51
  260. package/.agents/skills/review-router/reference/route-policy.json +0 -7
  261. package/.agents/skills/review-router/reference/task-seeds.md +0 -1
  262. package/.agents/skills/review-router/scripts/conftest.py +0 -4
  263. package/.agents/skills/review-router/scripts/review_router.py +0 -50
  264. package/.agents/skills/review-router/scripts/review_router_cli.py +0 -211
  265. package/.agents/skills/review-router/scripts/review_router_constants/__init__.py +0 -1
  266. package/.agents/skills/review-router/scripts/review_router_constants/config/__init__.py +0 -0
  267. package/.agents/skills/review-router/scripts/review_router_constants/config/constants.py +0 -13
  268. package/.agents/skills/review-router/scripts/test_review_router.py +0 -23
  269. package/.agents/skills/review-router/scripts/test_review_router_cli.py +0 -47
  270. package/.agents/skills/review-tier/SKILL.md +0 -56
  271. package/.agents/skills/review-tier/reference/task-seeds.md +0 -1
  272. package/.agents/skills/review-tier/reference/tier-policy.json +0 -9
  273. package/.agents/skills/review-tier/scripts/conftest.py +0 -4
  274. package/.agents/skills/review-tier/scripts/review_tier.py +0 -359
  275. package/.agents/skills/review-tier/scripts/review_tier_constants/__init__.py +0 -1
  276. package/.agents/skills/review-tier/scripts/review_tier_constants/config/__init__.py +0 -0
  277. package/.agents/skills/review-tier/scripts/review_tier_constants/config/constants.py +0 -29
  278. package/.agents/skills/review-tier/scripts/test_generation.py +0 -159
  279. package/.agents/skills/review-tier/scripts/test_review_tier.py +0 -33
  280. package/.agents/skills/run-claude-dev-env/SKILL.md +0 -84
  281. package/.agents/skills/session-log/.claude/CLAUDE.md +0 -1
  282. package/.agents/skills/session-log/AGENTS.md +0 -1
  283. package/.agents/skills/session-log/SKILL.md +0 -170
  284. package/.agents/skills/session-log/templates/frontmatter.md +0 -40
  285. package/.agents/skills/session-tidy/.claude/CLAUDE.md +0 -1
  286. package/.agents/skills/session-tidy/AGENTS.md +0 -1
  287. package/.agents/skills/session-tidy/SKILL.md +0 -191
  288. package/.agents/skills/skill-builder/references/.claude/CLAUDE.md +0 -1
  289. package/.agents/skills/skill-builder/references/AGENTS.md +0 -1
  290. package/.agents/skills/skill-builder/references/delegation-map.md +0 -130
  291. package/.agents/skills/skill-builder/references/description-field.md +0 -111
  292. package/.agents/skills/skill-builder/references/deterministic-elements.md +0 -218
  293. package/.agents/skills/skill-builder/references/progressive-disclosure.md +0 -122
  294. package/.agents/skills/skill-builder/references/self-audit-checklist.md +0 -126
  295. package/.agents/skills/skill-builder/references/skill-modularity.md +0 -111
  296. package/.agents/skills/skill-builder/references/skill-types.md +0 -232
  297. package/.agents/skills/skill-builder/references/thariq-x-post-skills.json +0 -33
  298. package/.agents/skills/skill-builder/templates/.claude/CLAUDE.md +0 -1
  299. package/.agents/skills/skill-builder/templates/AGENTS.md +0 -1
  300. package/.agents/skills/skill-builder/templates/gap-analysis.md +0 -87
  301. package/.agents/skills/skill-builder/workflows/.claude/CLAUDE.md +0 -1
  302. package/.agents/skills/skill-builder/workflows/AGENTS.md +0 -1
  303. package/.agents/skills/skill-builder/workflows/improve-skill.md +0 -136
  304. package/.agents/skills/skill-builder/workflows/new-skill.md +0 -179
  305. package/.agents/skills/skill-builder/workflows/polish-skill.md +0 -139
  306. package/.agents/skills/source-command-sr-loop/SKILL.md +0 -82
  307. package/.agents/skills/update/.claude/CLAUDE.md +0 -1
  308. package/.agents/skills/update/AGENTS.md +0 -1
  309. package/.agents/skills/update/SKILL.md +0 -190
  310. package/_shared/pr-loop/AGENTS.md +0 -1
  311. package/_shared/pr-loop/CLAUDE.md +0 -1
  312. package/_shared/pr-loop/audit-contract.md +0 -183
  313. package/_shared/pr-loop/audit-reply-template.md +0 -151
  314. package/_shared/pr-loop/code-rules-gate.md +0 -65
  315. package/_shared/pr-loop/fix-protocol.md +0 -60
  316. package/_shared/pr-loop/gh-payloads.md +0 -75
  317. package/_shared/pr-loop/post-audit-thread-contract.md +0 -51
  318. package/_shared/pr-loop/precatch-rubric.md +0 -66
  319. package/_shared/pr-loop/preflight-proposal.md +0 -56
  320. package/_shared/pr-loop/scripts/post_audit_thread.py +0 -1242
  321. package/_shared/pr-loop/scripts/pr_loop_shared_constants/post_audit_thread_constants.py +0 -199
  322. package/_shared/pr-loop/scripts/tests/test_post_audit_thread.py +0 -1115
  323. package/_shared/pr-loop/scripts/tests/test_post_audit_thread_constants.py +0 -129
  324. package/_shared/pr-loop/state-schema.md +0 -45
  325. package/_shared/pr-loop/worker-spawn.md +0 -189
  326. package/hooks/_gh_pr_author_swap_utils.py +0 -1225
  327. package/hooks/blocking/conventional_pr_title_gate.py +0 -443
  328. package/hooks/blocking/gh_body_arg_blocker.py +0 -176
  329. package/hooks/blocking/gh_pr_author_enforcer.py +0 -487
  330. package/hooks/blocking/gh_pr_author_restore.py +0 -105
  331. package/hooks/blocking/pr_description_writer_gate.py +0 -256
  332. package/hooks/blocking/test_conventional_pr_title_gate.py +0 -640
  333. package/hooks/blocking/test_gh_body_arg_blocker.py +0 -441
  334. package/hooks/blocking/test_gh_pr_author_enforcer.py +0 -1166
  335. package/hooks/blocking/test_gh_pr_author_restore.py +0 -513
  336. package/hooks/blocking/test_gh_pr_author_swap_utils.py +0 -910
  337. package/hooks/blocking/test_pr_description_writer_gate.py +0 -234
  338. package/hooks/blocking/test_preflight_check.py +0 -343
  339. package/hooks/blocking/test_test_preflight_check.py +0 -80
  340. package/hooks/blocking/test_volatile_path_in_post_blocker.py +0 -322
  341. package/hooks/blocking/volatile_path_in_post_blocker.py +0 -461
  342. package/hooks/hooks_constants/conventional_pr_title_gate_constants.py +0 -58
  343. package/hooks/hooks_constants/gh_pr_author_swap_constants.py +0 -76
  344. package/hooks/hooks_constants/pr_description_writer_gate_constants.py +0 -73
  345. package/hooks/hooks_constants/volatile_path_in_post_blocker_constants.py +0 -55
  346. package/hooks/observability/pr_description_writer_spawn_tracker.py +0 -113
  347. package/hooks/observability/test_pr_description_writer_spawn_tracker.py +0 -150
  348. package/hooks/session/gh_pr_author_session_cleanup.py +0 -175
  349. package/hooks/session/test_gh_pr_author_session_cleanup.py +0 -576
  350. package/hooks/test__gh_pr_author_swap_utils.py +0 -333
@@ -1,333 +0,0 @@
1
- """Canonical-location tests for the gh-pr-author swap utils module.
2
-
3
- The TDD enforcer matches a production filename ``X.py`` to ``test_X.py``;
4
- ``_gh_pr_author_swap_utils.py`` carries a leading underscore that the
5
- enforcer treats as part of the name. This file's tests are the canonical
6
- match. The broader behavioural suite lives alongside in
7
- ``blocking/test_gh_pr_author_swap_utils.py``.
8
- """
9
-
10
- from __future__ import annotations
11
-
12
- import importlib.util
13
- import os
14
- import pathlib
15
- import sys
16
- import tempfile
17
-
18
- import pytest
19
-
20
- from hooks_constants.gh_pr_author_swap_constants import STATE_FILE_PERMISSION_MODE
21
-
22
- _HOOKS_ROOT = pathlib.Path(__file__).resolve().parent
23
- if str(_HOOKS_ROOT) not in sys.path:
24
- sys.path.insert(0, str(_HOOKS_ROOT))
25
-
26
- utils_module_spec = importlib.util.spec_from_file_location(
27
- "_gh_pr_author_swap_utils",
28
- _HOOKS_ROOT / "_gh_pr_author_swap_utils.py",
29
- )
30
- assert utils_module_spec is not None
31
- assert utils_module_spec.loader is not None
32
- utils_module = importlib.util.module_from_spec(utils_module_spec)
33
- utils_module_spec.loader.exec_module(utils_module)
34
-
35
-
36
- def test_state_file_path_rejects_path_traversal_session_id() -> None:
37
- """A session_id containing path-traversal characters must not escape tempdir.
38
-
39
- Regression guard: an unsanitised ``session_id`` containing ``../`` or
40
- ``/`` would interpolate into the filename and let the resulting path
41
- land outside ``tempfile.gettempdir()``. The sanitiser strips every
42
- character outside ``[A-Za-z0-9_-]`` and falls back to the default
43
- session id when the result is empty.
44
- """
45
- sanitised_path = utils_module._state_file_path("../../tmp/evil")
46
- temporary_directory_path = pathlib.Path(tempfile.gettempdir()).resolve()
47
- assert sanitised_path.parent.resolve() == temporary_directory_path
48
-
49
-
50
- def test_state_file_path_rejects_backslash_in_session_id() -> None:
51
- """Backslashes are also unsafe path separators on Windows."""
52
- sanitised_path = utils_module._state_file_path("evil\\..\\..\\system32")
53
- temporary_directory_path = pathlib.Path(tempfile.gettempdir()).resolve()
54
- assert sanitised_path.parent.resolve() == temporary_directory_path
55
-
56
-
57
- def test_state_file_path_rejects_nul_byte_in_session_id() -> None:
58
- """A NUL byte inside the session id must not reach the filename."""
59
- sanitised_path = utils_module._state_file_path("abc\x00../def")
60
- temporary_directory_path = pathlib.Path(tempfile.gettempdir()).resolve()
61
- assert sanitised_path.parent.resolve() == temporary_directory_path
62
- assert "\x00" not in sanitised_path.name
63
-
64
-
65
- def test_state_file_path_preserves_safe_session_id() -> None:
66
- """A well-formed session id passes through unchanged."""
67
- safe_session_id = "session-001_abc"
68
- produced_path = utils_module._state_file_path(safe_session_id)
69
- assert safe_session_id in produced_path.name
70
-
71
-
72
- def test_backtick_substitution_blanks_inner_quoted_literals() -> None:
73
- """A ``gh pr create`` literal inside a single-quoted argument of a backtick body must not trigger.
74
-
75
- Mirrors ``$(printf '...')`` behaviour: when the backtick body's
76
- quoted literal contains the token, the matcher must blank the
77
- quoted region before searching.
78
- """
79
- stripped_command = utils_module._strip_quoted_regions("foo `printf ';gh pr create'`")
80
- assert not utils_module._command_invokes_gh_pr_create_in_stripped(stripped_command)
81
-
82
-
83
- def test_backtick_substitution_matches_unquoted_gh_pr_create_inside_body() -> None:
84
- """A bare ``gh pr create`` inside a backtick body still matches.
85
-
86
- Symmetric to ``$(gh pr create)`` — the substitution body is real
87
- code, so the matcher must see it.
88
- """
89
- stripped_command = utils_module._strip_quoted_regions("echo `gh pr create --title T`")
90
- assert utils_module._command_invokes_gh_pr_create_in_stripped(stripped_command)
91
-
92
-
93
- def test_state_file_is_attacker_planted_returns_true_for_world_readable_mode(
94
- tmp_path: pathlib.Path,
95
- ) -> None:
96
- """A state file with mode 0o644 is flagged as attacker-planted on POSIX.
97
-
98
- The enforcer always atomically creates state files at 0o600. A file
99
- at the predictable swap-state path with any other mode bits cannot
100
- have come from the enforcer running as this user.
101
- """
102
- if not hasattr(os, "getuid"):
103
- return
104
- state_file = tmp_path / "gh_pr_author_swap_session-attacker.json"
105
- state_file.write_text("{}", encoding="utf-8")
106
- os.chmod(state_file, 0o644)
107
-
108
- assert utils_module._state_file_is_attacker_planted(state_file) is True
109
-
110
-
111
- def test_state_file_is_attacker_planted_returns_false_for_well_formed_file(
112
- tmp_path: pathlib.Path,
113
- ) -> None:
114
- """A state file written exactly the way the enforcer writes is not flagged."""
115
- state_file = tmp_path / "gh_pr_author_swap_session-good.json"
116
- state_file.write_text("{}", encoding="utf-8")
117
- if hasattr(os, "getuid"):
118
- os.chmod(state_file, STATE_FILE_PERMISSION_MODE)
119
-
120
- assert utils_module._state_file_is_attacker_planted(state_file) is False
121
-
122
-
123
- def test_state_file_is_attacker_planted_returns_false_for_missing_file(
124
- tmp_path: pathlib.Path,
125
- ) -> None:
126
- """A missing state file is treated as not-planted so callers can no-op cleanly."""
127
- missing_state_file = tmp_path / "gh_pr_author_swap_session-missing.json"
128
-
129
- assert utils_module._state_file_is_attacker_planted(missing_state_file) is False
130
-
131
-
132
- def test_state_file_is_attacker_planted_returns_true_for_non_regular_file(
133
- tmp_path: pathlib.Path,
134
- ) -> None:
135
- """A FIFO at the predictable swap-state path is flagged as attacker-planted.
136
-
137
- The enforcer only writes regular files; any non-regular file type
138
- (symlink, FIFO, device) at the predictable path indicates another
139
- party pre-created it to redirect the restore or cleanup hook.
140
- """
141
- if not hasattr(os, "mkfifo"):
142
- pytest.skip("mkfifo not available on this platform")
143
- if not hasattr(os, "getuid"):
144
- pytest.skip("POSIX ownership semantics not available on this platform")
145
- fifo_state_file = tmp_path / "gh_pr_author_swap_session-fifo.json"
146
- os.mkfifo(fifo_state_file, STATE_FILE_PERMISSION_MODE)
147
-
148
- assert utils_module._state_file_is_attacker_planted(fifo_state_file) is True
149
-
150
-
151
- def test_state_file_is_attacker_planted_returns_true_when_lstat_raises_os_error(
152
- tmp_path: pathlib.Path,
153
- monkeypatch: pytest.MonkeyPatch,
154
- ) -> None:
155
- """An ``OSError`` from ``lstat`` fails closed — the path is treated as planted.
156
-
157
- A path that exists but is unreadable (permission denied, broken
158
- filesystem mount, etc.) cannot be proven safe, so the helper
159
- returns True to keep the restore or cleanup hook from trusting it.
160
- """
161
- if not hasattr(os, "getuid"):
162
- pytest.skip("POSIX ownership semantics not available on this platform")
163
- unreadable_state_file = tmp_path / "gh_pr_author_swap_session-unreadable.json"
164
- unreadable_state_file.write_text("{}", encoding="utf-8")
165
-
166
- def raise_permission_error(self: pathlib.Path) -> os.stat_result:
167
- raise PermissionError("simulated lstat failure")
168
-
169
- monkeypatch.setattr(pathlib.Path, "lstat", raise_permission_error)
170
-
171
- assert utils_module._state_file_is_attacker_planted(unreadable_state_file) is True
172
-
173
-
174
- def test_strip_bash_comments_preserves_substitution_body_when_hash_is_inside_dollar_paren() -> None:
175
- """Regression: ``$(date +%H # 24h) && gh pr create`` must not let the regex eat past the substitution closer.
176
-
177
- Before this fix ``_strip_bash_comments`` ran a flat regex sweep that
178
- blanked from ``#`` to end-of-line regardless of substitution depth.
179
- A ``#`` preceded by whitespace inside a ``$(...)`` body consumed
180
- the closing ``)`` AND every byte after it on the same line,
181
- erasing a real ``gh pr create`` invocation from the enforcer's
182
- view and silently bypassing the swap.
183
- """
184
- raw_command = "$(date +%H # 24h) && gh pr create --title T"
185
- preprocessed_command = utils_module._preprocess_command_for_matching(raw_command)
186
- assert "gh pr create" in preprocessed_command
187
- assert utils_module._command_invokes_gh_pr_create_in_stripped(preprocessed_command)
188
-
189
-
190
- def test_strip_bash_comments_preserves_substitution_body_when_hash_is_inside_backtick() -> None:
191
- """Regression: a ``#`` inside a backtick body must not erase a trailing ``gh pr create``.
192
-
193
- Backtick substitution is symmetric with ``$(...)``; the
194
- substitution-aware comment walker must treat both shapes the same.
195
- """
196
- raw_command = "foo `cmd # comment` bar && gh pr create"
197
- preprocessed_command = utils_module._preprocess_command_for_matching(raw_command)
198
- assert "gh pr create" in preprocessed_command
199
- assert utils_module._command_invokes_gh_pr_create_in_stripped(preprocessed_command)
200
-
201
-
202
- def test_strip_bash_comments_strips_top_level_trailing_comment() -> None:
203
- """Existing behaviour: a top-level trailing ``#`` comment after ``gh pr create`` is blanked.
204
-
205
- The comment-stripping pass must still erase a real top-level
206
- comment so the enforcer treats only the command portion as code.
207
- """
208
- raw_command = "gh pr create # this is a comment"
209
- preprocessed_command = utils_module._preprocess_command_for_matching(raw_command)
210
- assert "this is a comment" not in preprocessed_command
211
-
212
-
213
- def test_strip_bash_comments_strips_prior_line_comment_only() -> None:
214
- """Existing behaviour: a comment on line 1 is blanked but a ``gh pr create`` on line 2 still matches.
215
-
216
- The newline is preserved so the matcher can still tell the two
217
- lines apart, and the second-line command stays intact.
218
- """
219
- raw_command = "echo a # b\ngh pr create"
220
- preprocessed_command = utils_module._preprocess_command_for_matching(raw_command)
221
- assert "gh pr create" in preprocessed_command
222
- assert "# b" not in preprocessed_command
223
- assert utils_module._command_invokes_gh_pr_create_in_stripped(preprocessed_command)
224
-
225
-
226
- def test_lstat_indicates_attacker_planted_returns_false_for_well_formed_lstat(
227
- tmp_path: pathlib.Path,
228
- ) -> None:
229
- """A 0o600 regular file owned by the current user is not flagged.
230
-
231
- Mirrors ``test_state_file_is_attacker_planted_returns_false_for_well_formed_file``
232
- but feeds the helper a pre-computed ``lstat`` result so the helper
233
- does not perform its own syscall.
234
- """
235
- state_file = tmp_path / "gh_pr_author_swap_session-well_formed.json"
236
- state_file.write_text("{}", encoding="utf-8")
237
- if hasattr(os, "getuid"):
238
- os.chmod(state_file, STATE_FILE_PERMISSION_MODE)
239
-
240
- file_lstat_result = state_file.lstat()
241
-
242
- assert utils_module._lstat_indicates_attacker_planted(file_lstat_result) is False
243
-
244
-
245
- def test_lstat_indicates_attacker_planted_returns_true_for_world_readable_mode(
246
- tmp_path: pathlib.Path,
247
- ) -> None:
248
- """A 0o644 regular file is flagged as attacker-planted on POSIX.
249
-
250
- The enforcer always creates state files at 0o600, so a divergent
251
- mode is treated as a plant.
252
- """
253
- if not hasattr(os, "getuid"):
254
- pytest.skip("POSIX ownership semantics not available on this platform")
255
- state_file = tmp_path / "gh_pr_author_swap_session-mode_wrong.json"
256
- state_file.write_text("{}", encoding="utf-8")
257
- os.chmod(state_file, 0o644)
258
-
259
- file_lstat_result = state_file.lstat()
260
-
261
- assert utils_module._lstat_indicates_attacker_planted(file_lstat_result) is True
262
-
263
-
264
- def test_lstat_indicates_attacker_planted_returns_true_for_foreign_uid(
265
- tmp_path: pathlib.Path,
266
- ) -> None:
267
- """A regular 0o600 file owned by a different uid is flagged on POSIX.
268
-
269
- The helper sees only the ``stat_result`` it is given, so the test
270
- builds a synthetic ``os.stat_result`` whose ``st_uid`` does not match
271
- ``os.getuid()`` and feeds it directly to the helper.
272
- """
273
- if not hasattr(os, "getuid"):
274
- pytest.skip("POSIX ownership semantics not available on this platform")
275
- state_file = tmp_path / "gh_pr_author_swap_session-foreign_uid.json"
276
- state_file.write_text("{}", encoding="utf-8")
277
- os.chmod(state_file, STATE_FILE_PERMISSION_MODE)
278
- real_lstat_result = state_file.lstat()
279
- foreign_user_id = os.getuid() + 1
280
- synthetic_stat_fields = (
281
- real_lstat_result.st_mode,
282
- real_lstat_result.st_ino,
283
- real_lstat_result.st_dev,
284
- real_lstat_result.st_nlink,
285
- foreign_user_id,
286
- real_lstat_result.st_gid,
287
- real_lstat_result.st_size,
288
- real_lstat_result.st_atime,
289
- real_lstat_result.st_mtime,
290
- real_lstat_result.st_ctime,
291
- )
292
- synthetic_stat_result = os.stat_result(synthetic_stat_fields)
293
-
294
- assert utils_module._lstat_indicates_attacker_planted(synthetic_stat_result) is True
295
-
296
-
297
- def test_lstat_indicates_attacker_planted_returns_true_for_non_regular_file(
298
- tmp_path: pathlib.Path,
299
- ) -> None:
300
- """A FIFO at the predictable swap-state path is flagged.
301
-
302
- Mirrors ``test_state_file_is_attacker_planted_returns_true_for_non_regular_file``
303
- but feeds the helper the FIFO's own ``lstat`` result rather than the
304
- path.
305
- """
306
- if not hasattr(os, "mkfifo"):
307
- pytest.skip("mkfifo not available on this platform")
308
- if not hasattr(os, "getuid"):
309
- pytest.skip("POSIX ownership semantics not available on this platform")
310
- fifo_state_file = tmp_path / "gh_pr_author_swap_session-fifo.json"
311
- os.mkfifo(fifo_state_file, STATE_FILE_PERMISSION_MODE)
312
-
313
- file_lstat_result = fifo_state_file.lstat()
314
-
315
- assert utils_module._lstat_indicates_attacker_planted(file_lstat_result) is True
316
-
317
-
318
- def test_lstat_indicates_attacker_planted_returns_false_on_windows(
319
- tmp_path: pathlib.Path,
320
- ) -> None:
321
- """On Windows (no ``os.getuid``) the helper short-circuits to False.
322
-
323
- Windows tempdir is already per-user, so the cross-user attack
324
- surface this check guards against on POSIX does not exist there.
325
- """
326
- if hasattr(os, "getuid"):
327
- pytest.skip("POSIX has os.getuid; this case asserts Windows-only behaviour")
328
- state_file = tmp_path / "gh_pr_author_swap_session-windows.json"
329
- state_file.write_text("{}", encoding="utf-8")
330
-
331
- file_lstat_result = state_file.lstat()
332
-
333
- assert utils_module._lstat_indicates_attacker_planted(file_lstat_result) is False