on main help sign in
chore: rename opencode -> crush
5baebf7Kujtim Hoxha
README.md+22−22
@@ -43,17 +43,17 @@ curl -fsSL https://raw.githubusercontent.com/charmbracelet/crush/refs/heads/main
43### Using Homebrew (macOS and Linux)
43### Using Homebrew (macOS and Linux)
44
44
45```bash
45```bash
46−brew install opencode-ai/tap/opencode
46+brew install crush-ai/tap/crush
47```
47```
48
48
49### Using AUR (Arch Linux)
49### Using AUR (Arch Linux)
50
50
51```bash
51```bash
52# Using yay
52# Using yay
53−yay -S opencode-ai-bin
53+yay -S crush-ai-bin
54
54
55# Using paru
55# Using paru
56−paru -S opencode-ai-bin
56+paru -S crush-ai-bin
57```
57```
58
58
59### Using Go
59### Using Go
@@ -66,9 +66,9 @@ go install github.com/charmbracelet/crush@latest
66
66
67OpenCode looks for configuration in the following locations:
67OpenCode looks for configuration in the following locations:
68
68
69−- `$HOME/.opencode.json`
69+- `$HOME/.crush.json`
70−- `$XDG_CONFIG_HOME/opencode/.opencode.json`
70+- `$XDG_CONFIG_HOME/crush/.crush.json`
71−- `./.opencode.json` (local directory)
71+- `./.crush.json` (local directory)
72
72
73### Auto Compact Feature
73### Auto Compact Feature
74
74
@@ -130,7 +130,7 @@ This is useful if you want to use a different shell than your default system she
130```json
130```json
131{
131{
132 "data": {
132 "data": {
133− "directory": ".opencode"
133+ "directory": ".crush"
134 },
134 },
135 "providers": {
135 "providers": {
136 "openai": {
136 "openai": {
@@ -248,13 +248,13 @@ OpenCode supports a variety of AI models from different providers:
248
248
249```bash
249```bash
250# Start OpenCode
250# Start OpenCode
251−opencode
251+crush
252
252
253# Start with debug logging
253# Start with debug logging
254−opencode -d
254+crush -d
255
255
256# Start with a specific working directory
256# Start with a specific working directory
257−opencode -c /path/to/project
257+crush -c /path/to/project
258```
258```
259
259
260## Non-interactive Prompt Mode
260## Non-interactive Prompt Mode
@@ -263,13 +263,13 @@ You can run OpenCode in non-interactive mode by passing a prompt directly as a c
263
263
264```bash
264```bash
265# Run a single prompt and print the AI's response to the terminal
265# Run a single prompt and print the AI's response to the terminal
266−opencode -p "Explain the use of context in Go"
266+crush -p "Explain the use of context in Go"
267
267
268# Get response in JSON format
268# Get response in JSON format
269−opencode -p "Explain the use of context in Go" -f json
269+crush -p "Explain the use of context in Go" -f json
270
270
271# Run without showing the spinner (useful for scripts)
271# Run without showing the spinner (useful for scripts)
272−opencode -p "Explain the use of context in Go" -q
272+crush -p "Explain the use of context in Go" -q
273```
273```
274
274
275In this mode, OpenCode will process your prompt, print the result to standard output, and then exit. All permissions are auto-approved for the session.
275In this mode, OpenCode will process your prompt, print the result to standard output, and then exit. All permissions are auto-approved for the session.
@@ -419,26 +419,26 @@ Custom commands are predefined prompts stored as Markdown files in one of three
4191. **User Commands** (prefixed with `user:`):
4191. **User Commands** (prefixed with `user:`):
420
420
421 ```
421 ```
422− $XDG_CONFIG_HOME/opencode/commands/
422+ $XDG_CONFIG_HOME/crush/commands/
423 ```
423 ```
424
424
425− (typically `~/.config/opencode/commands/` on Linux/macOS)
425+ (typically `~/.config/crush/commands/` on Linux/macOS)
426
426
427 or
427 or
428
428
429 ```
429 ```
430− $HOME/.opencode/commands/
430+ $HOME/.crush/commands/
431 ```
431 ```
432
432
4332. **Project Commands** (prefixed with `project:`):
4332. **Project Commands** (prefixed with `project:`):
434
434
435 ```
435 ```
436− <PROJECT DIR>/.opencode/commands/
436+ <PROJECT DIR>/.crush/commands/
437 ```
437 ```
438
438
439Each `.md` file in these directories becomes a custom command. The file name (without extension) becomes the command ID.
439Each `.md` file in these directories becomes a custom command. The file name (without extension) becomes the command ID.
440
440
441−For example, creating a file at `~/.config/opencode/commands/prime-context.md` with content:
441+For example, creating a file at `~/.config/crush/commands/prime-context.md` with content:
442
442
443```markdown
443```markdown
444RUN git ls-files
444RUN git ls-files
@@ -472,7 +472,7 @@ When you run a command with arguments, OpenCode will prompt you to enter values
472You can organize commands in subdirectories:
472You can organize commands in subdirectories:
473
473
474```
474```
475−~/.config/opencode/commands/git/commit.md
475+~/.config/crush/commands/git/commit.md
476```
476```
477
477
478This creates a command with ID `user:git:commit`.
478This creates a command with ID `user:git:commit`.
@@ -614,13 +614,13 @@ You can also configure a self-hosted model in the configuration file under the `
614```bash
614```bash
615# Clone the repository
615# Clone the repository
616git clone https://github.com/charmbracelet/crush.git
616git clone https://github.com/charmbracelet/crush.git
617−cd opencode
617+cd crush
618
618
619# Build
619# Build
620−go build -o opencode
620+go build -o crush
621
621
622# Run
622# Run
623−./opencode
623+./crush
624```
624```
625
625
626## Acknowledgments
626## Acknowledgments
cmd/root.go+7−7
@@ -21,29 +21,29 @@ import (
21)
21)
22
22
23var rootCmd = &cobra.Command{
23var rootCmd = &cobra.Command{
24− Use: "opencode",
24+ Use: "crush",
25 Short: "Terminal-based AI assistant for software development",
25 Short: "Terminal-based AI assistant for software development",
26 Long: `OpenCode is a powerful terminal-based AI assistant that helps with software development tasks.
26 Long: `OpenCode is a powerful terminal-based AI assistant that helps with software development tasks.
27It provides an interactive chat interface with AI capabilities, code analysis, and LSP integration
27It provides an interactive chat interface with AI capabilities, code analysis, and LSP integration
28to assist developers in writing, debugging, and understanding code directly from the terminal.`,
28to assist developers in writing, debugging, and understanding code directly from the terminal.`,
29 Example: `
29 Example: `
30 # Run in interactive mode
30 # Run in interactive mode
31− opencode
31+ crush
32
32
33 # Run with debug logging
33 # Run with debug logging
34− opencode -d
34+ crush -d
35
35
36 # Run with debug logging in a specific directory
36 # Run with debug logging in a specific directory
37− opencode -d -c /path/to/project
37+ crush -d -c /path/to/project
38
38
39 # Print version
39 # Print version
40− opencode -v
40+ crush -v
41
41
42 # Run a single non-interactive prompt
42 # Run a single non-interactive prompt
43− opencode -p "Explain the use of context in Go"
43+ crush -p "Explain the use of context in Go"
44
44
45 # Run a single non-interactive prompt with JSON output format
45 # Run a single non-interactive prompt with JSON output format
46− opencode -p "Explain the use of context in Go" -f json
46+ crush -p "Explain the use of context in Go" -f json
47 `,
47 `,
48 RunE: func(cmd *cobra.Command, args []string) error {
48 RunE: func(cmd *cobra.Command, args []string) error {
49 // If the help flag is set, show the help message
49 // If the help flag is set, show the help message
cmd/schema/README.md+3−3
@@ -5,7 +5,7 @@ This tool generates a JSON Schema for the OpenCode configuration file. The schem
5## Usage
5## Usage
6
6
7```bash
7```bash
8−go run cmd/schema/main.go > opencode-schema.json
8+go run cmd/schema/main.go > crush-schema.json
9```
9```
10
10
11This will generate a JSON Schema file that can be used to validate configuration files.
11This will generate a JSON Schema file that can be used to validate configuration files.
@@ -24,7 +24,7 @@ The generated schema includes:
24
24
25You can use the generated schema in several ways:
25You can use the generated schema in several ways:
26
26
27−1. **Editor Integration**: Many editors (VS Code, JetBrains IDEs, etc.) support JSON Schema for validation and autocompletion. You can configure your editor to use the generated schema for `.opencode.json` files.
27+1. **Editor Integration**: Many editors (VS Code, JetBrains IDEs, etc.) support JSON Schema for validation and autocompletion. You can configure your editor to use the generated schema for `.crush.json` files.
28
28
292. **Validation Tools**: You can use tools like [jsonschema](https://github.com/Julian/jsonschema) to validate your configuration files against the schema.
292. **Validation Tools**: You can use tools like [jsonschema](https://github.com/Julian/jsonschema) to validate your configuration files against the schema.
30
30
@@ -37,7 +37,7 @@ Here's an example configuration that conforms to the schema:
37```json
37```json
38{
38{
39 "data": {
39 "data": {
40− "directory": ".opencode"
40+ "directory": ".crush"
41 },
41 },
42 "debug": false,
42 "debug": false,
43 "providers": {
43 "providers": {
cmd/schema/main.go+5−5
@@ -52,7 +52,7 @@ func generateSchema() map[string]any {
52 "directory": map[string]any{
52 "directory": map[string]any{
53 "type": "string",
53 "type": "string",
54 "description": "Directory where application data is stored",
54 "description": "Directory where application data is stored",
55− "default": ".opencode",
55+ "default": ".crush",
56 },
56 },
57 },
57 },
58 "required": []string{"directory"},
58 "required": []string{"directory"},
@@ -89,8 +89,8 @@ func generateSchema() map[string]any {
89 ".cursor/rules/",
89 ".cursor/rules/",
90 "CLAUDE.md",
90 "CLAUDE.md",
91 "CLAUDE.local.md",
91 "CLAUDE.local.md",
92− "opencode.md",
92+ "crush.md",
93− "opencode.local.md",
93+ "crush.local.md",
94 "OpenCode.md",
94 "OpenCode.md",
95 "OpenCode.local.md",
95 "OpenCode.local.md",
96 "OPENCODE.md",
96 "OPENCODE.md",
@@ -105,9 +105,9 @@ func generateSchema() map[string]any {
105 "theme": map[string]any{
105 "theme": map[string]any{
106 "type": "string",
106 "type": "string",
107 "description": "TUI theme name",
107 "description": "TUI theme name",
108− "default": "opencode",
108+ "default": "crush",
109 "enum": []string{
109 "enum": []string{
110− "opencode",
110+ "crush",
111 "catppuccin",
111 "catppuccin",
112 "dracula",
112 "dracula",
113 "flexoki",
113 "flexoki",
cspell.json+1−1
@@ -1 +1 @@
1−{"flagWords":[],"language":"en","words":["opencode","charmbracelet","lipgloss","bubbletea","textinput","Focusable","lsps","Sourcegraph","filepicker","imageorient","rasterx","oksvg","termenv","trashhalo","lucasb","nfnt","srwiley","Lanczos"],"version":"0.2"}
1+{"flagWords":[],"language":"en","words":["crush","charmbracelet","lipgloss","bubbletea","textinput","Focusable","lsps","Sourcegraph","filepicker","imageorient","rasterx","oksvg","termenv","trashhalo","lucasb","nfnt","srwiley","Lanczos"],"version":"0.2"}
install+11−11
@@ -1,6 +1,6 @@
1#!/usr/bin/env bash
1#!/usr/bin/env bash
2set -euo pipefail
2set -euo pipefail
3−APP=opencode
3+APP=crush
4
4
5RED='\033[0;31m'
5RED='\033[0;31m'
6GREEN='\033[0;32m'
6GREEN='\033[0;32m'
@@ -36,7 +36,7 @@ case "$filename" in
36 ;;
36 ;;
37esac
37esac
38
38
39−INSTALL_DIR=$HOME/.opencode/bin
39+INSTALL_DIR=$HOME/.crush/bin
40mkdir -p "$INSTALL_DIR"
40mkdir -p "$INSTALL_DIR"
41
41
42if [ -z "$requested_version" ]; then
42if [ -z "$requested_version" ]; then
@@ -67,12 +67,12 @@ print_message() {
67}
67}
68
68
69check_version() {
69check_version() {
70− if command -v opencode >/dev/null 2>&1; then
70+ if command -v crush >/dev/null 2>&1; then
71− opencode_path=$(which opencode)
71+ crush_path=$(which crush)
72
72
73
73
74 ## TODO: check if version is installed
74 ## TODO: check if version is installed
75− # installed_version=$(opencode version)
75+ # installed_version=$(crush version)
76 installed_version="0.0.1"
76 installed_version="0.0.1"
77 installed_version=$(echo $installed_version | awk '{print $2}')
77 installed_version=$(echo $installed_version | awk '{print $2}')
78
78
@@ -86,11 +86,11 @@ check_version() {
86}
86}
87
87
88download_and_install() {
88download_and_install() {
89− print_message info "Downloading ${ORANGE}opencode ${GREEN}version: ${YELLOW}$specific_version ${GREEN}..."
89+ print_message info "Downloading ${ORANGE}crush ${GREEN}version: ${YELLOW}$specific_version ${GREEN}..."
90− mkdir -p opencodetmp && cd opencodetmp
90+ mkdir -p crushtmp && cd crushtmp
91 curl -# -L $url | tar xz
91 curl -# -L $url | tar xz
92− mv opencode $INSTALL_DIR
92+ mv crush $INSTALL_DIR
93− cd .. && rm -rf opencodetmp
93+ cd .. && rm -rf crushtmp
94}
94}
95
95
96check_version
96check_version
@@ -102,9 +102,9 @@ add_to_path() {
102 local command=$2
102 local command=$2
103
103
104 if [[ -w $config_file ]]; then
104 if [[ -w $config_file ]]; then
105− echo -e "\n# opencode" >> "$config_file"
105+ echo -e "\n# crush" >> "$config_file"
106 echo "$command" >> "$config_file"
106 echo "$command" >> "$config_file"
107− print_message info "Successfully added ${ORANGE}opencode ${GREEN}to \$PATH in $config_file"
107+ print_message info "Successfully added ${ORANGE}crush ${GREEN}to \$PATH in $config_file"
108 else
108 else
109 print_message warning "Manually add the directory to $config_file (or similar):"
109 print_message warning "Manually add the directory to $config_file (or similar):"
110 print_message info " $command"
110 print_message info " $command"
internal/config/config.go+5−5
@@ -97,9 +97,9 @@ type Config struct {
97
97
98// Application constants
98// Application constants
99const (
99const (
100− defaultDataDirectory = ".opencode"
100+ defaultDataDirectory = ".crush"
101 defaultLogLevel = "info"
101 defaultLogLevel = "info"
102− appName = "opencode"
102+ appName = "crush"
103
103
104 MaxTokensFallbackDefault = 4096
104 MaxTokensFallbackDefault = 4096
105)
105)
@@ -110,8 +110,8 @@ var defaultContextPaths = []string{
110 ".cursor/rules/",
110 ".cursor/rules/",
111 "CLAUDE.md",
111 "CLAUDE.md",
112 "CLAUDE.local.md",
112 "CLAUDE.local.md",
113− "opencode.md",
113+ "crush.md",
114− "opencode.local.md",
114+ "crush.local.md",
115 "OpenCode.md",
115 "OpenCode.md",
116 "OpenCode.local.md",
116 "OpenCode.local.md",
117 "OPENCODE.md",
117 "OPENCODE.md",
@@ -221,7 +221,7 @@ func configureViper() {
221func setDefaults(debug bool) {
221func setDefaults(debug bool) {
222 viper.SetDefault("data.directory", defaultDataDirectory)
222 viper.SetDefault("data.directory", defaultDataDirectory)
223 viper.SetDefault("contextPaths", defaultContextPaths)
223 viper.SetDefault("contextPaths", defaultContextPaths)
224− viper.SetDefault("tui.theme", "opencode")
224+ viper.SetDefault("tui.theme", "crush")
225 viper.SetDefault("autoCompact", true)
225 viper.SetDefault("autoCompact", true)
226
226
227 // Set default shell from environment or fallback to /bin/bash
227 // Set default shell from environment or fallback to /bin/bash
internal/db/connect.go+1−1
@@ -23,7 +23,7 @@ func Connect() (*sql.DB, error) {
23 if err := os.MkdirAll(dataDir, 0o700); err != nil {
23 if err := os.MkdirAll(dataDir, 0o700); err != nil {
24 return nil, fmt.Errorf("failed to create data directory: %w", err)
24 return nil, fmt.Errorf("failed to create data directory: %w", err)
25 }
25 }
26− dbPath := filepath.Join(dataDir, "opencode.db")
26+ dbPath := filepath.Join(dataDir, "crush.db")
27 // Open the SQLite database
27 // Open the SQLite database
28 db, err := sql.Open("sqlite3", dbPath)
28 db, err := sql.Open("sqlite3", dbPath)
29 if err != nil {
29 if err != nil {
internal/fileutil/fileutil.go+1−1
@@ -67,7 +67,7 @@ func SkipHidden(path string) bool {
67 }
67 }
68
68
69 commonIgnoredDirs := map[string]bool{
69 commonIgnoredDirs := map[string]bool{
70− ".opencode": true,
70+ ".crush": true,
71 "node_modules": true,
71 "node_modules": true,
72 "vendor": true,
72 "vendor": true,
73 "dist": true,
73 "dist": true,
internal/fileutil/ls.go+1−1
@@ -64,7 +64,7 @@ var CommonIgnorePatterns = []string{
64 ".fseventsd",
64 ".fseventsd",
65
65
66 // OpenCode
66 // OpenCode
67− ".opencode",
67+ ".crush",
68}
68}
69
69
70type DirectoryLister struct {
70type DirectoryLister struct {
internal/llm/prompt/coder.go+2−2
@@ -33,7 +33,7 @@ You can:
33- Apply patches, run commands, and manage user approvals based on policy.
33- Apply patches, run commands, and manage user approvals based on policy.
34- Work inside a sandboxed, git-backed workspace with rollback support.
34- Work inside a sandboxed, git-backed workspace with rollback support.
35- Log telemetry so sessions can be replayed or inspected later.
35- Log telemetry so sessions can be replayed or inspected later.
36−- More details on your functionality are available at "opencode --help"
36+- More details on your functionality are available at "crush --help"
37
37
38
38
39You are an agent - please keep going until the user's query is completely resolved, before ending your turn and yielding back to the user. Only terminate your turn when you are sure that the problem is solved. If you are not sure about file content or codebase structure pertaining to the user's request, use your tools to read files and gather the relevant information: do NOT guess or make up an answer.
39You are an agent - please keep going until the user's query is completely resolved, before ending your turn and yielding back to the user. Only terminate your turn when you are sure that the problem is solved. If you are not sure about file content or codebase structure pertaining to the user's request, use your tools to read files and gather the relevant information: do NOT guess or make up an answer.
@@ -156,7 +156,7 @@ The user will primarily request you perform software engineering tasks. This inc
1561. Use the available search tools to understand the codebase and the user's query.
1561. Use the available search tools to understand the codebase and the user's query.
1572. Implement the solution using all tools available to you
1572. Implement the solution using all tools available to you
1583. Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.
1583. Verify the solution if possible with tests. NEVER assume specific test framework or test script. Check the README or search codebase to determine the testing approach.
159−4. VERY IMPORTANT: When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to opencode.md so that you will know to run it next time.
159+4. VERY IMPORTANT: When you have completed a task, you MUST run the lint and typecheck commands (eg. npm run lint, npm run typecheck, ruff, etc.) if they were provided to you to ensure your code is correct. If you are unable to find the correct command, ask the user for the command to run and if they supply it, proactively suggest writing it to crush.md so that you will know to run it next time.
160
160
161NEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked, otherwise the user will feel that you are being too proactive.
161NEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked, otherwise the user will feel that you are being too proactive.
162
162
internal/llm/provider/provider.go+1−1
@@ -130,7 +130,7 @@ func NewProvider(providerName models.ModelProvider, opts ...ProviderClientOption
130 clientOptions.openaiOptions = append(clientOptions.openaiOptions,
130 clientOptions.openaiOptions = append(clientOptions.openaiOptions,
131 WithOpenAIBaseURL("https://openrouter.ai/api/v1"),
131 WithOpenAIBaseURL("https://openrouter.ai/api/v1"),
132 WithOpenAIExtraHeaders(map[string]string{
132 WithOpenAIExtraHeaders(map[string]string{
133− "HTTP-Referer": "opencode.ai",
133+ "HTTP-Referer": "crush.ai",
134 "X-Title": "OpenCode",
134 "X-Title": "OpenCode",
135 }),
135 }),
136 )
136 )
internal/llm/tools/bash.go+5−5
@@ -122,16 +122,16 @@ When the user asks you to create a new git commit, follow these steps carefully:
122</commit_analysis>
122</commit_analysis>
123
123
1244. Create the commit with a message ending with:
1244. Create the commit with a message ending with:
125−🤖 Generated with opencode
125+🤖 Generated with crush
126−Co-Authored-By: opencode <noreply@opencode.ai>
126+Co-Authored-By: crush <noreply@crush.ai>
127
127
128- In order to ensure good formatting, ALWAYS pass the commit message via a HEREDOC, a la this example:
128- In order to ensure good formatting, ALWAYS pass the commit message via a HEREDOC, a la this example:
129<example>
129<example>
130git commit -m "$(cat <<'EOF'
130git commit -m "$(cat <<'EOF'
131 Commit message here.
131 Commit message here.
132
132
133− 🤖 Generated with opencode
133+ 🤖 Generated with crush
134− Co-Authored-By: opencode <noreply@opencode.ai>
134+ Co-Authored-By: crush <noreply@crush.ai>
135 EOF
135 EOF
136 )"
136 )"
137</example>
137</example>
@@ -193,7 +193,7 @@ gh pr create --title "the pr title" --body "$(cat <<'EOF'
193## Test plan
193## Test plan
194[Checklist of TODOs for testing the pull request...]
194[Checklist of TODOs for testing the pull request...]
195
195
196−🤖 Generated with opencode
196+🤖 Generated with crush
197EOF
197EOF
198)"
198)"
199</example>
199</example>
internal/llm/tools/fetch.go+1−1
@@ -152,7 +152,7 @@ func (t *fetchTool) Run(ctx context.Context, call ToolCall) (ToolResponse, error
152 return ToolResponse{}, fmt.Errorf("failed to create request: %w", err)
152 return ToolResponse{}, fmt.Errorf("failed to create request: %w", err)
153 }
153 }
154
154
155− req.Header.Set("User-Agent", "opencode/1.0")
155+ req.Header.Set("User-Agent", "crush/1.0")
156
156
157 resp, err := client.Do(req)
157 resp, err := client.Do(req)
158 if err != nil {
158 if err != nil {
internal/llm/tools/shell/shell.go+4−4
@@ -149,10 +149,10 @@ func (s *PersistentShell) execCommand(command string, timeout time.Duration, ctx
149 }
149 }
150
150
151 tempDir := os.TempDir()
151 tempDir := os.TempDir()
152− stdoutFile := filepath.Join(tempDir, fmt.Sprintf("opencode-stdout-%d", time.Now().UnixNano()))
152+ stdoutFile := filepath.Join(tempDir, fmt.Sprintf("crush-stdout-%d", time.Now().UnixNano()))
153− stderrFile := filepath.Join(tempDir, fmt.Sprintf("opencode-stderr-%d", time.Now().UnixNano()))
153+ stderrFile := filepath.Join(tempDir, fmt.Sprintf("crush-stderr-%d", time.Now().UnixNano()))
154− statusFile := filepath.Join(tempDir, fmt.Sprintf("opencode-status-%d", time.Now().UnixNano()))
154+ statusFile := filepath.Join(tempDir, fmt.Sprintf("crush-status-%d", time.Now().UnixNano()))
155− cwdFile := filepath.Join(tempDir, fmt.Sprintf("opencode-cwd-%d", time.Now().UnixNano()))
155+ cwdFile := filepath.Join(tempDir, fmt.Sprintf("crush-cwd-%d", time.Now().UnixNano()))
156
156
157 defer func() {
157 defer func() {
158 os.Remove(stdoutFile)
158 os.Remove(stdoutFile)
internal/llm/tools/sourcegraph.go+1−1
@@ -218,7 +218,7 @@ func (t *sourcegraphTool) Run(ctx context.Context, call ToolCall) (ToolResponse,
218 }
218 }
219
219
220 req.Header.Set("Content-Type", "application/json")
220 req.Header.Set("Content-Type", "application/json")
221− req.Header.Set("User-Agent", "opencode/1.0")
221+ req.Header.Set("User-Agent", "crush/1.0")
222
222
223 resp, err := client.Do(req)
223 resp, err := client.Do(req)
224 if err != nil {
224 if err != nil {
internal/logging/logger.go+1−1
@@ -54,7 +54,7 @@ func RecoverPanic(name string, cleanup func()) {
54
54
55 // Create a timestamped panic log file
55 // Create a timestamped panic log file
56 timestamp := time.Now().Format("20060102-150405")
56 timestamp := time.Now().Format("20060102-150405")
57− filename := fmt.Sprintf("opencode-panic-%s-%s.log", name, timestamp)
57+ filename := fmt.Sprintf("crush-panic-%s-%s.log", name, timestamp)
58
58
59 file, err := os.Create(filename)
59 file, err := os.Create(filename)
60 if err != nil {
60 if err != nil {
internal/tui/components/dialogs/commands/commands.go+1−1
@@ -233,7 +233,7 @@ func (c *commandDialogCmp) defaultCommands() []Command {
233 2. Code style guidelines including imports, formatting, types, naming conventions, error handling, etc.
233 2. Code style guidelines including imports, formatting, types, naming conventions, error handling, etc.
234
234
235 The file you create will be given to agentic coding agents (such as yourself) that operate in this repository. Make it about 20 lines long.
235 The file you create will be given to agentic coding agents (such as yourself) that operate in this repository. Make it about 20 lines long.
236− If there's already a opencode.md, improve it.
236+ If there's already a crush.md, improve it.
237 If there are Cursor rules (in .cursor/rules/ or .cursorrules) or Copilot rules (in .github/copilot-instructions.md), make sure to include them.`
237 If there are Cursor rules (in .cursor/rules/ or .cursorrules) or Copilot rules (in .github/copilot-instructions.md), make sure to include them.`
238 return tea.Batch(
238 return tea.Batch(
239 util.CmdHandler(chat.SendMsg{
239 util.CmdHandler(chat.SendMsg{
internal/tui/components/dialogs/commands/loader.go+2−2
@@ -56,7 +56,7 @@ func buildCommandSources(cfg *config.Config) []commandSource {
56 // Home directory
56 // Home directory
57 if home, err := os.UserHomeDir(); err == nil {
57 if home, err := os.UserHomeDir(); err == nil {
58 sources = append(sources, commandSource{
58 sources = append(sources, commandSource{
59− path: filepath.Join(home, ".opencode", "commands"),
59+ path: filepath.Join(home, ".crush", "commands"),
60 prefix: UserCommandPrefix,
60 prefix: UserCommandPrefix,
61 })
61 })
62 }
62 }
@@ -78,7 +78,7 @@ func getXDGCommandsDir() string {
78 }
78 }
79 }
79 }
80 if xdgHome != "" {
80 if xdgHome != "" {
81− return filepath.Join(xdgHome, "opencode", "commands")
81+ return filepath.Join(xdgHome, "crush", "commands")
82 }
82 }
83 return ""
83 return ""
84}
84}
opencode-schema.json+5−5
@@ -216,8 +216,8 @@
216 ".cursor/rules/",
216 ".cursor/rules/",
217 "CLAUDE.md",
217 "CLAUDE.md",
218 "CLAUDE.local.md",
218 "CLAUDE.local.md",
219− "opencode.md",
219+ "crush.md",
220− "opencode.local.md",
220+ "crush.local.md",
221 "OpenCode.md",
221 "OpenCode.md",
222 "OpenCode.local.md",
222 "OpenCode.local.md",
223 "OPENCODE.md",
223 "OPENCODE.md",
@@ -233,7 +233,7 @@
233 "description": "Storage configuration",
233 "description": "Storage configuration",
234 "properties": {
234 "properties": {
235 "directory": {
235 "directory": {
236− "default": ".opencode",
236+ "default": ".crush",
237 "description": "Directory where application data is stored",
237 "description": "Directory where application data is stored",
238 "type": "string"
238 "type": "string"
239 }
239 }
@@ -374,10 +374,10 @@
374 "description": "Terminal User Interface configuration",
374 "description": "Terminal User Interface configuration",
375 "properties": {
375 "properties": {
376 "theme": {
376 "theme": {
377− "default": "opencode",
377+ "default": "crush",
378 "description": "TUI theme name",
378 "description": "TUI theme name",
379 "enum": [
379 "enum": [
380− "opencode",
380+ "crush",
381 "catppuccin",
381 "catppuccin",
382 "dracula",
382 "dracula",
383 "flexoki",
383 "flexoki",