Seed default config on install; share defaults JSON with runtime
The defaults now live in a single file, scripts/config.default.json:
- src/config.ts imports it via 'with { type: "json" }' and derives
DEFAULT_CONFIG (with seconds->ms conversion at the boundary), so the
CLI help text always matches what the seeded user config contains.
- scripts/install.sh copies the same file to
$XDG_CONFIG_HOME/move/config.json only if no file is already there.
Existing configs (yours or from a previous install) are never
overwritten.
- scripts/uninstall.sh does not touch the user config file at all,
following the strict Unix convention. It does print a one-line
notice pointing at the path so the user can rm -rf the dir
themselves if they want a fully-clean removal.
- tsconfig.json gains resolveJsonModule:true so tsc accepts the JSON
import.
- A small runtime assertion in src/config.ts (assertSeedShape) fails
loudly if the seed file is missing keys or has wrong types.
- README Configuration section documents the seed behavior; Uninstall
section documents the leave-config-behind policy with the rm-it-
yourself command; Files table gains scripts/config.default.json.
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"moveInterval": 240,
|
||||
"checkInterval": 10,
|
||||
"stepDelay": 50,
|
||||
"stepCount": 250,
|
||||
"verbose": false
|
||||
}
|
||||
+48
-15
@@ -14,15 +14,19 @@
|
||||
# 5. Download the source tarball from Gitea, extract under the install dir.
|
||||
# 6. `bun install --production` (skips devDependencies).
|
||||
# 7. Drop a small wrapper script as `move` on the user's bin dir.
|
||||
# 8. Verify PATH, surface macOS Accessibility hint, print final status.
|
||||
# 8. Seed the user's config file with defaults, only if one doesn't already
|
||||
# exist at $XDG_CONFIG_HOME/move/config.json.
|
||||
# 9. Verify PATH, surface macOS Accessibility hint, print final status.
|
||||
#
|
||||
# Env vars (all optional):
|
||||
# MOVE_VERSION Branch or tag to install. Default: master.
|
||||
# MOVE_FORCE Set to 1 to reinstall even if the version marker matches.
|
||||
# XDG_DATA_HOME Source install root (default $HOME/.local/share).
|
||||
# Final source location is $XDG_DATA_HOME/move.
|
||||
# XDG_BIN_HOME Wrapper install root (default $HOME/.local/bin).
|
||||
# Final binary location is $XDG_BIN_HOME/move.
|
||||
# MOVE_VERSION Branch or tag to install. Default: master.
|
||||
# MOVE_FORCE Set to 1 to reinstall even if the version marker matches.
|
||||
# XDG_DATA_HOME Source install root (default $HOME/.local/share).
|
||||
# Final source location is $XDG_DATA_HOME/move.
|
||||
# XDG_BIN_HOME Wrapper install root (default $HOME/.local/bin).
|
||||
# Final binary location is $XDG_BIN_HOME/move.
|
||||
# XDG_CONFIG_HOME User config root (default $HOME/.config).
|
||||
# Default config file path is $XDG_CONFIG_HOME/move/config.json.
|
||||
#
|
||||
# POSIX sh; no bashisms.
|
||||
|
||||
@@ -37,6 +41,8 @@ MOVE_FORCE="${MOVE_FORCE:-0}"
|
||||
|
||||
INSTALL_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/move"
|
||||
BIN_DIR="${XDG_BIN_HOME:-$HOME/.local/bin}"
|
||||
CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/move"
|
||||
CONFIG_FILE="$CONFIG_DIR/config.json"
|
||||
|
||||
die() {
|
||||
printf 'Error: %s\n' "$1" >&2
|
||||
@@ -44,14 +50,14 @@ die() {
|
||||
}
|
||||
|
||||
# Refuse to operate on a directory that points somewhere catastrophic.
|
||||
# `INSTALL_DIR` derives from XDG_DATA_HOME, a broadly-scoped env var the
|
||||
# user could conceivably set to anything; the install path always
|
||||
# culminates in `.../move`, but a malformed XDG_DATA_HOME could still
|
||||
# resolve to something like '/move' which we don't want to `rm -rf`.
|
||||
assert_safe_install_dir() {
|
||||
case "$INSTALL_DIR" in
|
||||
# The XDG_* env vars are broadly-scoped and the user could set them to
|
||||
# anything; our paths always culminate in `.../move`, but a malformed
|
||||
# XDG var could still resolve to something like '/move' which we don't
|
||||
# want to `rm -rf` or otherwise mass-write into.
|
||||
assert_safe_dir() {
|
||||
case "$1" in
|
||||
'' | '/' | "$HOME" | "$HOME/" | '/move')
|
||||
die "refusing to operate on INSTALL_DIR='$INSTALL_DIR' (too broad)"
|
||||
die "refusing to operate on '$1' (too broad)"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
@@ -96,7 +102,7 @@ printf '==> Using bun %s\n' "$BUN_VERSION"
|
||||
|
||||
# --- Idempotence check -------------------------------------------------------
|
||||
|
||||
assert_safe_install_dir
|
||||
assert_safe_dir "$INSTALL_DIR"
|
||||
|
||||
if [ "$MOVE_FORCE" != "1" ] && [ -f "$INSTALL_DIR/.installed-version" ]; then
|
||||
CURRENT=$(cat "$INSTALL_DIR/.installed-version" 2>/dev/null || printf '')
|
||||
@@ -152,6 +158,33 @@ chmod +x "$WRAPPER"
|
||||
|
||||
printf '%s\n' "$MOVE_VERSION" > "$INSTALL_DIR/.installed-version"
|
||||
|
||||
# --- Seed user config file (only if absent) ----------------------------------
|
||||
#
|
||||
# The defaults file shipped with the source tree (scripts/config.default.json)
|
||||
# is also the single source of truth for the runtime defaults loaded by
|
||||
# src/config.ts, so seeding a fresh user file from the same place keeps the
|
||||
# CLI behavior and the user-visible config in sync.
|
||||
#
|
||||
# Strict policy: never overwrite an existing user config. The uninstaller
|
||||
# follows the matching policy of never removing it; together that
|
||||
# preserves user customizations unconditionally across (re)installs and
|
||||
# uninstalls.
|
||||
|
||||
assert_safe_dir "$CONFIG_DIR"
|
||||
SEED_SRC="$INSTALL_DIR/scripts/config.default.json"
|
||||
|
||||
if [ ! -f "$SEED_SRC" ]; then
|
||||
die "default config seed missing from install tree: $SEED_SRC"
|
||||
fi
|
||||
|
||||
mkdir -p "$CONFIG_DIR"
|
||||
if [ ! -e "$CONFIG_FILE" ]; then
|
||||
cp "$SEED_SRC" "$CONFIG_FILE"
|
||||
printf '==> Wrote default config to %s\n' "$CONFIG_FILE"
|
||||
else
|
||||
printf '==> Config already exists at %s; leaving it alone\n' "$CONFIG_FILE"
|
||||
fi
|
||||
|
||||
# --- PATH sanity check -------------------------------------------------------
|
||||
|
||||
case ":$PATH:" in
|
||||
|
||||
+18
-2
@@ -8,10 +8,15 @@
|
||||
#
|
||||
# Removes the `move` wrapper from $XDG_BIN_HOME and the install tree from
|
||||
# $XDG_DATA_HOME/move. Does NOT remove Bun — that's your runtime, not ours.
|
||||
# Also leaves the user config file at $XDG_CONFIG_HOME/move/config.json
|
||||
# intact (Unix convention; user customizations are not ours to delete).
|
||||
# A notice is printed pointing at the file so you can remove it yourself
|
||||
# if desired.
|
||||
#
|
||||
# Env vars (must match what install.sh used):
|
||||
# XDG_DATA_HOME Source install root (default $HOME/.local/share).
|
||||
# XDG_BIN_HOME Wrapper install root (default $HOME/.local/bin).
|
||||
# XDG_DATA_HOME Source install root (default $HOME/.local/share).
|
||||
# XDG_BIN_HOME Wrapper install root (default $HOME/.local/bin).
|
||||
# XDG_CONFIG_HOME User config root (default $HOME/.config).
|
||||
#
|
||||
# POSIX sh; no bashisms.
|
||||
|
||||
@@ -19,6 +24,8 @@ set -eu
|
||||
|
||||
INSTALL_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/move"
|
||||
BIN_DIR="${XDG_BIN_HOME:-$HOME/.local/bin}"
|
||||
CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/move"
|
||||
CONFIG_FILE="$CONFIG_DIR/config.json"
|
||||
WRAPPER="$BIN_DIR/move"
|
||||
|
||||
die() {
|
||||
@@ -50,7 +57,16 @@ fi
|
||||
|
||||
if [ "$REMOVED_SOMETHING" = "0" ]; then
|
||||
printf 'Nothing to remove. Checked %s and %s.\n' "$WRAPPER" "$INSTALL_DIR"
|
||||
if [ -e "$CONFIG_FILE" ]; then
|
||||
printf 'Note: config file at %s was left in place.\n' "$CONFIG_FILE"
|
||||
printf ' Remove it manually with: rm -rf %s\n' "$CONFIG_DIR"
|
||||
fi
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ -e "$CONFIG_FILE" ]; then
|
||||
printf '\nNote: your config file at %s was left in place.\n' "$CONFIG_FILE"
|
||||
printf ' Remove it manually with: rm -rf %s\n' "$CONFIG_DIR"
|
||||
fi
|
||||
|
||||
printf '\nUninstalled. (Bun was not touched.)\n'
|
||||
|
||||
Reference in New Issue
Block a user