The stepCount and stepSize knobs were two controls for one quantity users actually care about (reach), and the number of steps is an implementation detail nobody meaningfully tunes. Each pattern has a natural size and resolution — a jitter is inherently small, an arc a broad curve — so those now live as constants in each strategy rather than as global config. - strategies.ts: each pattern defines its own step count and size; MoveContext drops `config` down to pure geometry (start/width/height/rng), and the module no longer imports Config at all (dissolving the type-only-import cycle workaround). line stays byte-for-byte: 250 one-pixel steps. - executor.ts: executePath takes `config` for pacing (stepDelay); the path itself needs nothing from it. - config.ts / cli.ts / move.ts / config.default.json: drop stepCount and stepSize from the type, seed, validation, resolver, CLI flags (-n, -s), and help. stepDelay stays as the one pacing lever. - configFile.ts: tolerate the removed keys instead of rejecting them — every pre-1.3.0 install seeded stepCount, so a hard "unknown key" failure on upgrade is avoided. They're ignored with a one-line stderr notice; genuine unknown keys still error. The -n/--step-count CLI flag (shipped since 1.0.0) is now an unknown option; config files degrade gracefully, command lines don't. Stays in the unpushed 1.3.0 release. 64 tests pass.
5.3 KiB
5.3 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.0 - 2026-08-06
Added
- Pluggable movement strategies. New
-p, --pattern <name>flag andpatternconfig 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, andFIGUREEIGHTare all accepted (on the CLI and in the config file) and resolve to the canonical name. src/device.ts: injectableDeviceseam 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: singleexecutePathdriver 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
simulateActivityno longer hardcodes a straight-line sweep; it selects a strategy from the registry and delegates execution toexecutePath. The defaultlinepattern 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 = 0moved fromrunKeeperintocreateNutDevice— 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/reflectpatterns 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(policyabort) is unaffected.
Removed
-n, --step-countflag and thestepCount/stepSizeconfig 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 withstepCount) 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, --editflag opens the resolved config file in$EDITOR.
Changed
keeper.ts(and@nut-tree-fork/nut-js) is lazy-imported, so--helpand--versionskip the nut.js load and start ~10x faster.
1.1.1 - 2026-06-17
Changed
- Tests moved from
src/to a top-leveltests/directory. tsconfig.jsonsets"types": ["bun"]so VS Code resolvesbun:test.
Fixed
package.jsonversion 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.jsonwith project defaults on fresh install only. - Bun test suite for
resolveConfigandloadConfigFile.
Changed
- Installer scripts now live in
scripts/. verboseis now a first-classConfigfield;resolveVerboseremoved.CliErrorextracted intosrc/errors.ts.defaultConfigPath()throws when both$XDG_CONFIG_HOMEand$HOMEare unset.mouse.config.autoDelayMs = 0moved intorunKeeper(no module-load side effect).- Runtime errors go through a
failRuntimehelper that mirrorsfailUser. keeper.tsdeclares a namedLoggerinterface.dev-setup.shis now POSIXsh.tsconfig.json: enablednoUncheckedIndexedAccessandresolveJsonModule.
1.0.1 - 2026-06-17
Added
- End-user
install.shrunnable viacurl ... | sh. XDG-respecting, idempotent. uninstall.shremoves the wrapper and install tree; leaves Bun and user config alone.dev-setup.shfor contributors.
Removed
DISTRIBUTION-PLAN.md(design notes, superseded by the implementation).
1.0.0 - 2026-06-15
Initial release.
Added
moveCLI 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. binentry + shebang sobun linkregistersmoveglobally.