clud 2.7.9__tar.gz → 2.8.2__tar.gz

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 (385) hide show
  1. {clud-2.7.9 → clud-2.8.2}/Cargo.lock +14 -5
  2. {clud-2.7.9 → clud-2.8.2}/Cargo.toml +1 -1
  3. clud-2.7.9/README.md → clud-2.8.2/PKG-INFO +63 -0
  4. clud-2.7.9/PKG-INFO → clud-2.8.2/README.md +37 -24
  5. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/Cargo.toml +8 -0
  6. clud-2.8.2/crates/clud-bin/assets/skills/clud-bosn/SKILL.md +83 -0
  7. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-extern-repos/SKILL.md +18 -0
  8. clud-2.8.2/crates/clud-bin/assets/skills/clud-os-debug/SKILL.md +152 -0
  9. clud-2.8.2/crates/clud-bin/assets/skills/clud-preloop/SKILL.md +85 -0
  10. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/docker/docker_recover.py +21 -1
  11. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/github/pr_merge_watch.py +210 -36
  12. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/hooks/uv_run_hook_guard.py +76 -8
  13. clud-2.8.2/crates/clud-bin/build.rs +67 -0
  14. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/README.md +132 -29
  15. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/args.rs +113 -1
  16. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/args_tests.rs +87 -0
  17. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/backend.rs +52 -21
  18. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/backend_bootstrap.rs +90 -0
  19. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/block_bad_cmd.rs +642 -60
  20. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/block_bad_cmd_cd.rs +157 -23
  21. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/block_bad_cmd_cd_tests.rs +290 -12
  22. clud-2.8.2/crates/clud-bin/src/block_bad_cmd_cwd_changed.rs +155 -0
  23. clud-2.8.2/crates/clud-bin/src/block_bad_cmd_cwd_changed_tests.rs +287 -0
  24. clud-2.8.2/crates/clud-bin/src/build_id.rs +200 -0
  25. clud-2.8.2/crates/clud-bin/src/build_id_tests.rs +127 -0
  26. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/clud_hooks.rs +198 -0
  27. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/clud_hooks_compile.rs +41 -2
  28. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/clud_hooks_compile_tests.rs +67 -19
  29. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/clud_hooks_run.rs +25 -2
  30. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/clud_hooks_tests.rs +186 -0
  31. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/clud_settings.rs +4 -4
  32. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/clud_settings_tests.rs +3 -3
  33. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_bridge.rs +534 -18
  34. clud-2.8.2/crates/clud-bin/src/codex_lf.rs +107 -0
  35. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_model.rs +6 -0
  36. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_translate.rs +15 -2
  37. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_upstream.rs +82 -17
  38. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/command/README.md +7 -2
  39. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/command/builder.rs +43 -44
  40. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/command/mod.rs +3 -2
  41. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/command/tests.rs +74 -66
  42. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/cpu_banner.rs +101 -15
  43. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/cpu_banner_tests.rs +58 -0
  44. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/crash_report.rs +143 -0
  45. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/README.md +3 -2
  46. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/client.rs +36 -7
  47. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/entry.rs +3 -0
  48. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/entry_tests.rs +4 -1
  49. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/gc_service/extern_repo.rs +334 -33
  50. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/gc_service/filesystem.rs +5 -0
  51. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/gc_service.rs +2 -0
  52. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/http/tests.rs +34 -15
  53. clud-2.8.2/crates/clud-bin/src/daemon/io_helpers.rs +695 -0
  54. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/mod.rs +5 -0
  55. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/server.rs +127 -7
  56. clud-2.8.2/crates/clud-bin/src/daemon/session_state_sweep.rs +211 -0
  57. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/session_tmp_sweep.rs +11 -0
  58. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/target_sweep.rs +2 -2
  59. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/types.rs +19 -1
  60. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/wire_prost/tests.rs +1 -0
  61. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/worker.rs +71 -8
  62. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/worker_tests.rs +68 -1
  63. clud-2.8.2/crates/clud-bin/src/extern_cli.rs +131 -0
  64. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/foreground_runtime.rs +37 -3
  65. clud-2.8.2/crates/clud-bin/src/gc/delete_audit.rs +192 -0
  66. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/gc/mod.rs +2 -0
  67. clud-2.8.2/crates/clud-bin/src/gc/session_state.rs +221 -0
  68. clud-2.8.2/crates/clud-bin/src/gc/session_state_tests.rs +254 -0
  69. clud-2.8.2/crates/clud-bin/src/gc/session_tmp.rs +869 -0
  70. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/gc/target_sweep.rs +122 -9
  71. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/gc/uv_cache.rs +20 -1
  72. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/grind.rs +12 -13
  73. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/hook_health/codex_trust.rs +38 -2
  74. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/hook_health/inspect.rs +42 -1
  75. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/hook_health/mod.rs +2 -2
  76. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/hook_health/prompts.rs +1 -0
  77. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/hook_health_tests.rs +40 -0
  78. clud-2.8.2/crates/clud-bin/src/hook_trust.rs +354 -0
  79. clud-2.8.2/crates/clud-bin/src/hook_trust_tests.rs +297 -0
  80. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/job_orphan_reaper.rs +116 -5
  81. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/launch_log.rs +65 -3
  82. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/launch_setup.rs +54 -8
  83. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/lib.rs +9 -0
  84. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/main.rs +104 -51
  85. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/orphan_reaper.rs +157 -15
  86. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/orphan_reaper_tests.rs +269 -0
  87. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/process_scan.rs +101 -0
  88. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/provider_auth.rs +71 -0
  89. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/provider_catalog.rs +60 -0
  90. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/runner.rs +64 -3
  91. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/runner_execution.rs +7 -3
  92. clud-2.8.2/crates/clud-bin/src/runner_exit.rs +40 -0
  93. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/session.rs +92 -8
  94. clud-2.8.2/crates/clud-bin/src/session_stdin.rs +133 -0
  95. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/session_tests.rs +79 -0
  96. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/settings_tui.rs +5 -4
  97. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/shell/mod.rs +1 -0
  98. clud-2.8.2/crates/clud-bin/src/shell/nounset.rs +183 -0
  99. clud-2.8.2/crates/clud-bin/src/shell/nounset_tests.rs +289 -0
  100. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/skills.rs +12 -0
  101. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/skills_tests.rs +195 -0
  102. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/soldr_activate.rs +68 -16
  103. clud-2.8.2/crates/clud-bin/src/stage_trace.rs +161 -0
  104. clud-2.8.2/crates/clud-bin/src/symbols.rs +1115 -0
  105. clud-2.8.2/crates/clud-bin/src/test_env.rs +31 -0
  106. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/trampoline.rs +9 -109
  107. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/trash.rs +4 -0
  108. clud-2.8.2/crates/clud-bin/src/workspace_trust.rs +189 -0
  109. clud-2.8.2/crates/clud-bin/src/workspace_trust_tests.rs +179 -0
  110. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/worktrees.rs +7 -0
  111. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/diagnostics/runtime_cache_hop_windows.rs +3 -2
  112. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/diagnostics/symbols.rs +51 -2
  113. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/pty/pty_pump.rs +72 -0
  114. clud-2.8.2/crates/clud-bin/tests/reaper/daemon_spawn_hygiene.rs +209 -0
  115. clud-2.8.2/crates/clud-bin/tests/reaper/fixture_ids.rs +65 -0
  116. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/reaper/main.rs +11 -0
  117. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/reaper/orphan_reap.rs +5 -0
  118. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/reaper/reaper_orphan_sweep_survival.rs +92 -42
  119. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/reaper/subprocess_capture_lifecycle_windows.rs +31 -4
  120. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/reaper/tool_shell_lifecycle_windows.rs +16 -3
  121. {clud-2.7.9 → clud-2.8.2}/pyproject.toml +38 -1
  122. {clud-2.7.9 → clud-2.8.2}/src/clud/__init__.py +1 -1
  123. clud-2.8.2/src/clud/mcp_server.py +926 -0
  124. clud-2.7.9/crates/clud-bin/build.rs +0 -29
  125. clud-2.7.9/crates/clud-bin/src/daemon/io_helpers.rs +0 -286
  126. clud-2.7.9/crates/clud-bin/src/gc/session_tmp.rs +0 -312
  127. clud-2.7.9/crates/clud-bin/src/runner_exit.rs +0 -10
  128. clud-2.7.9/crates/clud-bin/src/session_stdin.rs +0 -30
  129. clud-2.7.9/crates/clud-bin/src/symbols.rs +0 -308
  130. {clud-2.7.9 → clud-2.8.2}/LICENSE +0 -0
  131. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/LICENSE +0 -0
  132. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/README.md +0 -0
  133. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/README.md +0 -0
  134. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/dashboard/index.html +0 -0
  135. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/hero-clud.jpg +0 -0
  136. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/scripts/extract_zip.py +0 -0
  137. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/README.md +0 -0
  138. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-docker-linux-build/README.md +0 -0
  139. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-docker-linux-build/SKILL.md +0 -0
  140. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-docker-mac-x86/SKILL.md +0 -0
  141. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-docker-recover/SKILL.md +0 -0
  142. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-docker-rust-app-dev/README.md +0 -0
  143. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-docker-rust-app-dev/SKILL.md +0 -0
  144. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-fix-quick/SKILL.md +0 -0
  145. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-git/SKILL.md +0 -0
  146. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-git-diff/SKILL.md +0 -0
  147. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-improve/README.md +0 -0
  148. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-improve/SKILL.md +0 -0
  149. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-issue/README.md +0 -0
  150. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-issue/SKILL.md +0 -0
  151. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-issue-triage/README.md +0 -0
  152. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-issue-triage/SKILL.md +0 -0
  153. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-omarchy/SKILL.md +0 -0
  154. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-python-lint-deadcode/SKILL.md +0 -0
  155. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-review/SKILL.md +0 -0
  156. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-tag-release/README.md +0 -0
  157. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-tag-release/SKILL.md +0 -0
  158. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-windows-trash/README.md +0 -0
  159. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-windows-trash/SKILL.md +0 -0
  160. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/docker/README.md +0 -0
  161. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/docker/docker-build.py +0 -0
  162. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/docker/docker_build_cpp.py +0 -0
  163. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/docker/docker_build_python.py +0 -0
  164. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/docker/docker_build_soldr.py +0 -0
  165. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/git/clud-git-diff.py +0 -0
  166. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/hooks/block-bad-cmd.py +0 -0
  167. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/hooks/telemetry.py +0 -0
  168. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/python/lint_deadcode.py +0 -0
  169. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/args_tests/commands.rs +0 -0
  170. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/auth.rs +0 -0
  171. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/bin/clud_bench_proc_sampler.rs +0 -0
  172. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/bin/clud_block_bad_cmd.rs +0 -0
  173. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/bin/clud_cmd_scan.rs +0 -0
  174. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/bin/clud_ctrlc_probe.rs +0 -0
  175. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/bin/clud_shim.rs +0 -0
  176. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/block_bad_cmd_gate.rs +0 -0
  177. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/block_bad_cmd_io.rs +0 -0
  178. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/block_bad_cmd_rm_vars.rs +0 -0
  179. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/block_bad_cmd_rollout.rs +0 -0
  180. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/block_bad_cmd_shell.rs +0 -0
  181. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/bridge_log.rs +0 -0
  182. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/capture.rs +0 -0
  183. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/clud_hook_roots.rs +0 -0
  184. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/clud_hook_roots_tests.rs +0 -0
  185. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/clud_hooks_run_tests.rs +0 -0
  186. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/clud_settings_document.rs +0 -0
  187. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_auth.rs +0 -0
  188. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_history.rs +0 -0
  189. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_hook_normalize.rs +0 -0
  190. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_hook_normalize_tests.rs +0 -0
  191. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_pipeline.rs +0 -0
  192. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_sse.rs +0 -0
  193. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_sse_tests.rs +0 -0
  194. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_upstream_credentials.rs +0 -0
  195. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/command/do_input.rs +0 -0
  196. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/command/loop_task.rs +0 -0
  197. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/command/prompts.rs +0 -0
  198. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/command/tests/repeat_execution.rs +0 -0
  199. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/command/tests/repeat_parse.rs +0 -0
  200. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/command/tests/repeat_schedule.rs +0 -0
  201. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/command/types.rs +0 -0
  202. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/config.rs +0 -0
  203. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/console_input.rs +0 -0
  204. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/console_setup.rs +0 -0
  205. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/console_title.rs +0 -0
  206. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/console_title_osc.rs +0 -0
  207. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/ctrl_c_track.rs +0 -0
  208. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/ctrl_c_track_tests.rs +0 -0
  209. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/activity.rs +0 -0
  210. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/api_session_http.rs +0 -0
  211. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/api_session_lifecycle.rs +0 -0
  212. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/api_sessions.rs +0 -0
  213. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/api_turn_controller.rs +0 -0
  214. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/attach.rs +0 -0
  215. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/client_compat.rs +0 -0
  216. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/client_leases.rs +0 -0
  217. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/client_tests.rs +0 -0
  218. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/commands.rs +0 -0
  219. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/cpu_alert_publish.rs +0 -0
  220. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/daemon_events.rs +0 -0
  221. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/gc_service/list_state.rs +0 -0
  222. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/gc_service/tests/delete_and_pool.rs +0 -0
  223. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/gc_service/tests/parallel.rs +0 -0
  224. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/gc_service/tests/policy.rs +0 -0
  225. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/gc_service/tests.rs +0 -0
  226. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/gc_service_disk_watchdog.rs +0 -0
  227. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/gc_service_purge.rs +0 -0
  228. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/handover_registry.rs +0 -0
  229. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/headless_adapter.rs +0 -0
  230. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/http.rs +0 -0
  231. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/http_dashboard_state.rs +0 -0
  232. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/http_info.rs +0 -0
  233. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/http_response.rs +0 -0
  234. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/keys.rs +0 -0
  235. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/paths.rs +0 -0
  236. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/proc_sampler.rs +0 -0
  237. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/proc_sampler_tests.rs +0 -0
  238. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/process_utils.rs +0 -0
  239. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/rp_broker/endpoint.rs +0 -0
  240. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/rp_broker/errors.rs +0 -0
  241. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/rp_broker/frame_lane.rs +0 -0
  242. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/rp_broker/mod.rs +0 -0
  243. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/rp_broker/payload.rs +0 -0
  244. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/rp_broker/tests.rs +0 -0
  245. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/rp_broker/wire_mode.rs +0 -0
  246. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/runtime_config.rs +0 -0
  247. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/sessions.rs +0 -0
  248. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/top.rs +0 -0
  249. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/uv_cache_sweep.rs +0 -0
  250. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/watch_service.rs +0 -0
  251. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/wire_prost/daemon_msgs.rs +0 -0
  252. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/wire_prost/error.rs +0 -0
  253. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/wire_prost/frame.rs +0 -0
  254. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/wire_prost/mod.rs +0 -0
  255. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/wire_prost/session.rs +0 -0
  256. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/wire_prost/worker_msgs.rs +0 -0
  257. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/worker_shared.rs +0 -0
  258. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/dashboard_auth.rs +0 -0
  259. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/dnd/README.md +0 -0
  260. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/dnd/console_drop_target.rs +0 -0
  261. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/dnd/console_drop_target_tests.rs +0 -0
  262. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/dnd/dropfiles.rs +0 -0
  263. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/dnd/injectors.rs +0 -0
  264. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/dnd/mod.rs +0 -0
  265. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/extern_root.rs +0 -0
  266. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/extern_root_tests.rs +0 -0
  267. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/failover.rs +0 -0
  268. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/gc/cli.rs +0 -0
  269. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/gc/reconcile.rs +0 -0
  270. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/gc/registry.rs +0 -0
  271. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/gc/scanner.rs +0 -0
  272. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/gc_tests.rs +0 -0
  273. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/graphics.rs +0 -0
  274. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/harness_picker.rs +0 -0
  275. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/hook_health/repairs.rs +0 -0
  276. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/hook_health/types.rs +0 -0
  277. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/hook_health/utils.rs +0 -0
  278. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/hook_health/warnings.rs +0 -0
  279. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/large_file_guard/fallback_tests.rs +0 -0
  280. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/large_file_guard/index_pass.rs +0 -0
  281. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/large_file_guard/ls_files_pass.rs +0 -0
  282. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/large_file_guard.rs +0 -0
  283. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/log_event.rs +0 -0
  284. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/loop_artifacts.rs +0 -0
  285. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/loop_check.rs +0 -0
  286. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/loop_spec.rs +0 -0
  287. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/main_helpers.rs +0 -0
  288. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/optimize.rs +0 -0
  289. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/paste_image.rs +0 -0
  290. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/path_norm.rs +0 -0
  291. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/preference.rs +0 -0
  292. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/process_identity.rs +0 -0
  293. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/process_tree.rs +0 -0
  294. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/provider_registry.rs +0 -0
  295. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/reap_log.rs +0 -0
  296. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/reaper_facts.rs +0 -0
  297. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/repo_clud_config.rs +0 -0
  298. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/repo_clud_config_tests.rs +0 -0
  299. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/route_health.rs +0 -0
  300. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/runner_terminal.rs +0 -0
  301. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/runtime_cache.rs +0 -0
  302. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/session/bracketed_paste.rs +0 -0
  303. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/session/interrupt.rs +0 -0
  304. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/session_index.rs +0 -0
  305. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/session_output.rs +0 -0
  306. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/session_registry.rs +0 -0
  307. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/session_registry_tests.rs +0 -0
  308. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/shell/README.md +0 -0
  309. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/shell/completion_guard.rs +0 -0
  310. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/shell/git_bash_resolver.rs +0 -0
  311. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/shim_install.rs +0 -0
  312. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/shim_resolve.rs +0 -0
  313. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/shim_session.rs +0 -0
  314. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/shim_uv.rs +0 -0
  315. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/skills_home.rs +0 -0
  316. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/startup.rs +0 -0
  317. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/stream_json.rs +0 -0
  318. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/subprocess.rs +0 -0
  319. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/test_runtime/README.md +0 -0
  320. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/test_runtime/cli.rs +0 -0
  321. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/test_runtime/mod.rs +0 -0
  322. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/test_runtime/store.rs +0 -0
  323. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_cli.rs +0 -0
  324. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_info.rs +0 -0
  325. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_install.rs +0 -0
  326. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_ledger.rs +0 -0
  327. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_list.rs +0 -0
  328. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_log.rs +0 -0
  329. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_query.rs +0 -0
  330. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_run.rs +0 -0
  331. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_run_telemetry.rs +0 -0
  332. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_run_tests.rs +0 -0
  333. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_tee.rs +0 -0
  334. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_termination.rs +0 -0
  335. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_watchdog.rs +0 -0
  336. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tools.rs +0 -0
  337. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/ui.rs +0 -0
  338. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/uv_run_hook_guard.rs +0 -0
  339. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/verbose_log.rs +0 -0
  340. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/voice/README.md +0 -0
  341. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/voice/audio.rs +0 -0
  342. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/voice/config.rs +0 -0
  343. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/voice/cues.rs +0 -0
  344. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/voice/linux_capture.rs +0 -0
  345. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/voice/mod.rs +0 -0
  346. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/voice/mode.rs +0 -0
  347. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/voice/model.rs +0 -0
  348. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/voice/recording.rs +0 -0
  349. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/voice/worker.rs +0 -0
  350. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/wasm.rs +0 -0
  351. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/webterm.rs +0 -0
  352. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/wedge_watchdog.rs +0 -0
  353. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/wedge_watchdog_gate_tests.rs +0 -0
  354. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/wedge_watchdog_tests.rs +0 -0
  355. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/win_creation_flags.rs +0 -0
  356. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/worktrees_duration.rs +0 -0
  357. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/worktrees_format.rs +0 -0
  358. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/worktrees_locked_age.rs +0 -0
  359. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/worktrees_tests.rs +0 -0
  360. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/README.md +0 -0
  361. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/api/api_session_lifecycle.rs +0 -0
  362. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/api/api_turn_controller.rs +0 -0
  363. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/api/main.rs +0 -0
  364. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/cli/codex_bridge_preflight_cli.rs +0 -0
  365. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/cli/main.rs +0 -0
  366. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/cli/provider_selection_cli.rs +0 -0
  367. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/cli/shell_completion_guard.rs +0 -0
  368. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/common/exe.rs +0 -0
  369. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/common/mod.rs +0 -0
  370. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/diagnostics/crash_report.rs +0 -0
  371. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/diagnostics/main.rs +0 -0
  372. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/diagnostics/telemetry_endpoint.rs +0 -0
  373. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/diagnostics/tier_refresh_probe.rs +0 -0
  374. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/diagnostics/win32_hooking_probe.rs +0 -0
  375. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/pty/main.rs +0 -0
  376. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/pty/pty_behavior.rs +0 -0
  377. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/pty/shift_enter_dual_reader.rs +0 -0
  378. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/pty/utf8_codepage.rs +0 -0
  379. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/reaper/reaper_batch_drain_windows.rs +0 -0
  380. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/reaper/reaper_daemon_survival_windows.rs +0 -0
  381. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/reaper/wedge_watchdog_e2e.rs +0 -0
  382. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/signals/ctrlc_signal_kinds.rs +0 -0
  383. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/signals/ctrlc_windows_events.rs +0 -0
  384. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/signals/main.rs +0 -0
  385. {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/vendor/win32/git-bash-bin.toml +0 -0
@@ -574,7 +574,7 @@ dependencies = [
574
574
 
575
575
  [[package]]
576
576
  name = "clud"
577
- version = "2.7.9"
577
+ version = "2.8.2"
578
578
  dependencies = [
579
579
  "arboard",
580
580
  "base64",
@@ -584,6 +584,7 @@ dependencies = [
584
584
  "crossterm",
585
585
  "ctrlc",
586
586
  "dirs 5.0.1",
587
+ "filetime",
587
588
  "fs4",
588
589
  "getrandom 0.4.2",
589
590
  "gix-hash",
@@ -866,7 +867,7 @@ dependencies = [
866
867
 
867
868
  [[package]]
868
869
  name = "daemon-stub"
869
- version = "2.7.9"
870
+ version = "2.8.2"
870
871
  dependencies = [
871
872
  "libc",
872
873
  "running-process",
@@ -2335,7 +2336,7 @@ dependencies = [
2335
2336
 
2336
2337
  [[package]]
2337
2338
  name = "mock-agent"
2338
- version = "2.7.9"
2339
+ version = "2.8.2"
2339
2340
  dependencies = [
2340
2341
  "libc",
2341
2342
  "serde_json",
@@ -2953,11 +2954,11 @@ dependencies = [
2953
2954
 
2954
2955
  [[package]]
2955
2956
  name = "probe-dll"
2956
- version = "2.7.9"
2957
+ version = "2.8.2"
2957
2958
 
2958
2959
  [[package]]
2959
2960
  name = "probe-target"
2960
- version = "2.7.9"
2961
+ version = "2.8.2"
2961
2962
 
2962
2963
  [[package]]
2963
2964
  name = "proc-macro-crate"
@@ -3805,6 +3806,14 @@ version = "1.0.1"
3805
3806
  source = "registry+https://github.com/rust-lang/crates.io-index"
3806
3807
  checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
3807
3808
 
3809
+ [[package]]
3810
+ name = "tap-gate"
3811
+ version = "2.8.2"
3812
+ dependencies = [
3813
+ "running-process",
3814
+ "tempfile",
3815
+ ]
3816
+
3808
3817
  [[package]]
3809
3818
  name = "tempfile"
3810
3819
  version = "3.27.0"
@@ -13,7 +13,7 @@ exclude = [
13
13
  libraries = [{ path = "dylints/*" }]
14
14
 
15
15
  [workspace.package]
16
- version = "2.7.9"
16
+ version = "2.8.2"
17
17
  edition = "2021"
18
18
  rust-version = "1.85"
19
19
  license-file = "LICENSE"
@@ -1,3 +1,28 @@
1
+ Metadata-Version: 2.4
2
+ Name: clud
3
+ Version: 2.8.2
4
+ Classifier: Development Status :: 4 - Beta
5
+ Classifier: Environment :: Console
6
+ Classifier: Intended Audience :: Developers
7
+ Classifier: License :: Other/Proprietary License
8
+ Classifier: Operating System :: OS Independent
9
+ Classifier: Programming Language :: Rust
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: Topic :: Software Development :: Build Tools
12
+ Requires-Dist: mcp>=2.1 ; extra == 'mcp'
13
+ Provides-Extra: mcp
14
+ License-File: LICENSE
15
+ Summary: Fast Rust CLI for running Claude Code and Codex in YOLO mode
16
+ Keywords: claude,codex,cli,ai,agent
17
+ Home-Page: https://github.com/zackees/clud
18
+ Author: Zach Vorhies
19
+ License: Clud Proprietary License
20
+ Requires-Python: >=3.10
21
+ Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
22
+ Project-URL: Homepage, https://github.com/zackees/clud
23
+ Project-URL: Issues, https://github.com/zackees/clud/issues
24
+ Project-URL: Repository, https://github.com/zackees/clud
25
+
1
26
  # clud
2
27
 
3
28
  ![hero-clud](https://github.com/user-attachments/assets/4009dfee-e703-446d-b073-80d826708a10)
@@ -21,6 +46,13 @@ The name `clud` is simply a shorter, easier-to-type version of `claude`.
21
46
 
22
47
  `clud grind`
23
48
 
49
+ `grind` opens one normal interactive PTY session and seeds its
50
+ prompt with the harness-native `/loop` instruction. The harness owns all
51
+ repetition; clud must not relaunch the agent, impose an iteration ceiling, or
52
+ use DONE/BLOCKED marker files for `grind`. See the
53
+ [grind contract](docs/architecture/grind.md). It requires the Claude harness;
54
+ for another model provider, use `--harness claude`.
55
+
24
56
  [![CI](https://github.com/zackees/clud/actions/workflows/ci.yml/badge.svg)](https://github.com/zackees/clud/actions/workflows/ci.yml)
25
57
  [![Auto Release](https://github.com/zackees/clud/actions/workflows/auto-release.yml/badge.svg)](https://github.com/zackees/clud/actions/workflows/auto-release.yml)
26
58
 
@@ -59,6 +91,7 @@ clud # Launch Claude in YOLO mode via subprocess
59
91
  clud --codex # Use Codex as the backend
60
92
  clud --claude # Use Claude as the backend (default)
61
93
  clud --deepseek # Use DeepSeek through the Claude harness
94
+ clud --deepseek sk-... # Same, storing that API key in the native credential vault first
62
95
  clud --kimi # Use Kimi through the Claude harness
63
96
  clud --openrouter # Use Claude through OpenRouter
64
97
  clud --pty # Force PTY launch mode
@@ -504,6 +537,35 @@ which looks like it does this but does not: that flag exits 0 with empty output
504
537
  outside a submodule, so the `||` fallback never runs and `cd ""` silently does
505
538
  nothing.
506
539
 
540
+ ### Stop a subagent from spawning more agents
541
+
542
+ One request can become hundreds of agents when a subagent delegates again: a
543
+ deep-research run created 101 agents before it was stopped, and an upstream
544
+ `/code-review` created 877 descendants *despite* a five-level nesting ceiling.
545
+ A depth ceiling does not help, because fan-out at every level is what makes the
546
+ total exponential.
547
+
548
+ `clud-cmd-scan` can refuse the second level outright. With the guard on, the
549
+ primary session may still create subagents, but a subagent's own `Agent` or
550
+ `Workflow` call is denied before the descendant is allocated:
551
+
552
+ ```bash
553
+ export CLUD_BLOCK_RECURSIVE_AGENTS=1
554
+ ```
555
+
556
+ The denial is tagged `clud_agent_depth_exceeded` and tells the agent to do the
557
+ work itself or hand it back to the session that started it. The guard is off by
558
+ default — refusing agent creation changes what an agent may do, and a wrong
559
+ default would break legitimate orchestration silently.
560
+
561
+ Two things to know:
562
+
563
+ - The hook must be registered with `"matcher": "*"` (the config above), not
564
+ `"Bash"`. A `Bash`-only matcher never sees an `Agent` call.
565
+ - Only tool-visible creation is covered. The `agent()` calls a workflow script
566
+ makes internally emit no blocking hook event, so they remain uncontrolled
567
+ (anthropics/claude-code#79953 tracks the upstream gap).
568
+
507
569
  ### Let clud run your project's hooks
508
570
 
509
571
  Project hooks are usually written as repo-relative script paths, which is why a
@@ -795,3 +857,4 @@ organizations under 6 people, with lifetime grandfathering for organizations
795
857
  that qualified before growing beyond that size. Larger organizations need a
796
858
  commercial license unless they have a grandfathered or contributor-granted free
797
859
  license. See [LICENSE](LICENSE) for the full terms.
860
+
@@ -1,26 +1,3 @@
1
- Metadata-Version: 2.4
2
- Name: clud
3
- Version: 2.7.9
4
- Classifier: Development Status :: 4 - Beta
5
- Classifier: Environment :: Console
6
- Classifier: Intended Audience :: Developers
7
- Classifier: License :: Other/Proprietary License
8
- Classifier: Operating System :: OS Independent
9
- Classifier: Programming Language :: Rust
10
- Classifier: Programming Language :: Python :: 3
11
- Classifier: Topic :: Software Development :: Build Tools
12
- License-File: LICENSE
13
- Summary: Fast Rust CLI for running Claude Code and Codex in YOLO mode
14
- Keywords: claude,codex,cli,ai,agent
15
- Home-Page: https://github.com/zackees/clud
16
- Author: Zach Vorhies
17
- License: Clud Proprietary License
18
- Requires-Python: >=3.10
19
- Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
20
- Project-URL: Homepage, https://github.com/zackees/clud
21
- Project-URL: Issues, https://github.com/zackees/clud/issues
22
- Project-URL: Repository, https://github.com/zackees/clud
23
-
24
1
  # clud
25
2
 
26
3
  ![hero-clud](https://github.com/user-attachments/assets/4009dfee-e703-446d-b073-80d826708a10)
@@ -44,6 +21,13 @@ The name `clud` is simply a shorter, easier-to-type version of `claude`.
44
21
 
45
22
  `clud grind`
46
23
 
24
+ `grind` opens one normal interactive PTY session and seeds its
25
+ prompt with the harness-native `/loop` instruction. The harness owns all
26
+ repetition; clud must not relaunch the agent, impose an iteration ceiling, or
27
+ use DONE/BLOCKED marker files for `grind`. See the
28
+ [grind contract](docs/architecture/grind.md). It requires the Claude harness;
29
+ for another model provider, use `--harness claude`.
30
+
47
31
  [![CI](https://github.com/zackees/clud/actions/workflows/ci.yml/badge.svg)](https://github.com/zackees/clud/actions/workflows/ci.yml)
48
32
  [![Auto Release](https://github.com/zackees/clud/actions/workflows/auto-release.yml/badge.svg)](https://github.com/zackees/clud/actions/workflows/auto-release.yml)
49
33
 
@@ -82,6 +66,7 @@ clud # Launch Claude in YOLO mode via subprocess
82
66
  clud --codex # Use Codex as the backend
83
67
  clud --claude # Use Claude as the backend (default)
84
68
  clud --deepseek # Use DeepSeek through the Claude harness
69
+ clud --deepseek sk-... # Same, storing that API key in the native credential vault first
85
70
  clud --kimi # Use Kimi through the Claude harness
86
71
  clud --openrouter # Use Claude through OpenRouter
87
72
  clud --pty # Force PTY launch mode
@@ -527,6 +512,35 @@ which looks like it does this but does not: that flag exits 0 with empty output
527
512
  outside a submodule, so the `||` fallback never runs and `cd ""` silently does
528
513
  nothing.
529
514
 
515
+ ### Stop a subagent from spawning more agents
516
+
517
+ One request can become hundreds of agents when a subagent delegates again: a
518
+ deep-research run created 101 agents before it was stopped, and an upstream
519
+ `/code-review` created 877 descendants *despite* a five-level nesting ceiling.
520
+ A depth ceiling does not help, because fan-out at every level is what makes the
521
+ total exponential.
522
+
523
+ `clud-cmd-scan` can refuse the second level outright. With the guard on, the
524
+ primary session may still create subagents, but a subagent's own `Agent` or
525
+ `Workflow` call is denied before the descendant is allocated:
526
+
527
+ ```bash
528
+ export CLUD_BLOCK_RECURSIVE_AGENTS=1
529
+ ```
530
+
531
+ The denial is tagged `clud_agent_depth_exceeded` and tells the agent to do the
532
+ work itself or hand it back to the session that started it. The guard is off by
533
+ default — refusing agent creation changes what an agent may do, and a wrong
534
+ default would break legitimate orchestration silently.
535
+
536
+ Two things to know:
537
+
538
+ - The hook must be registered with `"matcher": "*"` (the config above), not
539
+ `"Bash"`. A `Bash`-only matcher never sees an `Agent` call.
540
+ - Only tool-visible creation is covered. The `agent()` calls a workflow script
541
+ makes internally emit no blocking hook event, so they remain uncontrolled
542
+ (anthropics/claude-code#79953 tracks the upstream gap).
543
+
530
544
  ### Let clud run your project's hooks
531
545
 
532
546
  Project hooks are usually written as repo-relative script paths, which is why a
@@ -818,4 +832,3 @@ organizations under 6 people, with lifetime grandfathering for organizations
818
832
  that qualified before growing beyond that size. Larger organizations need a
819
833
  commercial license unless they have a grandfathered or contributor-granted free
820
834
  license. See [LICENSE](LICENSE) for the full terms.
821
-
@@ -118,6 +118,14 @@ tempfile = "3"
118
118
 
119
119
  [dev-dependencies]
120
120
  serde_yaml = "0.9"
121
+ # #1148: the nested-sweep tests need a *mixed-age* tree — a stale session
122
+ # directory beneath a fresh parent — which is the exact shape the bug lives
123
+ # in. The existing idiom in `gc::session_tmp` shifts the test's notion of
124
+ # "now" into the future, which ages every entry uniformly and so cannot
125
+ # express that shape. Setting mtimes directly can; `std::fs::File` cannot
126
+ # open a directory on Windows, so this does it portably. Already in the
127
+ # lockfile via `notify`/`gix-index`, so it is not new to the build.
128
+ filetime = "0.2"
121
129
  # #436: the `RUNNING_PROCESS_FAKE_BACKEND` seam that
122
130
  # `fake_backend_seam_overrides_cached_endpoint` exercises lives behind
123
131
  # running-process's off-by-default `test-seams` feature (upstream #433 R4).
@@ -0,0 +1,83 @@
1
+ ---
2
+ name: clud-bosn
3
+ description: Run repeated local Docker builds under bosn so the loop stops filling the disk.
4
+ triggers:
5
+ - When iterating locally on a Dockerfile or compose stack in this repo
6
+ - When repeated docker builds are filling the disk or a prune is being considered
7
+ - When the user mentions bosn
8
+ ---
9
+ <!-- managed-by: clud -->
10
+
11
+ # clud-bosn
12
+
13
+ [bosn](https://github.com/zackees/bosn) owns the containers, volumes, and images a
14
+ local build loop creates: every resource is labeled with who made it and what it was
15
+ built from, and whether anything still needs it is a lease in bosn's registry rather
16
+ than a guess. Storage is bounded by ceilings with eviction, so the loop stops growing
17
+ without anyone running a prune.
18
+
19
+ Use it for **the agent's own build loop**. The problem it solves is running the same
20
+ containerized build hundreds of times, where Docker keeps every image and volume it
21
+ was told to make and has no notion of "this one is finished". The reflex it replaces
22
+ is `docker system prune`, which also destroys the warm cache you wanted to keep.
23
+
24
+ ## Code Change Rule
25
+
26
+ If the work this loop is iterating on is a bug fix or feature implementation, use
27
+ RED -> GREEN: write or identify the focused failing test first, run it under the
28
+ containerized loop to see it fail, implement the scoped change, and rerun it to pass.
29
+ A faster build loop is only worth having if it is still answering a real question.
30
+
31
+ ## Do not use this when
32
+
33
+ - Editing a `Dockerfile` or compose file that **ships** — production images, or a file
34
+ written for someone else to run. The subject being Docker is not the trigger; local
35
+ iteration is.
36
+ - Debugging a registry push, or anything about images leaving this machine.
37
+ - The user asked a Docker question and is not building anything.
38
+
39
+ A skill that fires on every mention of Docker becomes noise, and noise gets ignored.
40
+
41
+ ## Before committing the agent to this path
42
+
43
+ 1. `command -v bosn` — if absent, say so and stop. Install is
44
+ `uv tool install git+https://github.com/zackees/bosn` (Python 3.11+; puts `bosn`
45
+ and `bosn-docker` on PATH). Do not install it without being asked.
46
+ 2. `docker info` must succeed — bosn manages a real engine, it does not replace one.
47
+ 3. **WSL is refused outright**: `bosn` exits non-zero inside WSL, because its Windows
48
+ loopback daemon is unreachable from there. Use a native Windows shell, macOS, or
49
+ Linux. (`bosn-docker` does not yet refuse it, so a WSL failure can surface later
50
+ and less clearly.)
51
+ 4. bosn is manifest-driven: it needs a `bosn.toml` at the repo root declaring stacks,
52
+ volumes, and tasks. Without one there is nothing for it to converge, and writing
53
+ one is a change to the repo — propose it, do not add it silently.
54
+
55
+ ## The loop
56
+
57
+ ```bash
58
+ bosn ensure # converge and register without running anything (pre-warm)
59
+ bosn unit # run the task named in bosn.toml
60
+ bosn status --json # bounded daemon/registry state
61
+ bosn gc --dry-run --json # what retention would remove, before it removes it
62
+ ```
63
+
64
+ Existing unmanaged volumes can be imported rather than recreated:
65
+ `bosn adopt --legacy clud` plans and reports, `--yes` applies.
66
+
67
+ ## What it does not cover
68
+
69
+ Read this before promising a drop-in replacement:
70
+
71
+ - The Docker front door is **partial** — `bosn init` and
72
+ `bosn-docker compose {up,down,logs,ps}` over a small compose subset only.
73
+ `bosn-docker compose up -d` is rejected outright, not ignored.
74
+ - **No `docker` / `docker-compose` shims and no podman.** Arbitrary docker commands
75
+ are not routed through bosn; only what is listed above is.
76
+ - **BuildKit's own layer cache is outside the label contract.** bosn manages
77
+ containers, volumes, and images and never prunes the builder, so builder growth is
78
+ still yours to watch.
79
+ - `docker compose up` maps to `bosn-docker compose up`, which labels and tracks the
80
+ service *containers*; volumes created that way are not tracked.
81
+
82
+ When the work needs something in that list, say so and use Docker directly rather
83
+ than bending the task to fit the tool.
@@ -33,6 +33,24 @@ You do not need to add an ignore entry for it, and you should not: it is outside
33
33
 
34
34
  Checkouts still under the older `<repo>/.extern-repos/` location keep working and are still tracked, but put new ones beside the repo.
35
35
 
36
+ A dependent checkout is a **complete project**, so parent-repo tooling that
37
+ discovers projects by walking up from `$PWD` will find it and bind to it. That
38
+ is not hypothetical: in #972 a Stop hook installed in the parent repo resolved
39
+ its root that way, landed in the dependent checkout, and ran *that* project's
40
+ hook through `uv run` — turning a "quick lint" into a full native build of a
41
+ Rust-backed dependency. Two fires cost ~600s and ~400s, and the second died
42
+ with a build-backend error that named no hook at all.
43
+
44
+ Two rules follow, and they apply wherever the checkout lives:
45
+
46
+ - **Anchor hooks to the session project root**, not `$PWD`. Claude Code passes
47
+ it in the hook payload (`cwd`), and the settings live in that repo anyway. A
48
+ hook installed in repo A should never execute repo B's hook.
49
+ - **Never let a hook trigger a project sync**: use `uv run --no-project` (or
50
+ `--frozen`). A hook may lint; it may not compile a dependency from source.
51
+ clud's `uv_run_hook_guard` warns about the bare form, and since #972 it looks
52
+ at `Stop` hooks and at dependent checkouts in both locations.
53
+
36
54
  Create feature branches in the dependent repo using the `feat/<short-name>` convention.
37
55
 
38
56
  ## Coordination
@@ -0,0 +1,152 @@
1
+ ---
2
+ name: clud-os-debug
3
+ description: Diagnose a live crash, hang, or CPU burn on Windows, macOS, or Linux with the OS's own debugger and sampling profiler.
4
+ triggers:
5
+ - When a process is hung, spinning, or crashing and the cause is not in a log
6
+ - When the user asks why something is using CPU, or asks for a stack dump or profile
7
+ - When a crash report exists but the question is what the process is doing *now*
8
+ ---
9
+ <!-- managed-by: clud -->
10
+
11
+ # clud-os-debug
12
+
13
+ `clud symbols` and the crash reporter answer "what did it do before it died". This
14
+ skill answers "what is it doing right now" — a live stack, an attached debugger, or a
15
+ sampled CPU profile, using the tools the OS already ships.
16
+
17
+ ## Code Change Rule
18
+
19
+ A diagnosis is not a fix. When this investigation turns into a bug fix, switch to
20
+ RED -> GREEN: turn what you observed into a focused failing test first — the stack
21
+ you captured names the function, the profile names the hot path — run it to see it
22
+ fail, make the scoped change, and rerun it to pass. A profile that leads straight to
23
+ an edit leaves nothing behind to stop the same regression returning.
24
+
25
+ ## Pick the right instrument first
26
+
27
+ These three get confused constantly, and reaching for the wrong one wastes the
28
+ reproduction you may not get again:
29
+
30
+ | You want to know | Use | Cost |
31
+ |---|---|---|
32
+ | Where is it stuck *right now* | **Live stack dump** — one sample of every thread | Milliseconds; process pauses briefly |
33
+ | Why does this state happen | **Debugger attach** — breakpoints, memory, stepping | Process stops until you detach |
34
+ | What is eating the CPU | **Sampled profile** — periodic stacks over a window | Seconds to minutes; process keeps running |
35
+
36
+ A hang wants a stack dump. A crash wants the debugger (or the existing crash report).
37
+ CPU burn wants a profile — a single stack of a busy process tells you almost nothing,
38
+ because you sampled one arbitrary instant.
39
+
40
+ ## Before you attach to anything
41
+
42
+ 1. **Get the PID and confirm it is the right one.** `pgrep -af <name>` /
43
+ `Get-Process <name>`. Attaching to the wrong PID of a multi-process app (browsers,
44
+ Electron, anything with a helper tree) is the most common wasted attempt.
45
+ 2. **A stopped process is a stopped service.** Attaching a debugger *suspends the
46
+ target*. On anything shared or user-facing, prefer a stack dump or a sampled
47
+ profile, which do not.
48
+ 3. **Elevation is the user's call, not yours.** Where a step needs sudo, UAC, or a
49
+ `ptrace_scope` change, say which step needs it and why, run the OS's normal consent
50
+ mechanism, and stop if the user declines. Never weaken a system policy to make a
51
+ diagnosis convenient — `ptrace_scope`, SIP, and UAC exist to stop exactly what you
52
+ are about to do, and turning them off outlives your investigation.
53
+
54
+ ## Linux
55
+
56
+ **Live stack of a running process** — no install, no elevation on your own processes:
57
+
58
+ ```bash
59
+ gdb -p <pid> -batch -ex "thread apply all bt" # every thread
60
+ eu-stack -p <pid> # elfutils, lighter
61
+ cat /proc/<pid>/stack # kernel-side only
62
+ ```
63
+
64
+ **Sampled CPU profile:**
65
+
66
+ ```bash
67
+ perf record -F 99 -g -p <pid> -- sleep 20
68
+ perf report --stdio # or: perf script | stackcollapse-perf.pl | flamegraph.pl
69
+ ```
70
+
71
+ **What blocks it, and the exact prerequisite:**
72
+
73
+ - `ptrace: Operation not permitted` attaching to *your own* process →
74
+ `/proc/sys/kernel/yama/ptrace_scope` is `1`. The scoped fix is to run the debugger
75
+ under `sudo`, **not** to set the sysctl to `0` machine-wide.
76
+ - `perf` returning no samples → `/proc/sys/kernel/perf_event_paranoid`. Report the
77
+ value and what it permits; changing it is a system-policy decision.
78
+ - Missing symbols → install the distro's `-dbg`/`-debuginfo` package for that binary.
79
+
80
+ **Syscall-level**: `strace -f -p <pid>` for a hang that is blocked in the kernel;
81
+ `ltrace` for library calls. Both slow the target materially — bound the window.
82
+
83
+ ## macOS
84
+
85
+ ```bash
86
+ sample <pid> 10 -f /tmp/sample.txt # sampled profile, no elevation for your own procs
87
+ spindump <pid> 10 # system-wide, needs sudo, best for beachballs
88
+ lldb -p <pid> # attach
89
+ xcrun xctrace record --template 'Time Profiler' --attach <pid>
90
+ ```
91
+
92
+ - `sample` is the first thing to run for a spinning process. It is non-invasive and
93
+ usually enough.
94
+ - Attaching to a process you do not own, or one that is SIP-protected, will fail;
95
+ that is the boundary working. Report it rather than looking for a way around.
96
+ - Hardened-runtime apps reject debuggers unless built with
97
+ `com.apple.security.get-task-allow`. For a third-party app, this is a dead end —
98
+ say so.
99
+
100
+ ## Windows
101
+
102
+ ```powershell
103
+ Get-Process <name> | Select Id,ProcessName,CPU
104
+ ```
105
+
106
+ **Live stack / crash dump** — inbox, no install:
107
+
108
+ ```powershell
109
+ # Full user-mode dump; open in WinDbg or Visual Studio
110
+ Get-Process <name> | ForEach-Object {
111
+ & "$env:SystemRoot\System32\rundll32.exe" `
112
+ "$env:SystemRoot\System32\comsvcs.dll",MiniDump $_.Id C:\temp\dump.dmp full
113
+ }
114
+ ```
115
+
116
+ `procdump -ma <pid> C:\temp\dump.dmp` (Sysinternals) is friendlier if present.
117
+
118
+ **Sampled CPU profile** — WPR is inbox on Windows 10/11:
119
+
120
+ ```powershell
121
+ wpr -start CPU -filemode
122
+ # ... reproduce for a bounded window ...
123
+ wpr -stop C:\temp\trace.etl
124
+ ```
125
+
126
+ - `wpr` requires an elevated shell. Ask once, through UAC, and explain that the trace
127
+ is machine-wide for the capture window.
128
+ - **If WPA (the analysis GUI) is missing**, that is the Windows Performance Toolkit,
129
+ an ADK component. Installing it is a privileged, machine-wide change: propose it,
130
+ let the user run the installer, and do not launch an installer unattended. The
131
+ `.etl` is still captured and analysable elsewhere without it.
132
+ - Keep the capture bounded. A `CPU` profile writes hundreds of MB per minute.
133
+
134
+ ## Reporting
135
+
136
+ Whatever you capture, report: the **artifact path**, the **exact command**, the
137
+ **PIDs** it covers, and the **window** it spans. A profile with no window and a stack
138
+ with no PID are both unfalsifiable later.
139
+
140
+ State plainly which of the three instruments you used. "I profiled it" when you took
141
+ one stack dump is the error this skill exists to prevent.
142
+
143
+ ## What this skill does not do
144
+
145
+ - **It installs nothing.** Every command above is either inbox or a package the user
146
+ already has. Where a tool is missing, name the tool and let the user install it.
147
+ - **It does not elevate on its own**, change `ptrace_scope`, disable SIP, or work
148
+ around a hardened runtime. Each of those is the OS refusing on purpose.
149
+ - **It is not a substitute for the crash report.** For a process that already died,
150
+ `clud symbols` and `~/.clud/state/crashes/` are the right starting point.
151
+ - **Automated, checksum-verified tool acquisition** (#563's second half) is not here;
152
+ bundled skills ship as documentation only.
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: clud-preloop
3
+ description: Run a GitHub Actions workflow locally with preloop before pushing a branch to find out whether CI passes.
4
+ triggers:
5
+ - When about to push a branch mainly to see whether CI passes
6
+ - When the user asks to run a GitHub Actions workflow locally
7
+ - When a workflow failed remotely and the fix needs more than one attempt
8
+ - When the user mentions preloop
9
+ ---
10
+ <!-- managed-by: clud -->
11
+
12
+ # clud-preloop
13
+
14
+ [preloop](https://github.com/preloopdev/preloop) runs `.github/workflows` locally on
15
+ hardware-isolated microVMs, speaking the official `actions/runner` protocol rather
16
+ than approximating it. `${{ }}` expressions, matrix builds, reusable workflows and
17
+ concurrency groups work as they do on GitHub, and it can run against **uncommitted
18
+ changes** — including untracked and gitignored files.
19
+
20
+ The valuable trigger is the one nobody says out loud: *"I'll push and see if CI goes
21
+ green."* That is a decision to spend a full remote matrix on a question a local run
22
+ answers. Cross-platform failures — a path literal that is absolute on one OS and not
23
+ another — are the class this catches cheapest.
24
+
25
+ ## Code Change Rule
26
+
27
+ If the workflow is being changed to fix a bug or add behavior, use RED -> GREEN:
28
+ run it locally first and see it fail for the reason you believe, make the scoped
29
+ change, and rerun it to pass. Running a workflow locally makes that cycle cheap
30
+ enough to actually do, which is the point.
31
+
32
+ ## Do not use this when
33
+
34
+ - The task is about the workflow **file** rather than its behavior: renaming a job,
35
+ editing a matrix entry, fixing YAML indentation.
36
+ - Reading an existing remote run's logs. That run already happened; `gh run view` is
37
+ the tool.
38
+ - The failing thing is not the workflow. A test that fails locally will fail here too,
39
+ and going through a VM to learn that is slower than running the test.
40
+
41
+ ## Before committing the agent to this path
42
+
43
+ 1. `command -v preloop` — if absent, say so and stop.
44
+ 2. **Install by verified download, not by piping a script into a shell.** preloop's
45
+ README documents `curl -fsSL … | sh`; clud's own rule-writing guide uses that exact
46
+ shape as its canonical example of a pipeline worth blocking, so a clud skill must
47
+ not tell an agent to run it. Each release publishes per-platform tarballs with a
48
+ matching `.sha256` (`preloop-cli-<arch>-<os>.tar.gz` plus `.sha256`, and a
49
+ `sha256.sum`). Download the asset for the platform, verify it against its published
50
+ checksum, and put the binary on PATH — the same material the install script uses.
51
+ 3. **First run downloads a base image and builds a golden VM: 1–5 minutes.** After
52
+ that each job forks in ~200–300 ms. If the task cannot afford the first-run cost,
53
+ say so rather than starting it and stranding the work.
54
+
55
+ ## The loop
56
+
57
+ ```bash
58
+ preloop serve # engine on 127.0.0.1:9090; -d to detach
59
+ preloop run -f .github/workflows/ci.yml --event pull_request
60
+ preloop dap <run-id> # hold the job at entry and inspect it
61
+ ```
62
+
63
+ `preloop dap` pauses a job before it runs and exposes the live `github`, `env`,
64
+ `runner`, `job`, `steps` and `secrets` scopes. Reach for it when the YAML looks right
65
+ and the runtime context is what is actually wrong — a matrix value or event payload
66
+ that is not what the workflow assumed.
67
+
68
+ ## Where local and remote differ
69
+
70
+ A green local run is strong evidence, not a guarantee. Say which one you ran.
71
+
72
+ - The base image is **curated, not GitHub's** — the official image is ~90 GB, and
73
+ preloop deliberately omits dependencies that actions usually install themselves. A
74
+ step that relies on something preinstalled on a GitHub runner can pass there and
75
+ fail here, or the reverse. Custom and OCI-based goldens are supported.
76
+ - On Apple Silicon, x86_64 goldens run under Rosetta 2 translation, and **Docker
77
+ actions are not supported on that path** — amd64 images inside the VM's Docker fail
78
+ with a `rosetta-wrapper` error. Prefer arm64 goldens there.
79
+ - Some events need a payload supplied before they can be simulated.
80
+
81
+ ## Relationship to clud-bosn
82
+
83
+ They do not overlap. bosn manages Docker resources on the **host**; a workflow run by
84
+ preloop uses the Docker engine **inside its own microVM**, which the host's bosn
85
+ neither sees nor tracks. Use bosn for the local build loop, preloop for the workflow.
@@ -1702,7 +1702,27 @@ def _launch_windows_docker_desktop_guard() -> tuple[bool, str]:
1702
1702
  cwd=os.path.dirname(script),
1703
1703
  originator="clud-docker-recover-guard",
1704
1704
  )
1705
- except OSError as exc:
1705
+ except Exception as exc: # noqa: BLE001 - see below; a guard failure must not abort recovery
1706
+ # Deliberately broader than `OSError` (#1058). running-process signals
1707
+ # launch failures through its own `RuntimeError`/`Exception` subclasses
1708
+ # -- `ProcessAbnormalExit`, `ProbeUnavailableError`,
1709
+ # `DaemonOutputNotAvailableError` -- none of which derive from
1710
+ # `OSError`. The reported failure was exactly that shape:
1711
+ #
1712
+ # RuntimeError: daemon I/O error: The system cannot find the file
1713
+ # specified. (os error 2)
1714
+ #
1715
+ # so the narrow catch let it propagate out of `_execute_restart`, and a
1716
+ # `restart --yes --force` aborted *before touching Docker at all* while
1717
+ # `doctor` still reported healthy. The caller already has a complete
1718
+ # fallback below this call -- direct executable launch, then the CLI
1719
+ # path -- and it was simply never reached.
1720
+ #
1721
+ # Failing to start an optional guard process is never a reason to
1722
+ # abandon a recovery the user explicitly asked for. The return value
1723
+ # keeps this distinguishable from a failed restart: this message says
1724
+ # the *guard* did not start, and the fallback appends its own outcome
1725
+ # after it.
1706
1726
  return False, f"Docker Desktop daemon guard launch failed: {exc}"
1707
1727
  return (
1708
1728
  True,