8 Commits

Author SHA1 Message Date
lachtan
0041ce95dc Commit messages must be in English 2026-03-15 20:41:57 +01:00
lachtan
dd7a9249a2 Update project documentation 2026-03-15 20:36:02 +01:00
lachtan
7ad3fa729c Add forgotten .claude/settings.local.json to .gitignore 2026-03-15 20:35:51 +01:00
lachtan
b9fa65b141 Add whole-string quoting rule to bash style guide 2026-03-15 16:34:14 +01:00
lachtan
0d5eb492aa Quote variable expansions in rc scripts 2026-03-15 16:32:14 +01:00
lachtan
79ba0ae913 Add shellcheck hook and configuration 2026-03-15 16:28:34 +01:00
lachtan
aa28c9619f Add commit message style guideline to CLAUDE.md 2026-03-15 16:27:31 +01:00
lachtan
54ad290a82 Add resource cleanup and structured data rules to bash style guide 2026-03-15 15:43:08 +01:00
11 changed files with 83 additions and 11 deletions

22
.claude/hooks/shellcheck.sh Executable file
View File

@@ -0,0 +1,22 @@
#!/usr/bin/env bash
set -E -o errexit -o nounset -o pipefail
# Exit silently if required tools are missing
command -v shellcheck > /dev/null 2>&1 || exit 0
command -v file > /dev/null 2>&1 || exit 0
command -v jq > /dev/null 2>&1 || exit 0
input=$(cat)
file_path=$(printf '%s' "$input" | jq -r '.tool_input.file_path // empty')
[[ -z "$file_path" || ! -f "$file_path" ]] && exit 0
file_type=$(file --brief "$file_path")
case "$file_type" in
*"Bourne-Again shell"*|*"bash"*|*"/bin/bash"*) ;;
*"shell script"*|*"/bin/sh"*) ;;
*) exit 0 ;;
esac
shellcheck --format=gcc "$file_path" >&2

View File

@@ -20,7 +20,7 @@ Complements CLAUDE.md. Does not repeat rules already defined there.
## Naming
- `UPPER_CASE` — exported env vars and constants
- `UPPER_CASE` — exported env vars and constants; use `readonly` for true constants
- `snake_case` — local variables and function names
- `verb_noun` pattern for functions: `set_ps1_prompt`, `docker_aws_login`
- Meaningful names, no single letters except loop counters (`i`, `f`)
@@ -48,9 +48,19 @@ function do_thing() {
- `(( ))` for arithmetic comparisons
- `$(command)` for substitution, never backticks
- Double quotes around expansions: `"$var"`, `"${array[@]}"`
- Quote the whole string, not just the variable: `"$HOME/.local/bin"` not `"$HOME"/.local/bin`
- Single quotes for literals that must not expand
- `printf` over `echo` when output contains escapes or format strings
## Resource Cleanup
- Consider `trap cleanup EXIT` with `mktemp` when scripts create temporary files/dirs or acquire resources; skip when it would add unnecessary complexity (short scripts, no temp state)
## Structured Data
- Prefer `jq` for JSON and `yq` for YAML over ad-hoc `grep`/`awk`/string splitting
- Treat parser errors as fatal; check exit status before using results
## Commands
- Long options for clarity: `--recursive` not `-r` (common test flags `-f`, `-d`, `-e` are fine)

15
.claude/settings.json Normal file
View File

@@ -0,0 +1,15 @@
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": ".claude/hooks/shellcheck.sh"
}
]
}
]
}
}

1
.gitignore vendored
View File

@@ -9,3 +9,4 @@
.vscode/
.idea/
.claude/settings.local.json

12
.shellcheckrc Normal file
View File

@@ -0,0 +1,12 @@
# Default shell for sourced files without shebang (SC2148)
shell=bash
# Sourced files define variables used by other files after source
disable=SC2034
# Non-constant and external source paths are intentional
disable=SC1090
disable=SC1091
# Functions invoked indirectly via trap/callback
disable=SC2317

View File

@@ -10,6 +10,7 @@ and adds `bin/` to PATH. `$LWS` points to repo root.
- `bin/` — Scripts auto-added to PATH. New CLI tools go here.
- `scripts/` — Setup scripts NOT on PATH (git-config, docker fixes, gnome config).
- `conf/` — Tool configs (vim, WireGuard, WSL).
- `doc/` — Reference docs, cheatsheets, bookmarks.
- `functions.sh` — Core lib (see below).
## Key Helpers (`functions.sh`)
@@ -26,7 +27,7 @@ and adds `bin/` to PATH. `$LWS` points to repo root.
## Conventions
All new bash scripts should use:
All new **executable** bash scripts should use:
```bash
#!/usr/bin/env bash
@@ -34,8 +35,13 @@ All new bash scripts should use:
set -E -o errexit -o nounset -o pipefail
```
**Sourced files** (rc files, `functions.sh`) must NOT use `set -o errexit` — they run inside
the user's shell. Add `# shellcheck shell=bash` at the top instead of a shebang.
Before writing shell code, check `functions.sh` for existing helper functions and prefer them over raw commands.
Detailed formatting, naming, and syntax rules are in `.claude/rules/bash-style.md`.
RC files MUST guard slow tools and check availability:
```bash
@@ -53,4 +59,6 @@ Installers (`install/*.sh`) MUST be idempotent — check before installing.
## Commits
Do not add `Co-Authored-By` lines to commit messages.
- Do not add `Co-Authored-By` lines to commit messages.
- Commit messages must be in English.
- Prefer one-line commit messages. Add a longer description only when necessary for better understanding.

View File

@@ -24,6 +24,10 @@ For faster load can be set
For debug log enabled
`LWS_DEBUG=1`
## Directory notes
`opt/` (git-ignored) is used for locally installed tools (e.g. bash-git-prompt, enhancd).
## Quick commands
```bash

View File

@@ -1 +1 @@
append_path_try $HOME/.local/bin
append_path_try "$HOME/.local/bin"

View File

@@ -1,7 +1,7 @@
_INIT_FILE=$WORKSPACE/opt/enhancd/init.sh
_INIT_FILE="$WORKSPACE/opt/enhancd/init.sh"
if [[ -f $_INIT_FILE ]]; then
source $_INIT_FILE
source "$_INIT_FILE"
unalias cd
alias ecd="__enhancd::cd"
fi

View File

@@ -1,12 +1,12 @@
CRYPTED_DIR=$HOME/Sync/safe
DECRYPTED_DIR=$HOME/mnt/safe
CRYPTED_DIR="$HOME/Sync/safe"
DECRYPTED_DIR="$HOME/mnt/safe"
function safe-mount() {
gocryptfs $CRYPTED_DIR $DECRYPTED_DIR
gocryptfs "$CRYPTED_DIR" "$DECRYPTED_DIR"
}
function safe-unmount() {
fusermount -u $DECRYPTED_DIR
fusermount -u "$DECRYPTED_DIR"
}

View File

@@ -1 +1 @@
$WORKSPACE/scripts/changes.sh
"$WORKSPACE/scripts/changes.sh"