| name | state-directory-manager-1-xdg-base-directory-standard |
| description | XDG Base Directory compliant state management. Use when setting up config, data, state, or cache directories per the XDG specification. |
| version | 1.0.0 |
| category | _core |
| type | reference |
| scripts_exempt | true |
1. XDG Base Directory Standard (+2)
1. XDG Base Directory Standard
Follow the XDG specification for directory locations:
#!/bin/bash
XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"
XDG_DATA_HOME="${XDG_DATA_HOME:-$HOME/.local/share}"
XDG_STATE_HOME="${XDG_STATE_HOME:-$HOME/.local/state}"
XDG_CACHE_HOME="${XDG_CACHE_HOME:-$HOME/.cache}"
APP_NAME="my-tool"
CONFIG_DIR="$XDG_CONFIG_HOME/$APP_NAME"
DATA_DIR="$XDG_DATA_HOME/$APP_NAME"
STATE_DIR="$XDG_STATE_HOME/$APP_NAME"
CACHE_DIR="$XDG_CACHE_HOME/$APP_NAME"
LOG_DIR="$STATE_DIR/logs"
init_directories() {
mkdir -p "$CONFIG_DIR"
mkdir -p "$DATA_DIR"
mkdir -p "$STATE_DIR"
mkdir -p "$CACHE_DIR"
mkdir -p "$LOG_DIR"
}
2. Workspace-Hub Pattern
Alternative using home directory (from workspace-hub scripts):
#!/bin/bash
APP_NAME="workspace-hub"
APP_DIR="${HOME}/.${APP_NAME}"
CONFIG_DIR="$APP_DIR/config"
DATA_DIR="$APP_DIR/data"
LOGS_DIR="$APP_DIR/logs"
CACHE_DIR="$APP_DIR/cache"
TEMP_DIR="$APP_DIR/tmp"
init_app_dirs() {
local dirs=("$CONFIG_DIR" "$DATA_DIR" "$LOGS_DIR" "$CACHE_DIR" "$TEMP_DIR")
for dir in "${dirs[@]}"; do
if [[ ! -d "$dir" ]]; then
mkdir -p "$dir"
chmod 700 "$dir"
fi
done
}
() {
find - f -mtime +1 -delete 2>/dev/null ||
}
3. Configuration File Management
Read and write configuration files:
#!/bin/bash
CONFIG_FILE="$CONFIG_DIR/config"
declare -A DEFAULT_CONFIG=(
["parallel_workers"]="5"
["log_level"]="INFO"
["auto_sync"]="true"
["timeout"]="30"
)
init_config() {
if [[ ! -f "$CONFIG_FILE" ]]; then
{
echo "# Configuration for $APP_NAME"
echo "# Generated: $(date)"
echo ""
for key in "${!DEFAULT_CONFIG[@]}"; do
echo "${key}=${DEFAULT_CONFIG[$key]}"
done
} > "$CONFIG_FILE"
fi
}
get_config() {
local key="$1"
local default="${2:-}"
[[ -f ]];
value
value=$(grep 2>/dev/null | -d -f2-)
}
() {
key=
value=
init_config
grep -q 2>/dev/null;
sed -i
>>
}
() {
-gA CONFIG
key ;
CONFIG[]=
[[ -f ]];
IFS= -r key value;
[[ =~ ^#.*$ || -z ]] &&
CONFIG[]=
<
}
init_config
load_config
set_config