Compare commits

...
15 Commits
Author SHA1 Message Date
xavier 4c7b637e97 feat(chezmoi): Add devops toolbox for ubuntu user on cloud host 2026-10-04 17:04:20 +02:00
Xavier Logerais d0327a3b70 feat(chezmoi): Split git tools in several toolboxes 2026-09-28 18:13:44 +02:00
xavier 88d13bf36c Merge pull request 'Merge dev into main' (#3) from dev into main
Reviewed-on: #3
2026-09-28 00:35:10 +02:00
xavier d094dced64 Merge pull request 'fix(hosts): Remove rage from devenv tools' (#2) from fix/devenv-remove-rage into dev
Reviewed-on: #2
2026-09-27 22:46:25 +02:00
xavierandClaude Opus 5.5 3645b0c3d0 fix(hosts): Remove rage from devenv tools
cargo-binstall finds no prebuilt binary for rage and refuses to fall back
to cargo install, so mise compiles it from source, which slows down the
bootstrap and logs an error. The tool is not used yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DNFVa9coYSXpUrxogVwSiG
2026-09-27 21:51:47 +02:00
Xavier Logerais 5c46b38455 feat(ghostty): Improve Ghostty configuration 2026-09-22 18:53:32 +02:00
xavier 12b79dc835 fix(starship): Fix zsh prompt for ViM mode 2026-09-20 22:07:36 +02:00
xavier ebf3fec9d4 feat(starship): Use same character setting for bash than zsh 2026-09-19 20:22:06 +02:00
Xavier Logerais 3a2687474e feat(starship): Add indicator for ViM mode in zsh prompt 2026-09-17 15:32:34 +02:00
xavier ead4da0581 feat(starship): Improve bash prompt 2026-09-11 23:53:06 +02:00
xavierandClaude Sonnet 5 a787c7ed51 fix(git): Guard $gitConfig.name/email lookup against missing map keys
Accessing a missing key on a map value in text/template raises an
error before `default` can run, so `configs.git` without `name`/`email`
(or hosts without a `configs` key, e.g. termux-*) broke `chezmoi diff`
with "map has no entry for key". Use `hasKey` before accessing each
field instead.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0145M6KGu5gQ3brTPzqs8NwG
2026-09-11 23:42:19 +02:00
Xavier LogeraisandCopilot e17a18d7c5 feat(git): Templatize git config for per-host/user identity override
Convert private_dot_config/git/config to config.tmpl so that the
[user] name/email can be overridden per host/user via the existing
`configs` key in .chezmoidata/hosts*.yaml, falling back to the
default identity (Xavier Logerais / xavier@logerais.com) when no
override is defined.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-09-11 15:23:50 +02:00
Xavier Logerais db34347d55 feat: (starship) Improve zsh prompt 2026-09-11 15:07:38 +02:00
xavier 08dd7060b6 feat: Improve update script 2026-09-10 23:03:26 +02:00
xavier 2500668363 feat: Add an update script to update all packages/tools/config with one command 2026-09-10 22:43:04 +02:00
8 changed files with 353 additions and 98 deletions

No files matched your search

+13 -1
View File
@@ -10,6 +10,8 @@ hosts:
xavier: xavier:
toolboxes: toolboxes:
- terminal - terminal
- dev-git
- dev-gitea
- dev-tools - dev-tools
- dev-languages - dev-languages
- ai - ai
@@ -28,8 +30,11 @@ hosts:
ubuntu: ubuntu:
toolboxes: toolboxes:
- terminal - terminal
- dev-git
- dev-gitea
- dev-tools - dev-tools
- dev-languages - dev-languages
- devops
- ai - ai
tools: tools:
- pipx:vit - pipx:vit
@@ -40,10 +45,13 @@ hosts:
root: root:
toolboxes: toolboxes:
- terminal - terminal
- dev-git
- dev-tools - dev-tools
xavier: xavier:
toolboxes: toolboxes:
- terminal - terminal
- dev-git
- dev-gitea
- dev-tools - dev-tools
- dev-languages - dev-languages
- devops - devops
@@ -51,7 +59,6 @@ hosts:
tools: tools:
- sops - sops
- age - age
- cargo:rage
configs: {} configs: {}
# Termux (application de terminal pour android) # Termux (application de terminal pour android)
termux-debian: termux-debian:
@@ -61,10 +68,14 @@ hosts:
root: root:
toolboxes: toolboxes:
- terminal - terminal
- dev-git
- dev-tools - dev-tools
xavier: xavier:
toolboxes: toolboxes:
- terminal - terminal
- dev-git
- dev-github
- dev-gitea
- dev-tools - dev-tools
termux-ubuntu: termux-ubuntu:
packages: packages:
@@ -77,4 +88,5 @@ hosts:
xavier: xavier:
toolboxes: toolboxes:
- terminal - terminal
- dev-git
- dev-tools - dev-tools
+6 -1
View File
@@ -21,9 +21,14 @@ tools:
- jq - jq
- yq - yq
- shellcheck - shellcheck
- lazygit
- delta - delta
dev-git:
- lazygit
dev-github:
- gh - gh
dev-gitlab:
- glab
dev-gitea:
- tea: - tea:
url: "https://gitea.com/gitea/tea/releases/download/v{{ version }}/tea-{{ version }}-{{ os() }}-{{ arch(x64='amd64') }}.xz" url: "https://gitea.com/gitea/tea/releases/download/v{{ version }}/tea-{{ version }}-{{ os() }}-{{ arch(x64='amd64') }}.xz"
version: "0.15.1" version: "0.15.1"
+13
View File
@@ -46,6 +46,19 @@ shell-integration-features = sudo
gtk-titlebar-hide-when-maximized = true gtk-titlebar-hide-when-maximized = true
maximize maximize
# Ouvre les nouvelles fenêtres avec un répertoire de travail dans $HOME
window-inherit-working-directory = false
# Ouvre les nouveaux onglets avec un répertoire de travail dans $HOME
tab-inherit-working-directory = false
# mais les nouveaux splits dans le répertoire courant
split-inherit-working-directory = true
# Permet d'ouvrir un nouvel onglet en conservant le répertoire de travail courant
# keybind = shift+alt+t=new_tab:current
keybind = ctrl+b>n=new_window
keybind = ctrl+b>t=new_tab
keybind = ctrl+b>z=toggle_split_zoom
keybind = ctrl+b>`=toggle_quick_terminal
# Systemd and D-Bus Integration # Systemd and D-Bus Integration
quit-after-last-window-closed = true quit-after-last-window-closed = true
quit-after-last-window-closed-delay = 5m quit-after-last-window-closed-delay = 5m
-47
View File
@@ -1,47 +0,0 @@
[core]
excludesfile = ~/.config/git/ignore
attributesfile = ~/.config/git/attributes
pager = delta
[user]
name = Xavier Logerais
email = xavier@logerais.com
[credential]
helper = cache
[credential "https://gitea.logerais.com"]
helper = cache
helper = !tea login helper
[credential "https://gitea.cloud.logerais.com"]
helper = cache
helper = !tea login helper
[init]
defaultBranch = main
[rerere]
enabled = 1
[merge]
conflictstyle = diff3
[page]
diff = delta
show = delta
log = delta
blame = delta
reflog = delta
[delta]
navigate = true
side-by-side = true
dark = true
syntax-theme = Coldark-Dark
[interactive]
diffFilter = delta --color-only
[alias]
tree = !git ls-files | tree --fromfile -C
+70
View File
@@ -0,0 +1,70 @@
{{- $hostname := output "hostname" | trim -}}
{{- $username := .chezmoi.username -}}
{{- $currentHost := index .hosts $hostname -}}
{{- $currentUser := "" -}}
{{- if $currentHost -}}
{{- if hasKey $currentHost.users $username -}}
{{- $currentUser = index $currentHost.users $username -}}
{{- end -}}
{{- end -}}
{{- $gitConfig := dict -}}
{{- if and $currentUser (hasKey $currentUser "configs") -}}
{{- if hasKey $currentUser.configs "git" -}}
{{- $gitConfig = $currentUser.configs.git -}}
{{- end -}}
{{- end -}}
{{- $gitName := "Xavier Logerais" -}}
{{- $gitEmail := "xavier@logerais.com" -}}
{{- if hasKey $gitConfig "name" -}}
{{- $gitName = $gitConfig.name -}}
{{- end -}}
{{- if hasKey $gitConfig "email" -}}
{{- $gitEmail = $gitConfig.email -}}
{{- end -}}
[core]
excludesfile = ~/.config/git/ignore
attributesfile = ~/.config/git/attributes
pager = delta
[user]
name = {{ $gitName }}
email = {{ $gitEmail }}
[credential]
helper = cache
[credential "https://gitea.logerais.com"]
helper = cache
helper = !tea login helper
[credential "https://gitea.cloud.logerais.com"]
helper = cache
helper = !tea login helper
[init]
defaultBranch = main
[rerere]
enabled = 1
[merge]
conflictstyle = diff3
[page]
diff = delta
show = delta
log = delta
blame = delta
reflog = delta
[delta]
navigate = true
side-by-side = true
dark = true
syntax-theme = Coldark-Dark
[interactive]
diffFilter = delta --color-only
[alias]
tree = !git ls-files | tree --fromfile -C
+31 -41
View File
@@ -1,14 +1,15 @@
"$schema" = 'https://starship.rs/config-schema.json' "$schema" = 'https://starship.rs/config-schema.json'
format = """ format = """
[ ](fg:#769ff0)\
$directory\ $directory\
[](fg:#769ff0 bg:#394260)\ [](bg:#394260 fg:#769ff0)\
$git_branch\ $git_branch\
$git_commit\ $git_commit\
$git_status\ $git_status\
$git_state\ $git_state\
$direnv\
$mise\ $mise\
$direnv\
[](fg:#394260 bg:#212736)\ [](fg:#394260 bg:#212736)\
$rust\ $rust\
$golang\ $golang\
@@ -22,18 +23,7 @@ $terraform\
""" """
right_format = """ right_format = """
[](fg:#a3aed2)\ [](fg:#a3aed2)$time[](fg:#a3aed2)\
$shell\
$username\
[](fg:#394260 bg:#a3aed2)\
$os\
[](bg:#394260 fg:#a3aed2)\
$container\
$hostname\
[ ](fg:#394260)\
[](fg:#a3aed2)\
$time\
[](fg:#a3aed2)\
""" """
[hostname] [hostname]
@@ -52,7 +42,7 @@ format = '[ $symbol $name ]($style)'
[os] [os]
disabled = false disabled = false
style = "bg:#394260 fg:#a3aed2" style = "bg:#394260 fg:#a3aed2"
format = "[ $symbol ]($style)" format = "[ $symbol $name ]($style)"
[username] [username]
show_always = true show_always = true
@@ -62,65 +52,67 @@ format = '[  $user ]($style)'
[shell] [shell]
disabled = false disabled = false
bash_indicator = ' ' bash_indicator = ' bash'
zsh_indicator = ' ' zsh_indicator = ' zsh'
fish_indicator = '󰈺 ' fish_indicator = '󰈺 fish'
powershell_indicator = '_' powershell_indicator = '_ Powershell'
unknown_indicator = 'unknown shell' unknown_indicator = 'unknown shell'
format = '[ $indicator ]($style)'
style = "bg:#a3aed2 fg:#212736" style = "bg:#a3aed2 fg:#212736"
format = '[ $indicator[](fg:#394260 bg:#a3aed2)]($style)'
[sudo] [sudo]
disabled = false disabled = false
[directory] [directory]
disabled = false disabled = false
style = "fg:#e3e5e5 bg:#769ff0"
format = "[  $path ]($style)"
truncation_length = 5 truncation_length = 5
truncation_symbol = "…/" truncation_symbol = "…/"
truncate_to_repo = false truncate_to_repo = false
style = "fg:#e3e5e5 bg:#769ff0"
format = "[  $path ]($style)"
[git_branch] [git_branch]
disabled = false disabled = false
symbol = "" symbol = ""
style = "fg:#769ff0 bg:#394260" style = "fg:#769ff0 bg:#394260 bold"
format = '[ $symbol $branch ]($style)' format = '[ $symbol $branch ]($style)'
[git_commit] [git_commit]
disabled = false disabled = false
style = "fg:#769ff0 bg:#394260" only_detached = true
tag_disabled = false tag_disabled = false
tag_symbol = '  ' tag_symbol = '  '
only_detached = true style = "fg:#769ff0 bg:#394260"
format = '[ $hash $tag ]($style)' format = '[ $hash $tag ]($style)'
[git_status] [git_status]
disabled = false disabled = false
style = "fg:#769ff0 bg:#394260"
ahead = '⇡${count}' ahead = '⇡${count}'
behind = '⇣${count}' behind = '⇣${count}'
diverged = '[⇕⇡${ahead_count}⇣${behind_count}](fg:#FFA500 bg:#394260)' diverged = '[⇕⇡${ahead_count}⇣${behind_count}](fg:#FFA500 bg:#394260)'
up_to_date = '' up_to_date = ''
modified = '[$count 󰷉 ](fg:#FFFF00 bg:#394260)' modified = '[$count󰷉 ](fg:#FFFF00 bg:#394260)'
staged = '[$count  ](fg:#00D000 bg:#394260)' staged = '[$count ](fg:#00D000 bg:#394260)'
deleted = '[$count  ](fg:#FF0000 bg:#394260)' deleted = '[$count ](fg:#FF0000 bg:#394260)'
renamed = '[$count 󱀱 ](fg:#87CEEB bg:#394260)' renamed = '[$count󱀱 ](fg:#87CEEB bg:#394260)'
untracked = '[$count 󱀶 ](fg:#CCCCCC bg:#394260)' untracked = '[$count󱀶 ](fg:#CCCCCC bg:#394260)'
conflicted = '[$count 󱪘 ](fg:#FF0000 bg:#394260)' conflicted = '[$count󱪘 ](fg:#FF0000 bg:#394260)'
stashed = '[$count ](fg:#FFA500 bg:#394260)' # 󱁺  stashed = '[$count ](fg:#FFA500 bg:#394260)' # 󱁺 
style = "fg:#769ff0 bg:#394260"
format = '[$all_status$ahead_behind ]($style)' format = '[$all_status$ahead_behind ]($style)'
[git_state] [git_state]
disabled = false disabled = false
style = "fg:#769ff0 bg:#394260" style = "fg:#769ff0 bg:#394260"
format = ' [$state( $progress_current/$progress_total)]($style) ' format = '[ $state ($progress_current/$progress_total)]($style)'
[direnv] [direnv]
disabled = false disabled = false
[mise] [mise]
disabled = true disabled = true
style = "bg:#212736 fg:white"
format = '[$symbol$health]($style)'
[nodejs] [nodejs]
symbol = "" symbol = ""
@@ -161,7 +153,7 @@ format = '[[](fg:#212736 bg:#ffffff) $symbol $context [](fg:#ffffff bg:#21
[kubernetes] [kubernetes]
disabled = false disabled = false
symbol = " " symbol = ""
style = "bg:#316ce6 fg:#a3aed2" style = "bg:#316ce6 fg:#a3aed2"
format = '[[](fg:#212736 bg:#316ce6) $symbol $context (\($namespace\))[](fg:#316ce6 bg:#212736)]($style)' format = '[[](fg:#212736 bg:#316ce6) $symbol $context (\($namespace\))[](fg:#316ce6 bg:#212736)]($style)'
@@ -173,16 +165,14 @@ format = '[[](fg:#212736 bg:#1b1028) [$symbol](fg:#7b42bc bg:#1b1028) $worksp
[time] [time]
disabled = false disabled = false
time_format = '%T  󰃶 %A %e %B %Y'
style = "fg:#212736 bg:#a3aed2" style = "fg:#212736 bg:#a3aed2"
format = '[  $time ]($style)' format = '[  $time ]($style)'
time_format = '%T  󰃶 %A %e %B %Y'
# format = '[[  $time ](fg:#a0a9cb bg:#1d2230)]($style)'
[character] [character]
# success_symbol = '[[](fg:#ddffdd)  [](fg:#ddffdd)](bg:#ddffdd fg:#00af5f) ' success_symbol = '[[](fg:#ddffdd)  [](fg:#ddffdd)](bg:#ddffdd fg:#00af5f) '
# error_symbol = '[[](fg:#ffddff) 󰚽 [](fg:#ffddff)](bg:#ffddff fg:#f44336) ' error_symbol = '[[](fg:#ffddff) 󰚽 [](fg:#ffddff)](bg:#ffddff fg:#f44336) '
success_symbol = '[ [](fg:#ddffdd)](bg:#ddffdd fg:#00af5f) ' vimcmd_symbol = '[[](fg:#007f00)  ViM mode [](fg:#007f00)](bg:#007f00) '
error_symbol = '[ 󰚽 [](fg:#ffddff)](bg:#ffddff fg:#f44336) '
[os.symbols] [os.symbols]
Windows = "󰍲" Windows = "󰍲"
+5 -8
View File
@@ -25,12 +25,10 @@ $docker_context\
$kubernetes\ $kubernetes\
$terraform\ $terraform\
[](fg:#212736)\ [](fg:#212736)\
\n$time\ \n$character"""
$character"""
right_format = """ right_format = """
[](fg:#212736 bg:#1d2230)\ [](fg:#a3aed2)$time[](fg:#a3aed2)\
\n$time\
""" """
[hostname] [hostname]
@@ -165,13 +163,12 @@ format = '[[](fg:#212736 bg:#1b1028) [$symbol](fg:#7b42bc bg:#1b1028) $worksp
[time] [time]
disabled = false disabled = false
time_format = "%R" # Hour:Minute Format time_format = "%R" # Hour:Minute Format
style = "fg:#a3aed2" style = "fg:#212736 bg:#a3aed2"
format = '[  $time ]($style)' format = '[  $time ]($style)'
# format = '[[  $time ](fg:#a0a9cb bg:#1d2230)]($style)'
[character] [character]
success_symbol = '[❯](bold green) ' success_symbol = '[[](fg:#ddffdd)  [](fg:#ddffdd)](bg:#ddffdd fg:#00af5f) '
error_symbol = '[󰚽 ❯](bold red) ' error_symbol = '[[](fg:#ffddff) 󰚽 [](fg:#ffddff)](bg:#ffddff fg:#f44336) '
[os.symbols] [os.symbols]
Windows = "󰍲" Windows = "󰍲"
+215
View File
@@ -0,0 +1,215 @@
#!/usr/bin/env bash
set -u
FAILED=0
STATUS_APT="not_detected"
STATUS_BREW="not_detected"
STATUS_CHEZMOI="not_detected"
STATUS_MISE="not_detected"
STATUS_NEOVIM="not_detected"
# Couleurs
BLUE='\e[00;34;49m'
GRAY='\e[02;37;49m'
RESET='\e[39;49;00m'
# Affiche un message stylisé sur la sortie standard
echo_bold() {
printf '\e[1m%s\e[0m\n' "$*"
}
# Affiche un message informatif stylisé sur la sortie d'erreur
echo_info() {
printf >&2 "\n${BLUE}󰋼 %s${RESET}\n\n" "$*"
}
echo_success() {
printf >&2 "\e[00;01;32;49m %s${RESET}\n" "$*"
}
echo_failed() {
printf >&2 "\e[00;01;31;49m✖ %s${RESET}\n" "$*"
}
echo_skipped() {
printf >&2 "${GRAY}󰜺 %s${RESET}\n" "$*"
}
run() {
local section="$1"
local name="$2"
shift 2
local start=$SECONDS
printf '⏳ [%s] %s...' "$section" "$name"
if "$@"; then
printf '\r\033[K'
echo_success "[$section] $name ($((SECONDS - start))s)"
else
printf '\r\033[K'
echo_failed "[$section] $name ($((SECONDS - start))s)"
# Marque la section comme échouée
eval "STATUS_${section^^}=failed"
FAILED=1
return 1
fi
}
echo
echo_bold "🚀 Mise à jour quotidienne"
echo
# ----------------------------------------------------------------------
# Debian / Ubuntu
# ----------------------------------------------------------------------
if [[ -f /etc/os-release ]]; then
. /etc/os-release
if [[ "$ID" == "debian" || "$ID" == "ubuntu" ]]; then
STATUS_APT="success"
if ((EUID == 0)); then
APT=(apt)
else
APT=(sudo apt)
fi
echo_info "APT"
run APT "Mise à jour des paquets" \
"${APT[@]}" update || true
run APT "Mise à niveau des paquets" \
"${APT[@]}" upgrade -y || true
run APT "Suppression des paquets inutiles" \
"${APT[@]}" autoremove -y || true
run APT "Nettoyage du cache" \
"${APT[@]}" autoclean || true
fi
fi
# ----------------------------------------------------------------------
# Homebrew
# ----------------------------------------------------------------------
if command -v brew >/dev/null 2>&1; then
STATUS_BREW="success"
echo_info "Brew"
run BREW "Mise à jour" \
brew update || true
run BREW "Mise à niveau des paquets" \
brew upgrade || true
fi
# ----------------------------------------------------------------------
# chezmoi
# ----------------------------------------------------------------------
if command -v chezmoi >/dev/null 2>&1; then
STATUS_CHEZMOI="success"
echo_info "chezmoi"
run CHEZMOI "Récupération de la configuration" \
chezmoi git pull || true
run CHEZMOI "Application de la configuration" \
chezmoi apply -v || true
fi
# ----------------------------------------------------------------------
# mise
# ----------------------------------------------------------------------
if command -v mise >/dev/null 2>&1; then
STATUS_MISE="success"
echo_info "mise"
run MISE "Mise à jour de mise" \
mise self-update -y || true
run MISE "Mise à jour des outils" \
mise up || true
fi
# ----------------------------------------------------------------------
# Neovim / AstroNvim
# ----------------------------------------------------------------------
if command -v nvim >/dev/null 2>&1; then
STATUS_NEOVIM="success"
echo_info "Neovim / AstroNvim"
run NEOVIM "Mise à jour d'AstroNvim" \
nvim --headless \
-c 'autocmd User AstroUpdateCompleted quitall' \
-c 'AstroUpdate' \
2>&1 || true
fi
# ----------------------------------------------------------------------
# Récapitulatif
# ----------------------------------------------------------------------
echo
echo_info "Récapitulatif"
echo
echo -n " ► "
case "$STATUS_APT" in
success) echo_success "APT : réussi" ;;
failed) echo_failed "APT : échoué" ;;
not_detected) echo_skipped "APT : non détecté" ;;
esac
echo -n " ► "
case "$STATUS_BREW" in
success) echo_success "Brew : réussi" ;;
failed) echo_failed "Brew : échoué" ;;
not_detected) echo_skipped "Brew : non détecté" ;;
esac
echo -n " ► "
case "$STATUS_CHEZMOI" in
success) echo_success "chezmoi : réussi" ;;
failed) echo_failed "chezmoi : échoué" ;;
not_detected) echo_skipped "chezmoi : non détecté" ;;
esac
echo -n " ► "
case "$STATUS_MISE" in
success) echo_success "mise : réussi" ;;
failed) echo_failed "mise : échoué" ;;
not_detected) echo_skipped "mise : non détecté" ;;
esac
echo -n " ► "
case "$STATUS_NEOVIM" in
success) echo_success "Neovim : réussi" ;;
failed) echo_failed "Neovim : échoué" ;;
not_detected) echo_skipped "Neovim : non détecté" ;;
esac
echo
if ((FAILED)); then
echo_failed "Mise à jour terminée avec des erreurs"
exit 1
else
echo_success "Toutes les mises à jour sont terminées"
exit 0
fi