Repository navigation
Release v0.1.1 - #96
Conversation
Merge strategy: rebase or squash onlyThis PR is labeled A regular merge commit would:
When merging, click the dropdown next to the green button and pick Rebase and merge or Squash and merge. |
1 similar comment
Merge strategy: rebase or squash onlyThis PR is labeled A regular merge commit would:
When merging, click the dropdown next to the green button and pick Rebase and merge or Squash and merge. |
|
🚀 New RC: CI is building. Once the workflow finishes, RC channel users will receive this build automatically on their next update check. Release notes for this RCBuild
Dependencies
|
|
🚀 New RC: CI is building. Once the workflow finishes, RC channel users will receive this build automatically on their next update check. Release notes for this RCBuild
|
|
🚀 New RC: CI is building. Once the workflow finishes, RC channel users will receive this build automatically on their next update check. Release notes for this RCFeatures
|
Release v0.1.1
Tracking release candidates for v0.1.1.
npm run release -- --rcproduces a new RC build.Merge policy
Use rebase merge or squash merge. A regular merge commit creates a new commit hash, which would break bit-identity between RC and stable.
Iterations
(more added as RCs are cut)
What's in this release (
v0.1.1-rc.1)Bugfixes
A pairing code now works only once. Registering a remote device over iroh used to accept any TOTP code that was still within its ±30 s window, so a code someone had seen or intercepted could be reused for about a minute. Each TOTP credential now remembers the time step of the last code it accepted and rejects that step or any earlier one with "otp already used; wait for the next code" (RFC 6238 §5.2). Pairing a second device, or re-registering one, with the same credential therefore waits for the next code, up to 30 s. See SECURITY.md.
Guessing pairing codes is now throttled. Devices that weren't registered yet could try codes without limit, and a 6-digit code can be guessed in minutes at that rate. After 5 wrong codes in a row, registration is refused for 60 s, doubling with each further wrong code up to an hour; a successful registration resets it.
The iroh pairing database is no longer readable by other accounts.
iroh_auth.jsonholds the TOTP secrets but was written with default permissions, typically readable by every local user. On macOS and Linux it is now owner-only (0600), existing files are tightened when the daemon opens them, and saves go through a temporary file so a crash can't truncate it.Choosing "vulkan" as a device now means Vulkan. The device setting treated
vulkanas another name for wgpu, which on Windows runs on DX12, so asking for Vulkan quietly got DX12. It now asks for rlx's Vulkan backend, and where that isn't built in or present the usual fallback applies (CUDA, then wgpu, then CPU).GPU work on Windows uses DX12 only (with rlx
mainafter 0.2.19). wgpu could pick a Vulkan adapter instead, running models on a second GPU API with different drivers and results. SetWGPU_BACKEND=vulkanto use Vulkan anyway.Machines without a GPU run models on the CPU backend again (with rlx
mainafter 0.2.19). On a Windows PC, VM or remote session with no GPU, wgpu picked Microsoft's WARP software renderer (Mesa's llvmpipe on Linux) and skill counted it as a GPU, so models ran on an emulated GPU instead of rlx's native CPU backend. Software adapters are now skipped and the fallback reaches the CPU.RLX_WGPU_ALLOW_SOFTWARE=1keeps them.Warp no longer hangs when the zsh or bash hook is installed (Compatibility issue: Warp Terminal hangs when sourcing NeuroSkill zsh hook #69). Session recording re-runs the shell on a fresh PTY, which hides Warp's shell-integration handshake, so Warp waited forever at startup. The hooks now recognise the terminal app they run in (Warp, JetBrains, VS Code, Zed, iTerm2, Apple Terminal, Ghostty, WezTerm, Hyper, tmux, kitty, Alacritty, Konsole, GNOME Terminal, or a lowercased
$TERM_PROGRAM) and skip recording in any app listed inNEUROSKILL_SKIP_TERMINALS(space- or comma-separated). It defaults towarp; set it to an empty string to record everywhere, or add another app that misbehaves.NEUROSKILL_SKIP_RECORDING=1still skips a single shell. Takes effect when the hook is regenerated, which the daemon does on startup.The model picked in Settings → LLM is the one that loads (Built-in LLM fails across models in 0.0.131-rc.33 #92). Choosing a model only updated the in-memory config, so the previous model's path stayed in
settings.json, and the LLM page also wrote its stale copy back on every toggle. When the new selection wasn't marked downloaded, Start quietly loaded the old model instead. The daemon now saves the new path when you pick or switch a model, and loads the configured path only when nothing is selected or it is the selected file; otherwise Start says the selected model isn't downloaded.Refactor
svelte.config.js, so its settings (static adapter with theindex.htmlfallback, Vite preprocessing) moved into thesveltekit()plugin invite.config.js. It also removed the$libimport alias: the 907$lib/…imports are now#lib/…, mapped inpackage.json"imports"(with a matching TypeScriptpathsentry, since TypeScript does not add file extensions to"imports"targets).tsconfig.jsonnow extends$app/tsconfig, the error page readspagefrom$app/stateinstead of the removed$app/stores, and the search page updates its URL with a shallowgotoinstead of the deprecatedreplaceState.biome.jsonwas migrated to the 2.6 schema ("preset": "recommended"). The newuseDomNodeTextContentrule is off for the Playwright tests, where it misreadslocator.innerText()as the DOM property and its fix would change what the tests assert.Build
kache compiler cache. CI's Linux and Windows Rust jobs now cache compiled crates with kache (
kunobi-ninja/kache-action, pinned by SHA). "Rust — clippy + test" and "Windows — cargo clippy" each write one store, and the LLM and LSL E2E jobs restore the Linux store read-only.Swatinem/rust-cachestill caches the Cargo registry. Release jobs still run without a compiler cache. Locally,npm run tauri dev/build, the flamegraph script,scripts/test-all.shand the pre-push hook now prefer kache over sccache. An exportedRUSTC_WRAPPER=sccacheused to override a machine-wide kache setup. SetSKILL_NO_KACHE=1to fall back to sccache.The RPM and daemon-upgrade container checks run again.
Dockerfile.rpm-verifyandDockerfile.upgrade-testwere deleted in an unrelated commit, sonpm run verify:rpmandscripts/test-upgrade-linux-docker.shstopped at building their image. Both are restored, andverify:rpm --syntheticpasses all 24 checks again.compile-changelog.jsrejects anything that isn't a version. Any argument counted as the release version, so a typo or--helpmoved every unreleased fragment into a bogus release file. It now requires a version such as0.1.1or0.2.0-rc.1and aYYYY-MM-DDdate before touching anything, and--helpprints usage.bump.jsgets the same check.Build-cache setup prefers kache.
npm run setup:build-cache(and its Windows counterpart) offers kache first and sccache only as a fallback, and reports which one the build will use.npm run setupno longer suggests sccache when kache is installed. The build scripts already preferred kache; the setup scripts still offered only sccache.CI reads the Node version from
.nvmrc, so it has one source instead of elevennode-version: 22lines.Shell scripts are linted.
npm run lint:shruns shellcheck on every tracked shell script and git hook, and a new CI job runs it with a pinned shellcheck 0.11. The existing warnings were fixed: unused variables, unquoted expansions, and a pre-commit step that broke on Rust file names containing spaces.npm run stopmatches the daemon by name, and works on Windows.pkill -f skill-daemonmatched whole command lines, so on Linux it also killed the shell npm ran it in.npm run pullnow checks out the submodule commits the repo pins;npm run pull:latestkeeps the old move-to-latest behaviour.bundle-tts-weights.shfinds rlx-models the wayensure-rlx.shdoes (RLX_MODELS_ROOT, thenrlx-models.path, then../rlx-models) instead of falling back to one machine's absolute path.The app crate's tests compile on Linux and Windows.
tempfile, which 50 of theskillcrate's tests use, was declared in the macOS-only dependency table, socargo test -p skillfailed to compile everywhere else. It is now a dev-dependency. The daemon-upgrade container image also gainedlibopenblas-dev, which the tests need to link.Running the app's tests on Windows no longer overwrites your daemon token. The
daemon_cmdstests isolated themselves by settingHOME,XDG_CONFIG_HOMEandAPPDATA, but on Windows the config directory comes from the shell's known-folder API, which ignoresAPPDATA. Socargo test -p skillwrotetest-tokeninto the real%APPDATA%\skill\daemon\auth.token, after which the installed app got 401s from its own daemon. The tests now also setSKILL_DAEMON_CONFIG_ROOT, which every path helper honours. One mock server also left the request body unread, so Windows sometimes reset the connection before the client read the reply. All 93 of the crate's library tests now pass on Windows (verified twice, with the real token file left untouched) and all 107 on Linux.cargo updateworks with rlx-models 0.2.20. rlx-models now depends onrlx-mcu, a new rlx crate that isn't on crates.io, socargo updatefailed with "no matching package namedrlx-mcu". It is now patched to rlx's gitmainlike the other rlx crates, and so isrlx-optim, which had been resolving from crates.io beside the git copies. Every rlx crate in the lock now comes from one source.The vendored
libduckdb-syspatch applies again. It adds-bundleto the link of DuckDB's static-extension autoregister archive (the v0.1.0-rc.4 macOS link fix), but it was vendored as 1.20000.0, and once duckdb moved to 1.20000.1 Cargo stopped applying it. Without it, rustc repacks that archive in a temporary directory, and everyskill-daemonlink on macOS printedwarning: (arm64) deps/rustcXXXX/libduckdb_static_extension_autoregister.a(...) unable to open object file. It is now vendored as 1.20000.1 with the same two-line change, and the warning is gone.patches/holds only the four vendored crates still in use (openbci, eegdino, gpu-allocator, oura-api), each still needed because crates.io has no fixed release. Deleted: the retired btleplug shim, which nothing has compiled since the BLE crates moved to webbluetooth (theCargo.tomlcomment gives thegit checkoutto restore it), muda and phf_generator, whose patch entries were removed in May, and brainjepa and reve-rs, which are no longer dependencies.Cross-compiled builds pick platform code by target, not by build machine. Two build scripts used
#[cfg(target_os = …)], which describes the machine running the script. So a Windows build cross-compiled from a Mac tried to compileskill-vision's macOS Objective-C OCR shim and failed, and the app's Windows manifest was skipped whenever the Windows binary wasn't built on Windows. Both now readCARGO_CFG_TARGET_OS, asskill-calendaralready did. Native builds, including the CI release jobs, were unaffected.tsxis a pinned dev dependency. Nine npm scripts, including the settings-index step of everynpm run devandnpm run build, callednpx tsxwithouttsxbeing installed, so npx fetched whatever version was newest from the registry. They now run the locked version.npm run neuroskilland the VS Code extension build usenpm ci, installing what their lockfiles pin instead of re-resolving versions.Python and PowerShell scripts are linted too.
npm run lint:pyruns ruff with the rules inruff.toml, andnpm run lint:psruns PSScriptAnalyzer withPSScriptAnalyzerSettings.psd1; both run in the same CI job as shellcheck, andscripts/test-all.sh lintruns whichever linters are installed. The pre-push hook shellchecks the shell scripts a push changes. Fixes from the first run: unused imports (one of them a Unix-only module that would fail on Windows), three PowerShell scripts with non-ASCII text but no byte-order mark, which Windows PowerShell 5.1 misreads, and a$Argsparameter that shadowed PowerShell's automatic variable.Removed obsolete scripts: the root
release.sh(an old manual macOS release pipeline whose paths no longer resolve; releases go throughnpm run releaseand CI),test_daemon_hooks.sh,scripts/fix-daemon-rpath.sh(copied llama.cpp libraries the build no longer produces) andscripts/extract-help-to-md.mjs(a finished one-time migration).Linux CI runs again. GitHub's
ubuntu-latestimage moved to Ubuntu 26.04, and LunarG publishes its Vulkan SDK apt repository only for 24.04 and 22.04, so the "Rust — clippy + test", LLM E2E and coverage jobs failed at setup withcurl: (22) … 404before compiling anything. Those three jobs now run onubuntu-24.04, the image the Linux release build already uses. The Vulkan setup action now names the cause when LunarG has no list for the runner's Ubuntu release, instead of a bare curl error.Windows builds no longer install the Vulkan SDK. The app's build script downloaded LunarG's Vulkan SDK 1.3.280 and ran its installer silently whenever
C:\VulkanSDKwas missing, andnpm run tauriand the local Windows release script (release-windows.ps1) raninstall-vulkan-sdk.ps1on every build. Nothing needed it: GPU work on Windows goes through wgpu on DirectX 12, and the app makes no Vulkan calls of its own. All three installs and the script are gone; Linux, which does use Vulkan, is unchanged.The Homebrew cask follows releases again (
brew tap NeuroSkill-com/skill404s — the tap repo does not exist, and the in-repo cask is pinned to 0.0.37 #80). The workflow that bumpsCasks/neuroskill.rbafter a stable release opened a pull request, which GitHub Actions is not allowed to do in this repository, so it failed and the cask stayed at 0.0.129 after 0.1.0 shipped. It now commits the bump (version and the release asset's sha256 digest) straight tomain, and the cask is updated to 0.1.0.npm run setupinstalls CMake on macOS and usesnpm ci(fix(setup): macOS dev setup — add cmake, use npm ci #78). CMake is needed to buildsentencepiece-sysandhighs-sysbut was only checked on Linux. Dependencies now install withnpm ciwhenpackage-lock.jsonexists, the way CI installs them, instead ofnpm install, which re-resolves versions and can fail on peer ranges the lockfile already settled (Fresh-clonenpm installfails: typescript ^7.0.2 exceeds @sveltejs/kit peer range (^5.3.3 || ^6.0.0) #81).Building the frontend needs Node.js 22.17 or newer, up from 20. SvelteKit 3 requires 22.17 and Vitest 5 requires 22.12, so on Node 20 the dependencies install but the frontend does not build or test.
package.jsonengines, CONTRIBUTING and the development guide now say 22.17, andnpm run setupchecks the version, which it used to print as fine whatever it was. When Node is missing or older, setup now offers to install the latest Node 22 LTS from nodejs.org into~/.local(checksum-verified against the release'sSHASUMS256.txt, no sudo needed), linksnode,npmandnpxinto~/.local/bin, and prints the line to add to your shell profile if that directory is not on yourPATH. A new.nvmrcpins Node 22 for nvm, fnm and similar version managers. CI already runs Node 22.Docs
The development guide lists the scripts you run by hand, such as the WidgetKit build, the CLI end-to-end tests, the Windows test VM, icon generation and the TTS validation tools, and explains the kache setup.
The README's download links work (docs(readme): fix 404 download links; drop unbuilt AppImage #82). They pointed at unversioned file names under
releases/latest/download/that no release has ever had, and promised a Linux AppImage that isn't built. They now link the latest release page and name the real files: the macOS.dmg, the Windows-setup.exe, and the Linux.deb,.rpmor portable.tar.gz.Dependencies
Dependency update (deps(cargo): bump the cargo-all group across 1 directory with 19 updates #95): base64 0.23, rusqlite 0.41, dirs 7, sysinfo 0.39, rodio 0.23, sha2 0.11, rand 0.10, tower-http 0.7, tokio-tungstenite 0.29, tao 0.37, wry 0.57, totp-rs 6, hotpath 0.30, jsonschema 0.60, safetensors 0.7, fancy-regex 0.19, espeak-ng 0.2, cpal 0.18 and tokenizers 0.23. Code was updated for the breaking API changes in totp-rs, cpal, sha2, fancy-regex and safetensors; stored TOTP secrets still load unchanged.
Frontend dependency update (deps(npm): bump the npm-all group across 1 directory with 28 updates #94): SvelteKit 3.1, adapter-static 4, Vitest 5, Biome 2.6, maplibre-gl 6, tailwind-variants 4, three 0.187, sharp 0.35, Playwright 1.64, svelte-check 4.7 and 18 smaller bumps.