| 7158 | const char *legacy_verify_content, bool dry_run); |
| 7159 | |
| 7160 | static void install_claude_code_config(const char *home, const char *binary_path, bool force, |
| 7161 | bool dry_run) { |
| 7162 | char config_dir[CLI_BUF_1K]; |
| 7163 | cbm_claude_config_dir(home, config_dir, sizeof(config_dir)); |
| 7164 | char user_root[CLI_BUF_1K]; |
| 7165 | cbm_claude_user_root(home, user_root, sizeof(user_root)); |
| 7166 | |
| 7167 | char skills_dir[CLI_BUF_1K]; |
| 7168 | char agent_path[CLI_BUF_1K]; |
| 7169 | snprintf(skills_dir, sizeof(skills_dir), "%s/skills", config_dir); |
| 7170 | snprintf(agent_path, sizeof(agent_path), "%s/agents/codebase-memory.md", config_dir); |
| 7171 | |
| 7172 | /* Plan mode: record the planned writes and return without mutating (#388). */ |
| 7173 | if (g_install_plan) { |
| 7174 | char p[CLI_BUF_1K]; |
| 7175 | snprintf(p, sizeof(p), "%s/codebase-memory/SKILL.md", skills_dir); |
| 7176 | plan_record("Claude Code", "skill", p); |
| 7177 | install_tiered_agent_profiles( |
| 7178 | (cbm_tiered_profile_set_t){ |
| 7179 | .label = "Claude Code", |
| 7180 | .verify_path = agent_path, |
| 7181 | .binary_path = binary_path, |
| 7182 | .legacy_verify_content = legacy_claude_verify_agent_content, |
| 7183 | .dialect = CBM_GRAPH_DIALECT_CLAUDE, |
| 7184 | }, |
| 7185 | dry_run); |
| 7186 | snprintf(p, sizeof(p), "%s/.claude.json", user_root); |
| 7187 | plan_record("Claude Code", "mcp_config", p); |
| 7188 | snprintf(p, sizeof(p), "%s/settings.json", config_dir); |
| 7189 | plan_record("Claude Code", "hook", p); |
| 7190 | snprintf(p, sizeof(p), "%s/hooks/%s", config_dir, CMM_HOOK_GATE_SCRIPT); |
| 7191 | plan_record("Claude Code", "hook", p); |
| 7192 | snprintf(p, sizeof(p), "%s/hooks/%s", config_dir, CMM_SESSION_REMINDER_SCRIPT); |
| 7193 | plan_record("Claude Code", "hook", p); |
| 7194 | snprintf(p, sizeof(p), "%s/hooks/%s", config_dir, CMM_SUBAGENT_REMINDER_SCRIPT); |
| 7195 | plan_record("Claude Code", "hook", p); |
| 7196 | return; |
| 7197 | } |
| 7198 | |
| 7199 | printf("Claude Code:\n"); |
| 7200 | |
| 7201 | int skill_count = cbm_install_skills(skills_dir, force, dry_run); |
| 7202 | printf(" skills: %d installed\n", skill_count); |
| 7203 | install_tiered_agent_profiles( |
| 7204 | (cbm_tiered_profile_set_t){ |
| 7205 | .label = "Claude Code", |
| 7206 | .verify_path = agent_path, |
| 7207 | .binary_path = binary_path, |
| 7208 | .legacy_verify_content = legacy_claude_verify_agent_content, |
| 7209 | .dialect = CBM_GRAPH_DIALECT_CLAUDE, |
| 7210 | }, |
| 7211 | dry_run); |
| 7212 | |
| 7213 | if (cbm_remove_old_monolithic_skill(skills_dir, dry_run)) { |
| 7214 | printf(" removed old monolithic skill\n"); |
| 7215 | } |
| 7216 | |
| 7217 | /* ~/.claude/.mcp.json is not a documented Claude Code MCP location. |
no test coverage detected