12 tasks: vitest setup, semantic theme tokens, four in-repo primitives
(ProgressBar/AppButton/Popover/Icon) with unit tests, per-component
restyle, and element-plus removal.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Visual restyle of the desktop app and shared n-link-core components:
dark-first Slate theme with light/dark tokens, inline-SVG icons for
theming, and removal of Element-Plus in favor of three small in-repo
primitives (Popover, AppButton, ProgressBar).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ten tasks: async-command backend fix, Tailwind 3 + Vite foundation, the
8 n-link-core components, the device store, the app shell, verification.
Grounded in the real scaffold rather than assumptions. Reading the actual
sources surfaced three hazards missing from the earlier follow-on notes:
vue-async-computed (Vue 2 only, drives FileBrowser's listing and spinner),
30 require() calls in FileIcon, and @tailwindcss/custom-forms.
Tailwind 3 chosen over 4: the theme is a JS config with 16 @apply/theme()
uses in scoped SCSS, and 4's CSS-first rewrite would layer a second
migration onto the Vue one.
Task 1 fixes the command-serialization defect found during Plan A
verification: all commands were sync, so a hung list_dir blocked the whole
queue. It goes first because the UI is otherwise untestable on this
hardware.
Core components inject the store via an InjectionKey rather than importing
it, so n-link-core stays decoupled from the desktop implementation and the
web consumer remains portable.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Correct the vendored libnspire-sys retry limit in spec and plan: the
actual constant in vendor/libnspire-sys/libnspire/src/cx2.cpp:391 is 30,
not 100. The '10 -> 100' claim originated in nlink-cli's own Cargo.toml
comment and was propagated into both documents unverified.
- Drop @tauri-apps/plugin-opener from desktop/package.json; the Rust plugin
and its capability entry were removed in Task 3, leaving this dangling.
- Reconcile desktop/package.json version 0.1.0 -> 0.1.6 to match Cargo.toml
and tauri.conf.json.
- Rewrite desktop/README.md, which still instructed users to
'sudo apt install webkit2gtk-4.0' -- the exact unavailable package this
port exists to move off. Now documents npm workspaces, the --legacy-peer-deps
requirement, the dist/-before-cargo gotcha, snap LD_LIBRARY_PATH breakage,
AppImage FUSE fallback, and the vendored patch.
Disclosure note: commit 4626858 also committed the previously untracked
nlink-cli/ and vendor/ trees (~5900 lines). Committing vendor/ is required --
the [patch.crates-io] override cannot resolve without it -- but the commit
message did not say so. Recorded here rather than rewriting branch history.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
n-link-cli ls / returns Busy then hangs (known CX II firmware issue,
owned by the user, out of scope here). Transfer-dependent gates are
downgraded to non-blocking; enumerate remains a full verification of the
IPC path since it reads USB descriptors only and does no libnspire
transfer.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Eight tasks from system-dep install through verified deb/appimage
bundles, with a webkit2gtk-4.1 go/no-go gate at Task 2 and n-link-cli
used as the verification oracle against the connected CX II.
Splits the spec's two phases into two plans; Plan B (frontend) is
written after Plan A is verified so it can be grounded in the real
scaffold output rather than assumptions.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ports desktop from Tauri 1.0.0-beta.8 (webkit2gtk-4.0, unavailable on
Ubuntu 26.04) to Tauri 2.x (webkit2gtk-4.1), alongside Vue 2 -> Vue 3 and
Vue CLI -> Vite. Wires in the locally patched libnspire-sys already proven
by nlink-cli.
Scoped to Linux (deb + appimage). The web/ package shares n-link-core and
is knowingly left broken, deferred to its own project.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>