Files
Move/CHANGELOG.md
T
nokeo08 1ad724cd33 Release 1.3.3
install.sh now installs the newest published tag by default instead of
tracking the master branch, so 'curl ... | sh' installs a real release and
reports its version. The tag is resolved from the Gitea tags API, falling
back to master if the lookup fails. MOVE_VERSION still pins an explicit ref.
2026-08-17 10:58:26 -05:00

8.0 KiB

Changelog

All notable changes to move are documented here.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

1.3.3 - 2026-08-17

Changed

  • install.sh now installs the newest published tag by default instead of tracking the master branch, so the plain curl ... | sh one-liner installs a real release and reports its version (e.g. v1.3.2). The tag is resolved from the Gitea tags API; if that lookup fails (offline, API unreachable, or no tags yet) it falls back to master, preserving the old behavior. Set MOVE_VERSION to pin an explicit branch or tag as before.

1.3.2 - 2026-08-17

Added

  • install.sh is now interactive. When it finds an existing install and a controlling terminal is available, it reports what's there and asks before replacing it, instead of leaving MOVE_FORCE as the only control. If a config file already exists it asks separately whether to reseed it from the shipped defaults. Both questions are asked before anything is downloaded or deleted, so declining changes nothing.
  • MOVE_RESEED_CONFIG=1 overwrites the user config with the shipped defaults without prompting, for unattended use. The previous file is kept as config.json.bak; the same backup is written when reseeding is confirmed at the prompt.

Changed

  • MOVE_FORCE=1 now means "skip every prompt and reinstall unconditionally". It deliberately does not touch the user config, so automation that reinstalls the CLI can't take customizations down with it.
  • Existing-install detection looks for the install tree and the wrapper, not just the .installed-version marker, so a half-finished or hand-moved install is caught rather than silently overwritten.

Fixed

  • Installing a different version over an existing one used to wipe and replace it with no warning; only an exact version match was ever reported. That case now prompts. With no terminal (CI, cron, container builds) the previous non-interactive behavior is preserved exactly: an identical version is a no-op, a different version is replaced.

1.3.1 - 2026-08-14

Added

  • docs/execution-happy-path.md: a sequence diagram (plus invariants) tracing a clean idle-triggered sweep end to end, linked from the README.

Fixed

  • Stale comments corrected to match the current code: the install.sh / uninstall.sh header curl URLs pointed at a nonexistent repo-root path (they live under scripts/), so the documented command 404'd; move.ts's module list omitted editor.ts and the --edit step; and config.ts still described a removed pixel unit.

1.3.0 - 2026-08-14

Added

  • Pluggable movement strategies. New -p, --pattern <name> flag and pattern config key select how the cursor moves: line (default, unchanged behavior), diagonal, jitter, walk, arc, figureEight. Each pattern owns its own size and step count as constants; there is no user knob for sweep magnitude.
  • Pattern names are matched leniently: case and separators are ignored, so figureEight, figure-eight, figure_eight, and FIGUREEIGHT are all accepted (on the CLI and in the config file) and resolve to the canonical name.
  • src/device.ts: injectable Device seam over nut.js, enabling unit tests for movement without the native binary or a real screen.
  • src/strategies.ts: pure, per-pattern path generators plus the registry and name validation.
  • src/executor.ts: single executePath driver owning bounds policy (abort/clamp/reflect), pacing, interrupt detection, and restore.
  • Test suites for strategies, the executor (all bounds policies, rounding, interrupt), and the keeper loop.

Changed

  • simulateActivity no longer hardcodes a straight-line sweep; it selects a strategy from the registry and delegates execution to executePath. The default line pattern is byte-for-byte the previous behavior.
  • Interrupt detection now compares against the last commanded (rounded) point rather than an ideal target, so fractional/curved paths don't self-trip.
  • mouse.config.autoDelayMs = 0 moved from runKeeper into createNutDevice — the single place nut.js is wired up.
  • runKeeper(config, device?) accepts an injected device for testing.
  • Interrupt detection tolerates a small (2px) gap between the commanded and read-back cursor position, and the clamp/reflect patterns stay a few pixels off the screen edge. Together these avoid false "user activity" aborts from sub-pixel cursor placement on scaled or multi-monitor setups, which the new edge-seeking patterns would otherwise hit. line (policy abort) is unaffected.

Removed

  • -n, --step-count flag and the stepCount / stepSize config keys. Sweep size and step count are now intrinsic to each movement pattern, not user knobs. Config files that still contain these keys keep working: the loader ignores them with a one-line notice instead of rejecting them, so existing installs (all seeded with stepCount) don't break on upgrade. The removed CLI flag, however, is a hard error like any other unknown option.

1.2.0 - 2026-06-17

Added

  • -e, --edit flag opens the resolved config file in $EDITOR.

Changed

  • keeper.ts (and @nut-tree-fork/nut-js) is lazy-imported, so --help and --version skip the nut.js load and start ~10x faster.

1.1.1 - 2026-06-17

Changed

  • Tests moved from src/ to a top-level tests/ directory.
  • tsconfig.json sets "types": ["bun"] so VS Code resolves bun:test.

Fixed

  • package.json version now matches the published tag.

1.1.0 - 2026-06-17

Added

  • JSON config file support at ${XDG_CONFIG_HOME:-~/.config}/move/config.json. Precedence: CLI flags > config file > defaults. Strict validation.
  • -C, --config <path> to override the default config path.
  • Installer seeds config.json with project defaults on fresh install only.
  • Bun test suite for resolveConfig and loadConfigFile.

Changed

  • Installer scripts now live in scripts/.
  • verbose is now a first-class Config field; resolveVerbose removed.
  • CliError extracted into src/errors.ts.
  • defaultConfigPath() throws when both $XDG_CONFIG_HOME and $HOME are unset.
  • mouse.config.autoDelayMs = 0 moved into runKeeper (no module-load side effect).
  • Runtime errors go through a failRuntime helper that mirrors failUser.
  • keeper.ts declares a named Logger interface.
  • dev-setup.sh is now POSIX sh.
  • tsconfig.json: enabled noUncheckedIndexedAccess and resolveJsonModule.

1.0.1 - 2026-06-17

Added

  • End-user install.sh runnable via curl ... | sh. XDG-respecting, idempotent.
  • uninstall.sh removes the wrapper and install tree; leaves Bun and user config alone.
  • dev-setup.sh for contributors.

Removed

  • DISTRIBUTION-PLAN.md (design notes, superseded by the implementation).

1.0.0 - 2026-06-15

Initial release.

Added

  • move CLI for keeping presence-tracking apps marked Available by nudging the cursor after a configurable idle period.
  • Flags: -h/--help, -v/--version, -m/--move-interval, -c/--check-interval, -d/--step-delay, -n/--step-count, -V/--verbose.
  • Quiet-by-default logging.
  • Source split into src/{move,cli,config,keeper}.ts.
  • bin entry + shebang so bun link registers move globally.