Skip to content

Commit ec54af9

Browse files
authored
fix(ci): repair corrupt shellcheck.yml and docker_aliases.sh issues (#4)
## Summary - Replace 0x01 control character that corrupted the `jobs:` key in `shellcheck.yml`, causing all CI workflow runs to fail - Add `# shellcheck disable=SC2086` on 5 `grp*` functions where `$services` word-splitting is intentional (space-separated list passed as multiple args to docker compose) - Exclude `docker_aliases.sh` from shfmt — contains zsh-specific `${(f)...}` parameter expansion that shfmt cannot parse ## Test plan - [ ] All pre-commit hooks pass locally (verified: shellcheck, shfmt, actionlint, yamllint, check-yaml all pass) - [ ] CI workflow runs after merge <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Chores** * Fixed GitHub Actions workflow configuration syntax to ensure proper job definitions. * Updated pre-commit hook configuration to exclude a shell script file from automatic formatting. * Added inline validation directives to shell script commands to maintain compatibility with linting tools. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
1 parent 3772e12 commit ec54af9

5 files changed

Lines changed: 114 additions & 98 deletions

File tree

.bash_aliases

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# shellcheck shell=bash
22
# General System Utilities
33
alias c='clear'
4-
alias gh='history | grep'
4+
alias grephist='history | grep'
55
alias lt='ls --human-readable --size -1 -S --classify'
66
alias sha='shasum -a 256'
77
alias sshrestart='sudo /etc/init.d/ssh restart'
@@ -33,26 +33,31 @@ alias speed='speedtest-cli --server 2406 --simple'
3333
alias dcdown='docker compose down'
3434
alias dcup='docker compose up'
3535
alias dexec='docker exec -it'
36+
alias dockerclean='docker rm $(docker ps -a -q)'
3637
alias dockerdu='docker system df'
3738
alias dockerls='docker ps -a'
39+
# shellcheck disable=SC2142 # $3 is awk's field variable, not a shell positional param
40+
alias docker-rmi-untagged='docker rmi $(docker images | grep "^<none>" | awk "{print \$3}")'
41+
alias dockerstopall='docker stop $(docker ps -a -q)'
3842
alias dlogs='docker logs'
3943

4044
# Development and Git
4145
startgit() { cd "$(git rev-parse --show-toplevel)" && git checkout master && git pull; }
4246

4347
# File Management
44-
alias rmrf='rm -rf' # Use with caution
48+
alias rmrf='rm -rf' # Use with caution
4549
alias mkdir='mkdir -p'
4650
alias mv='mv -i'
4751
alias cp='cp -i'
52+
alias chmod002='sudo chmod -R a=,a+rX,u+w,g+w'
4853

4954
# Searching
5055
alias grep='grep --color=auto'
5156
alias fgrep='fgrep --color=auto'
5257
alias egrep='egrep --color=auto'
5358

5459
# System Monitoring
55-
alias top='htop' # Requires htop installed
60+
alias top='htop' # Requires htop installed
5661
alias df='df -h'
5762
alias du='du -ch'
5863

@@ -70,9 +75,9 @@ alias ....='cd ../../../'
7075
alias .....='cd ../../../../'
7176

7277
# Enhanced ls
73-
alias ll='ls -lAFh'
74-
alias la='ls -A'
75-
alias l='ls -CF'
78+
alias ll='ls -lAFha --color=auto --group-directories-first'
79+
alias la='ls -A --color=auto --group-directories-first'
80+
alias l='ls -CF --color=auto --group-directories-first'
7681

7782
# Git Operations
7883
alias gs='git status'

.github/workflows/shellcheck.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ concurrency:
1515
group: ${{ github.workflow }}-${{ github.ref }}
1616
cancel-in-progress: true
1717

18-
18+
jobs:
1919
shellcheck:
2020
runs-on: ubuntu-latest
2121
timeout-minutes: 5

.pre-commit-config.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ repos:
4444
hooks:
4545
- id: shfmt
4646
args: [--write, --indent, '2', --case-indent, --binary-next-line]
47+
exclude: ^docker_aliases\.sh$ # zsh-specific ${(f)...} syntax is incompatible with shfmt
4748

4849
- repo: https://github.com/adrienverge/yamllint
4950
rev: v1.35.1

docker_aliases.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ function grpdown {
254254
services=$(_dc_group "$grp")
255255
[[ -z "$services" ]] && { _dc_red "No services in group: $grp"; return 1; }
256256
_dc_blue "Stopping $grp: $services"
257+
# shellcheck disable=SC2086 # word splitting intentional — $services is space-separated list
257258
_dc_compose stop $services "$@"
258259
_dc_green "$grp stopped"
259260
}
@@ -265,6 +266,7 @@ function grpup {
265266
services=$(_dc_group "$grp")
266267
[[ -z "$services" ]] && { _dc_red "No services in group: $grp"; return 1; }
267268
_dc_blue "Starting $grp: $services"
269+
# shellcheck disable=SC2086 # word splitting intentional — $services is space-separated list
268270
_dc_compose up -d $services "$@"
269271
_dc_green "$grp started"
270272
}
@@ -275,6 +277,7 @@ function grplogs {
275277
local services
276278
services=$(_dc_group "$grp")
277279
[[ -z "$services" ]] && { _dc_red "No services in group: $grp"; return 1; }
280+
# shellcheck disable=SC2086 # word splitting intentional — $services is space-separated list
278281
_dc_compose logs -f $services "$@"
279282
}
280283

@@ -284,6 +287,7 @@ function grpps {
284287
local services
285288
services=$(_dc_group "$grp")
286289
[[ -z "$services" ]] && { _dc_red "No services in group: $grp"; return 1; }
290+
# shellcheck disable=SC2086 # word splitting intentional — $services is space-separated list
287291
_dc_compose ps $services "$@"
288292
}
289293

@@ -294,6 +298,7 @@ function grprestart {
294298
services=$(_dc_group "$grp")
295299
[[ -z "$services" ]] && { _dc_red "No services in group: $grp"; return 1; }
296300
_dc_blue "Restarting $grp: $services"
301+
# shellcheck disable=SC2086 # word splitting intentional — $services is space-separated list
297302
_dc_compose restart $services "$@"
298303
_dc_green "$grp restarted"
299304
}

tmux_session_picker.sh

Lines changed: 96 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -40,105 +40,110 @@ _TMUX_SESS_PAIRS=(
4040
_TMUX_NOTABLE_PROCS=(claude vim nvim docker node python pwsh htop)
4141

4242
# === Implementation ===
43-
if command -v tmux >/dev/null 2>&1 &&
44-
[[ $- == *i* ]] && [[ -n "$SSH_TTY" ]] && [[ -z "$TMUX" ]] && [[ -z "$NOTMUX" ]]; then
43+
if command -v tmux >/dev/null 2>&1 \
44+
&& [[ $- == *i* ]] && [[ -n "$SSH_TTY" ]] && [[ -z "$TMUX" ]] && [[ -z "$NOTMUX" ]]; then
4545

46-
# Create sessions for valid paths
47-
for _pair in "${_TMUX_SESS_PAIRS[@]}"; do
48-
_sess_name="${_pair%%=*}"
49-
_sess_path="${_pair#*=}"
50-
if [[ -d "$_sess_path" ]] && ! tmux has-session -t "$_sess_name" 2>/dev/null; then
51-
tmux new-session -d -s "$_sess_name" -c "$_sess_path"
52-
fi
53-
done
46+
# Create sessions for valid paths
47+
for _pair in "${_TMUX_SESS_PAIRS[@]}"; do
48+
_sess_name="${_pair%%=*}"
49+
_sess_path="${_pair#*=}"
50+
if [[ -d "$_sess_path" ]] && ! tmux has-session -t "$_sess_name" 2>/dev/null; then
51+
tmux new-session -d -s "$_sess_name" -c "$_sess_path"
52+
fi
53+
done
5454

55-
# Detect notable processes in a tmux session via pstree
56-
_tmux_procs() {
57-
local sid=$1
58-
local pids procs=""
59-
pids=$(tmux list-panes -t "$sid" -F '#{pane_pid}' 2>/dev/null)
60-
for _pid in $pids; do
61-
local tree
62-
tree=$(pstree -A "$_pid" 2>/dev/null) || continue
63-
for _proc in "${_TMUX_NOTABLE_PROCS[@]}"; do
64-
[[ "$tree" == *"$_proc"* ]] && procs="${procs:+$procs, }$_proc"
65-
done
66-
done
67-
printf '%s' "${procs:--}"
68-
}
55+
# Detect notable processes in a tmux session via pstree
56+
_tmux_procs() {
57+
local sid=$1
58+
local pids procs=""
59+
pids=$(tmux list-panes -t "$sid" -F '#{pane_pid}' 2>/dev/null)
60+
for _pid in $pids; do
61+
local tree
62+
tree=$(pstree -A "$_pid" 2>/dev/null) || continue
63+
for _proc in "${_TMUX_NOTABLE_PROCS[@]}"; do
64+
[[ "$tree" == *"$_proc"* ]] && procs="${procs:+$procs, }$_proc"
65+
done
66+
done
67+
printf '%s' "${procs:--}"
68+
}
6969

70-
# Relative time since last activity in a session
71-
_tmux_age() {
72-
local sid=$1
73-
local now age_s
74-
now=$(date +%s)
75-
local last
76-
last=$(tmux display-message -t "$sid" -p '#{session_activity}' 2>/dev/null) || { printf '?'; return; }
77-
age_s=$(( now - last ))
78-
if (( age_s < 60 )); then printf 'just now'
79-
elif (( age_s < 3600 )); then printf '%dm ago' "$(( age_s / 60 ))"
80-
elif (( age_s < 86400 )); then printf '%dh ago' "$(( age_s / 3600 ))"
81-
else printf '%dd ago' "$(( age_s / 86400 ))"; fi
70+
# Relative time since last activity in a session
71+
_tmux_age() {
72+
local sid=$1
73+
local now age_s
74+
now=$(date +%s)
75+
local last
76+
last=$(tmux display-message -t "$sid" -p '#{session_activity}' 2>/dev/null) || {
77+
printf '?'
78+
return
8279
}
80+
age_s=$((now - last))
81+
if ((age_s < 60)); then
82+
printf 'just now'
83+
elif ((age_s < 3600)); then
84+
printf '%dm ago' "$((age_s / 60))"
85+
elif ((age_s < 86400)); then
86+
printf '%dh ago' "$((age_s / 3600))"
87+
else printf '%dd ago' "$((age_s / 86400))"; fi
88+
}
8389

84-
# Session picker with loop (re-displays after creating new sessions)
85-
while true; do
86-
_tmux_names=()
87-
_tmux_count=0
90+
# Session picker with loop (re-displays after creating new sessions)
91+
while true; do
92+
_tmux_names=()
93+
_tmux_count=0
8894

89-
printf '\n'
90-
printf '# %-16s %s %-20s %s\n' 'SESSION' 'WIN' 'PROCESSES' 'LAST ACCESS'
91-
printf -- '--- %-16s %s %-20s %s\n' '----------------' '---' '--------------------' '-------------------'
95+
printf '\n'
96+
printf '# %-16s %s %-20s %s\n' 'SESSION' 'WIN' 'PROCESSES' 'LAST ACCESS'
97+
printf -- '--- %-16s %s %-20s %s\n' '----------------' '---' '--------------------' '-------------------'
9298

93-
while IFS='|' read -r _sname _swins _satt; do
94-
(( _tmux_count++ ))
95-
_tmux_names[$_tmux_count]="$_sname"
96-
_label="${_sname}${_satt:+ *}"
97-
_procs=$(_tmux_procs "$_sname")
98-
_age=$(_tmux_age "$_sname")
99-
printf '%-4s %-16s %3s %-20s %s\n' "${_tmux_count})" "$_label" "$_swins" "$_procs" "$_age"
100-
done < <(tmux list-sessions -F '#{session_name}|#{session_windows}|#{?session_attached,*,}' 2>/dev/null)
99+
while IFS='|' read -r _sname _swins _satt; do
100+
((_tmux_count++))
101+
_tmux_names[_tmux_count]="$_sname"
102+
_label="${_sname}${_satt:+ *}"
103+
_procs=$(_tmux_procs "$_sname")
104+
_age=$(_tmux_age "$_sname")
105+
printf '%-4s %-16s %3s %-20s %s\n' "${_tmux_count})" "$_label" "$_swins" "$_procs" "$_age"
106+
done < <(tmux list-sessions -F '#{session_name}|#{session_windows}|#{?session_attached,*,}' 2>/dev/null)
101107

102-
printf '\n[1-%d] attach [n] new [s] skip\n' "$_tmux_count"
103-
printf '> '
104-
read -r _choice
108+
printf '\n[1-%d] attach [n] new [s] skip\n' "$_tmux_count"
109+
printf '> '
110+
read -r _choice
105111

106-
case "$_choice" in
107-
s|skip)
108-
break
109-
;;
110-
n|new)
111-
printf 'Session name: '
112-
read -r _new_name
113-
printf 'Start directory: '
114-
read -r _new_path
115-
_new_path="${_new_path:-$HOME}"
116-
if [[ -n "$_new_name" ]] && [[ -d "$_new_path" ]]; then
117-
tmux new-session -d -s "$_new_name" -c "$_new_path"
118-
else
119-
printf 'Invalid name or path.\n' >&2
120-
continue
121-
fi
122-
;;
123-
[0-9]*)
124-
if (( _choice >= 1 && _choice <= _tmux_count )); then
125-
exec tmux attach -t "${_tmux_names[_choice]}"
126-
else
127-
printf 'Invalid selection.\n' >&2
128-
fi
129-
;;
130-
"")
131-
;;
132-
*)
133-
# Try as session name directly
134-
if tmux has-session -t "$_choice" 2>/dev/null; then
135-
exec tmux attach -t "$_choice"
136-
else
137-
printf 'Unknown session: %s\n' "$_choice" >&2
138-
fi
139-
;;
140-
esac
141-
done
112+
case "$_choice" in
113+
s | skip)
114+
break
115+
;;
116+
n | new)
117+
printf 'Session name: '
118+
read -r _new_name
119+
printf 'Start directory: '
120+
read -r _new_path
121+
_new_path="${_new_path:-$HOME}"
122+
if [[ -n "$_new_name" ]] && [[ -d "$_new_path" ]]; then
123+
tmux new-session -d -s "$_new_name" -c "$_new_path"
124+
else
125+
printf 'Invalid name or path.\n' >&2
126+
continue
127+
fi
128+
;;
129+
[0-9]*)
130+
if ((_choice >= 1 && _choice <= _tmux_count)); then
131+
exec tmux attach -t "${_tmux_names[_choice]}"
132+
else
133+
printf 'Invalid selection.\n' >&2
134+
fi
135+
;;
136+
"") ;;
137+
*)
138+
# Try as session name directly
139+
if tmux has-session -t "$_choice" 2>/dev/null; then
140+
exec tmux attach -t "$_choice"
141+
else
142+
printf 'Unknown session: %s\n' "$_choice" >&2
143+
fi
144+
;;
145+
esac
146+
done
142147

143-
unset _pair _sess_name _sess_path _tmux_names _tmux_count _sname _swins _satt _choice _new_name _new_path _label _procs _age _pid _proc
148+
unset _pair _sess_name _sess_path _tmux_names _tmux_count _sname _swins _satt _choice _new_name _new_path _label _procs _age _pid _proc
144149
fi

0 commit comments

Comments
 (0)