Detailed changes
@@ -301,6 +301,31 @@ using `$(echo $VAR)` syntax.
}
```
+### Memory
+
+Crush automatically includes two memory files for cross-project instructions.
+
+- `~/.config/crush/CRUSH.md`: Crush-specific rules that would confuse other
+ agentic coding tools. If you only use Crush, this is the only one you need to
+ edit.
+- `~/.config/AGENTS.md`: generic instructions that other coding tools might
+ read. Avoid referring to Crush-specific tools or workflows here.
+
+You can customize these paths using the `memory_paths` option in your
+configuration:
+
+```json
+{
+ "$schema": "https://charm.land/crush.json",
+ "options": {
+ "memory_paths": [
+ "/path/to/custom/memory/file.md",
+ "/path/to/folder/of/files/" // recursively load all .md files in folder
+ ]
+ }
+}
+```
+
### Ignoring Files
Crush respects `.gitignore` files by default, but you can also create a
@@ -193,6 +193,7 @@ func (Attribution) JSONSchemaExtend(schema *jsonschema.Schema) {
type Options struct {
ContextPaths []string `json:"context_paths,omitempty" jsonschema:"description=Paths to files containing context information for the AI,example=.cursorrules,example=CRUSH.md"`
+ MemoryPaths []string `json:"memory_paths,omitempty" jsonschema:"description=Paths to files containing memory information for the AI,default=~/.config/crush/CRUSH.md,default=~/.config/AGENTS.md"`
TUI *TUIOptions `json:"tui,omitempty" jsonschema:"description=Terminal user interface options"`
Debug bool `json:"debug,omitempty" jsonschema:"description=Enable debug logging,default=false"`
DebugLSP bool `json:"debug_lsp,omitempty" jsonschema:"description=Enable debug logging for LSP servers,default=false"`
@@ -314,6 +314,15 @@ func (c *Config) setDefaults(workingDir, dataDir string) {
if c.Options.ContextPaths == nil {
c.Options.ContextPaths = []string{}
}
+ if c.Options.MemoryPaths == nil {
+ crushConfigDir := filepath.Dir(GlobalConfig())
+ c.Options.MemoryPaths = []string{
+ filepath.Join(crushConfigDir, "CRUSH.md"),
+ filepath.Join(filepath.Dir(crushConfigDir), "AGENTS.md"),
+ }
+ }
+ c.Options.ContextPaths = append(c.Options.ContextPaths, c.Options.MemoryPaths...)
+
if dataDir != "" {
c.Options.DataDirectory = dataDir
} else if c.Options.DataDirectory == "" {
@@ -344,6 +353,9 @@ func (c *Config) setDefaults(workingDir, dataDir string) {
// Add the default context paths if they are not already present
c.Options.ContextPaths = append(defaultContextPaths, c.Options.ContextPaths...)
+
+ // The ordering of contexts can be important; maybe the user's stuff should
+ // go at the bottom? Or top?
slices.Sort(c.Options.ContextPaths)
c.Options.ContextPaths = slices.Compact(c.Options.ContextPaths)
@@ -357,6 +357,17 @@
"type": "array",
"description": "Paths to files containing context information for the AI"
},
+ "memory_paths": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "description": "Paths to files containing memory information for the AI",
+ "default": [
+ "~/.config/crush/CRUSH.md",
+ "~/.config/AGENTS.md"
+ ]
+ },
"tui": {
"$ref": "#/$defs/TUIOptions",
"description": "Terminal user interface options"