| 10389 | } |
| 10390 | |
| 10391 | static void uninstall_devin_durable_context(const cbm_agent_registry_context_t *registry, |
| 10392 | const char *binary_path, const char *config_path, |
| 10393 | bool config_resolved, bool dry_run) { |
| 10394 | char devin_dir[CLI_BUF_1K]; |
| 10395 | char instructions_path[CLI_BUF_1K]; |
| 10396 | char skills_dir[CLI_BUF_1K]; |
| 10397 | if (!cbm_devin_user_dir(registry, devin_dir, sizeof(devin_dir))) { |
| 10398 | record_agent_config_error(true, "Devin CLI / Local", "context_resolve", "devin"); |
| 10399 | return; |
| 10400 | } |
| 10401 | snprintf(instructions_path, sizeof(instructions_path), "%s/AGENTS.md", devin_dir); |
| 10402 | snprintf(skills_dir, sizeof(skills_dir), "%s/skills", devin_dir); |
| 10403 | bool cleanup_ok = true; |
| 10404 | if (!dry_run && config_resolved && |
| 10405 | cbm_remove_devin_context_hooks(config_path, binary_path) != CLI_OK) { |
| 10406 | cleanup_ok = false; |
| 10407 | record_agent_config_error(true, "Devin CLI / Local", "lifecycle_hook_uninstall", |
| 10408 | config_path); |
| 10409 | } |
| 10410 | const char *hook_status = !config_resolved ? "skipped because the config path was unresolved" |
| 10411 | : dry_run ? "canonical lifecycle cleanup planned" |
| 10412 | : cleanup_ok |
| 10413 | ? "canonical lifecycle cleanup complete; modified or foreign " |
| 10414 | "entries preserved" |
| 10415 | : "canonical lifecycle cleanup failed"; |
| 10416 | printf(" hooks: %s\n", hook_status); |
| 10417 | uninstall_managed_agent_instructions("Devin CLI / Local", instructions_path, dry_run); |
| 10418 | uninstall_agent_skill("Devin CLI / Local", skills_dir, dry_run); |
| 10419 | } |
| 10420 | |
| 10421 | static void uninstall_pi_durable_context(const char *home, bool dry_run) { |
| 10422 | char instructions_path[CLI_BUF_1K]; |
no test coverage detected