• Гильмуллин Руслан Ниязович's avatar
    Tape block: copy + paste (serialize/deserialize round-trip) (#67)
    · a785cd2a
    * docs: spec + plan for tape-block copy + paste (#63)
    
    * docs: register tapeSnapshot.test.ts topics in scenario ID grammar
    
    * icons: add copy + clipboard (for tape snapshot actions)
    
    * tapeSnapshot: scaffold module with serialize + minimal parse (R-snapshot-roundtrip)
    
    * tapeSnapshot: parse catches JSON.parse errors (R-snapshot-parse-not-json)
    
    * tapeSnapshot: validate format discriminator (R-snapshot-parse-wrong-format)
    
    * tapeSnapshot: validate version field (R-snapshot-parse-unsupported-version)
    
    * tapeSnapshot: validate tapes shape + position range (R-snapshot-parse-wrong-shape-tapes)
    
    * tapeSnapshot: validate alphabets shape (R-snapshot-parse-wrong-shape-alphabets)
    
    * tapeSnapshot: validate tapes.length === alphabets.length (R-snapshot-parse-length-mismatch)
    
    * MachineView: wire copy + paste tape-snapshot actions (closes #63)
    
    * MachineView: right-align copy/paste icons, relax paste to MAX_TAPES bound
    
    - Reorder .tape-actions row to [Take Control] [Copy] [Paste]; pin the
      icons to the right via `justify-content: flex-end` so they stay anchored
      even when Take Control is hidden (MANUAL / RUNNING_CONTINUOUS / paused).
    - Switch .take-control from `width: 100%` to `flex: 1` so it fills the
      remaining space without crowding the icon buttons.
    - Drop the strict tape-count-must-match-current-machine guard on paste:
      with the user implicitly in MANUAL after auto-take-control, the mirror
      is the source of truth and any in-bounds snapshot should land. Replace
      with empty-snapshot lower bound + MAX_TAPES upper bound (the palette
      + worker hard limit). Import MAX_TAPES from caps.
    - Add `await tick()` before `setAllFromMirror()` since paste can now
      change tape count (1→N), matching reloadWorker's pattern.
    - Spec updated to reflect the new bounds + layout decisions.
    
    * docs: catch CLAUDE.md + README.md up with logStore + tapeSnapshot
    
    - Add `logStore.svelte.ts` to both lib/ trees (missed in #45 — the LogStore
      extraction landed but the file inventory was never updated).
    - Add `tapeSnapshot.ts` to both lib/ trees (this PR).
    - CLAUDE.md: extend MachineView's handlers list with onCopy/onPaste and a
      one-liner on the clipboard wiring + mirror-only paste semantics.
    - README.md: mention copy/paste of tape-block state in the user-facing
      feature blurb so it's discoverable.
    
    * test: wait for paused log entry before snapshotting baseline (E-continue-from-step)
    
    The E-continue-from-step test was racing LogStore's 16ms flush (introduced
    in #45). executionMode flips synchronously when the worker pauses, so the
    Continue button is visible immediately — but `log.report('paused at …')`
    is buffered behind the flush timer. Snapshotting pausedBefore right after
    the Continue-visible check could capture 0 instead of 1; after Continue +
    halt, the entry had finally flushed in and pausedAfter saw 1, failing the
    "no new pauses" assertion.
    
    Add an explicit `toBeVisible` wait on the paused log line before snapshotting
    so the baseline accurately reflects the post-flush DOM state. Latent since
    #45 merged; Playwright 1.60.0's timing changes made it deterministic on
    parallel runs.
    
    * chore: update dependencies to latest
    
    Minor/patch bumps across the board (no major version changes):
    
    - @codemirror/lang-javascript 6.2.0 → 6.2.5
    - @codemirror/lint 6.8.0 → 6.9.6
    - @codemirror/theme-one-dark 6.1.0 → 6.1.3
    - @post-machine-js/machine 6.0.0 → 6.1.0 (debugger lockdown + instruction-derived state names)
    - @tabler/icons 3.41.1 → 3.44.0
    - @turing-machine-js/machine 6.0.0 → 6.1.0 (fixes malformed `^6..0` range)
    - codemirror 6.0.1 → 6.0.2
    - @playwright/test 1.50.0 → 1.60.0
    - @testing-library/jest-dom 6.6.0 → 6.9.1
    - @testing-library/svelte 5.2.0 → 5.3.1
    - @tsconfig/svelte 5.0.4 → 5.0.8
    - @types/node 25.6.2 → 25.8.0
    - @vitest/coverage-v8 4.1.5 → 4.1.6 (sister of vitest)
    - eslint 10.3.0 → 10.4.0
    - svelte 5.0.0 → 5.55.7
    - svelte-check 4.0.0 → 4.4.8
    - tslib 2.8.0 → 2.8.1
    - typescript-eslint 8.0.0 → 8.59.3
    - vite 8.0.11 → 8.0.13
    - vitest 4.1.5 → 4.1.6 (paired with @vitest/coverage-v8 per peer constraint)
    
    No config changes required. All gates green: check / lint / 77 unit tests /
    4 E2E tests / production build.
    
    * Bump to 1.0.0-alpha.14
    a785cd2a