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.
- {clud-2.7.9 → clud-2.8.2}/Cargo.lock +14 -5
- {clud-2.7.9 → clud-2.8.2}/Cargo.toml +1 -1
- clud-2.7.9/README.md → clud-2.8.2/PKG-INFO +63 -0
- clud-2.7.9/PKG-INFO → clud-2.8.2/README.md +37 -24
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/Cargo.toml +8 -0
- clud-2.8.2/crates/clud-bin/assets/skills/clud-bosn/SKILL.md +83 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-extern-repos/SKILL.md +18 -0
- clud-2.8.2/crates/clud-bin/assets/skills/clud-os-debug/SKILL.md +152 -0
- clud-2.8.2/crates/clud-bin/assets/skills/clud-preloop/SKILL.md +85 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/docker/docker_recover.py +21 -1
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/github/pr_merge_watch.py +210 -36
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/hooks/uv_run_hook_guard.py +76 -8
- clud-2.8.2/crates/clud-bin/build.rs +67 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/README.md +132 -29
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/args.rs +113 -1
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/args_tests.rs +87 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/backend.rs +52 -21
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/backend_bootstrap.rs +90 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/block_bad_cmd.rs +642 -60
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/block_bad_cmd_cd.rs +157 -23
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/block_bad_cmd_cd_tests.rs +290 -12
- clud-2.8.2/crates/clud-bin/src/block_bad_cmd_cwd_changed.rs +155 -0
- clud-2.8.2/crates/clud-bin/src/block_bad_cmd_cwd_changed_tests.rs +287 -0
- clud-2.8.2/crates/clud-bin/src/build_id.rs +200 -0
- clud-2.8.2/crates/clud-bin/src/build_id_tests.rs +127 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/clud_hooks.rs +198 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/clud_hooks_compile.rs +41 -2
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/clud_hooks_compile_tests.rs +67 -19
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/clud_hooks_run.rs +25 -2
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/clud_hooks_tests.rs +186 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/clud_settings.rs +4 -4
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/clud_settings_tests.rs +3 -3
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_bridge.rs +534 -18
- clud-2.8.2/crates/clud-bin/src/codex_lf.rs +107 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_model.rs +6 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_translate.rs +15 -2
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_upstream.rs +82 -17
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/command/README.md +7 -2
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/command/builder.rs +43 -44
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/command/mod.rs +3 -2
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/command/tests.rs +74 -66
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/cpu_banner.rs +101 -15
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/cpu_banner_tests.rs +58 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/crash_report.rs +143 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/README.md +3 -2
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/client.rs +36 -7
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/entry.rs +3 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/entry_tests.rs +4 -1
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/gc_service/extern_repo.rs +334 -33
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/gc_service/filesystem.rs +5 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/gc_service.rs +2 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/http/tests.rs +34 -15
- clud-2.8.2/crates/clud-bin/src/daemon/io_helpers.rs +695 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/mod.rs +5 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/server.rs +127 -7
- clud-2.8.2/crates/clud-bin/src/daemon/session_state_sweep.rs +211 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/session_tmp_sweep.rs +11 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/target_sweep.rs +2 -2
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/types.rs +19 -1
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/wire_prost/tests.rs +1 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/worker.rs +71 -8
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/worker_tests.rs +68 -1
- clud-2.8.2/crates/clud-bin/src/extern_cli.rs +131 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/foreground_runtime.rs +37 -3
- clud-2.8.2/crates/clud-bin/src/gc/delete_audit.rs +192 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/gc/mod.rs +2 -0
- clud-2.8.2/crates/clud-bin/src/gc/session_state.rs +221 -0
- clud-2.8.2/crates/clud-bin/src/gc/session_state_tests.rs +254 -0
- clud-2.8.2/crates/clud-bin/src/gc/session_tmp.rs +869 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/gc/target_sweep.rs +122 -9
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/gc/uv_cache.rs +20 -1
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/grind.rs +12 -13
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/hook_health/codex_trust.rs +38 -2
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/hook_health/inspect.rs +42 -1
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/hook_health/mod.rs +2 -2
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/hook_health/prompts.rs +1 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/hook_health_tests.rs +40 -0
- clud-2.8.2/crates/clud-bin/src/hook_trust.rs +354 -0
- clud-2.8.2/crates/clud-bin/src/hook_trust_tests.rs +297 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/job_orphan_reaper.rs +116 -5
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/launch_log.rs +65 -3
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/launch_setup.rs +54 -8
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/lib.rs +9 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/main.rs +104 -51
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/orphan_reaper.rs +157 -15
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/orphan_reaper_tests.rs +269 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/process_scan.rs +101 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/provider_auth.rs +71 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/provider_catalog.rs +60 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/runner.rs +64 -3
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/runner_execution.rs +7 -3
- clud-2.8.2/crates/clud-bin/src/runner_exit.rs +40 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/session.rs +92 -8
- clud-2.8.2/crates/clud-bin/src/session_stdin.rs +133 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/session_tests.rs +79 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/settings_tui.rs +5 -4
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/shell/mod.rs +1 -0
- clud-2.8.2/crates/clud-bin/src/shell/nounset.rs +183 -0
- clud-2.8.2/crates/clud-bin/src/shell/nounset_tests.rs +289 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/skills.rs +12 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/skills_tests.rs +195 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/soldr_activate.rs +68 -16
- clud-2.8.2/crates/clud-bin/src/stage_trace.rs +161 -0
- clud-2.8.2/crates/clud-bin/src/symbols.rs +1115 -0
- clud-2.8.2/crates/clud-bin/src/test_env.rs +31 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/trampoline.rs +9 -109
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/trash.rs +4 -0
- clud-2.8.2/crates/clud-bin/src/workspace_trust.rs +189 -0
- clud-2.8.2/crates/clud-bin/src/workspace_trust_tests.rs +179 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/worktrees.rs +7 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/diagnostics/runtime_cache_hop_windows.rs +3 -2
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/diagnostics/symbols.rs +51 -2
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/pty/pty_pump.rs +72 -0
- clud-2.8.2/crates/clud-bin/tests/reaper/daemon_spawn_hygiene.rs +209 -0
- clud-2.8.2/crates/clud-bin/tests/reaper/fixture_ids.rs +65 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/reaper/main.rs +11 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/reaper/orphan_reap.rs +5 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/reaper/reaper_orphan_sweep_survival.rs +92 -42
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/reaper/subprocess_capture_lifecycle_windows.rs +31 -4
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/reaper/tool_shell_lifecycle_windows.rs +16 -3
- {clud-2.7.9 → clud-2.8.2}/pyproject.toml +38 -1
- {clud-2.7.9 → clud-2.8.2}/src/clud/__init__.py +1 -1
- clud-2.8.2/src/clud/mcp_server.py +926 -0
- clud-2.7.9/crates/clud-bin/build.rs +0 -29
- clud-2.7.9/crates/clud-bin/src/daemon/io_helpers.rs +0 -286
- clud-2.7.9/crates/clud-bin/src/gc/session_tmp.rs +0 -312
- clud-2.7.9/crates/clud-bin/src/runner_exit.rs +0 -10
- clud-2.7.9/crates/clud-bin/src/session_stdin.rs +0 -30
- clud-2.7.9/crates/clud-bin/src/symbols.rs +0 -308
- {clud-2.7.9 → clud-2.8.2}/LICENSE +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/LICENSE +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/README.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/README.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/dashboard/index.html +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/hero-clud.jpg +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/scripts/extract_zip.py +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/README.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-docker-linux-build/README.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-docker-linux-build/SKILL.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-docker-mac-x86/SKILL.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-docker-recover/SKILL.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-docker-rust-app-dev/README.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-docker-rust-app-dev/SKILL.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-fix-quick/SKILL.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-git/SKILL.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-git-diff/SKILL.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-improve/README.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-improve/SKILL.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-issue/README.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-issue/SKILL.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-issue-triage/README.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-issue-triage/SKILL.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-omarchy/SKILL.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-python-lint-deadcode/SKILL.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-review/SKILL.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-tag-release/README.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-tag-release/SKILL.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-windows-trash/README.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/skills/clud-windows-trash/SKILL.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/docker/README.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/docker/docker-build.py +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/docker/docker_build_cpp.py +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/docker/docker_build_python.py +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/docker/docker_build_soldr.py +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/git/clud-git-diff.py +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/hooks/block-bad-cmd.py +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/hooks/telemetry.py +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/assets/tools/python/lint_deadcode.py +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/args_tests/commands.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/auth.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/bin/clud_bench_proc_sampler.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/bin/clud_block_bad_cmd.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/bin/clud_cmd_scan.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/bin/clud_ctrlc_probe.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/bin/clud_shim.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/block_bad_cmd_gate.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/block_bad_cmd_io.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/block_bad_cmd_rm_vars.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/block_bad_cmd_rollout.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/block_bad_cmd_shell.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/bridge_log.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/capture.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/clud_hook_roots.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/clud_hook_roots_tests.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/clud_hooks_run_tests.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/clud_settings_document.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_auth.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_history.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_hook_normalize.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_hook_normalize_tests.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_pipeline.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_sse.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_sse_tests.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/codex_upstream_credentials.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/command/do_input.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/command/loop_task.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/command/prompts.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/command/tests/repeat_execution.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/command/tests/repeat_parse.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/command/tests/repeat_schedule.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/command/types.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/config.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/console_input.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/console_setup.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/console_title.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/console_title_osc.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/ctrl_c_track.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/ctrl_c_track_tests.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/activity.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/api_session_http.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/api_session_lifecycle.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/api_sessions.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/api_turn_controller.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/attach.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/client_compat.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/client_leases.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/client_tests.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/commands.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/cpu_alert_publish.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/daemon_events.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/gc_service/list_state.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/gc_service/tests/delete_and_pool.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/gc_service/tests/parallel.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/gc_service/tests/policy.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/gc_service/tests.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/gc_service_disk_watchdog.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/gc_service_purge.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/handover_registry.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/headless_adapter.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/http.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/http_dashboard_state.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/http_info.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/http_response.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/keys.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/paths.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/proc_sampler.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/proc_sampler_tests.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/process_utils.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/rp_broker/endpoint.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/rp_broker/errors.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/rp_broker/frame_lane.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/rp_broker/mod.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/rp_broker/payload.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/rp_broker/tests.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/rp_broker/wire_mode.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/runtime_config.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/sessions.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/top.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/uv_cache_sweep.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/watch_service.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/wire_prost/daemon_msgs.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/wire_prost/error.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/wire_prost/frame.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/wire_prost/mod.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/wire_prost/session.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/wire_prost/worker_msgs.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/daemon/worker_shared.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/dashboard_auth.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/dnd/README.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/dnd/console_drop_target.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/dnd/console_drop_target_tests.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/dnd/dropfiles.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/dnd/injectors.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/dnd/mod.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/extern_root.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/extern_root_tests.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/failover.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/gc/cli.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/gc/reconcile.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/gc/registry.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/gc/scanner.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/gc_tests.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/graphics.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/harness_picker.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/hook_health/repairs.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/hook_health/types.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/hook_health/utils.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/hook_health/warnings.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/large_file_guard/fallback_tests.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/large_file_guard/index_pass.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/large_file_guard/ls_files_pass.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/large_file_guard.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/log_event.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/loop_artifacts.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/loop_check.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/loop_spec.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/main_helpers.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/optimize.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/paste_image.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/path_norm.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/preference.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/process_identity.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/process_tree.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/provider_registry.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/reap_log.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/reaper_facts.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/repo_clud_config.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/repo_clud_config_tests.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/route_health.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/runner_terminal.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/runtime_cache.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/session/bracketed_paste.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/session/interrupt.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/session_index.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/session_output.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/session_registry.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/session_registry_tests.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/shell/README.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/shell/completion_guard.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/shell/git_bash_resolver.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/shim_install.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/shim_resolve.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/shim_session.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/shim_uv.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/skills_home.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/startup.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/stream_json.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/subprocess.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/test_runtime/README.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/test_runtime/cli.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/test_runtime/mod.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/test_runtime/store.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_cli.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_info.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_install.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_ledger.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_list.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_log.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_query.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_run.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_run_telemetry.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_run_tests.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_tee.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_termination.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tool_watchdog.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/tools.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/ui.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/uv_run_hook_guard.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/verbose_log.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/voice/README.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/voice/audio.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/voice/config.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/voice/cues.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/voice/linux_capture.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/voice/mod.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/voice/mode.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/voice/model.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/voice/recording.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/voice/worker.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/wasm.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/webterm.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/wedge_watchdog.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/wedge_watchdog_gate_tests.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/wedge_watchdog_tests.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/win_creation_flags.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/worktrees_duration.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/worktrees_format.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/worktrees_locked_age.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/src/worktrees_tests.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/README.md +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/api/api_session_lifecycle.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/api/api_turn_controller.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/api/main.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/cli/codex_bridge_preflight_cli.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/cli/main.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/cli/provider_selection_cli.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/cli/shell_completion_guard.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/common/exe.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/common/mod.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/diagnostics/crash_report.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/diagnostics/main.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/diagnostics/telemetry_endpoint.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/diagnostics/tier_refresh_probe.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/diagnostics/win32_hooking_probe.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/pty/main.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/pty/pty_behavior.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/pty/shift_enter_dual_reader.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/pty/utf8_codepage.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/reaper/reaper_batch_drain_windows.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/reaper/reaper_daemon_survival_windows.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/reaper/wedge_watchdog_e2e.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/signals/ctrlc_signal_kinds.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/signals/ctrlc_windows_events.rs +0 -0
- {clud-2.7.9 → clud-2.8.2}/crates/clud-bin/tests/signals/main.rs +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
2957
|
+
version = "2.8.2"
|
|
2957
2958
|
|
|
2958
2959
|
[[package]]
|
|
2959
2960
|
name = "probe-target"
|
|
2960
|
-
version = "2.
|
|
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"
|
|
@@ -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
|

|
|
@@ -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
|
[](https://github.com/zackees/clud/actions/workflows/ci.yml)
|
|
25
57
|
[](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
|

|
|
@@ -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
|
[](https://github.com/zackees/clud/actions/workflows/ci.yml)
|
|
48
32
|
[](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
|
|
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,
|