You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Canonical list of extension and package features. Each row links to its topic doc. A feature is not "done" until it appears here. Status legend: ✅ Implemented · 🟡 Partial · ⬜ Planned.
Package layout: the BrightScript engine ships as three npm packages — kopytko-brightscript-parser (packages/brightscript-parser/), kopytko-formatter (packages/formatter/), and kopytko-linter (packages/linter/) — and all Roku device communication (SSDP discovery, ECP, SceneGraph debug console, BrightScript remote debug protocol, diagnostics collectors, Perfetto streaming) lives in a fourth package, kopytko-roku-device (packages/roku-device/), which is deliberately Kopytko-ecosystem-unaware so Kopytko packages can depend on it. The extension's LSP server is a thin adapter over the language packages, and its device features are thin VS Code glue over kopytko-roku-device plus the Kopytko CLI deployer (src/client/roku/rokuDeployer.ts).
Multi-pass engine (19 CST passes + text passes, 59 configurable options), shared by the editor and the kopytko-format CLI. Also formats SceneGraph .xml<interface> blocks (field/function sorting). Full settings: formatting.md.
Feature
Status
Document formatting — kopytko.format.* rules
✅
Granular identifier casing with exact-casing overrides (Function after as uses type casing)
kopytko-roku-device's InstallerClient drives the Roku developer web-admin page
(http://<device-ip>/, HTTP Digest auth) the same way a developer would in a
browser. 7 of the 10 operations below are surfaced in the extension through the
Device Manager's Device actions section (inside the Remote Control view); the
other three remain package/CLI-only (see the 🟡 rows). See
roku-webadmin.md.
A recording tool that captures live runtime telemetry from a running channel into replayable per-session files. Built only on data verified against real devices (SceneGraph debug server on TCP 8080 + ECP rendezvous). See diagnostics.md.
SceneGraph Tree tab — All (/query/sgnodes/all), Roots (/query/sgnodes/roots), and UI (/query/app-ui) collections, rendered as formatted XML (default) or an icicle chart; the chosen view persists across collection switches
SceneGraph Tree Edit mode — edit the UI-collection XML in place and push field changes to the running app via an injected RALE TrackerTask (RaleTrackerClient); navigation blocked while editing, structural edits rejected, per-edit target verification
Tools sidebar — quick-nav buttons, top to bottom: Device Manager, Diagnostics, Console, Network Inspector, SceneGraph Tree, Deep Linking, Perfetto, Roku Pay Web Services
A real terminal for the two Roku debug consoles in its own bottom-panel tab, with per-port command
completion and severity colouring. Cross-platform — a Node TCP socket plus a webview, no external telnet.
See roku-console.md.
Feature
Status
Doc
Raw streaming transport (ConsoleStream, TCP 8085 + 8080) — verbatim byte forwarding, backoff reconnect
🟡 Verified live (Roku Ultra, firmware 15.2.4.3442): 8085 streams correctly, but the device ignores
commands sent to it while the channel is running normally — the documented command set only responds
behind a BrightScript Debugger> prompt, which reproducing needs a crashing channel. See
findings/roku-device-api.md.
Kopytko Perfetto (App Tracing)
Live Roku app tracing panel that embeds the official ui.perfetto.dev viewer directly in VS Code. Requires Roku firmware 15.2+. Deploy, stream, view, and save — without leaving the editor. See diagnostics.md.
Feature
Status
Doc
Deploy app with run_as_process=1 manifest injection + restore
Activity-bar container (drag it to the right-hand Secondary Side Bar) joining a
Roku remote control with everything else kopytko-roku-device can do. See
device-manager.md.
Feature
Status
Doc
Remote Control view — physical-remote button layout (ECP /keypress)
Secret screens section (expanded by default, reference-only list of remote key sequences: enable dev mode/channel info/screenshots & ads/reset & update/clear cache) — not buttons, typed on the physical remote by hand
Charles-style editor-tab tool: an intercepting proxy the device's traffic is
redirected through, showing HTTP requests/responses grouped by origin/path
with metrics. Uses a protocol-bridging model (device speaks HTTP, proxy
bridges to HTTPS, response bodies rewritten https://→http://) so no CA
is installed on the device. Real transparent redirect works on all three
platforms out of the box — macOS/Linux via iptables/pf, Windows via an
elevated WinDivert companion process using the driver bundled with the
extension, no setup required (see
network-inspector.md).
Feature
Status
Doc
Pure-Node intercepting proxy (HTTP in, HTTP/HTTPS out) — no external deps, no CA
Detail pane remembers your place — only Overview open by default, per-section open state persists across request selections, pane scrolls back to the last-focused section
Truncated bodies never shown cut — warning + "Open full body in editor" (formatted, from the on-disk session); Open-in-editor button on every text body; truncated replays send the full on-disk body
Streaming pass-through — open-ended responses (SSE, chunked no-length) forwarded chunk-by-chunk instead of buffered, so the device never hangs (tagged stream)
Incremental, frame-batched request list — live flows append targeted DOM rows instead of rebuilding the list; debounced filter; selection survives tab hide/restore
In-flight request rows — a request appears the moment it arrives (status …, live elapsed-time counter, request headers inspectable) and updates in place on completion; long-polls/SSE/breakpoint-paused requests visible while they run; pending flows excluded from HAR/replay/diff
Upstream connection pooling (keep-alive) — no per-request TCP/TLS handshake to origins; device side still closes per request; a pooled connection that goes stale (e.g. a long-poll outliving a network hop) is retried once on a fresh connection automatically; upstreamKeepAlive off-switch
Windows transparent redirect via a bundled WinDivert companion — zero setup on x64, packet-level, any port/protocol, hidden elevated process, self-terminates if the extension host goes silent; kopytko.network.winDivertDir (machine-scoped) as an escape hatch
utils/documentCache.ts caches lines, CST, type map, imports, and functions per {uri, version, length}. Providers read through it.
Cross-document file parse cache
utils/fileParseCache.ts parses each .brs/.xml once and shares it; the edited document always parses its live buffer.
Workspace function index
utils/workspaceFunctionIndex.ts — built at startup, updated incrementally; O(1) function name lookups for diagnostics, Find References, Rename.
Workspace call index
utils/workspaceCallIndex.ts — built at startup, updated incrementally; provides workspace-wide union of all called function names (used by identifier/unused-function). No per-keystroke computation.
Component-XML resolution cache
findComponentXml memoizes componentName → XML path (incl. negatives).
Import-path directory cache
Each directory listed once per session via readCachedDir.
Granular cache invalidation
A watched-file change evicts only the changed files; package re-walk only on package.json/node_modules changes.
Planned / Nice-to-have
Ideas grouped by readiness. The parser already ships four analysis modules that are not yet wired to any editor feature — buildCallGraph, analyzeContext (m-field tracking), inferTypesFromAst, and getSymbolInfo — so several high-value items below are mostly UI/plumbing work over an engine that already exists.
A. Buildable now on existing parser tools
Feature
What it does
Engine it uses
Inlay hints
Inline parameter-name hints at call sites and inferred-type hints on = assignments.
inferTypesFromAst + call graph
Document highlight
Highlight every occurrence of the symbol under the cursor (scope-aware, skips strings).
buildScopes / resolve
More quick-fixes
"Create missing function" stub from an undefined-function call; "Add @import" for a function found in another module; "Add type annotation" inferring the type.
scope + import resolver + inferTypesFromAst
B. Higher-value, larger build
Feature
What it does
Notes
Test Explorer integration
Discover Kopytko it()/test()/itEach() cases in VS Code's Testing panel; run on the active device; show pass/fail inline.
Reuses existing test-scope detection; needs a device test runner bridge.
CodeLens
Reference counts and a "Run test" lens above test cases; "N callers" above functions.
Reference counts come from the workspace index; call counts from the call graph.
Rename file → update @imports
Auto-rewrite affected @import/@mock paths when a .brs/.xml is moved or renamed.
Import resolver already maps both directions.
Workspace audit command
One-shot report of unused exports, unresolved imports, and dead functions across the project.
Call graph + import resolver + workspace index.
C. Roku device & debugging roadmap
Feature
Notes
Roku log streaming panel
Always-on syslog channel, independent of debug sessions.