Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ Same concepts, different words — like British vs. American English. Roughly 80

**What it does:** Scans a customer's existing codebase and checks how their TwiML and Twilio SDK usage maps to Bandwidth's BXML.

**Outcome:** Size the migration effort and identify blockers **without writing a line of code**. You get a migration-complexity score and a per-feature *works-as-is / heads-up / blocker* breakdown.
**Outcome:** Size the migration effort and identify what needs a redesign **without writing a line of code**. You get a migration-complexity score and a per-feature *works-as-is / heads-up / no direct equivalent* breakdown.

```bash
npm install
Expand Down Expand Up @@ -56,7 +56,7 @@ npm run bxml-generator -- <in-dir> <out-dir> # writes out/bxml/*, out/MIGRAT

## Try the Compatibility Check in your browser — no command needed

The **Migration Compatibility Check** is a single, self-contained HTML file a sales engineer can double-click and present to a prospect. Paste a customer's TwiML (or pick a curated example) and it shows — live — a migration-complexity score, a *works-as-is / heads-up / blocker* verdict, the translated BXML, and a forwardable report.
The **Migration Compatibility Check** is a single, self-contained HTML file a sales engineer can double-click and present to a prospect. Paste a customer's TwiML (or pick a curated example) and it shows — live — a migration-complexity score, a *works-as-is / heads-up / no direct equivalent* verdict, the translated BXML, and a forwardable report.

```bash
npm install
Expand Down
2 changes: 1 addition & 1 deletion examples/full-pv-app/server.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// "Full PV" demo — a Twilio voice app that exercises EVERYTHING Bandwidth
// Programmable Voice supports (verified against dev.bandwidth.com via Context7).
// Deliberately stays inside the supported surface, so the whole app translates
// clean through the adapter: no blockers, only expected heads-up notes.
// clean through the adapter: nothing lacking a direct equivalent, only expected heads-up notes.
//
// Supported BW PV surface covered here (Twilio verb -> BXML verb):
// Say (+SSML, voice) -> SpeakSentence
Expand Down
4 changes: 2 additions & 2 deletions src/bxml-generator/report.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export function renderMigration(result: GenerateResult): string {
"# Twilio → Bandwidth migration — generated BXML",
"",
`Translated **${docs.length}** TwiML document${docs.length === 1 ? "" : "s"} to native BXML` +
` (${clean} clean, ${withBlockers} with blockers).`,
` (${clean} clean, ${withBlockers} with verbs that have no direct equivalent).`,
"",
"Generated BXML is written under `bxml/`. Action/redirect URLs are preserved",
"exactly as your Twilio app used them — point those endpoints at your migrated",
Expand All @@ -37,7 +37,7 @@ export function renderMigration(result: GenerateResult): string {
if (errors.length === 0 && warnings.length === 0)
lines.push("✅ Translated cleanly.", "");
if (errors.length) {
lines.push("### 🛑 Blockers — need a human", "");
lines.push("### 🛑 No direct equivalent — needs a human", "");
for (const f of errors)
lines.push(`- **${f.verb}** — ${f.message}${f.docsUrl ? ` ([docs](${f.docsUrl}))` : ""}`);
lines.push("");
Expand Down
4 changes: 2 additions & 2 deletions src/compatibility-check/report.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export function renderReport(analyses: FileAnalysis[]): string {
const lines: string[] = [
"# Twilio → Bandwidth migration — Compatibility Check",
"",
`**Migration complexity: ${score}/10** (1 + warnings + 3×blockers, capped at 10)`,
`**Migration complexity: ${score}/10** (1 + heads-up + 3× no-equivalent, capped at 10)`,
"",
`Files with Twilio voice usage: ${relevant.length}`,
"",
Expand All @@ -25,7 +25,7 @@ export function renderReport(analyses: FileAnalysis[]): string {
if (errors.length === 0 && warnings.length === 0)
lines.push("✅ Runs through the translator as-is.", "");
if (errors.length) {
lines.push("### 🛑 Blockers", "");
lines.push("### 🛑 No direct equivalent", "");
for (const f of errors)
lines.push(`- **${f.verb}** — ${f.message}${f.docsUrl ? ` ([docs](${f.docsUrl}))` : ""}`);
lines.push("");
Expand Down
2 changes: 1 addition & 1 deletion web/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Migration Compatibility Check playground

A single, self-contained HTML file a sales engineer can **double-click** and present to a prospect. Paste a customer's TwiML (or pick a curated example) and it shows — live — how much of that Twilio voice app runs on Bandwidth unchanged: a works-as-is / heads-up / blocker verdict, a migration-complexity score, the translated BXML, and a forwardable report.
A single, self-contained HTML file a sales engineer can **double-click** and present to a prospect. Paste a customer's TwiML (or pick a curated example) and it shows — live — how much of that Twilio voice app runs on Bandwidth unchanged: a works-as-is / heads-up / no direct equivalent verdict, a migration-complexity score, the translated BXML, and a forwardable report.

No server, no install, no network. It works offline on a plane.

Expand Down
4 changes: 2 additions & 2 deletions web/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ function renderVerdict(v: PreflightView): string {
<div class="pf-tiles">
${tile("clean", v.counts.clean, "Clean")}
${tile("warn", v.counts.headsUp, "Heads-up")}
${tile("block", v.counts.blocker, "Blocker")}
${tile("block", v.counts.blocker, "No direct equivalent")}
</div>
</div>
</section>`;
Expand All @@ -106,7 +106,7 @@ function tile(kind: "clean" | "warn" | "block", n: number, label: string): strin
// ---- Findings ----
function renderFindings(v: PreflightView): string {
const groups: Array<[string, "block" | "warn" | "clean", VerbCard[]]> = [
["Blockers", "block", v.blockers],
["No direct equivalent", "block", v.blockers],
["Heads-up", "warn", v.headsUp],
["Clean", "clean", v.clean],
];
Expand Down