Initial commit
This commit is contained in:
commit
c878e5e35f
92
.gitignore
vendored
Normal file
92
.gitignore
vendored
Normal file
@ -0,0 +1,92 @@
|
||||
# Dotfiles gitignore
|
||||
# Comprehensive ignore patterns for development environments
|
||||
|
||||
# ================================
|
||||
# Build artifacts and caches
|
||||
# ================================
|
||||
**/build/
|
||||
!src/**/build/
|
||||
**/dist/
|
||||
**/node_modules/
|
||||
**/__pycache__/
|
||||
**/*.pyc
|
||||
**/*.pyo
|
||||
**/.cache/
|
||||
|
||||
# ================================
|
||||
# IDE and Editor files
|
||||
# ================================
|
||||
# Eclipse
|
||||
.project
|
||||
.classpath
|
||||
.metadata/
|
||||
.settings/
|
||||
bin/
|
||||
|
||||
# IntelliJ IDEA
|
||||
.idea/
|
||||
**/*.iml
|
||||
**/*.iws
|
||||
|
||||
# VS Code
|
||||
.vscode/
|
||||
**/*.code-workspace
|
||||
|
||||
# Vim
|
||||
**/*.swp
|
||||
**/*.swo
|
||||
**/*~
|
||||
|
||||
# Emacs
|
||||
**/*~
|
||||
**/#*#
|
||||
**/.#*
|
||||
|
||||
# ================================
|
||||
# OS generated files
|
||||
# ================================
|
||||
.DS_Store
|
||||
.DS_Store?
|
||||
**/.DS_Store
|
||||
**/Thumbs.db
|
||||
**/desktop.ini
|
||||
|
||||
# ================================
|
||||
# Temporary and log files
|
||||
# ================================
|
||||
**/*.log
|
||||
**/*.tmp
|
||||
**/*.temp
|
||||
**/*.bak
|
||||
**/*.backup
|
||||
**/*.orig
|
||||
|
||||
# ================================
|
||||
# Security and credentials
|
||||
# ================================
|
||||
**/.netrc
|
||||
**/id_rsa
|
||||
**/id_rsa_*
|
||||
**/id_rsa.pub
|
||||
**/known_hosts
|
||||
**/*.pem
|
||||
**/*.key
|
||||
**/*.p12
|
||||
**/*.pfx
|
||||
|
||||
# ================================
|
||||
# Large binary files
|
||||
# ================================
|
||||
**/*.iso
|
||||
**/*.dmg
|
||||
**/*.exe
|
||||
**/*.msi
|
||||
**/*.deb
|
||||
**/*.rpm
|
||||
|
||||
# ================================
|
||||
# Backup files created by scripts
|
||||
# ================================
|
||||
.dotfiles-backup-*/
|
||||
**/*.backup
|
||||
.gitignore.backup
|
||||
53
AGENTS.md
Normal file
53
AGENTS.md
Normal file
@ -0,0 +1,53 @@
|
||||
# dotfiles repo agent guide
|
||||
|
||||
This repo is a collection of personal config files deployed via GNU Stow.
|
||||
|
||||
## How it works
|
||||
|
||||
- Each subdirectory is a **stow package**: `bash`, `zsh`, `git`, `ghostty`, `starship`, `tmux`, `lazygit`, `zed`, `opencode`.
|
||||
- Directory structure mirrors `$HOME` (e.g. `git/.gitconfig` → `~/.gitconfig`).
|
||||
|
||||
## Commands
|
||||
|
||||
```bash
|
||||
# Deploy all packages (auto-installs stow via apt if missing)
|
||||
./setup.sh
|
||||
|
||||
# Selective install
|
||||
./setup.sh --only=git,zsh
|
||||
|
||||
# Preview without changes
|
||||
./setup.sh --dry-run
|
||||
|
||||
# Remove symlinks
|
||||
./uninstall.sh
|
||||
./uninstall.sh --only=git # selective removal
|
||||
```
|
||||
|
||||
All scripts accept `--verbose`, `--quiet`, `--dry-run`.
|
||||
|
||||
## Adding a new package
|
||||
|
||||
```bash
|
||||
mkdir <name>
|
||||
cp ~/.<configfile> <name>/
|
||||
./setup.sh --only=<name>
|
||||
```
|
||||
|
||||
## Toolchain auto-installed by setup.sh
|
||||
|
||||
`setup.sh` installs these tools to `~/.local/bin` if not already present — do not add manual install steps for them: **zinit** (zsh plugin manager), **zoxide** (smart cd), **fzf**, **bat**, **eza**, **delta**, **tmux**, **lazygit**, **ripgrep**.
|
||||
|
||||
## Theming convention
|
||||
|
||||
All tools are themed with **Gruvbox Dark Hard**. When adding config for a new tool, apply Gruvbox colors to keep the environment cohesive.
|
||||
|
||||
## Important constraints
|
||||
|
||||
- Default shell is **zsh** (`bash/.bashrc` does NOT exec zsh — set your default shell with `chsh`). Uses **zinit** as plugin manager (turbo mode for async loading).
|
||||
- `.bashrc` sources `~/.bash_aliases`; `.zshrc` sources `~/.zsh_aliases`.
|
||||
- **zoxide** replaces `cd` for directory jumping (frecency-based, auto-tracked via chpwd hook). `j` alias for `zoxide cd`.
|
||||
- **Sensitive files are gitignored**: `.netrc`, SSH keys (`id_rsa*`, `known_hosts`), gradle caches.
|
||||
- The `opencode/` package stows OpenCode's own config (`~/.config/opencode/`). Do not treat it as a repo instruction file — that file is `AGENTS.md` at the repo root.
|
||||
- No build, test, lint, or typecheck steps — this is pure config.
|
||||
- Backups of pre-existing real files are created at `~/.dotfiles-backup-YYYYMMDD-HHMMSS` before stowing.
|
||||
55
README.md
Normal file
55
README.md
Normal file
@ -0,0 +1,55 @@
|
||||
# Dotfiles
|
||||
|
||||
Personal dotfiles managed with GNU Stow. Themed with **Gruvbox Dark Hard**.
|
||||
|
||||
## Packages
|
||||
|
||||
| Package | Description |
|
||||
|---------|-------------|
|
||||
| `bash` | Bash configuration |
|
||||
| `zsh` | Zsh configuration with zinit plugin manager |
|
||||
| `git` | Git configuration with delta pager |
|
||||
| `ghostty` | Ghostty terminal config |
|
||||
| `starship` | Cross-shell prompt |
|
||||
| `tmux` | Terminal multiplexer config |
|
||||
| `lazygit` | Git TUI config |
|
||||
| `zed` | Zed editor config |
|
||||
| `opencode` | OpenCode AI config |
|
||||
|
||||
## Quick Start
|
||||
|
||||
```bash
|
||||
# Deploy all packages
|
||||
./setup.sh
|
||||
|
||||
# Selective install
|
||||
./setup.sh --only=git,zsh
|
||||
|
||||
# Preview without changes
|
||||
./setup.sh --dry-run
|
||||
|
||||
# Remove symlinks
|
||||
./uninstall.sh
|
||||
./uninstall.sh --only=git
|
||||
```
|
||||
|
||||
## Toolchain
|
||||
|
||||
`setup.sh` auto-installs these tools to `~/.local/bin` if missing:
|
||||
- **zinit** (zsh plugin manager)
|
||||
- **zoxide** (smart cd)
|
||||
- **fzf** (fuzzy finder)
|
||||
- **bat** (syntax-highlighted cat)
|
||||
- **eza** (modern ls)
|
||||
- **delta** (better git diff)
|
||||
- **tmux** (terminal multiplexer)
|
||||
- **lazygit** (git TUI)
|
||||
- **ripgrep** (fast grep)
|
||||
|
||||
## Theming
|
||||
|
||||
All tools are themed with **Gruvbox Dark Hard** for a cohesive appearance.
|
||||
|
||||
## SSH & Netrc
|
||||
|
||||
SSH config and `.netrc` are **not** included in this repo. Manage those separately for security.
|
||||
132
bash/.bashrc
Normal file
132
bash/.bashrc
Normal file
@ -0,0 +1,132 @@
|
||||
# ~/.bashrc: executed by bash(1) for non-login shells.
|
||||
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
|
||||
# for examples
|
||||
|
||||
# If not running interactively, don't do anything
|
||||
case $- in
|
||||
*i*) ;;
|
||||
*) return;;
|
||||
esac
|
||||
|
||||
# don't put duplicate lines or lines starting with space in the history.
|
||||
# See bash(1) for more options
|
||||
HISTCONTROL=ignoreboth
|
||||
|
||||
# append to the history file, don't overwrite it
|
||||
shopt -s histappend
|
||||
|
||||
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
|
||||
HISTSIZE=1000
|
||||
HISTFILESIZE=2000
|
||||
|
||||
# check the window size after each command and, if necessary,
|
||||
# update the values of LINES and COLUMNS.
|
||||
shopt -s checkwinsize
|
||||
|
||||
# If set, the pattern "**" used in a pathname expansion context will
|
||||
# match all files and zero or more directories and subdirectories.
|
||||
#shopt -s globstar
|
||||
|
||||
# make less more friendly for non-text input files, see lesspipe(1)
|
||||
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
|
||||
|
||||
# set variable identifying the chroot you work in (used in the prompt below)
|
||||
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
|
||||
debian_chroot=$(cat /etc/debian_chroot)
|
||||
fi
|
||||
|
||||
# set a fancy prompt (non-color, unless we know we "want" color)
|
||||
case "$TERM" in
|
||||
xterm-color|*-256color) color_prompt=yes;;
|
||||
esac
|
||||
|
||||
# uncomment for a colored prompt, if the terminal has the capability; turned
|
||||
# off by default to not distract the user: the focus in a terminal window
|
||||
# should be on the output of commands, not on the prompt
|
||||
#force_color_prompt=yes
|
||||
|
||||
if [ -n "$force_color_prompt" ]; then
|
||||
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
|
||||
# We have color support; assume it's compliant with Ecma-48
|
||||
# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
|
||||
# a case would tend to support setf rather than setaf.)
|
||||
color_prompt=yes
|
||||
else
|
||||
color_prompt=
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$color_prompt" = yes ]; then
|
||||
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
|
||||
else
|
||||
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
|
||||
fi
|
||||
unset color_prompt force_color_prompt
|
||||
|
||||
# If this is an xterm set the title to user@host:dir
|
||||
case "$TERM" in
|
||||
xterm*|rxvt*)
|
||||
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
|
||||
# enable color support of ls and also add handy aliases
|
||||
if [ -x /usr/bin/dircolors ]; then
|
||||
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
|
||||
alias ls='ls --color=auto'
|
||||
#alias dir='dir --color=auto'
|
||||
#alias vdir='vdir --color=auto'
|
||||
|
||||
alias grep='grep --color=auto'
|
||||
alias fgrep='fgrep --color=auto'
|
||||
alias egrep='egrep --color=auto'
|
||||
fi
|
||||
|
||||
# colored GCC warnings and errors
|
||||
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
|
||||
|
||||
# some more ls aliases
|
||||
alias ll='ls -alF'
|
||||
alias la='ls -A'
|
||||
alias l='ls -CF'
|
||||
|
||||
# Add an "alert" alias for long running commands. Use like so:
|
||||
# sleep 10; alert
|
||||
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
|
||||
|
||||
# Alias definitions.
|
||||
# You may want to put all your additions into a separate file like
|
||||
# ~/.bash_aliases, instead of adding them here directly.
|
||||
# See /usr/share/doc/bash-doc/examples in the bash-doc package.
|
||||
|
||||
if [ -f ~/.bash_aliases ]; then
|
||||
. ~/.bash_aliases
|
||||
fi
|
||||
|
||||
# enable programmable completion features (you don't need to enable
|
||||
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
|
||||
# sources /etc/bash.bashrc).
|
||||
if ! shopt -oq posix; then
|
||||
if [ -f /usr/share/bash-completion/bash_completion ]; then
|
||||
. /usr/share/bash-completion/bash_completion
|
||||
elif [ -f /etc/bash_completion ]; then
|
||||
. /etc/bash_completion
|
||||
fi
|
||||
fi
|
||||
|
||||
export PATH=/home/mikjoh/.local/bin:/usr/local/go/bin:$PATH
|
||||
|
||||
. "$HOME/.atuin/bin/env"
|
||||
|
||||
[[ -f ~/.bash-preexec.sh ]] && source ~/.bash-preexec.sh
|
||||
eval "$(atuin init bash)"
|
||||
|
||||
export NVM_DIR="$HOME/.nvm"
|
||||
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
|
||||
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
|
||||
|
||||
# bun
|
||||
export BUN_INSTALL="$HOME/.bun"
|
||||
export PATH="$BUN_INSTALL/bin:$PATH"
|
||||
8
ghostty/.config/ghostty/config
Normal file
8
ghostty/.config/ghostty/config
Normal file
@ -0,0 +1,8 @@
|
||||
theme = GruvboxDarkHard
|
||||
font-family = JetBrainsMono Nerd Font
|
||||
font-size = 10
|
||||
window-padding-x = 8
|
||||
window-padding-y = 8
|
||||
scrollback-limit = 10000
|
||||
|
||||
shell-integration = zsh
|
||||
66
git/.gitconfig
Normal file
66
git/.gitconfig
Normal file
@ -0,0 +1,66 @@
|
||||
# This is Git's per-user configuration file.
|
||||
[user]
|
||||
name = Mikael Johansson
|
||||
email = mikael@thematrix.se
|
||||
|
||||
[core]
|
||||
editor = nano
|
||||
pager = delta
|
||||
|
||||
[interactive]
|
||||
diffFilter = delta --color-only
|
||||
|
||||
[delta]
|
||||
side-by-side = true
|
||||
line-numbers = true
|
||||
navigate = true
|
||||
syntax-theme = "Gruvbox Dark"
|
||||
plus-color = "#b8bb26"
|
||||
minus-color = "#fb4934"
|
||||
|
||||
[init]
|
||||
defaultBranch = main
|
||||
|
||||
[safe]
|
||||
directory = /tank/docker
|
||||
|
||||
[push]
|
||||
default = simple
|
||||
autoSetupRemote = true
|
||||
|
||||
[pull]
|
||||
rebase = true
|
||||
|
||||
[fetch]
|
||||
prune = true
|
||||
|
||||
[rebase]
|
||||
autoSquash = true
|
||||
autoStash = true
|
||||
|
||||
[rerere]
|
||||
enabled = true
|
||||
|
||||
[diff]
|
||||
colorMoved = default
|
||||
|
||||
[branch]
|
||||
sort = -committerdate
|
||||
|
||||
[alias]
|
||||
st = status --short --branch
|
||||
ci = commit
|
||||
co = checkout
|
||||
br = branch
|
||||
lg = log --graph --pretty=format:'%C(auto)%h%d %s%n %C(yellow)(%ar) by %an%Creset%n %C(white)%Creset' --all
|
||||
ll = lg --stat
|
||||
ls = lg --simplify-by-decoration
|
||||
undo = reset HEAD~1 --mixed
|
||||
amend = commit --amend --no-edit
|
||||
wip = commit -m "WIP"
|
||||
unstage = reset HEAD --
|
||||
stage = add
|
||||
last = log -1 HEAD --stat
|
||||
diffs = diff --stat
|
||||
fixup = commit --fixup
|
||||
aliases = config --get-regexp alias
|
||||
23
lazygit/.config/lazygit/config.yml
Normal file
23
lazygit/.config/lazygit/config.yml
Normal file
@ -0,0 +1,23 @@
|
||||
gui:
|
||||
theme:
|
||||
lightTheme: false
|
||||
activeBorderColor:
|
||||
- '#d3869b'
|
||||
- bold
|
||||
inactiveBorderColor:
|
||||
- '#7c6f64'
|
||||
searchingActiveBorderColor:
|
||||
- '#fabd2f'
|
||||
- bold
|
||||
optionsTextColor:
|
||||
- '#83a598'
|
||||
selectedLineBgColor:
|
||||
- '#3c3836'
|
||||
cherryPickedCommitBgColor:
|
||||
- '#d3869b'
|
||||
cherryPickedCommitFgColor:
|
||||
- '#1d2021'
|
||||
unstagedChangesColor:
|
||||
- '#fb4934'
|
||||
defaultFgColor:
|
||||
- '#ebdbb2'
|
||||
9
opencode/.config/opencode/AGENTS.md
Normal file
9
opencode/.config/opencode/AGENTS.md
Normal file
@ -0,0 +1,9 @@
|
||||
# Claude-Mem Memory Context
|
||||
|
||||
<claude-mem-context>
|
||||
# Memory Context from Past Sessions
|
||||
|
||||
*No context yet. Complete your first session and context will appear here.*
|
||||
|
||||
Use claude-mem search tools for manual memory queries.
|
||||
</claude-mem-context>
|
||||
20
opencode/.config/opencode/agents/architect.md
Normal file
20
opencode/.config/opencode/agents/architect.md
Normal file
@ -0,0 +1,20 @@
|
||||
---
|
||||
description: High-level system design and architectural analysis.
|
||||
mode: primary
|
||||
model: ollama-local/qwen3.5:9b #anthropic/claude-3-5-sonnet
|
||||
temperature: 0.2
|
||||
tools:
|
||||
write: true
|
||||
edit: true
|
||||
bash: true
|
||||
permission:
|
||||
edit: allow
|
||||
bash:
|
||||
"*": ask
|
||||
"git status": allow
|
||||
---
|
||||
# System Architect Instructions
|
||||
You are an expert software architect.
|
||||
- Prioritize modularity and scalability in all suggestions.
|
||||
- When proposing changes, always check existing architectural patterns in the codebase.
|
||||
- Use the `bash` tool to verify dependency trees before suggesting new libraries.
|
||||
76
opencode/.config/opencode/agents/doc-agent.md
Normal file
76
opencode/.config/opencode/agents/doc-agent.md
Normal file
@ -0,0 +1,76 @@
|
||||
---
|
||||
description: AI assistant specialized in creating and maintaining API documentation, README files, and technical guides for the x-call project
|
||||
mode: primary
|
||||
model: "github-copilot/claude-sonnet-4.6"
|
||||
temperature: 0.1
|
||||
tools:
|
||||
write: true
|
||||
edit: true
|
||||
bash: true
|
||||
permission:
|
||||
edit: allow
|
||||
bash:
|
||||
"*": ask
|
||||
"git status": allow
|
||||
---
|
||||
You are an expert technical writer for this project.
|
||||
|
||||
## Persona
|
||||
- You specialize in writing clear, developer-friendly documentation for APIs, SDKs, and internal services
|
||||
- You understand the x-call codebase architecture and translate complex features into accessible guides
|
||||
- Your output: API documentation, architecture diagrams, setup guides, and troubleshooting docs that developers can quickly understand and implement
|
||||
|
||||
## Project knowledge
|
||||
- **Tech Stack:** Kotlin, Java, Gradle, Android, Markdown (for documentation), Mermaid (for creating diagrams)
|
||||
- **Repository:** x-call (BMW Group internal telematics application)
|
||||
- **File Structure:**
|
||||
- `app/` – Main Android application source code
|
||||
- `app/src/main/` – Core application code (Kotlin/Java)
|
||||
- `app/src/test/` – Unit tests
|
||||
- `app/src/androidTest/` – Android instrumentation tests
|
||||
- `connection/` – Connection modules (interfaces, joynr, mcp)
|
||||
- `core/` – Core library modules
|
||||
- `remotediagnosis/` – Remote diagnosis functionality
|
||||
- `docs/` – Project documentation
|
||||
|
||||
## Tools you can use
|
||||
- **Build:** `./gradlew build` (compiles Kotlin/Java, runs tests)
|
||||
- **Test:** `./gradlew test` (runs unit tests)
|
||||
- **Android Test:** `./gradlew connectedAndroidTest` (runs instrumentation tests)
|
||||
- **Lint:** `./gradlew lint` (checks code quality)
|
||||
- **Clean:** `./gradlew clean` (removes build artifacts)
|
||||
|
||||
## Standards
|
||||
|
||||
Follow these rules for all documentation you write:
|
||||
|
||||
**Documentation style:**
|
||||
- Use clear, concise language avoiding jargon where possible
|
||||
- Include code examples with proper syntax highlighting
|
||||
- Structure docs with headings, lists, and callout boxes
|
||||
- Keep API docs consistent with project conventions
|
||||
- Reference existing documentation in `docs/` and `README.md`
|
||||
|
||||
**Code examples in docs:**
|
||||
```kotlin
|
||||
// ✅ Good - clear intent, proper error handling
|
||||
fun getUserById(id: String): User {
|
||||
if (id.isBlank()) throw IllegalArgumentException("User ID required")
|
||||
return userRepository.findById(id) ?: throw NotFoundException()
|
||||
}
|
||||
|
||||
// ❌ Bad - unclear, missing validation
|
||||
fun getUser(x) {
|
||||
return userRepository.find(x)
|
||||
}
|
||||
```
|
||||
|
||||
**Naming conventions:**
|
||||
- Functions: camelCase (`getUserData`, `fetchTelemetry`)
|
||||
- Classes: PascalCase (`UserService`, `TelemetryController`)
|
||||
- Constants: UPPER_SNAKE_CASE (`API_KEY`, `MAX_RETRIES`)
|
||||
|
||||
## Boundaries
|
||||
- ✅ **Always:** Write to `docs/`, follow markdown best practices, keep docs in sync with code changes, reference CHANGELOG files
|
||||
- ⚠️ **Ask first:** Major documentation restructuring, adding new doc sections, API contract changes, modifying README.md
|
||||
- 🚫 **Never:** Commit internal URLs, remove existing documentation without approval, modify source code logic, edit `build/`
|
||||
25
opencode/.config/opencode/agents/reviewer.md
Normal file
25
opencode/.config/opencode/agents/reviewer.md
Normal file
@ -0,0 +1,25 @@
|
||||
---
|
||||
description: Reviews code for quality and best practices
|
||||
mode: subagent
|
||||
model: ollama-local/qwen3.5:9b #openai/gpt-5.3-codex
|
||||
temperature: 0.1
|
||||
tools:
|
||||
write: false
|
||||
edit: false
|
||||
bash: true
|
||||
permission:
|
||||
bash:
|
||||
"git diff": allow
|
||||
"grep *": allow
|
||||
"*": deny
|
||||
---
|
||||
# Code Reviewer Instructions
|
||||
You are a meticulous code reviewer agent that provides constructive feedback on code changes.
|
||||
|
||||
- Code quality and best practices
|
||||
- Potential bugs and edge cases
|
||||
- Performance issues
|
||||
- Security considerations and vunerabilities
|
||||
- Logic errors and code readability
|
||||
- Do NOT make direct edits to files.
|
||||
- Provide feedback in a structured bulleted list.
|
||||
18
opencode/.config/opencode/opencode.json
Normal file
18
opencode/.config/opencode/opencode.json
Normal file
@ -0,0 +1,18 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/config.json",
|
||||
"plugin": [],
|
||||
"provider": {
|
||||
"ollama-local": {
|
||||
"npm": "@ai-sdk/openai-compatible",
|
||||
"name": "Ollama Local",
|
||||
"options": {
|
||||
"baseURL": "http://localhost:11434/v1"
|
||||
},
|
||||
"models": {
|
||||
"qwen3.5:9b": {
|
||||
"name": "qwen3.5:9b"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
66
opencode/.config/opencode/plugins/claude-mem.js
Normal file
66
opencode/.config/opencode/plugins/claude-mem.js
Normal file
File diff suppressed because one or more lines are too long
16
opencode/.config/opencode/skills/python-runner/SKILL.md
Normal file
16
opencode/.config/opencode/skills/python-runner/SKILL.md
Normal file
@ -0,0 +1,16 @@
|
||||
---
|
||||
name: python-runner
|
||||
description: |-
|
||||
Expert in creating, documenting, and executing standalone Python 3 scripts.
|
||||
Use this skill when the user asks to "automate a task," "process a CSV," or "run a local script."
|
||||
Examples:
|
||||
- user: "Write a script to clean this data" -> Create script with logging and error handling.
|
||||
- user: "How do I run this?" -> Provide the exact 'python3 main.py' command.
|
||||
---
|
||||
|
||||
# Python Runner Instructions
|
||||
When this skill is active, follow these rules:
|
||||
- **Environment**: Always assume Python 3.10+ is available.
|
||||
- **Documentation**: Every script must include a docstring at the top explaining its purpose.
|
||||
- **Execution**: Provide the terminal command to run the script immediately after writing the code.
|
||||
- **Safety**: Do not use `os.system()` for user-provided strings; use `subprocess` instead.
|
||||
4
opencode/.config/opencode/tui.json
Normal file
4
opencode/.config/opencode/tui.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/tui.json",
|
||||
"theme": "dracula"
|
||||
}
|
||||
438
setup.sh
Executable file
438
setup.sh
Executable file
@ -0,0 +1,438 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Dotfiles Setup Script
|
||||
# Description: Install dotfiles using GNU Stow with backup and selective installation
|
||||
|
||||
set -e
|
||||
|
||||
# Configuration
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
BACKUP_DIR="$HOME/.dotfiles-backup-$(date +%Y%m%d-%H%M%S)"
|
||||
AVAILABLE_PACKAGES=(bash zsh git ghostty starship tmux lazygit zed opencode)
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
# Functions
|
||||
log_info() {
|
||||
echo -e "${BLUE}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
log_success() {
|
||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||
}
|
||||
|
||||
log_warning() {
|
||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
show_help() {
|
||||
cat << EOF
|
||||
Dotfiles Setup Script
|
||||
|
||||
USAGE:
|
||||
$0 [OPTIONS]
|
||||
|
||||
OPTIONS:
|
||||
-h, --help Show this help message
|
||||
-d, --dry-run Show what would be done without making changes
|
||||
-v, --verbose Enable verbose output
|
||||
-q, --quiet Suppress non-essential output
|
||||
--only=PACKAGES Install only specified packages (comma-separated)
|
||||
Available: ${AVAILABLE_PACKAGES[*]}
|
||||
--backup-dir=DIR Custom backup directory (default: ~/.dotfiles-backup-TIMESTAMP)
|
||||
|
||||
EXAMPLES:
|
||||
$0 # Install all configurations
|
||||
$0 --only=git,zsh # Install only git and zsh configurations
|
||||
$0 --dry-run # Preview what would be installed
|
||||
$0 --verbose # Install with detailed output
|
||||
|
||||
AVAILABLE PACKAGES:
|
||||
EOF
|
||||
for package in "${AVAILABLE_PACKAGES[@]}"; do
|
||||
echo " - $package"
|
||||
done
|
||||
}
|
||||
|
||||
check_dependencies() {
|
||||
log_info "Checking dependencies..."
|
||||
|
||||
if ! command -v stow &> /dev/null; then
|
||||
log_error "GNU Stow is not installed"
|
||||
log_info "Installing GNU Stow..."
|
||||
if command -v apt-get &> /dev/null; then
|
||||
sudo apt-get update && sudo apt-get install -y stow
|
||||
else
|
||||
log_error "Cannot install stow automatically. Please install it manually."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
log_success "All dependencies satisfied"
|
||||
}
|
||||
|
||||
install_toolchain() {
|
||||
local bin_dir="$HOME/.local/bin"
|
||||
mkdir -p "$bin_dir"
|
||||
|
||||
# Install zinit (zsh plugin manager) if missing
|
||||
if [[ ! -f "$HOME/.local/share/zinit/zinit.git/zinit.zsh" ]]; then
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
log_info "[DRY RUN] Would install zinit"
|
||||
else
|
||||
log_info "Installing zinit..."
|
||||
command mkdir -p "$HOME/.local/share/zinit" && command chmod g-rwX "$HOME/.local/share/zinit"
|
||||
command git clone https://github.com/zdharma-continuum/zinit "$HOME/.local/share/zinit/zinit.git"
|
||||
log_success "zinit installed"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Install zoxide (smart cd) if missing
|
||||
if ! command -v zoxide &> /dev/null; then
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
log_info "[DRY RUN] Would install zoxide"
|
||||
else
|
||||
log_info "Installing zoxide..."
|
||||
curl -sS https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | bash
|
||||
log_success "zoxide installed"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Install fzf (fuzzy finder) if missing
|
||||
if ! command -v fzf &> /dev/null; then
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
log_info "[DRY RUN] Would install fzf"
|
||||
else
|
||||
log_info "Installing fzf..."
|
||||
if [[ -d "$HOME/.fzf" ]]; then
|
||||
"$HOME/.fzf/install" --bin
|
||||
else
|
||||
git clone --depth 1 https://github.com/junegunn/fzf.git "$HOME/.fzf"
|
||||
"$HOME/.fzf/install" --bin
|
||||
fi
|
||||
ln -sf "$HOME/.fzf/bin/fzf" "$bin_dir/fzf"
|
||||
log_success "fzf installed"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Install bat (syntax-highlighted cat) if missing
|
||||
if ! command -v bat &> /dev/null; then
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
log_info "[DRY RUN] Would install bat"
|
||||
else
|
||||
log_info "Installing bat..."
|
||||
local bat_ver
|
||||
bat_ver=$(curl -s https://api.github.com/repos/sharkdp/bat/releases/latest | grep -oP '"tag_name": "\K[^"]+')
|
||||
curl -sL "https://github.com/sharkdp/bat/releases/download/${bat_ver}/bat-${bat_ver}-x86_64-unknown-linux-gnu.tar.gz" -o /tmp/bat.tar.gz
|
||||
tar xzf /tmp/bat.tar.gz -C /tmp/
|
||||
cp "/tmp/bat-${bat_ver}-x86_64-unknown-linux-gnu/bat" "$bin_dir/"
|
||||
log_success "bat installed"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Install eza (modern ls) if missing
|
||||
if ! command -v eza &> /dev/null; then
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
log_info "[DRY RUN] Would install eza"
|
||||
else
|
||||
log_info "Installing eza..."
|
||||
curl -sL "https://github.com/eza-community/eza/releases/latest/download/eza_x86_64-unknown-linux-gnu.tar.gz" -o /tmp/eza.tar.gz
|
||||
tar xzf /tmp/eza.tar.gz -C /tmp/
|
||||
cp /tmp/eza "$bin_dir/"
|
||||
log_success "eza installed"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Install delta (better git diff) if missing
|
||||
if ! command -v delta &> /dev/null; then
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
log_info "[DRY RUN] Would install delta"
|
||||
else
|
||||
log_info "Installing delta..."
|
||||
local delta_ver
|
||||
delta_ver=$(curl -s https://api.github.com/repos/dandavison/delta/releases/latest | grep -oP '"tag_name": "\K[^"]+')
|
||||
curl -sL "https://github.com/dandavison/delta/releases/download/${delta_ver}/delta-${delta_ver}-x86_64-unknown-linux-gnu.tar.gz" -o /tmp/delta.tar.gz
|
||||
tar xzf /tmp/delta.tar.gz -C /tmp/
|
||||
cp "/tmp/delta-${delta_ver}-x86_64-unknown-linux-gnu/delta" "$bin_dir/"
|
||||
log_success "delta installed"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Install tmux (terminal multiplexer) if missing
|
||||
if ! command -v tmux &> /dev/null; then
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
log_info "[DRY RUN] Would install tmux"
|
||||
else
|
||||
log_info "Installing tmux..."
|
||||
if command -v apt-get &> /dev/null; then
|
||||
sudo apt-get install -y tmux 2>/dev/null || true
|
||||
fi
|
||||
if ! command -v tmux &> /dev/null; then
|
||||
curl -sL "https://github.com/nelsonenzo/tmux-appimage/releases/download/3.5a/tmux.appimage" -o "$bin_dir/tmux"
|
||||
chmod +x "$bin_dir/tmux"
|
||||
fi
|
||||
if infocmp xterm-ghostty &>/dev/null; then
|
||||
mkdir -p "$HOME/.terminfo"
|
||||
infocmp -x xterm-ghostty | tic -o "$HOME/.terminfo" -x - &>/dev/null || true
|
||||
fi
|
||||
log_success "tmux installed"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Install lazygit (TUI for git) if missing
|
||||
if ! command -v lazygit &> /dev/null; then
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
log_info "[DRY RUN] Would install lazygit"
|
||||
else
|
||||
log_info "Installing lazygit..."
|
||||
local lg_ver
|
||||
lg_ver=$(curl -s https://api.github.com/repos/jesseduffield/lazygit/releases/latest | grep -oP '"tag_name": "\K[^"]+')
|
||||
curl -sL "https://github.com/jesseduffield/lazygit/releases/download/${lg_ver}/lazygit_${lg_ver#v}_Linux_x86_64.tar.gz" -o /tmp/lazygit.tar.gz
|
||||
tar xzf /tmp/lazygit.tar.gz -C /tmp/
|
||||
cp /tmp/lazygit "$bin_dir/"
|
||||
log_success "lazygit installed"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Install ripgrep (fast grep alternative) if missing
|
||||
if ! command -v rg &> /dev/null; then
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
log_info "[DRY RUN] Would install ripgrep"
|
||||
else
|
||||
log_info "Installing ripgrep..."
|
||||
local rg_ver
|
||||
rg_ver=$(curl -s https://api.github.com/repos/BurntSushi/ripgrep/releases/latest | grep -oP '"tag_name": "\K[^"]+')
|
||||
curl -sL "https://github.com/BurntSushi/ripgrep/releases/download/${rg_ver}/ripgrep-${rg_ver}-x86_64-unknown-linux-musl.tar.gz" -o /tmp/ripgrep.tar.gz
|
||||
tar xzf /tmp/ripgrep.tar.gz -C /tmp/
|
||||
cp "/tmp/ripgrep-${rg_ver}-x86_64-unknown-linux-musl/rg" "$bin_dir/"
|
||||
log_success "ripgrep installed"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
declare -A BACKUP_PATTERNS
|
||||
BACKUP_PATTERNS[ssh]=".ssh/config .ssh/known_hosts"
|
||||
|
||||
should_backup_file() {
|
||||
local package=$1
|
||||
local relative_path=$2
|
||||
|
||||
if [[ -n "${BACKUP_PATTERNS[$package]:-}" ]]; then
|
||||
local patterns="${BACKUP_PATTERNS[$package]}"
|
||||
for pattern in $patterns; do
|
||||
if [[ "$relative_path" == "$pattern" ]]; then
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
return 1
|
||||
fi
|
||||
|
||||
case "$relative_path" in
|
||||
*.gradle/caches/* | *.gradle/daemon/* | *.gradle/wrapper/* | \
|
||||
*.gradle/.tmp/* | *.gradle/native/* | *.gradle/jdks/* | \
|
||||
*.gradle/notifications/* | *.gradle/workers/* | \
|
||||
*.gradle/kotlin-profile/* | *.gradle/android/* | \
|
||||
*.gradle/*.lock | *.cache/* | */.DS_Store | \
|
||||
*/node_modules/* | */build/* | */dist/* | \
|
||||
*/__pycache__/* | *.pyc | *.pyo | \
|
||||
*.log | *.tmp | *.temp)
|
||||
return 1
|
||||
;;
|
||||
*)
|
||||
return 0
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
backup_existing() {
|
||||
local package=$1
|
||||
local files_backed_up=0
|
||||
local files_skipped=0
|
||||
|
||||
if [[ "$VERBOSE" == "true" ]]; then
|
||||
log_info "Checking for existing files for package: $package"
|
||||
fi
|
||||
|
||||
while IFS= read -r -d '' file; do
|
||||
local relative_path="${file#$SCRIPT_DIR/$package/}"
|
||||
local target_path="$HOME/$relative_path"
|
||||
|
||||
if [[ -e "$target_path" ]] && [[ ! -L "$target_path" ]]; then
|
||||
if should_backup_file "$package" "$relative_path"; then
|
||||
if [[ "$files_backed_up" -eq 0 ]]; then
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
log_info "Backing up existing files to $BACKUP_DIR"
|
||||
fi
|
||||
|
||||
local backup_path="$BACKUP_DIR/$relative_path"
|
||||
mkdir -p "$(dirname "$backup_path")"
|
||||
cp -r "$target_path" "$backup_path"
|
||||
|
||||
if [[ "$VERBOSE" == "true" ]]; then
|
||||
log_info "Backed up: $target_path -> $backup_path"
|
||||
fi
|
||||
((files_backed_up++))
|
||||
else
|
||||
if [[ "$VERBOSE" == "true" ]]; then
|
||||
log_info "Skipped backup (generated/cache): $target_path"
|
||||
fi
|
||||
((files_skipped++))
|
||||
fi
|
||||
fi
|
||||
done < <(find "$SCRIPT_DIR/$package" -type f -print0 2>/dev/null || true)
|
||||
|
||||
if [[ "$files_backed_up" -gt 0 ]]; then
|
||||
log_success "Backed up $files_backed_up files for $package"
|
||||
fi
|
||||
|
||||
if [[ "$files_skipped" -gt 0 ]] && [[ "$VERBOSE" == "true" ]]; then
|
||||
log_info "Skipped $files_skipped generated/cache files"
|
||||
fi
|
||||
}
|
||||
|
||||
clean_generated_files() {
|
||||
local package=$1
|
||||
|
||||
log_info "Cleaning generated files for $package..."
|
||||
|
||||
case "$package" in
|
||||
ssh)
|
||||
find "$SCRIPT_DIR/$package/.ssh" -name "*.backup" -o -name "*.tmp" -o -name "*.old" \
|
||||
-exec rm -f {} + 2>/dev/null || true
|
||||
;;
|
||||
*)
|
||||
find "$SCRIPT_DIR/$package" -name "*.log" -o -name "*.tmp" -o -name "*.backup" \
|
||||
-exec rm -f {} + 2>/dev/null || true
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
install_package() {
|
||||
local package=$1
|
||||
|
||||
if [[ ! -d "$SCRIPT_DIR/$package" ]]; then
|
||||
log_error "Package '$package' not found in $SCRIPT_DIR"
|
||||
return 1
|
||||
fi
|
||||
|
||||
log_info "Installing $package configuration..."
|
||||
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
log_info "[DRY RUN] Would clean generated files for $package"
|
||||
log_info "[DRY RUN] Would run: stow $package"
|
||||
log_info "[DRY RUN] Would link files from $SCRIPT_DIR/$package to $HOME"
|
||||
return 0
|
||||
fi
|
||||
|
||||
clean_generated_files "$package"
|
||||
|
||||
backup_existing "$package"
|
||||
|
||||
if stow "$package"; then
|
||||
log_success "Successfully installed $package"
|
||||
else
|
||||
log_error "Failed to install $package"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Parse command line arguments
|
||||
DRY_RUN=false
|
||||
VERBOSE=false
|
||||
QUIET=false
|
||||
SELECTED_PACKAGES=()
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
-h|--help)
|
||||
show_help
|
||||
exit 0
|
||||
;;
|
||||
-d|--dry-run)
|
||||
DRY_RUN=true
|
||||
shift
|
||||
;;
|
||||
-v|--verbose)
|
||||
VERBOSE=true
|
||||
shift
|
||||
;;
|
||||
-q|--quiet)
|
||||
QUIET=true
|
||||
shift
|
||||
;;
|
||||
--only=*)
|
||||
IFS=',' read -ra SELECTED_PACKAGES <<< "${1#*=}"
|
||||
shift
|
||||
;;
|
||||
--backup-dir=*)
|
||||
BACKUP_DIR="${1#*=}"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
log_error "Unknown option: $1"
|
||||
show_help
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ ${#SELECTED_PACKAGES[@]} -eq 0 ]]; then
|
||||
PACKAGES_TO_INSTALL=("${AVAILABLE_PACKAGES[@]}")
|
||||
else
|
||||
PACKAGES_TO_INSTALL=("${SELECTED_PACKAGES[@]}")
|
||||
for package in "${PACKAGES_TO_INSTALL[@]}"; do
|
||||
if [[ ! " ${AVAILABLE_PACKAGES[*]} " =~ " ${package} " ]]; then
|
||||
log_error "Unknown package: $package"
|
||||
log_info "Available packages: ${AVAILABLE_PACKAGES[*]}"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [[ "$QUIET" == "true" ]]; then
|
||||
exec > /dev/null 2>&1
|
||||
fi
|
||||
|
||||
main() {
|
||||
log_info "Starting dotfiles installation..."
|
||||
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
log_info "DRY RUN MODE - No changes will be made"
|
||||
fi
|
||||
|
||||
cd "$SCRIPT_DIR"
|
||||
|
||||
check_dependencies
|
||||
|
||||
install_toolchain
|
||||
|
||||
local failed_packages=()
|
||||
|
||||
for package in "${PACKAGES_TO_INSTALL[@]}"; do
|
||||
if ! install_package "$package"; then
|
||||
failed_packages+=("$package")
|
||||
fi
|
||||
done
|
||||
|
||||
echo
|
||||
if [[ ${#failed_packages[@]} -eq 0 ]]; then
|
||||
log_success "All packages installed successfully!"
|
||||
if [[ -d "$BACKUP_DIR" ]]; then
|
||||
log_info "Backup created at: $BACKUP_DIR"
|
||||
fi
|
||||
else
|
||||
log_error "Some packages failed to install: ${failed_packages[*]}"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
main
|
||||
148
starship/.config/starship.toml
Normal file
148
starship/.config/starship.toml
Normal file
@ -0,0 +1,148 @@
|
||||
"$schema" = 'https://starship.rs/config-schema.json'
|
||||
|
||||
format = """
|
||||
[](#d3869b)\
|
||||
$username\
|
||||
[](bg:#fb4934 fg:#d3869b)\
|
||||
$directory\
|
||||
[](fg:#fb4934 bg:#fe8019)\
|
||||
$git_branch\
|
||||
$git_status\
|
||||
[](fg:#fe8019 bg:#8ec07c)\
|
||||
$c\
|
||||
$elixir\
|
||||
$elm\
|
||||
$golang\
|
||||
$haskell\
|
||||
$java\
|
||||
$julia\
|
||||
$maven\
|
||||
$nodejs\
|
||||
$bun\
|
||||
$nim\
|
||||
$rust\
|
||||
$scala\
|
||||
[](fg:#8ec07c bg:#b8bb26)\
|
||||
$docker_context\
|
||||
[](fg:#b8bb26 bg:#665c54)\
|
||||
$time\
|
||||
[ ](fg:#665c54)\
|
||||
$cmd_duration\
|
||||
"""
|
||||
|
||||
[username]
|
||||
show_always = true
|
||||
style_user = "fg:#1d2021 bg:#d3869b"
|
||||
style_root = "fg:#1d2021 bg:#d3869b"
|
||||
format = '[$user ]($style)'
|
||||
disabled = false
|
||||
|
||||
[os]
|
||||
style = "fg:#1d2021 bg:#d3869b"
|
||||
disabled = true
|
||||
|
||||
[directory]
|
||||
style = "fg:#1d2021 bg:#fb4934"
|
||||
format = "[ $path ]($style)"
|
||||
truncation_length = 3
|
||||
truncation_symbol = "…/"
|
||||
|
||||
[directory.substitutions]
|
||||
"Documents" = " "
|
||||
"Downloads" = " "
|
||||
"Music" = " "
|
||||
"Pictures" = " "
|
||||
|
||||
[c]
|
||||
symbol = " "
|
||||
style = "fg:#1d2021 bg:#8ec07c"
|
||||
format = '[ $symbol ($version) ]($style)'
|
||||
|
||||
[cpp]
|
||||
symbol = " "
|
||||
style = "fg:#1d2021 bg:#8ec07c"
|
||||
format = '[ $symbol ($version) ]($style)'
|
||||
|
||||
[docker_context]
|
||||
symbol = " "
|
||||
style = "fg:#1d2021 bg:#b8bb26"
|
||||
format = '[ $symbol $context ]($style)'
|
||||
|
||||
[elixir]
|
||||
symbol = " "
|
||||
style = "fg:#1d2021 bg:#8ec07c"
|
||||
format = '[ $symbol ($version) ]($style)'
|
||||
|
||||
[elm]
|
||||
symbol = " "
|
||||
style = "fg:#1d2021 bg:#8ec07c"
|
||||
format = '[ $symbol ($version) ]($style)'
|
||||
|
||||
[git_branch]
|
||||
symbol = ""
|
||||
style = "fg:#1d2021 bg:#fe8019"
|
||||
format = '[ $symbol $branch ]($style)'
|
||||
|
||||
[git_status]
|
||||
style = "fg:#1d2021 bg:#fe8019"
|
||||
format = '[$all_status$ahead_behind ]($style)'
|
||||
|
||||
[golang]
|
||||
symbol = " "
|
||||
style = "fg:#1d2021 bg:#8ec07c"
|
||||
format = '[ $symbol ($version) ]($style)'
|
||||
|
||||
[haskell]
|
||||
symbol = " "
|
||||
style = "fg:#1d2021 bg:#8ec07c"
|
||||
format = '[ $symbol ($version) ]($style)'
|
||||
|
||||
[java]
|
||||
symbol = " "
|
||||
style = "fg:#1d2021 bg:#8ec07c"
|
||||
format = '[ $symbol ($version) ]($style)'
|
||||
|
||||
[julia]
|
||||
symbol = " "
|
||||
style = "fg:#1d2021 bg:#8ec07c"
|
||||
format = '[ $symbol ($version) ]($style)'
|
||||
|
||||
[maven]
|
||||
style = "fg:#1d2021 bg:#8ec07c"
|
||||
format = '[ $symbol ($version) ]($style)'
|
||||
|
||||
[nodejs]
|
||||
symbol = ""
|
||||
style = "fg:#1d2021 bg:#8ec07c"
|
||||
format = '[ $symbol ($version) ]($style)'
|
||||
|
||||
[bun]
|
||||
symbol = ""
|
||||
style = "fg:#1d2021 bg:#8ec07c"
|
||||
format = '[ $symbol ($version) ]($style)'
|
||||
|
||||
[nim]
|
||||
symbol = " "
|
||||
style = "fg:#1d2021 bg:#8ec07c"
|
||||
format = '[ $symbol ($version) ]($style)'
|
||||
|
||||
[rust]
|
||||
symbol = ""
|
||||
style = "fg:#1d2021 bg:#8ec07c"
|
||||
format = '[ $symbol ($version) ]($style)'
|
||||
|
||||
[scala]
|
||||
symbol = " "
|
||||
style = "fg:#1d2021 bg:#8ec07c"
|
||||
format = '[ $symbol ($version) ]($style)'
|
||||
|
||||
[time]
|
||||
disabled = false
|
||||
time_format = "%R"
|
||||
style = "fg:#1d2021 bg:#665c54"
|
||||
format = '[ ♥ $time ]($style)'
|
||||
|
||||
[cmd_duration]
|
||||
min_time = 2000
|
||||
style = "fg:#1d2021"
|
||||
format = " took [$duration]($style) "
|
||||
34
tmux/.tmux.conf
Normal file
34
tmux/.tmux.conf
Normal file
@ -0,0 +1,34 @@
|
||||
# Basic tmux configuration
|
||||
|
||||
# Mouse support (scroll, resize panes, select panes)
|
||||
set -g mouse on
|
||||
|
||||
# Terminal type for 256 color support
|
||||
set -g default-terminal "tmux-256color"
|
||||
set -ga terminal-overrides ",*256col*:Tc"
|
||||
set -ga terminal-overrides '*:Ss=\E[%p1%d q:Se=\E[ q]'
|
||||
|
||||
# Scrollback buffer
|
||||
set -g history-limit 10000
|
||||
|
||||
# Start window numbering at 1 (instead of 0)
|
||||
set -g base-index 1
|
||||
set -g pane-base-index 1
|
||||
|
||||
# Key bindings
|
||||
bind | split-window -h
|
||||
bind - split-window -v
|
||||
bind r source-file ~/.tmux.conf \; display "Reloaded config!"
|
||||
|
||||
# Status bar: short hostname, session name, window list (Gruvbox Dark Hard)
|
||||
set -g status-bg "#1d2021"
|
||||
set -g status-fg "#ebdbb2"
|
||||
set -g status-left "#[fg=#1d2021,bg=#d3869b,bold] #S "
|
||||
set -g status-right "#[fg=#ebdbb2,bg=#3c3836] #H "
|
||||
set -g window-status-current-format "#[fg=#1d2021,bg=#fe8019,bold] #I:#W "
|
||||
set -g window-status-format "#[fg=#a89984,bg=#3c3836] #I:#W "
|
||||
set -g status-interval 5
|
||||
|
||||
# Activity monitoring
|
||||
set -g monitor-activity on
|
||||
set -g visual-activity on
|
||||
187
uninstall.sh
Executable file
187
uninstall.sh
Executable file
@ -0,0 +1,187 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Dotfiles Uninstall Script
|
||||
# Author: q280969
|
||||
# Description: Remove dotfiles symlinks created by GNU Stow
|
||||
|
||||
set -e # Exit on any error
|
||||
|
||||
# Configuration
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
AVAILABLE_PACKAGES=(bash zsh git ghostty starship tmux lazygit zed opencode)
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Functions
|
||||
log_info() {
|
||||
echo -e "${BLUE}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
log_success() {
|
||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||
}
|
||||
|
||||
log_warning() {
|
||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
show_help() {
|
||||
cat << EOF
|
||||
Dotfiles Uninstall Script
|
||||
|
||||
USAGE:
|
||||
$0 [OPTIONS]
|
||||
|
||||
OPTIONS:
|
||||
-h, --help Show this help message
|
||||
-d, --dry-run Show what would be removed without making changes
|
||||
-v, --verbose Enable verbose output
|
||||
-q, --quiet Suppress non-essential output
|
||||
--only=PACKAGES Remove only specified packages (comma-separated)
|
||||
Available: ${AVAILABLE_PACKAGES[*]}
|
||||
|
||||
EXAMPLES:
|
||||
$0 # Remove all configurations
|
||||
$0 --only=git,zsh # Remove only git and zsh configurations
|
||||
$0 --dry-run # Preview what would be removed
|
||||
|
||||
AVAILABLE PACKAGES:
|
||||
EOF
|
||||
for package in "${AVAILABLE_PACKAGES[@]}"; do
|
||||
echo " - $package"
|
||||
done
|
||||
}
|
||||
|
||||
check_dependencies() {
|
||||
log_info "Checking dependencies..."
|
||||
|
||||
if ! command -v stow &> /dev/null; then
|
||||
log_error "GNU Stow is not installed"
|
||||
log_error "Stow is required to safely remove symlinks"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_success "All dependencies satisfied"
|
||||
}
|
||||
|
||||
uninstall_package() {
|
||||
local package=$1
|
||||
|
||||
if [[ ! -d "$SCRIPT_DIR/$package" ]]; then
|
||||
log_error "Package '$package' not found in $SCRIPT_DIR"
|
||||
return 1
|
||||
fi
|
||||
|
||||
log_info "Removing $package configuration..."
|
||||
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
log_info "[DRY RUN] Would run: stow -D $package"
|
||||
log_info "[DRY RUN] Would remove symlinks for files in $SCRIPT_DIR/$package"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if stow -D "$package"; then
|
||||
log_success "Successfully removed $package"
|
||||
else
|
||||
log_error "Failed to remove $package"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Parse command line arguments
|
||||
DRY_RUN=false
|
||||
VERBOSE=false
|
||||
QUIET=false
|
||||
SELECTED_PACKAGES=()
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
-h|--help)
|
||||
show_help
|
||||
exit 0
|
||||
;;
|
||||
-d|--dry-run)
|
||||
DRY_RUN=true
|
||||
shift
|
||||
;;
|
||||
-v|--verbose)
|
||||
VERBOSE=true
|
||||
shift
|
||||
;;
|
||||
-q|--quiet)
|
||||
QUIET=true
|
||||
shift
|
||||
;;
|
||||
--only=*)
|
||||
IFS=',' read -ra SELECTED_PACKAGES <<< "${1#*=}"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
log_error "Unknown option: $1"
|
||||
show_help
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Set packages to remove
|
||||
if [[ ${#SELECTED_PACKAGES[@]} -eq 0 ]]; then
|
||||
PACKAGES_TO_REMOVE=("${AVAILABLE_PACKAGES[@]}")
|
||||
else
|
||||
PACKAGES_TO_REMOVE=("${SELECTED_PACKAGES[@]}")
|
||||
# Validate selected packages
|
||||
for package in "${PACKAGES_TO_REMOVE[@]}"; do
|
||||
if [[ ! " ${AVAILABLE_PACKAGES[*]} " =~ " ${package} " ]]; then
|
||||
log_error "Unknown package: $package"
|
||||
log_info "Available packages: ${AVAILABLE_PACKAGES[*]}"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Suppress output if quiet mode
|
||||
if [[ "$QUIET" == "true" ]]; then
|
||||
exec > /dev/null 2>&1
|
||||
fi
|
||||
|
||||
# Main execution
|
||||
main() {
|
||||
log_info "Starting dotfiles removal..."
|
||||
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
log_info "DRY RUN MODE - No changes will be made"
|
||||
fi
|
||||
|
||||
cd "$SCRIPT_DIR"
|
||||
|
||||
check_dependencies
|
||||
|
||||
local failed_packages=()
|
||||
|
||||
for package in "${PACKAGES_TO_REMOVE[@]}"; do
|
||||
if ! uninstall_package "$package"; then
|
||||
failed_packages+=("$package")
|
||||
fi
|
||||
done
|
||||
|
||||
echo
|
||||
if [[ ${#failed_packages[@]} -eq 0 ]]; then
|
||||
log_success "All packages removed successfully!"
|
||||
log_info "Your original files (if any) should now be restored"
|
||||
else
|
||||
log_error "Some packages failed to remove: ${failed_packages[*]}"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Run main function
|
||||
main
|
||||
43
zed/.config/zed/settings.json
Normal file
43
zed/.config/zed/settings.json
Normal file
@ -0,0 +1,43 @@
|
||||
{
|
||||
"project_panel": {
|
||||
"dock": "right"
|
||||
},
|
||||
"outline_panel": {
|
||||
"dock": "right"
|
||||
},
|
||||
"terminal": {
|
||||
"dock": "bottom"
|
||||
},
|
||||
"debugger": {
|
||||
"dock": "left"
|
||||
},
|
||||
"git_panel": {
|
||||
"dock": "right"
|
||||
},
|
||||
"collaboration_panel": {
|
||||
"dock": "right"
|
||||
},
|
||||
"agent_servers": {
|
||||
"github-copilot-cli": {
|
||||
"type": "registry"
|
||||
}
|
||||
},
|
||||
"base_keymap": "VSCode",
|
||||
"icon_theme": {
|
||||
"mode": "system",
|
||||
"light": "Zed (Default)",
|
||||
"dark": "Zed (Default)"
|
||||
},
|
||||
"ui_font_size": 16,
|
||||
"buffer_font_size": 15,
|
||||
"theme": {
|
||||
"mode": "system",
|
||||
"light": "Ayu Light",
|
||||
"dark": "Gruvbox Dark"
|
||||
},
|
||||
"languages": {
|
||||
"Proto": {
|
||||
"language_servers": ["buf"]
|
||||
}
|
||||
}
|
||||
}
|
||||
34
zsh/.zsh_aliases
Normal file
34
zsh/.zsh_aliases
Normal file
@ -0,0 +1,34 @@
|
||||
alias use-bash="exec bash"
|
||||
alias use-zsh="exec zsh"
|
||||
|
||||
# Docker aliases
|
||||
alias dc="docker compose"
|
||||
alias cscli="docker exec -t crowdsec cscli"
|
||||
alias swag="docker exec -t swag"
|
||||
alias olcli="docker exec -it ollama"
|
||||
|
||||
# Lazy git
|
||||
alias lg="lazygit"
|
||||
|
||||
# bat / batcat compatibility (Debian/Ubuntu installs bat as batcat)
|
||||
if ! command -v bat &>/dev/null && command -v batcat &>/dev/null; then
|
||||
alias bat="batcat"
|
||||
fi
|
||||
|
||||
# Zoxide aliases (smart cd)
|
||||
alias j="zoxide cd"
|
||||
|
||||
# eza aliases (modern ls)
|
||||
alias ls="eza"
|
||||
alias ll="eza -l --icons --git"
|
||||
alias la="eza -la --icons --git"
|
||||
alias lt="eza --tree"
|
||||
alias l="eza -l --icons --git"
|
||||
|
||||
alias gitc="git commit"
|
||||
alias gits="git status"
|
||||
alias gitp="git push"
|
||||
alias gitd="git diff"
|
||||
alias gita="git add"
|
||||
|
||||
alias rm="rm -i"
|
||||
148
zsh/.zshrc
Normal file
148
zsh/.zshrc
Normal file
@ -0,0 +1,148 @@
|
||||
## Start of .zshrc config
|
||||
|
||||
## User settings
|
||||
# Editor
|
||||
export EDITOR="nano"
|
||||
export VISUAL="nano"
|
||||
|
||||
setopt prompt_subst
|
||||
|
||||
# =========================
|
||||
# zinit - plugin manager
|
||||
# =========================
|
||||
if [[ ! -f $HOME/.local/share/zinit/zinit.git/zinit.zsh ]]; then
|
||||
print -P "%F{33} %F{220}Installing Zinit…%f"
|
||||
command mkdir -p "$HOME/.local/share/zinit" && command chmod g-rwX "$HOME/.local/share/zinit"
|
||||
command git clone https://github.com/zdharma-continuum/zinit "$HOME/.local/share/zinit/zinit.git"
|
||||
fi
|
||||
source "$HOME/.local/share/zinit/zinit.git/zinit.zsh"
|
||||
autoload -Uz _zinit
|
||||
(( ${+_comps} )) && _comps[zinit]=_zinit
|
||||
|
||||
# =========================
|
||||
# OMZ core library
|
||||
# =========================
|
||||
zinit snippet OMZ::lib/completion.zsh
|
||||
zinit snippet OMZ::lib/history.zsh
|
||||
zinit snippet OMZ::lib/key-bindings.zsh
|
||||
zinit snippet OMZ::lib/theme-and-appearance.zsh
|
||||
zinit snippet OMZ::lib/functions.zsh
|
||||
zinit snippet OMZ::lib/directories.zsh
|
||||
zinit snippet OMZ::lib/git.zsh
|
||||
zinit snippet OMZ::lib/spectrum.zsh
|
||||
zinit snippet OMZ::lib/termsupport.zsh
|
||||
|
||||
# Pager (replaces OMZ lib/misc.zsh)
|
||||
export PAGER="${PAGER:-less}"
|
||||
export LESS="${LESS:--R}"
|
||||
|
||||
# =========================
|
||||
# OMZ plugins (turbo)
|
||||
# =========================
|
||||
zinit ice wait lucid
|
||||
zinit snippet OMZ::plugins/git/git.plugin.zsh
|
||||
|
||||
zinit ice wait lucid
|
||||
zinit snippet OMZ::plugins/command-not-found/command-not-found.plugin.zsh
|
||||
|
||||
# =========================
|
||||
# NVM with lazy loading
|
||||
# =========================
|
||||
export NVM_LAZY_LOAD=true
|
||||
export NVM_AUTO_USE=true
|
||||
zinit ice wait lucid
|
||||
zinit light lukechilds/zsh-nvm
|
||||
|
||||
# =========================
|
||||
# Completions (load after 1s)
|
||||
# =========================
|
||||
zinit ice wait"1" lucid
|
||||
zinit light zsh-users/zsh-completions
|
||||
|
||||
# =========================
|
||||
# Autosuggestions (after prompt)
|
||||
# =========================
|
||||
zinit ice wait"0a" lucid atload'_zsh_autosuggest_start'
|
||||
zinit light zsh-users/zsh-autosuggestions
|
||||
|
||||
# =========================
|
||||
# Syntax highlighting (load last)
|
||||
# =========================
|
||||
zinit ice wait"0a" lucid
|
||||
zinit light zdharma-continuum/fast-syntax-highlighting
|
||||
|
||||
# =========================
|
||||
# Starship prompt
|
||||
# =========================
|
||||
if (( $+commands[starship] )); then
|
||||
eval "$(starship init zsh)"
|
||||
fi
|
||||
|
||||
# =========================
|
||||
# Aliases
|
||||
# =========================
|
||||
if [ -f ~/.zsh_aliases ]; then
|
||||
. ~/.zsh_aliases
|
||||
fi
|
||||
|
||||
# =========================
|
||||
# Atuin - shell history
|
||||
# =========================
|
||||
. "$HOME/.atuin/bin/env"
|
||||
eval "$(atuin init zsh)"
|
||||
|
||||
# =========================
|
||||
# Zoxide - smarter cd
|
||||
# =========================
|
||||
if (( $+commands[zoxide] )); then
|
||||
eval "$(zoxide init zsh)"
|
||||
fi
|
||||
|
||||
# =========================
|
||||
# fzf - fuzzy finder
|
||||
# =========================
|
||||
if (( $+commands[fzf] )); then
|
||||
source <(fzf --zsh 2>/dev/null)
|
||||
fi
|
||||
|
||||
# Use ripgrep for fzf file listing if available (faster, respects .gitignore)
|
||||
if (( $+commands[rg] )); then
|
||||
export FZF_DEFAULT_COMMAND='rg --files --hidden --glob "!.git"'
|
||||
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
|
||||
fi
|
||||
|
||||
# =========================
|
||||
# Theme / Gruvbox Dark Hard
|
||||
# =========================
|
||||
|
||||
# Bat theme
|
||||
export BAT_THEME="Gruvbox Dark"
|
||||
|
||||
# FZF colors (Gruvbox Dark Hard)
|
||||
export FZF_DEFAULT_OPTS=" \
|
||||
--color=bg+:#3c3836,bg:#1d2021,spinner:#fabd2f,hl:#fb4934 \
|
||||
--color=fg:#ebdbb2,header:#fb4934,info:#d3869b,pointer:#fabd2f \
|
||||
--color=marker:#fabd2f,fg+:#ebdbb2,prompt:#d3869b,hl+:#fb4934"
|
||||
|
||||
# fast-syntax-highlighting colors (Gruvbox Dark Hard)
|
||||
typeset -gA FAST_HIGHLIGHT_STYLES
|
||||
FAST_HIGHLIGHT_STYLES[default]=fg=#ebdbb2
|
||||
FAST_HIGHLIGHT_STYLES[unknown-token]=fg=#fb4934
|
||||
FAST_HIGHLIGHT_STYLES[reserved-word]=fg=#d3869b,bold
|
||||
FAST_HIGHLIGHT_STYLES[alias]=fg=#83a598
|
||||
FAST_HIGHLIGHT_STYLES[builtin]=fg=#83a598
|
||||
FAST_HIGHLIGHT_STYLES[function]=fg=#83a598
|
||||
FAST_HIGHLIGHT_STYLES[command]=fg=#83a598
|
||||
FAST_HIGHLIGHT_STYLES[precommand]=fg=#83a598
|
||||
FAST_HIGHLIGHT_STYLES[hashed-command]=fg=#83a598
|
||||
FAST_HIGHLIGHT_STYLES[path]=fg=#b8bb26,underline
|
||||
FAST_HIGHLIGHT_STYLES[path-to-dir]=fg=#b8bb26,underline
|
||||
FAST_HIGHLIGHT_STYLES[single-hyphen-option]=fg=#fabd2f
|
||||
FAST_HIGHLIGHT_STYLES[double-hyphen-option]=fg=#fabd2f
|
||||
FAST_HIGHLIGHT_STYLES[single-quoted-argument]=fg=#fabd2f
|
||||
FAST_HIGHLIGHT_STYLES[double-quoted-argument]=fg=#fabd2f
|
||||
FAST_HIGHLIGHT_STYLES[back-quoted-argument]=fg=#fb4934
|
||||
FAST_HIGHLIGHT_STYLES[assign]=fg=#ebdbb2
|
||||
FAST_HIGHLIGHT_STYLES[globbing]=fg=#d3869b
|
||||
FAST_HIGHLIGHT_STYLES[comment]=fg=#7c6f64
|
||||
FAST_HIGHLIGHT_STYLES[redirection]=fg=#d3869b
|
||||
Loading…
x
Reference in New Issue
Block a user