Skip to main content

git_worktree_manager/operations/setup_claude/
paths.rs

1//! Filesystem layout for the local-marketplace install.
2//!
3//! All helpers take a `data_local` root (typically `dirs::data_local_dir()`)
4//! so tests can pass a tempdir without touching real user state.
5
6use std::path::{Path, PathBuf};
7
8pub const MARKETPLACE_NAME: &str = "gw-local";
9pub const PLUGIN_NAME: &str = "gw";
10pub const PLUGIN_SLUG: &str = "gw@gw-local";
11
12const APP_DIR: &str = "git-worktree-manager";
13const MARKETPLACE_SUBDIR: &str = "claude-marketplace";
14const PLUGIN_SUBDIR: &str = "gw-plugin";
15const SENTINEL_FILE: &str = ".gw-managed";
16
17pub fn marketplace_root_under(data_local: &Path) -> PathBuf {
18    data_local.join(APP_DIR).join(MARKETPLACE_SUBDIR)
19}
20
21pub fn marketplace_manifest_under(data_local: &Path) -> PathBuf {
22    marketplace_root_under(data_local)
23        .join(".claude-plugin")
24        .join("marketplace.json")
25}
26
27pub fn plugin_root_under(data_local: &Path) -> PathBuf {
28    marketplace_root_under(data_local).join(PLUGIN_SUBDIR)
29}
30
31pub fn plugin_manifest_under(data_local: &Path) -> PathBuf {
32    plugin_root_under(data_local)
33        .join(".claude-plugin")
34        .join("plugin.json")
35}
36
37pub fn command_gw_under(data_local: &Path) -> PathBuf {
38    plugin_root_under(data_local).join("commands").join("gw.md")
39}
40
41pub fn skill_delegate_under(data_local: &Path) -> PathBuf {
42    plugin_root_under(data_local)
43        .join("skills")
44        .join("delegate")
45        .join("SKILL.md")
46}
47
48pub fn skill_manage_under(data_local: &Path) -> PathBuf {
49    plugin_root_under(data_local)
50        .join("skills")
51        .join("manage")
52        .join("SKILL.md")
53}
54
55pub fn skill_manage_reference_under(data_local: &Path) -> PathBuf {
56    plugin_root_under(data_local)
57        .join("skills")
58        .join("manage")
59        .join("references")
60        .join("gw-commands.md")
61}
62
63pub fn sentinel_under(data_local: &Path) -> PathBuf {
64    marketplace_root_under(data_local).join(SENTINEL_FILE)
65}
66
67/// Path to Claude Code's plugin registration file under `home`.
68/// This file tracks which plugins Claude Code has installed.
69pub fn installed_plugins_json_under(home: &Path) -> PathBuf {
70    home.join(".claude")
71        .join("plugins")
72        .join("installed_plugins.json")
73}