diff --git a/.claude-plugin/CLAUDE.md b/.claude-plugin/CLAUDE.md index 140e57dd1..e42374102 100644 --- a/.claude-plugin/CLAUDE.md +++ b/.claude-plugin/CLAUDE.md @@ -1,18 +1,20 @@ # Claude Code Plugin Guidelines -## Skills Directory Location +## Plugin Structure -**Working solution**: Using `source: "./.claude-plugin"` in `marketplace.json` allows skills to remain in `.claude-plugin/skills/` ✅ +This plugin uses `source: "./"` in `marketplace.json`, which means: +- `marketplace.json` and `plugin.json` live in `.claude-plugin/` +- `hooks/` and `skills/` directories are at the repository root -Configuration in `marketplace.json`: +Configuration in `.claude-plugin/marketplace.json`: ```json { - "source": "./.claude-plugin", + "source": "./", "skills": ["./skills/worktrunk"] } ``` -Configuration in `plugin.json`: +Configuration in `.claude-plugin/plugin.json`: ```json { "hooks": "./hooks/hooks.json", @@ -20,16 +22,7 @@ Configuration in `plugin.json`: } ``` -**Path resolution**: -- Source base: `./.claude-plugin` -- Skills: `./.claude-plugin + ./skills/worktrunk = ./.claude-plugin/skills/worktrunk` ✅ -- Hooks: `./.claude-plugin + ./hooks/hooks.json = ./.claude-plugin/hooks/hooks.json` ✅ - -This approach keeps all Claude Code components organized together in `.claude-plugin/` and avoids root directory clutter. - -**Note**: The official Claude Code documentation states "All other directories (commands/, agents/, skills/, hooks/) must be at the plugin root" but using the `source` field to point to `./.claude-plugin` makes paths relative to that directory, allowing this organizational structure. - -**Why this works**: The `source` field in `marketplace.json` changes the base directory for path resolution. When `source: "./"` (the default), skills paths are resolved from the plugin root. When `source: "./.claude-plugin"`, skills paths are resolved from `.claude-plugin/`, allowing the entire plugin to be self-contained in one directory. +**Why this structure**: Using `source: "./.claude-plugin"` caused EXDEV (cross-device link) errors on Linux systems where `/tmp` is on a separate filesystem (Ubuntu 21.04+, Fedora, Arch). See https://github.com/anthropics/claude-code/issues/14799 for details. Once that upstream bug is fixed, we could consolidate back to `.claude-plugin/` if desired. ## Known Limitations diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 7118fac7b..43c06f05a 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -12,7 +12,7 @@ { "name": "worktrunk", "description": "Worktrunk is a git worktree management CLI that streamlines multi-branch development. This plugin provides Claude Code integration with two features: (1) A configuration skill guiding you through LLM-powered commit message generation, project automation hooks (post-create, pre-merge), and worktree path customization. (2) Automatic activity tracking that displays 🤖 (working) and 💬 (waiting) indicators in `wt list`, showing which branches have active Claude sessions. Use when setting up Worktrunk configuration, automating project workflows, or monitoring AI activity across branches.", - "source": "./.claude-plugin", + "source": "./", "strict": false, "skills": [ "./skills/worktrunk" diff --git a/.claude-plugin/skills/worktrunk/reference/README.md b/.claude-plugin/skills/worktrunk/reference/README.md deleted file mode 120000 index ff5c79602..000000000 --- a/.claude-plugin/skills/worktrunk/reference/README.md +++ /dev/null @@ -1 +0,0 @@ -../../../../README.md \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index a0630dbd3..dfc6b03ad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,7 +21,7 @@ allow-branch = ["*"] consolidate-commits = true pre-release-replacements = [ # Update skill version marker - { file = ".claude-plugin/skills/worktrunk/SKILL.md", search = "worktrunk-skill-version: [0-9.]+", replace = "worktrunk-skill-version: {{version}}" }, + { file = "skills/worktrunk/SKILL.md", search = "worktrunk-skill-version: [0-9.]+", replace = "worktrunk-skill-version: {{version}}" }, ] [package.metadata.cargo-udeps.ignore] diff --git a/.claude-plugin/hooks/hooks.json b/hooks/hooks.json similarity index 100% rename from .claude-plugin/hooks/hooks.json rename to hooks/hooks.json diff --git a/.claude-plugin/skills/worktrunk/SKILL.md b/skills/worktrunk/SKILL.md similarity index 100% rename from .claude-plugin/skills/worktrunk/SKILL.md rename to skills/worktrunk/SKILL.md diff --git a/.claude-plugin/skills/worktrunk/reference/claude-code.md b/skills/worktrunk/reference/claude-code.md similarity index 100% rename from .claude-plugin/skills/worktrunk/reference/claude-code.md rename to skills/worktrunk/reference/claude-code.md diff --git a/.claude-plugin/skills/worktrunk/reference/config.md b/skills/worktrunk/reference/config.md similarity index 100% rename from .claude-plugin/skills/worktrunk/reference/config.md rename to skills/worktrunk/reference/config.md diff --git a/.claude-plugin/skills/worktrunk/reference/faq.md b/skills/worktrunk/reference/faq.md similarity index 100% rename from .claude-plugin/skills/worktrunk/reference/faq.md rename to skills/worktrunk/reference/faq.md diff --git a/.claude-plugin/skills/worktrunk/reference/hook.md b/skills/worktrunk/reference/hook.md similarity index 100% rename from .claude-plugin/skills/worktrunk/reference/hook.md rename to skills/worktrunk/reference/hook.md diff --git a/.claude-plugin/skills/worktrunk/reference/list.md b/skills/worktrunk/reference/list.md similarity index 100% rename from .claude-plugin/skills/worktrunk/reference/list.md rename to skills/worktrunk/reference/list.md diff --git a/.claude-plugin/skills/worktrunk/reference/llm-commits.md b/skills/worktrunk/reference/llm-commits.md similarity index 100% rename from .claude-plugin/skills/worktrunk/reference/llm-commits.md rename to skills/worktrunk/reference/llm-commits.md diff --git a/.claude-plugin/skills/worktrunk/reference/merge.md b/skills/worktrunk/reference/merge.md similarity index 100% rename from .claude-plugin/skills/worktrunk/reference/merge.md rename to skills/worktrunk/reference/merge.md diff --git a/.claude-plugin/skills/worktrunk/reference/remove.md b/skills/worktrunk/reference/remove.md similarity index 100% rename from .claude-plugin/skills/worktrunk/reference/remove.md rename to skills/worktrunk/reference/remove.md diff --git a/.claude-plugin/skills/worktrunk/reference/select.md b/skills/worktrunk/reference/select.md similarity index 100% rename from .claude-plugin/skills/worktrunk/reference/select.md rename to skills/worktrunk/reference/select.md diff --git a/.claude-plugin/skills/worktrunk/reference/shell-integration.md b/skills/worktrunk/reference/shell-integration.md similarity index 100% rename from .claude-plugin/skills/worktrunk/reference/shell-integration.md rename to skills/worktrunk/reference/shell-integration.md diff --git a/.claude-plugin/skills/worktrunk/reference/step.md b/skills/worktrunk/reference/step.md similarity index 100% rename from .claude-plugin/skills/worktrunk/reference/step.md rename to skills/worktrunk/reference/step.md diff --git a/.claude-plugin/skills/worktrunk/reference/switch.md b/skills/worktrunk/reference/switch.md similarity index 100% rename from .claude-plugin/skills/worktrunk/reference/switch.md rename to skills/worktrunk/reference/switch.md diff --git a/.claude-plugin/skills/worktrunk/reference/tips-patterns.md b/skills/worktrunk/reference/tips-patterns.md similarity index 100% rename from .claude-plugin/skills/worktrunk/reference/tips-patterns.md rename to skills/worktrunk/reference/tips-patterns.md diff --git a/.claude-plugin/skills/worktrunk/reference/troubleshooting.md b/skills/worktrunk/reference/troubleshooting.md similarity index 100% rename from .claude-plugin/skills/worktrunk/reference/troubleshooting.md rename to skills/worktrunk/reference/troubleshooting.md diff --git a/.claude-plugin/skills/worktrunk/reference/worktrunk.md b/skills/worktrunk/reference/worktrunk.md similarity index 100% rename from .claude-plugin/skills/worktrunk/reference/worktrunk.md rename to skills/worktrunk/reference/worktrunk.md diff --git a/tests/integration_tests/readme_sync.rs b/tests/integration_tests/readme_sync.rs index a0888cae6..5993a8191 100644 --- a/tests/integration_tests/readme_sync.rs +++ b/tests/integration_tests/readme_sync.rs @@ -1479,57 +1479,45 @@ fn remove_section(content: &str, heading: &str) -> String { /// Format: (docs_path, skill_path) /// Files are synced with content transformed for skill consumption const SKILL_SYNC_FILES: &[(&str, &str)] = &[ - ( - "docs/content/hook.md", - ".claude-plugin/skills/worktrunk/reference/hook.md", - ), + ("docs/content/hook.md", "skills/worktrunk/reference/hook.md"), ( "docs/content/config.md", - ".claude-plugin/skills/worktrunk/reference/config.md", + "skills/worktrunk/reference/config.md", ), ( "docs/content/switch.md", - ".claude-plugin/skills/worktrunk/reference/switch.md", + "skills/worktrunk/reference/switch.md", ), ( "docs/content/merge.md", - ".claude-plugin/skills/worktrunk/reference/merge.md", - ), - ( - "docs/content/list.md", - ".claude-plugin/skills/worktrunk/reference/list.md", + "skills/worktrunk/reference/merge.md", ), + ("docs/content/list.md", "skills/worktrunk/reference/list.md"), ( "docs/content/select.md", - ".claude-plugin/skills/worktrunk/reference/select.md", - ), - ( - "docs/content/step.md", - ".claude-plugin/skills/worktrunk/reference/step.md", + "skills/worktrunk/reference/select.md", ), + ("docs/content/step.md", "skills/worktrunk/reference/step.md"), ( "docs/content/remove.md", - ".claude-plugin/skills/worktrunk/reference/remove.md", + "skills/worktrunk/reference/remove.md", ), ( "docs/content/llm-commits.md", - ".claude-plugin/skills/worktrunk/reference/llm-commits.md", + "skills/worktrunk/reference/llm-commits.md", ), ( "docs/content/tips-patterns.md", - ".claude-plugin/skills/worktrunk/reference/tips-patterns.md", + "skills/worktrunk/reference/tips-patterns.md", ), ( "docs/content/worktrunk.md", - ".claude-plugin/skills/worktrunk/reference/worktrunk.md", - ), - ( - "docs/content/faq.md", - ".claude-plugin/skills/worktrunk/reference/faq.md", + "skills/worktrunk/reference/worktrunk.md", ), + ("docs/content/faq.md", "skills/worktrunk/reference/faq.md"), ( "docs/content/claude-code.md", - ".claude-plugin/skills/worktrunk/reference/claude-code.md", + "skills/worktrunk/reference/claude-code.md", ), ];