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
@@ -1,249 +0,0 @@
1
- #!/usr/bin/env python3
2
- """Emit a minimal ``--settings`` file carrying only the two sandbox safety hooks.
3
-
4
- ::
5
-
6
- python build_sandbox_settings.py --out sandbox-settings.json
7
- sandbox-settings.json -> {"env": {deny-mode override},
8
- "hooks": {"PreToolUse": [
9
- {"matcher": "Bash", "hooks": [pii_prevention, destructive_command]},
10
- {"matcher": "Edit", "hooks": [pii_prevention]},
11
- {"matcher": "MultiEdit", "hooks": [pii_prevention]},
12
- {"matcher": "Write", "hooks": [pii_prevention]}]}}
13
-
14
- The builder resolves each safety hook's command entry from the live settings
15
- source, which carries the per-machine interpreter, absolute script path, and
16
- timeout. It then registers each entry on the matchers the sandbox requires.
17
- The personal-data gate covers every write surface and the command line. The
18
- destructive-command gate covers the command line, and the emitted ``env`` block
19
- runs that gate in deny mode so its block holds under
20
- ``--dangerously-skip-permissions``. When either safety hook is absent from the
21
- source, the builder exits without writing, because a sandbox cannot be
22
- contained without both.
23
- """
24
-
25
- from __future__ import annotations
26
-
27
- import argparse
28
- import json
29
- import logging
30
- import sys
31
- from pathlib import Path
32
-
33
- from prototype_scripts_constants.config.build_sandbox_settings_constants import (
34
- ALL_REQUIRED_MATCHERS_BY_SAFETY_BASENAME,
35
- ALL_SAFETY_HOOK_SCRIPT_BASENAMES,
36
- BUILD_SUCCESS_EXIT_CODE,
37
- COMMAND_KEY,
38
- DEFAULT_SETTINGS_SOURCE,
39
- DESTRUCTIVE_DENY_MODE_ENV_VALUE,
40
- DESTRUCTIVE_DENY_MODE_ENV_VAR,
41
- ENV_KEY,
42
- HOOKS_KEY,
43
- JSON_INDENT_SPACES,
44
- MATCHER_KEY,
45
- MISSING_BASENAMES_JOIN_SEPARATOR,
46
- PRE_TOOL_USE_KEY,
47
- SETTINGS_MISSING_SAFETY_HOOK_EXIT_CODE,
48
- SETTINGS_SOURCE_UNREADABLE_EXIT_CODE,
49
- )
50
- from prototype_scripts_constants.config.prototype_common_constants import (
51
- LOGGING_FORMAT,
52
- TEXT_ENCODING_UTF8,
53
- )
54
-
55
- logger = logging.getLogger("build_sandbox_settings")
56
-
57
-
58
- def read_settings_document(source_path: Path) -> dict:
59
- """Load the live settings JSON the sandbox settings are resolved from.
60
-
61
- ::
62
-
63
- ~/.claude/settings.json -> parsed dict with hooks.PreToolUse blocks
64
- """
65
- return json.loads(source_path.read_text(encoding=TEXT_ENCODING_UTF8))
66
-
67
-
68
- def _first_subhook_running(
69
- pre_tool_use_block: dict, script_basename: str
70
- ) -> dict | None:
71
- """Return the block's first sub-hook whose command runs the named script."""
72
- for each_subhook in pre_tool_use_block.get(HOOKS_KEY, []):
73
- if script_basename in each_subhook.get(COMMAND_KEY, ""):
74
- return each_subhook
75
- return None
76
-
77
-
78
- def _first_block_running(
79
- all_pre_tool_use_blocks: list[dict], script_basename: str
80
- ) -> dict | None:
81
- """Return the first block's sub-hook entry that runs the named safety script."""
82
- for each_block in all_pre_tool_use_blocks:
83
- resolved_entry = _first_subhook_running(each_block, script_basename)
84
- if resolved_entry is not None:
85
- return resolved_entry
86
- return None
87
-
88
-
89
- def resolve_safety_hook_entries(settings_document: dict) -> dict[str, dict]:
90
- """Resolve each safety hook's live sub-hook entry, keyed by script basename.
91
-
92
- ::
93
-
94
- live PreToolUse blocks
95
- -> {"pii_prevention_blocker.py": {type, command, timeout},
96
- "destructive_command_blocker.py": {type, command, timeout}}
97
-
98
- The captured entry carries the per-machine interpreter, absolute script
99
- path, and timeout, so the sandbox settings stay correct on any machine.
100
-
101
- Args:
102
- settings_document: the live settings JSON with hooks.PreToolUse blocks.
103
-
104
- Returns:
105
- The first matching sub-hook entry per safety basename; a basename with
106
- no matching sub-hook is absent from the mapping.
107
- """
108
- pre_tool_use_blocks = settings_document.get(HOOKS_KEY, {}).get(PRE_TOOL_USE_KEY, [])
109
- entry_by_basename: dict[str, dict] = {}
110
- for each_basename in ALL_SAFETY_HOOK_SCRIPT_BASENAMES:
111
- resolved_entry = _first_block_running(pre_tool_use_blocks, each_basename)
112
- if resolved_entry is not None:
113
- entry_by_basename[each_basename] = resolved_entry
114
- return entry_by_basename
115
-
116
-
117
- def find_unresolved_safety_hook_basenames(
118
- entry_by_basename: dict[str, dict],
119
- ) -> list[str]:
120
- """List the safety hook basenames the live source resolved no command for.
121
-
122
- ::
123
-
124
- both resolved -> []
125
- destructive unresolved -> ["destructive_command_blocker.py"]
126
-
127
- Args:
128
- entry_by_basename: the resolved sub-hook entry per safety basename.
129
-
130
- Returns:
131
- The safety hook basenames absent from the mapping, empty when both
132
- resolved.
133
- """
134
- return [
135
- each_basename
136
- for each_basename in ALL_SAFETY_HOOK_SCRIPT_BASENAMES
137
- if each_basename not in entry_by_basename
138
- ]
139
-
140
-
141
- def _build_pre_tool_use_blocks(entry_by_basename: dict[str, dict]) -> list[dict]:
142
- """Build one PreToolUse block per required matcher, in sorted matcher order."""
143
- entries_by_matcher: dict[str, list[dict]] = {}
144
- for each_basename in ALL_REQUIRED_MATCHERS_BY_SAFETY_BASENAME:
145
- resolved_entry = entry_by_basename[each_basename]
146
- for each_matcher in ALL_REQUIRED_MATCHERS_BY_SAFETY_BASENAME[each_basename]:
147
- entries_by_matcher.setdefault(each_matcher, []).append(resolved_entry)
148
- return [
149
- {MATCHER_KEY: each_matcher, HOOKS_KEY: entries_by_matcher[each_matcher]}
150
- for each_matcher in sorted(entries_by_matcher)
151
- ]
152
-
153
-
154
- def _build_deny_mode_env_block() -> dict[str, str]:
155
- """Build the env block that runs the destructive gate in deny mode.
156
-
157
- The single key is the deny-mode env variable, mapped to its truthy value,
158
- so the sandbox session runs the destructive gate with a hard block.
159
-
160
- Returns:
161
- The single-key env override the sandbox session applies.
162
- """
163
- return {DESTRUCTIVE_DENY_MODE_ENV_VAR: DESTRUCTIVE_DENY_MODE_ENV_VALUE}
164
-
165
-
166
- def build_minimal_settings(entry_by_basename: dict[str, dict]) -> dict:
167
- """Assemble the minimal settings document from the resolved safety entries.
168
-
169
- ::
170
-
171
- resolved entries -> {"env": {deny-mode override},
172
- "hooks": {"PreToolUse": [required-matcher blocks]}}
173
-
174
- The ``env`` block runs the destructive gate in deny mode, so its block
175
- holds under ``--dangerously-skip-permissions``, where an ask decision is
176
- auto-resolved.
177
-
178
- Args:
179
- entry_by_basename: the resolved sub-hook entry per safety basename.
180
-
181
- Returns:
182
- The minimal settings document registering each safety entry on the
183
- matchers the sandbox requires, with the deny-mode env override.
184
- """
185
- return {
186
- ENV_KEY: _build_deny_mode_env_block(),
187
- HOOKS_KEY: {PRE_TOOL_USE_KEY: _build_pre_tool_use_blocks(entry_by_basename)},
188
- }
189
-
190
-
191
- def write_minimal_settings(minimal_settings: dict, out_path: Path) -> None:
192
- """Write the minimal settings document to the output path as pretty JSON."""
193
- serialized_settings = json.dumps(minimal_settings, indent=JSON_INDENT_SPACES)
194
- out_path.write_text(serialized_settings + "\n", encoding=TEXT_ENCODING_UTF8)
195
-
196
-
197
- def _parse_arguments(all_arguments: list[str] | None) -> argparse.Namespace:
198
- parser = argparse.ArgumentParser(description=__doc__)
199
- parser.add_argument("--out", required=True, help="where to write the settings")
200
- parser.add_argument(
201
- "--settings-source",
202
- default=DEFAULT_SETTINGS_SOURCE,
203
- help="the live settings JSON to resolve the safety hook commands from",
204
- )
205
- return parser.parse_args(all_arguments)
206
-
207
-
208
- def _load_settings_or_none(source_path: Path) -> dict | None:
209
- """Read and parse the settings source, logging and returning None on failure."""
210
- try:
211
- return read_settings_document(source_path)
212
- except (OSError, json.JSONDecodeError) as read_error:
213
- logger.error("cannot read settings source %s: %s", source_path, read_error)
214
- return None
215
-
216
-
217
- def main(all_arguments: list[str] | None = None) -> int:
218
- """Build the minimal safety settings and write them to the output path.
219
-
220
- Args:
221
- all_arguments: the command-line arguments, or None to read sys.argv.
222
-
223
- Returns:
224
- 0 after writing the settings, 2 when the source is unreadable, and 2
225
- when either safety hook is unresolved from the source.
226
- """
227
- logging.basicConfig(format=LOGGING_FORMAT)
228
- arguments = _parse_arguments(all_arguments)
229
- source_path = Path(arguments.settings_source).expanduser()
230
- settings_document = _load_settings_or_none(source_path)
231
- if settings_document is None:
232
- return SETTINGS_SOURCE_UNREADABLE_EXIT_CODE
233
- entry_by_basename = resolve_safety_hook_entries(settings_document)
234
- all_unresolved_basenames = find_unresolved_safety_hook_basenames(entry_by_basename)
235
- if all_unresolved_basenames:
236
- logger.error(
237
- "safety hook missing from settings source: %s",
238
- MISSING_BASENAMES_JOIN_SEPARATOR.join(all_unresolved_basenames),
239
- )
240
- return SETTINGS_MISSING_SAFETY_HOOK_EXIT_CODE
241
- minimal_settings = build_minimal_settings(entry_by_basename)
242
- out_path = Path(arguments.out).expanduser()
243
- write_minimal_settings(minimal_settings, out_path)
244
- sys.stdout.write(str(out_path) + "\n")
245
- return BUILD_SUCCESS_EXIT_CODE
246
-
247
-
248
- if __name__ == "__main__":
249
- raise SystemExit(main(sys.argv[1:]))
@@ -1,15 +0,0 @@
1
- """Put this worktree's prototype scripts directory on the import path.
2
-
3
- The scripts import their ``prototype_scripts_constants`` package by name.
4
- Inserting this directory lets the tests resolve that package and the
5
- script modules from the local worktree rather than an installed copy.
6
- """
7
-
8
- from __future__ import annotations
9
-
10
- import sys
11
- from pathlib import Path
12
-
13
- SCRIPTS_DIRECTORY = Path(__file__).resolve().parent
14
- if str(SCRIPTS_DIRECTORY) not in sys.path:
15
- sys.path.insert(0, str(SCRIPTS_DIRECTORY))
@@ -1,205 +0,0 @@
1
- #!/usr/bin/env python3
2
- """Launch the hookless ``claude -p --bare`` sandbox session in a worktree.
3
-
4
- ::
5
-
6
- python launch_sandbox.py --worktree ./wt --settings ./s.json --task-file ./t.txt
7
- {"worktree": "./wt", "settings": "./s.json", "exit_code": 0}
8
-
9
- The launcher validates the three paths, reads the proof-of-concept task from
10
- the task file, and runs a headless ``claude`` session in the worktree under
11
- the minimal safety settings. The session runs with the standards gates
12
- stripped, so the two safety hooks in the settings are its only containment.
13
- """
14
-
15
- from __future__ import annotations
16
-
17
- import argparse
18
- import json
19
- import logging
20
- import subprocess
21
- import sys
22
- from collections.abc import Callable
23
- from pathlib import Path
24
-
25
- from prototype_scripts_constants.config.launch_sandbox_constants import (
26
- BARE_FLAG,
27
- CLAUDE_EXECUTABLE_NAME,
28
- DEFAULT_TIMEOUT_SECONDS,
29
- LAUNCH_MISSING_PATH_EXIT_CODE,
30
- LAUNCH_TIMEOUT_EXIT_CODE,
31
- PROMPT_FLAG,
32
- SETTINGS_FLAG,
33
- SKIP_PERMISSIONS_FLAG,
34
- SUMMARY_KEY_EXIT_CODE,
35
- SUMMARY_KEY_SETTINGS,
36
- SUMMARY_KEY_WORKTREE,
37
- )
38
- from prototype_scripts_constants.config.prototype_common_constants import (
39
- LOGGING_FORMAT,
40
- TEXT_ENCODING_UTF8,
41
- )
42
-
43
- logger = logging.getLogger("launch_sandbox")
44
-
45
- SandboxCommandRunner = Callable[[list[str], Path, "int | None"], int]
46
-
47
-
48
- def build_sandbox_command(task_text: str, settings_path: Path) -> list[str]:
49
- """Build the exact headless ``claude`` argument vector for the sandbox.
50
-
51
- ::
52
-
53
- "build a spike", settings.json
54
- -> ["claude", "-p", "build a spike", "--bare",
55
- "--dangerously-skip-permissions", "--settings", "settings.json"]
56
-
57
- Args:
58
- task_text: the proof-of-concept task the session builds.
59
- settings_path: the minimal safety settings file.
60
-
61
- Returns:
62
- The ordered argument vector for the headless claude session.
63
- """
64
- return [
65
- CLAUDE_EXECUTABLE_NAME,
66
- PROMPT_FLAG,
67
- task_text,
68
- BARE_FLAG,
69
- SKIP_PERMISSIONS_FLAG,
70
- SETTINGS_FLAG,
71
- str(settings_path),
72
- ]
73
-
74
-
75
- def validate_sandbox_paths(
76
- worktree_path: Path, settings_path: Path, task_file_path: Path
77
- ) -> str | None:
78
- """Report the first path that does not fit the sandbox launch contract.
79
-
80
- Args:
81
- worktree_path: the isolated worktree the session runs in.
82
- settings_path: the minimal safety settings file.
83
- task_file_path: the file holding the proof-of-concept task text.
84
-
85
- Returns:
86
- An error message for the first path that is absent or the wrong
87
- kind, or None when the worktree is a directory and both files exist.
88
- """
89
- if not worktree_path.is_dir():
90
- return f"worktree is not a directory: {worktree_path}"
91
- if not settings_path.is_file():
92
- return f"settings file not found: {settings_path}"
93
- if not task_file_path.is_file():
94
- return f"task file not found: {task_file_path}"
95
- return None
96
-
97
-
98
- def _run_via_subprocess(
99
- all_command_tokens: list[str], working_directory: Path, timeout_seconds: int | None
100
- ) -> int:
101
- try:
102
- completed_process = subprocess.run(
103
- all_command_tokens,
104
- cwd=working_directory,
105
- timeout=timeout_seconds,
106
- check=False,
107
- )
108
- except subprocess.TimeoutExpired:
109
- logger.error(
110
- "sandbox session exceeded the %s-second wall-clock limit; terminated",
111
- timeout_seconds,
112
- )
113
- return LAUNCH_TIMEOUT_EXIT_CODE
114
- except OSError as launch_error:
115
- logger.error(
116
- "cannot launch the claude executable %s: %s",
117
- all_command_tokens[0],
118
- launch_error,
119
- )
120
- return LAUNCH_MISSING_PATH_EXIT_CODE
121
- return completed_process.returncode
122
-
123
-
124
- def run_sandbox(
125
- worktree_path: Path,
126
- settings_path: Path,
127
- task_text: str,
128
- timeout_seconds: int | None,
129
- command_runner: SandboxCommandRunner,
130
- ) -> int:
131
- """Run the headless sandbox command in the worktree and return its code.
132
-
133
- Args:
134
- worktree_path: the isolated worktree the session runs in.
135
- settings_path: the minimal safety settings file.
136
- task_text: the proof-of-concept task the session builds.
137
- timeout_seconds: the wall-clock limit, or None for no limit.
138
- command_runner: the callable that runs the command vector.
139
-
140
- Returns:
141
- The exit code the command runner reports for the session, which is
142
- the timeout exit code when the session outran its wall-clock limit.
143
- """
144
- sandbox_command = build_sandbox_command(task_text, settings_path)
145
- return command_runner(sandbox_command, worktree_path, timeout_seconds)
146
-
147
-
148
- def _emit_sandbox_summary(
149
- worktree_path: Path, settings_path: Path, exit_code: int
150
- ) -> None:
151
- summary = {
152
- SUMMARY_KEY_WORKTREE: str(worktree_path),
153
- SUMMARY_KEY_SETTINGS: str(settings_path),
154
- SUMMARY_KEY_EXIT_CODE: exit_code,
155
- }
156
- sys.stdout.write(json.dumps(summary) + "\n")
157
-
158
-
159
- def _parse_arguments(all_arguments: list[str] | None) -> argparse.Namespace:
160
- parser = argparse.ArgumentParser(description=__doc__)
161
- parser.add_argument("--worktree", required=True, help="the sandbox worktree")
162
- parser.add_argument("--settings", required=True, help="the safety settings file")
163
- parser.add_argument("--task-file", required=True, help="the task text file")
164
- parser.add_argument(
165
- "--timeout-seconds",
166
- type=int,
167
- default=DEFAULT_TIMEOUT_SECONDS,
168
- help="the wall-clock limit for the session",
169
- )
170
- return parser.parse_args(all_arguments)
171
-
172
-
173
- def main(all_arguments: list[str] | None = None) -> int:
174
- """Resolve and validate the paths, run the session, and print a summary.
175
-
176
- Args:
177
- all_arguments: the command-line arguments, or None to read sys.argv.
178
-
179
- Returns:
180
- The sandbox exit code, 2 when a required path is missing, or the
181
- timeout exit code when the session outran its wall-clock limit.
182
- """
183
- logging.basicConfig(format=LOGGING_FORMAT)
184
- arguments = _parse_arguments(all_arguments)
185
- worktree_path = Path(arguments.worktree).expanduser().resolve()
186
- settings_path = Path(arguments.settings).expanduser().resolve()
187
- task_file_path = Path(arguments.task_file).expanduser().resolve()
188
- path_error = validate_sandbox_paths(worktree_path, settings_path, task_file_path)
189
- if path_error is not None:
190
- logger.error("%s", path_error)
191
- return LAUNCH_MISSING_PATH_EXIT_CODE
192
- task_text = task_file_path.read_text(encoding=TEXT_ENCODING_UTF8)
193
- exit_code = run_sandbox(
194
- worktree_path,
195
- settings_path,
196
- task_text,
197
- arguments.timeout_seconds,
198
- _run_via_subprocess,
199
- )
200
- _emit_sandbox_summary(worktree_path, settings_path, exit_code)
201
- return exit_code
202
-
203
-
204
- if __name__ == "__main__":
205
- raise SystemExit(main(sys.argv[1:]))