Release 0.1.0 #10

Merged
deiussum merged 8 commits from develop into main 2026-09-19 13:09:32 -05:00
Owner

Summary

First tagged release of Tesserow. Per CONTRIBUTING.md, develop → main merges are not squashed — please merge this with a regular merge commit (or fast-forward), not squash, so main's history stays the curated sequence of releases.

Brings main up to date with everything merged into develop since the last release-adjacent work:

  • #2 docs: add CONTRIBUTING.md, LICENSE, and AGENTS.md
  • #3 chore: update npm and Cargo dependencies
  • #4 fix: pre-declare buffer shim to avoid Vite cold-start optimizer race
  • #5 fix: resolve all ESLint errors across renderer code
  • #6 docs(openspec): baseline current functionality into specs
  • #7 test: add Vitest and unit tests for the mosaic domain model
  • #8 fix: disable WebKitGTK's DMA-BUF renderer to fix blank window on Linux
  • #9 chore: align package.json version with the 0.1.0 initial release

After merging

  • Tag this commit v0.1.0
  • Build Linux release artifacts (deb/rpm/AppImage) via npm run make
  • Publish a Forgejo release with those artifacts attached

🤖 Generated with Claude Code

https://claude.ai/code/session_01KoLHnQugaAW2eknKo8FxVp

## Summary First tagged release of Tesserow. Per CONTRIBUTING.md, `develop` → `main` merges are **not squashed** — please merge this with a regular merge commit (or fast-forward), not squash, so `main`'s history stays the curated sequence of releases. Brings `main` up to date with everything merged into `develop` since the last release-adjacent work: - #2 docs: add CONTRIBUTING.md, LICENSE, and AGENTS.md - #3 chore: update npm and Cargo dependencies - #4 fix: pre-declare buffer shim to avoid Vite cold-start optimizer race - #5 fix: resolve all ESLint errors across renderer code - #6 docs(openspec): baseline current functionality into specs - #7 test: add Vitest and unit tests for the mosaic domain model - #8 fix: disable WebKitGTK's DMA-BUF renderer to fix blank window on Linux - #9 chore: align package.json version with the 0.1.0 initial release ## After merging - Tag this commit `v0.1.0` - Build Linux release artifacts (deb/rpm/AppImage) via `npm run make` - Publish a Forgejo release with those artifacts attached 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01KoLHnQugaAW2eknKo8FxVp
Documents the develop-branch strategy, commit conventions, and AI
contribution policy; adds the missing MIT license file; and extracts
CLAUDE.md's tool-agnostic content into AGENTS.md so it's shared across
Claude Code and OpenCode.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Reviewed-on: deiussum/tesserow#2
Upgrades React 19, MUI 9, TypeScript 5.9, ESLint 9 (flat config), jimp
1.6, uuid, and remaining npm/Cargo deps, fixing each breaking API
change along the way (pdfkit export path, jimp 1.x API, MUI Grid/Box/
TextField changes). TypeScript, ESLint, and jimp are capped just below
their absolute latest releases where the surrounding tooling (typescript-eslint,
eslint-plugin-import) or the package's own published build (jimp 1.6.1's
broken browser bundle) isn't ready yet - see openspec/changes/update-dependencies/
for the full rationale and verification trail.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Reviewed-on: deiussum/tesserow#3
## Summary
- Adds `vite-plugin-node-polyfills/shims/buffer` to `optimizeDeps.include` in `vite.config.ts` so it's known during Vite's initial dependency scan instead of being discovered mid-session.
- Fixes a cold-start race first flagged during the `rename-to-tesserow` change: on a fresh `node_modules/.vite` cache, the late-discovered Buffer shim (needed by pdfkit's standalone browser bundle) forced a mid-session re-optimize that raced in-flight chunk requests (e.g. the shared `@mui/icons-material` `createSvgIcon` chunk), producing a transient 404 and a full page reload.
- Dev-experience only - `optimizeDeps` doesn't affect production builds.
- Full root-cause diagnosis and alternatives considered are preserved in `openspec/changes/archive/2026-09-18-fix-vite-optimizer-cold-start-race/`.

## Test plan
- [x] Reproduced the race on a genuinely cold `node_modules/.vite` cache before the fix
- [x] Verified 3 separate cold-cache `npm run vite:dev` runs post-fix show zero race indicators
- [x] Verified `npm start` (Tauri dev) launches cleanly with no panics; icon-serving modules load with no optimizer errors
- [x] Verified `npm run package` (production build) still succeeds, unaffected by the dev-only config change

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Reviewed-on: deiussum/tesserow#4
## Summary
- Fixes all 73 `npm run lint` errors in `src/`
- Removes unused imports/vars, replaces `var` with `let`/`const`
- Replaces `any` with real types: Tauri `DialogFilter`, pdfkit's `PDFKit.PDFDocument`, Jimp's inferred image type, and new save-data/export interfaces (`MosaicChartSaveData`, `ChartPageData`, `ImageImportResult`, etc.)
- `window.dialogs` is now typed via a global `Window` augmentation instead of `window as any` casts

## Test plan
- [x] `npm run lint` passes with 0 errors
- [x] `npx tsc --noEmit` passes with 0 errors
- [x] `npx vite build` succeeds
- No behavior changes intended — this is type/lint cleanup only

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01KoLHnQugaAW2eknKo8FxVp
Reviewed-on: deiussum/tesserow#5
## Summary
- `openspec/specs/` was empty even though the app is fully built — every prior change was archived with `skip_specs: true`, so no capability specs ever existed
- Adds baseline capability specs derived directly from the current `src/` code: `mosaic-domain-model`, `new-mosaic`, `image-import`, `mosaic-editor`, `file-persistence`, `pdf-export`
- Documentation only — no changes to `src/`, `src-tauri/`, or any build/config files
- Includes the archived OpenSpec change (`openspec/changes/archive/2026-09-19-baseline-current-specs/`) with proposal, delta specs, and a verification-only task list

## Notable findings while verifying specs against source
- Column numbering direction was backwards in the first draft (column 1 is rightmost, not leftmost)
- The written pattern lists rows starting at row 1 (bottom), not top-to-bottom
- Extra border rows are all one fixed color and aren't required to alternate with the core grid
- Genuine shipped quirk: a chart-only PDF export (written pattern unchecked) always appends one extra trailing blank page, since `drawChartPage` unconditionally calls `doc.addPage()` after every page including the last

## Test plan
- [x] `openspec validate baseline-current-specs --type change --strict` passed before archiving
- [x] `openspec validate --specs --strict` passes 6/6 after sync
- No application behavior changed — nothing to test in the running app

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01KoLHnQugaAW2eknKo8FxVp
Reviewed-on: deiussum/tesserow#6
## Summary
- No test framework was configured at all — adds Vitest with an `npm test` script
- Standalone `vitest.config.ts` (node environment), kept separate from `vite.config.ts` since that config is tuned for the Tauri/browser build and not needed for Node-only unit tests
- `src/Mosaic.test.ts` — 14 tests covering every requirement in `openspec/specs/mosaic-domain-model/spec.md`: row/column numbering, alternating-color/locked-edge construction, cell-toggle validity, written-pattern text formatting, and save/load round-tripping
- Includes the archived OpenSpec change (`openspec/changes/archive/2026-09-19-add-vitest-domain-model-tests/`) with proposal, design, and tasks — `skip_specs: true` since this is tooling, not an app-behavior change

## Notable finding while implementing
The initial design assumed non-toggle tests could construct `new MosaicChart(...)` directly. That's not possible — `MosaicChart`/`MosaicRow`/`MosaicCell` aren't exported at all — so every test drives the domain model through `mosaic.initialize(...)` and `mosaic.data` instead. Corrected in the change's `design.md` before writing tests.

## Out of scope (deferred)
- React component tests
- `dialogs-bridge.ts` tests (would need Tauri/Jimp/pdfkit mocking)
- CI wiring to run tests automatically

## Test plan
- [x] `npm test` — 14/14 passing
- [x] `npm run lint` — 0 errors, including the new files
- [x] `npx tsc --noEmit` — clean
- [x] `npx vite build` — still succeeds

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01KoLHnQugaAW2eknKo8FxVp
Reviewed-on: deiussum/tesserow#7
## Summary
- The AppImage build showed a blank white window with `Failed to create GBM buffer of size 800x600: Invalid argument` on stderr, reported on an NVIDIA proprietary driver
- This is WebKitGTK's DMA-BUF renderer (default since 2.42) failing to allocate a hardware GBM buffer — a known issue on several GPU stacks, NVIDIA in particular. This exact failure was also seen (and left unresolved) during the original `migrate-electron-to-tauri` testing
- Fix: set `WEBKIT_DISABLE_DMABUF_RENDERER=1` in `src-tauri/src/main.rs` before Tauri/WebKitGTK initializes (Linux only), falling back to a compatible rendering path

## Test plan
- [x] `cargo check` — clean
- [x] `npm run package` — builds successfully
- [x] Confirmed fixed by the reporter on their NVIDIA machine (previously blank window, now renders correctly)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01KoLHnQugaAW2eknKo8FxVp
Reviewed-on: deiussum/tesserow#8
## Summary
- `package.json` said `1.0.0` while `src-tauri/tauri.conf.json` and `src-tauri/Cargo.toml` both already said `0.1.0`
- Preparing the first tagged release as `0.1.0` (pre-1.0, with UI work planned next), so `package.json` is the one that needed to change to match
- `package-lock.json` regenerated via `npm install` to pick up the version bump

## Test plan
- [x] `npm run lint` — clean
- [x] `npm test` — 14/14 passing
- [x] `npx tsc --noEmit` — clean

Follow-up (not in this PR): once merged, fast-forward/merge `develop` → `main` and tag `v0.1.0`, then build and publish the Linux release artifacts (deb/rpm/AppImage).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01KoLHnQugaAW2eknKo8FxVp
Reviewed-on: deiussum/tesserow#9
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
deiussum/tesserow-backup!10
No description provided.