@levelchat/cli
v0.1.0
Published
LevelChat command-line tool — scaffold, migrate, and inspect LevelChat projects. `npx levelchat migrate twilio` ports a Twilio Video integration in one run.
Downloads
67
Readme
@levelchat/cli
The levelchat command-line tool. Zero runtime dependencies — npx levelchat
is instant.
npx levelchat <command> [options]migrate — port an existing RTC integration
# Dry run: print a unified diff of what would change
npx levelchat migrate twilio
# Apply the rewrites in place
npx levelchat migrate twilio --write
# Scan a specific directory
npx levelchat migrate twilio --cwd ./packages/app/srcmigrate walks your source tree, finds files that reference the source SDK,
applies a set of named, idempotent rewrites, and prints a unified diff. Default
is a dry run — review the diff, then re-run with --write (or pipe the
output straight into git apply).
Twilio Video → LevelChat
twilio-video reaches end-of-life in December 2026. migrate twilio ports the
90%-common-case surface:
| Twilio Video | LevelChat |
| ------------------------------------------ | -------------------------------------------- |
| import Video from 'twilio-video' | import { LevelChat } from '@levelchat/web' |
| import { connect } from 'twilio-video' | import { LevelChat } from '@levelchat/web' |
| Video.connect(token, opts) | new LevelChat().joinRoom({ token }) |
| room.disconnect() | room.leave() |
| room.participants (Map) | room.participants() (iterable) |
| participant.videoTracks / .audioTracks | participant.tracks |
| 'participantConnected' | 'participant.joined' |
| 'participantDisconnected' | 'participant.left' |
| 'trackSubscribed' | 'track.subscribed' |
| 'dominantSpeakerChanged' | 'speaker.changed' |
| 'disconnected' | 'room.disconnected' |
The tool is regex-based, not a full AST transform — by design. The output
is a diff a human reviews, not a silent rewrite. Regex catches the import +
method + event-name surface that accounts for the bulk of a migration; the
reviewer handles the long tail. Every rewrite is independently named so the
per-file summary tells you exactly what moved, and the Manual follow-ups
block flags the call sites (token endpoints, createLocalTrack) that need a
human.
Adding a new source SDK
The architecture is open/closed: a new source SDK is one new file in
src/migrators/ implementing the Migrator interface, registered in
src/migrators/index.ts. The migrate command never changes.
License
MIT.
