on main help sign in
feat: load project skills automatically from `.crush/skills` and more
cd5c937Andrey Nering
internal/config/load.go+14
@@ -414,6 +414,9 @@ func (c *Config) setDefaults(workingDir, dataDir string) {
414 }
414 }
415 }
415 }
416
416
417+ // Project specific skills dirs.
418+ c.Options.SkillsPaths = append(c.Options.SkillsPaths, ProjectSkillsDir(workingDir)...)
419+
417 if str, ok := os.LookupEnv("CRUSH_DISABLE_PROVIDER_AUTO_UPDATE"); ok {
420 if str, ok := os.LookupEnv("CRUSH_DISABLE_PROVIDER_AUTO_UPDATE"); ok {
418 c.Options.DisableProviderAutoUpdate, _ = strconv.ParseBool(str)
421 c.Options.DisableProviderAutoUpdate, _ = strconv.ParseBool(str)
419 }
422 }
@@ -823,4 +826,15 @@ func GlobalSkillsDirs() []string {
823 return paths
826 return paths
824}
827}
825
828
829+// ProjectSkillsDir returns the default project directories for which Crush
830+// will look for skills.
831+func ProjectSkillsDir(workingDir string) []string {
832+ return []string{
833+ filepath.Join(workingDir, ".agents/skills"),
834+ filepath.Join(workingDir, ".crush/skills"),
835+ filepath.Join(workingDir, ".claude/skills"),
836+ filepath.Join(workingDir, ".cursor/skills"),
837+ }
838+}
839+
826func isAppleTerminal() bool { return os.Getenv("TERM_PROGRAM") == "Apple_Terminal" }
840func isAppleTerminal() bool { return os.Getenv("TERM_PROGRAM") == "Apple_Terminal" }