From cd5c937d2e265a1defbb45b953592286787f2346 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Tue, 24 Mar 2026 15:10:32 -0300 Subject: [PATCH] feat: load project skills automatically from `.crush/skills` and more --- internal/config/load.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/internal/config/load.go b/internal/config/load.go index e29e0cc82dbdf73b8038b54bcffc7c112fa150ff..6dd338e59e376f66a0d4471dd7b1e6e59ab76851 100644 --- a/internal/config/load.go +++ b/internal/config/load.go @@ -414,6 +414,9 @@ func (c *Config) setDefaults(workingDir, dataDir string) { } } + // Project specific skills dirs. + c.Options.SkillsPaths = append(c.Options.SkillsPaths, ProjectSkillsDir(workingDir)...) + if str, ok := os.LookupEnv("CRUSH_DISABLE_PROVIDER_AUTO_UPDATE"); ok { c.Options.DisableProviderAutoUpdate, _ = strconv.ParseBool(str) } @@ -823,4 +826,15 @@ func GlobalSkillsDirs() []string { return paths } +// ProjectSkillsDir returns the default project directories for which Crush +// will look for skills. +func ProjectSkillsDir(workingDir string) []string { + return []string{ + filepath.Join(workingDir, ".agents/skills"), + filepath.Join(workingDir, ".crush/skills"), + filepath.Join(workingDir, ".claude/skills"), + filepath.Join(workingDir, ".cursor/skills"), + } +} + func isAppleTerminal() bool { return os.Getenv("TERM_PROGRAM") == "Apple_Terminal" }