Skip to content

Fix broken build/release, CLI, sync, web, extension and desktop app; rewrite README - #1

Merged
kv4u merged 8 commits into
mainfrom
fix/audit-p0-p1
Oct 8, 2026
Merged

kv4u merged 8 commits into
mainfrom
fix/audit-p0-p1

Conversation

@kv4u

@kv4u kv4u commented Oct 8, 2026

Copy link
Copy Markdown
Owner

Summary

An audit found that v1.0.0 could not build or ship, and several core flows were broken. This PR fixes the release blockers and functional bugs (P0/P1) and rewrites the README to match what actually works.

Build & release

  • Finish the contextbridge/ → movez/ rename. The release workflow called a movez entry script that didn't exist.
  • The release now publishes movez.phar, movez-vscode.vsix and a Windows installer (MoveZ-Setup-<version>.exe) that bundles PHP and the PHAR.
  • CI covers PHP 8.2/8.3 and adds real type checks for the web app, extension and desktop app, plus a non-interactive VSIX packaging check.
  • *.tsbuildinfo files are no longer tracked.

CLI (movez/)

  • Export/import: export writes real .cbz bundles (optionally encrypted). Before, it wrote plain JSON that import couldn't read.
  • Project filter: --project now filters sessions, and relative paths like . work.
  • Sync:
    • The client uses { sessions, count } and Guzzle; illuminate/http was never installed.
    • Pulling before any push no longer crashes.
    • Tokens and server URL can come from MOVEZ_TOKEN / MOVEZ_SERVER_URL.
    • sync:pull accepts --from-path/--to-path.
  • Encryption: decrypt no longer silently creates a new key; it explains how to copy ~/.movez/key.
  • Path safety: unsafe session ids and project names from bundles are rejected before they're used in file paths.
  • Parsers:
    • Codex uses the dated rollout format for both reading and writing.
    • Cline reads its per-task history files.
    • Block-array content is flattened to text.
    • Malformed JSONL lines are skipped instead of aborting the parse.
  • Windsurf: now reports "not supported yet". It previously returned Cursor's sessions.
  • New show command: loads one full session. The desktop app needs it for Claude Code session details.

Web (web/)

  • Sync API: matches the spec. Payloads live in a new sync_blobs table instead of a fake AiSession.
  • Tokens: new php artisan movez:token command issues them, and api_token is hidden from serialization.
  • Migration wizard: returns the exact movez transfer command to run instead of claiming a migration was queued.
  • Dashboard: stat cards render again. They used a runtime template, which the runtime-only Vue build can't compile.
  • Cleanup: removed leftover entry files, added tsconfig and vue-tsc, fixed the e2e locators, and added new tests.

VS Code extension

  • Runs .phar through PHP via a new movez.phpPath setting, and shows CLI errors instead of hiding them.
  • The Sessions view is scoped to the open project and shows real turn counts.
  • The sync token is stored in SecretStorage and passed to the CLI as an environment variable.
  • The migration wizard runs transfer locally, behind a strict CSP.
  • Added the icon, README, LICENSE and repository metadata vsce needs to package without prompting.

Desktop app

  • Sync pull works, and the token is passed as an environment variable.
  • Claude Code session details load their turns.
  • Settings IPC only accepts known keys with validated values.
  • The renderer sandbox is enabled.

Docs

  • README, sync server and extension guides rewritten to match the code; AGENTS.md updated.

Deferred (listed in the README roadmap)

  • Web dashboard login and per-user scoping (keep deployments private for now)
  • Windsurf support
  • Server-side migration jobs (Horizon)
  • macOS and Linux desktop builds

Test plan

  • cd movez && php vendor/bin/pest: 95 passed, 1 skipped (Linux-only path test)
  • cd web && php artisan test: 21 passed; npm run type-check and npm run build are clean
  • cd vscode-extension && npm test; npx vsce package runs without prompts
  • cd electron-app && npm run typecheck && npm run build
  • Checked the Dashboard and Migration Wizard in a browser
  • CLI smoke test on real data: doctor, export --project, unpack
  • PHAR build: Box fails locally on Windows (temp-dir lock), so this is unverified until the release workflow runs on Ubuntu
  • Desktop app and extension not launched interactively

🤖 Generated with Claude Code

kv4u and others added 8 commits October 8, 2026 10:31
- Rename contextbridge/ to movez/ and the entry script to movez, matching
  composer.json bin, box.json, the spec and the release workflow
- export writes real .cbz bundles (optionally encrypted); import, unpack
  and package handle encrypted and invalid bundles without crashing
- --project now filters sessions on export, transfer, list and sync:push
- Sync client uses Guzzle (illuminate/http was never installed), sends
  { sessions, count }, handles empty pulls, reads MOVEZ_TOKEN / MOVEZ_SERVER_URL;
  sync:pull accepts --from-path/--to-path
- Encryptor no longer creates a key on decrypt and validates the key file
- Reject unsafe session ids / project names before building file paths
- Codex: read and write the dated rollout format; Cline: read per-task
  history files; flatten block content in all parsers; skip malformed lines
- Windsurf reports "not supported yet" instead of returning Cursor sessions
- ClaudeCodeWriter: keep POSIX paths, no duplicate desktop registry entries
- Remove Laravel Zero boilerplate, add strict_types, ext-* requirements
- Tests: stop touching the real Cursor DB, test the real ClaudeCodeWriter,
  add coverage for sync, encryption, bundles, parsers and commands

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- release.yml: build the PHAR from movez/ (the old `php movez` entry point
  did not exist), publish it as movez.phar, add a Windows desktop installer
  job that bundles PHP + the PHAR, and publish all assets in one release
- ci.yml: point at movez/, MOVEZ_* env vars, PHP 8.2/8.3 matrix, real
  extension type check (no continue-on-error), VSIX packaging check,
  web type check and a desktop app type check
- build.bat: fail clearly when box.phar or movez.phar is missing
- Electron: stable installer name, Windows-only target, vue-tsc type check
- Stop tracking *.tsbuildinfo; ignore extension and web build output

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Sync API now matches the spec ({ sessions, count }); encrypted blobs live
  in their own sync_blobs table instead of masquerading as an AiSession,
  push/pull events record real session counts
- New `php artisan movez:token <email>` issues API tokens; api_token is
  hidden from serialization and seeded tokens are printed once
- Migration wizard returns the exact `movez transfer` command to run
  locally instead of claiming a migration was queued when nothing ran;
  checks response.ok and shows validation errors
- Dashboard stat cards render (runtime template string needed the
  compiler build) via a proper StatCard SFC
- Stop sending raw session_data blobs to pages; safe JSON decoding
- Remove leftover app.js/bootstrap.js/welcome.blade.php, add tsconfig,
  vue-tsc type-check and test:e2e scripts, fix ambiguous e2e locators
- strict_types everywhere, Pest-only tests, MoveZ naming; new tests for
  dashboard, sessions, sync isolation and the wizard command

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Shared CLI runner: runs movez.phar through PHP (new movez.phpPath),
  reads settings on every call, runs in the workspace folder, surfaces CLI
  errors in notifications and a MoveZ output channel instead of hiding them
- Sessions view shows sessions for the open project with real turn counts
- Export via save dialog to .cbz (optionally encrypted); import accepts
  .cbz/.json; target lists only contain tools the CLI can write to
- Sync token stored in SecretStorage ("MoveZ: Set Sync Token") and passed
  as MOVEZ_TOKEN instead of a command-line argument
- Migration wizard runs `movez transfer` locally behind a strict CSP
  instead of iframing a server that cannot reach local sessions
- Add icon, README, LICENSE, repository/license metadata and .vscodeignore
  so `vsce package` runs non-interactively in CI; `npm test` type-checks

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
list-sessions only reads metadata for Claude Code (60 MB+ transcripts), so
clients had no way to display a session's turns. ClaudeCodeParser can now
parse a single transcript by id without scanning every file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Sync pull no longer fails on --from-path/--to-path (CLI now accepts
  them); the sync token is passed as MOVEZ_TOKEN, not a CLI argument
- Session detail loads full turns via `movez show` when the list only
  has metadata (Claude Code sessions always showed "No turns")
- Settings IPC only accepts known keys with validated values, since
  cliPath/phpPath are executed by the main process
- Enable the renderer sandbox; platform-aware bundled PHP binary name
- Source/target pickers only offer tools the CLI can read/write
- Real type check (vue-tsc + tsc); fixes the missing phpPath type

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`--project=.` has basename ".", which normalised to an empty string and
silently disabled the filter.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- README: correct download names (movez.phar, MoveZ-Setup-*.exe,
  movez-vscode.vsix), every command/option checked against the CLI,
  honest support matrix (Windsurf unsupported; Cline/Continue read-only),
  sync key-sharing step, real bundle format, build/test instructions,
  roadmap for deferred work
- Sync server guide: correct repo/paths, PHP 8.2+, `movez:token`,
  { sessions, count } API, Windows/Horizon notes, dashboard-auth warning
- Extension guide: VSIX install, phpPath, SecretStorage token, real
  command behaviour
- Replace Laravel boilerplate READMEs in movez/ and web/
- AGENTS.md: bundle/manifest shape, tool storage, sync API, desktop app

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kv4u
kv4u merged commit 6357966 into main Oct 8, 2026
10 checks passed
@kv4u
kv4u deleted the fix/audit-p0-p1 branch October 13, 2026 15:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant