#!/usr/bin/env bash
set -euo pipefail
usage() {
cat <<'USAGE_EOF' >&2
Usage:
bitlesson-init.sh --project-root
--template [--bitlesson-relpath ]
Behavior:
- Default bitlesson-relpath: .humanize/bitlesson.md
- Creates / from template if missing
- Does not overwrite existing file
- Prints the resolved bitlesson file path to stdout on success
USAGE_EOF
}
PROJECT_ROOT=""
TEMPLATE_PATH=""
BITLESSON_RELPATH=".humanize/bitlesson.md"
while [[ $# -gt 0 ]]; do
case "$1" in
-h|--help)
usage
exit 0
;;
--project-root)
PROJECT_ROOT="${2:-}"
shift 2
;;
--template)
TEMPLATE_PATH="${2:-}"
shift 2
;;
--bitlesson-relpath)
BITLESSON_RELPATH="${2:-}"
shift 2
;;
*)
echo "Error: Unknown argument: $1" >&2
usage
exit 1
;;
esac
done
if [[ -z "$PROJECT_ROOT" ]]; then
echo "Error: --project-root is required" >&2
usage
exit 1
fi
if [[ -z "$TEMPLATE_PATH" ]]; then
echo "Error: --template is required" >&2
usage
exit 1
fi
if [[ ! -d "$PROJECT_ROOT" ]]; then
echo "Error: --project-root must be an existing directory: $PROJECT_ROOT" >&2
exit 1
fi
if [[ ! -f "$TEMPLATE_PATH" ]]; then
echo "Error: --template must be an existing file: $TEMPLATE_PATH" >&2
exit 1
fi
if [[ "$BITLESSON_RELPATH" = /* ]] || [[ "$BITLESSON_RELPATH" =~ (^|/)\.\.(/|$) ]]; then
echo "Error: --bitlesson-relpath must be a relative path without '..': $BITLESSON_RELPATH" >&2
exit 1
fi
PROJECT_ROOT_ABS="$(cd "$PROJECT_ROOT" && pwd -P)"
BITLESSON_FILE="$PROJECT_ROOT_ABS/$BITLESSON_RELPATH"
if [[ -e "$BITLESSON_FILE" && ! -f "$BITLESSON_FILE" ]]; then
echo "Error: BitLesson path exists but is not a regular file: $BITLESSON_FILE" >&2
exit 1
fi
if [[ ! -f "$BITLESSON_FILE" ]]; then
mkdir -p "$(dirname "$BITLESSON_FILE")"
cp "$TEMPLATE_PATH" "$BITLESSON_FILE"
fi
printf '%s\n' "$BITLESSON_FILE"