{"id":2389,"date":"2026-05-05T13:06:46","date_gmt":"2026-05-05T12:06:46","guid":{"rendered":"https:\/\/coding4phone.com\/?p=2389"},"modified":"2026-05-07T17:20:54","modified_gmt":"2026-05-07T16:20:54","slug":"un-jour-une-extension-lhistoire-de-mogwai-language-support-pour-vs-code","status":"publish","type":"post","link":"https:\/\/coding4phone.com\/?p=2389","title":{"rendered":"Un jour, une extension \u2014 L&rsquo;histoire de MOGWAI Language Support pour VS Code"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>30 avril 2026. Il est environ minuit. Je suis devant mon \u00e9cran avec une id\u00e9e simple : et si MOGWAI avait sa propre extension VS Code ? Vingt-quatre heures plus tard, elle \u00e9tait publi\u00e9e sur le Marketplace. Voici l&rsquo;histoire de comment \u00e7a s&rsquo;est pass\u00e9 \u2014 et du r\u00f4le central qu&rsquo;a jou\u00e9 Claude dans cette aventure.<\/em><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"land39idee-de-depart\">L&rsquo;id\u00e9e de d\u00e9part<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a> existe depuis plus de dix ans. C&rsquo;est un moteur de scripting RPN bas\u00e9 sur la pile, inspir\u00e9 des calculatrices HP (HP 28S, HP 48), d\u00e9velopp\u00e9 pour .NET et open-sourc\u00e9 en f\u00e9vrier 2026 sous licence Apache 2.0. Il dispose d\u00e9j\u00e0 de son propre IDE \u2014 MOGWAI STUDIO \u2014 une application WinForms compl\u00e8te avec highlighting, autocompl\u00e9tion, debug pas \u00e0 pas, et bien plus.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mais un IDE d\u00e9di\u00e9, \u00e7a a ses limites. Beaucoup de d\u00e9veloppeurs ne veulent pas quitter VS Code. Ils ont leurs th\u00e8mes, leurs raccourcis, leurs habitudes. Et surtout, pour quelqu&rsquo;un qui d\u00e9couvre MOGWAI pour la premi\u00e8re fois, ouvrir un fichier <code>.mog<\/code> dans VS Code et voir du texte brut sans la moindre coloration, c&rsquo;est une barri\u00e8re imm\u00e9diate.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;id\u00e9e \u00e9tait donc simple : cr\u00e9er une extension VS Code qui rende MOGWAI accessible directement depuis l&rsquo;\u00e9diteur favori de la plupart des d\u00e9veloppeurs. Pas question de tout r\u00e9impl\u00e9menter \u2014 juste ce qu&rsquo;il faut pour coder confortablement.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"claude-comme-co-developpeur\">Claude comme co-d\u00e9veloppeur<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Je ne vais pas tourner autour du pot : cette extension a \u00e9t\u00e9 d\u00e9velopp\u00e9e en bin\u00f4me avec <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Claude_(mod%C3%A8le_de_langage)\" target=\"_blank\" rel=\"noreferrer noopener\">Claude<\/a> (Anthropic). Pas comme un simple outil de compl\u00e9tion de code, mais comme un v\u00e9ritable partenaire de d\u00e9veloppement.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-medium\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"200\" data-attachment-id=\"2202\" data-permalink=\"https:\/\/coding4phone.com\/?attachment_id=2202#main\" data-orig-file=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/04\/haia-img.webp?fit=1536%2C1024&amp;ssl=1\" data-orig-size=\"1536,1024\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"haia-img\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/04\/haia-img.webp?fit=1024%2C683&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/04\/haia-img.webp?resize=300%2C200&#038;ssl=1\" alt=\"Un homme et un robot assis \u00e0 une table, travaillant ensemble sur un ordinateur portable dans un bureau moderne.\" class=\"wp-image-2202\" srcset=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/04\/haia-img.webp?resize=300%2C200&amp;ssl=1 300w, https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/04\/haia-img.webp?resize=1024%2C683&amp;ssl=1 1024w, https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/04\/haia-img.webp?resize=768%2C512&amp;ssl=1 768w, https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/04\/haia-img.webp?w=1536&amp;ssl=1 1536w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">La session a commenc\u00e9 par une conversation sur l&rsquo;architecture. Quelles fonctionnalit\u00e9s voulais-je ? Comment le runtime MOGWAI communique-t-il ? Quels sont les formats de messages ? Claude a pos\u00e9 exactement les bonnes questions, dans le bon ordre, pour cadrer le projet avant d&rsquo;\u00e9crire la premi\u00e8re ligne de code.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ce que j&rsquo;ai particuli\u00e8rement appr\u00e9ci\u00e9 : Claude n&rsquo;a jamais g\u00e9n\u00e9r\u00e9 du code \u00ab\u00a0en vrac\u00a0\u00bb. Chaque fichier a \u00e9t\u00e9 construit bloc par bloc, valid\u00e9, puis assembl\u00e9. Quand quelque chose ne fonctionnait pas, on d\u00e9bogait ensemble \u2014 lui analysant les messages d&rsquo;erreur, moi testant sur ma machine et lui remontant les r\u00e9sultats.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"land39architecture-en-cinq-fichiers\">L&rsquo;architecture en cinq fichiers<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Une extension VS Code, c&rsquo;est finalement assez simple dans sa structure. La n\u00f4tre tient en cinq fichiers principaux :<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>package.json<\/code><\/strong> \u2014 le manifeste. Il d\u00e9clare le langage <code>.mog<\/code>, les commandes, les menus, les boutons de toolbar, les settings, et le panneau de la sidebar. C&rsquo;est lui qui dit \u00e0 VS Code \u00ab\u00a0j&rsquo;existe et voil\u00e0 ce que je fais\u00a0\u00bb.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>language-configuration.json<\/code><\/strong> \u2014 la configuration du langage. Auto-closing des paires <code>\u00ab\u00bb<\/code>, <code>{}<\/code>, <code>[]<\/code>, <code>()<\/code>, <code>'<\/code>, <code>\"<\/code>. Indentation automatique. Commentaires avec <code>#<\/code>. Rien de spectaculaire mais essentiel pour le confort de saisie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>mogwai.tmLanguage.json<\/code><\/strong> \u2014 la grammaire TextMate. C&rsquo;est elle qui produit la coloration syntaxique des mots-cl\u00e9s statiques : structures de contr\u00f4le (<code>if<\/code>, <code>while<\/code>, <code>foreach<\/code>, <code>forever<\/code>&#8230;), op\u00e9rateurs (<code>-&gt;<\/code>, <code>=&gt;<\/code>, <code>--&gt;<\/code>), sigils (<code>&amp;A<\/code>, <code>@A<\/code>, <code>!A<\/code>), strings avec interpolation <code>{! ... }<\/code>, nombres, constantes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>mogwai.code-snippets<\/code><\/strong> \u2014 les snippets. Dix-huit structures pr\u00eates \u00e0 l&#8217;emploi : <code>if\/then\/else<\/code>, <code>while\/do<\/code>, <code>for<\/code>, <code>foreach<\/code>, <code>forever<\/code>, <code>switch<\/code>, d\u00e9clarations de fonctions avec ou sans param\u00e8tres typ\u00e9s, et plus encore.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>extension.ts<\/code><\/strong> \u2014 le c\u0153ur de l&rsquo;extension. 1186 lignes de TypeScript qui g\u00e8rent tout le reste : d\u00e9couverte UDP des runtimes, connexion TCP persistante, ex\u00e9cution de code, debug, panneau Runtime, autocompl\u00e9tion dynamique.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"521\" height=\"355\" data-attachment-id=\"2391\" data-permalink=\"https:\/\/coding4phone.com\/?attachment_id=2391#main\" data-orig-file=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img01.png?fit=521%2C355&amp;ssl=1\" data-orig-size=\"521,355\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"c4p.vsce.img01\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img01.png?fit=521%2C355&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img01.png?resize=521%2C355&#038;ssl=1\" alt=\"Code source d'un script de contr\u00f4le de nombre, affichant des messages en fonction des essais effectu\u00e9s.\" class=\"wp-image-2391\" srcset=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img01.png?w=521&amp;ssl=1 521w, https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img01.png?resize=300%2C204&amp;ssl=1 300w\" sizes=\"auto, (max-width: 521px) 100vw, 521px\" \/><figcaption class=\"wp-element-caption\">Syntax highlighting<\/figcaption><\/figure>\n<\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"le-protocole-mogwai\">Le protocole MOGWAI<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Avant d&rsquo;\u00e9crire une ligne de code r\u00e9seau, il a fallu comprendre comment MOGWAI communique. Le runtime expose un protocole TCP\/IP simple et \u00e9l\u00e9gant, bas\u00e9 sur des objets <code>ServerMessage<\/code> s\u00e9rialis\u00e9s en JSON :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{<br>  \"Source\": \"MOGWAI STUDIO\",<br>  \"Function\": \"RUN\",<br>  \"Parameters\": [\"mon code ici\"]<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Chaque message a une source, une fonction, et une liste de param\u00e8tres. C&rsquo;est l&rsquo;ordre des param\u00e8tres qui d\u00e9termine leur signification. Simple, lisible, extensible.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La d\u00e9couverte des runtimes sur le r\u00e9seau se fait via UDP : l&rsquo;extension envoie un broadcast <code>WHO IS HERE<\/code> sur toutes les interfaces r\u00e9seau, et les runtimes r\u00e9pondent avec <code>I AM HERE<\/code> en fournissant leurs informations de connexion et la liste compl\u00e8te de leurs primitives.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"641\" height=\"130\" data-attachment-id=\"2393\" data-permalink=\"https:\/\/coding4phone.com\/?attachment_id=2393#main\" data-orig-file=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img02.png?fit=641%2C130&amp;ssl=1\" data-orig-size=\"641,130\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"c4p.vsce.img02\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img02.png?fit=641%2C130&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img02.png?resize=641%2C130&#038;ssl=1\" alt=\"Interface de s\u00e9lection de runtime pour MOGWAI, affichant l'IP, la version et les d\u00e9tails du syst\u00e8me d'exploitation.\" class=\"wp-image-2393\" srcset=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img02.png?w=641&amp;ssl=1 641w, https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img02.png?resize=300%2C61&amp;ssl=1 300w\" sizes=\"auto, (max-width: 641px) 100vw, 641px\" \/><figcaption class=\"wp-element-caption\">Quick Pick runtime<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Une fois connect\u00e9, toutes les commandes transitent sur une connexion TCP persistante. Pas de nouvelle connexion \u00e0 chaque \u00e9change \u2014 le socket reste ouvert de la connexion \u00e0 la d\u00e9connexion explicite.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"le-grand-bug-udp\">Le grand bug UDP<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Parlons du moment le plus \u00e9pique de cette session de d\u00e9veloppement : le bug UDP.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;id\u00e9e \u00e9tait simple \u2014 diffuser un message broadcast sur le r\u00e9seau local pour d\u00e9couvrir les runtimes MOGWAI disponibles. MOGWAI STUDIO fait exactement \u00e7a, en C#, sans probl\u00e8me. Mais notre impl\u00e9mentation Node.js refusait obstin\u00e9ment de fonctionner.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On a d&rsquo;abord cru \u00e0 un probl\u00e8me de port \u2014 on bindait sur <code>255.255.255.255<\/code> au lieu de l&rsquo;adresse de broadcast du sous-r\u00e9seau. On a corrig\u00e9. Toujours rien.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ensuite, le port 1968 \u00e9tait d\u00e9j\u00e0 occup\u00e9 par le runtime lui-m\u00eame. On a essay\u00e9 <code>reuseAddr: true<\/code>. Windows a r\u00e9pondu <code>EACCES<\/code>. On a ajout\u00e9 une r\u00e8gle de firewall. Toujours <code>EACCES<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On a mis des logs partout. On a ouvert les DevTools de VS Code (Help \u2192 Toggle Developer Tools \u2014 peu de gens savent que c&rsquo;est possible). Et l\u00e0, on a vu nos messages partir, nos propres broadcasts nous revenir en \u00e9cho&#8230; mais aucune r\u00e9ponse du runtime.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La cl\u00e9 \u00e9tait dans le code C# de MOGWAI STUDIO. Le runtime r\u00e9pond en unicast \u2014 directement \u00e0 l&rsquo;adresse source du paquet UDP re\u00e7u \u2014 et non en broadcast. Donc si on bind sur un port fixe, le runtime r\u00e9pond \u00e0 ce port fixe, que le runtime lui-m\u00eame occupe d\u00e9j\u00e0. La solution : binder sur le <strong>port 0<\/strong> (al\u00e9atoire), laisser le syst\u00e8me choisir un port libre, et le runtime r\u00e9pond sur ce port. Simple, \u00e9l\u00e9gant, et \u00e7a a fonctionn\u00e9 imm\u00e9diatement.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Trois heures de d\u00e9bogage pour un seul changement : remplacer <code>socket.bind(udpPort, () => {<\/code>&#8230; par <code>socket.bind(0, () => {<\/code>&#8230;<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"land39execution-et-le-debug\">L&rsquo;ex\u00e9cution et le debug<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Une fois la connexion \u00e9tablie, l&rsquo;ex\u00e9cution est remarquablement simple. On envoie le code via la commande <code>RUN<\/code>, et le runtime r\u00e9pond avec des messages structur\u00e9s : <code>PRG START<\/code> au lancement, <code>PRG STOP<\/code> \u00e0 la fin normale (avec la dur\u00e9e d&rsquo;ex\u00e9cution), <code>PRG ERROR<\/code> en cas d&rsquo;erreur.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"392\" height=\"104\" data-attachment-id=\"2394\" data-permalink=\"https:\/\/coding4phone.com\/?attachment_id=2394#main\" data-orig-file=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img03.png?fit=392%2C104&amp;ssl=1\" data-orig-size=\"392,104\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"c4p.vsce.img03\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img03.png?fit=392%2C104&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img03.png?resize=392%2C104&#038;ssl=1\" alt=\"Capture d'\u00e9cran d'une console avec un message indiquant 'Running...' et un nombre affich\u00e9 comme 46, le tout avec un horodatage.\" class=\"wp-image-2394\" srcset=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img03.png?w=392&amp;ssl=1 392w, https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img03.png?resize=300%2C80&amp;ssl=1 300w\" sizes=\"auto, (max-width: 392px) 100vw, 392px\" \/><figcaption class=\"wp-element-caption\">Output Channel ex\u00e9cution r\u00e9ussie<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Le message d&rsquo;erreur est particuli\u00e8rement riche : il contient le code d&rsquo;erreur MOGWAI (<code>MW.2<\/code>, <code>MW.21<\/code>&#8230;), le message complet, et surtout les positions du premier et du dernier caract\u00e8re de l&rsquo;instruction en erreur dans le code source. L&rsquo;extension se sert de ces positions pour surligner pr\u00e9cis\u00e9ment la zone probl\u00e9matique en rouge dans l&rsquo;\u00e9diteur et y positionner le curseur automatiquement.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"385\" height=\"151\" data-attachment-id=\"2396\" data-permalink=\"https:\/\/coding4phone.com\/?attachment_id=2396#main\" data-orig-file=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img04.png?fit=385%2C151&amp;ssl=1\" data-orig-size=\"385,151\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"c4p.vsce.img04\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img04.png?fit=385%2C151&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img04.png?resize=385%2C151&#038;ssl=1\" alt=\"Capture d'\u00e9cran d'une interface de programmation montrant un message d'erreur. R\u00e9sultat: &quot;nombre est 59&quot;. Erreur \u00e0 la position 318-322 avec un temps d'ex\u00e9cution de 10 secondes.\" class=\"wp-image-2396\" srcset=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img04.png?w=385&amp;ssl=1 385w, https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img04.png?resize=300%2C118&amp;ssl=1 300w\" sizes=\"auto, (max-width: 385px) 100vw, 385px\" \/><figcaption class=\"wp-element-caption\">Erreur avec position<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Le mode debug va plus loin. La commande <code>DEBUG<\/code> au lieu de <code>RUN<\/code> active la prise en compte des points d&rsquo;arr\u00eat (<code>debug.halt<\/code> ou <code>\u00a4<\/code>). Quand le runtime se met en pause, il envoie <code>PRG PAUSE<\/code> suivi de <code>PRG INFO<\/code> avec la position de l&rsquo;instruction courante \u2014 que l&rsquo;extension surligne en bleu dans le code.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"765\" height=\"209\" data-attachment-id=\"2398\" data-permalink=\"https:\/\/coding4phone.com\/?attachment_id=2398#main\" data-orig-file=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img05.png?fit=765%2C209&amp;ssl=1\" data-orig-size=\"765,209\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"c4p.vsce.img05\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img05.png?fit=765%2C209&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img05.png?resize=765%2C209&#038;ssl=1\" alt=\"Capture d'\u00e9cran d'un \u00e9diteur de code affichant un script de programme en langage M showcasing des fonctions de g\u00e9n\u00e9ration de nombres al\u00e9atoires.\" class=\"wp-image-2398\" srcset=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img05.png?w=765&amp;ssl=1 765w, https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img05.png?resize=300%2C82&amp;ssl=1 300w\" sizes=\"auto, (max-width: 765px) 100vw, 765px\" \/><figcaption class=\"wp-element-caption\">Instruction courante en bleu<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Depuis la toolbar de l&rsquo;\u00e9diteur, des boutons contextuels apparaissent selon l&rsquo;\u00e9tat : <strong>Pause<\/strong> pendant l&rsquo;ex\u00e9cution debug, <strong>Step<\/strong> et <strong>Resume<\/strong> en pause. Tout dispara\u00eet quand le programme s&rsquo;arr\u00eate.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"le-panneau-runtime\">Le panneau Runtime<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;une des fonctionnalit\u00e9s dont je suis le plus satisfait est le panneau Runtime, visible dans la sidebar de VS Code. Il affiche en temps r\u00e9el l&rsquo;\u00e9tat interne du moteur MOGWAI :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Stack<\/strong> \u2014 le contenu de la pile RPN, avec l&rsquo;index de chaque \u00e9l\u00e9ment<\/li>\n\n\n\n<li><strong>Variables locales<\/strong> \u2014 nom, type MOGWAI et valeur de chaque variable locale<\/li>\n\n\n\n<li><strong>Variables globales<\/strong> \u2014 idem pour les variables globales<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"357\" height=\"285\" data-attachment-id=\"2399\" data-permalink=\"https:\/\/coding4phone.com\/?attachment_id=2399#main\" data-orig-file=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img06.png?fit=357%2C285&amp;ssl=1\" data-orig-size=\"357,285\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"c4p.vsce.img06\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img06.png?fit=357%2C285&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img06.png?resize=357%2C285&#038;ssl=1\" alt=\"Capture d'\u00e9cran d'une interface de programme avec un volet affichant la pile, les variables locales et globales. La pile montre des instructions et des erreurs, tandis que les variables locales et globales incluent des nombres et des listes.\" class=\"wp-image-2399\" srcset=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img06.png?w=357&amp;ssl=1 357w, https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img06.png?resize=300%2C239&amp;ssl=1 300w\" sizes=\"auto, (max-width: 357px) 100vw, 357px\" \/><figcaption class=\"wp-element-caption\">Panneau Runtime<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Ce panneau se rafra\u00eechit automatiquement \u00e0 chaque pause, chaque instruction TRACE, chaque fin d&rsquo;ex\u00e9cution. Un bouton de rafra\u00eechissement manuel est aussi disponible. Le tout en envoyant simplement trois commandes au runtime (<code>?STACK<\/code>, <code>?LVARS<\/code>, <code>?VARS<\/code>) et en parsant les r\u00e9ponses JSON.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"le-highlighting-dynamique\">Le highlighting dynamique<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Une particularit\u00e9 de MOGWAI que l&rsquo;extension g\u00e8re avec \u00e9l\u00e9gance : les primitives disponibles varient selon le runtime. Chaque application qui h\u00e9berge le moteur MOGWAI peut exposer ses propres primitives \u00e9tendues, en plus des primitives standard.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Au moment de la connexion, le runtime transmet la liste compl\u00e8te de ses primitives avec leur groupe (<code>GE<\/code> pour General, <code>MH<\/code> pour Math, <code>SK<\/code> pour Stack, <code>RT<\/code> pour Runtime, <code>ER<\/code> pour Error, <code>DG<\/code> pour Debug). L&rsquo;extension enregistre un <code>SemanticTokensProvider<\/code> qui colorie chaque primitive selon son groupe \u2014 exactement comme le ferait MOGWAI STUDIO avec son lexer Scintilla.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ce highlighting se met \u00e0 jour automatiquement quand on change de runtime.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"land39autocompletion\">L&rsquo;autocompl\u00e9tion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dernier ajout avant la v1.0 : l&rsquo;autocompl\u00e9tion. Un <code>CompletionItemProvider<\/code> propose en cours de frappe :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Les <strong>keywords statiques<\/strong> MOGWAI (<code>if<\/code>, <code>while<\/code>, <code>foreach<\/code>, <code>forever<\/code>, <code>class<\/code>&#8230;)<\/li>\n\n\n\n<li>Les <strong>primitives du runtime connect\u00e9<\/strong>, avec leur groupe en d\u00e9tail<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"635\" height=\"270\" data-attachment-id=\"2402\" data-permalink=\"https:\/\/coding4phone.com\/?attachment_id=2402#main\" data-orig-file=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img07.png?fit=635%2C270&amp;ssl=1\" data-orig-size=\"635,270\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"c4p.vsce.img07\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img07.png?fit=635%2C270&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img07.png?resize=635%2C270&#038;ssl=1\" alt=\"Capture d'\u00e9cran d'un code en console avec des suggestions de m\u00e9thodes disponibles pour l'objet 'console'.\" class=\"wp-image-2402\" srcset=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img07.png?w=635&amp;ssl=1 635w, https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img07.png?resize=300%2C128&amp;ssl=1 300w\" sizes=\"auto, (max-width: 635px) 100vw, 635px\" \/><figcaption class=\"wp-element-caption\">Autocompl\u00e9tion<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Le filtre est bas\u00e9 sur le pr\u00e9fixe en cours de frappe. Les primitives MOGWAI ayant des noms parfois atypiques (<code>-&gt;upper<\/code>, <code>+\/-<\/code>, <code>?d<\/code>&#8230;), le pattern de correspondance est assez large pour les capturer correctement.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"de-zero-au-marketplace-en-24-heures\">De z\u00e9ro au Marketplace en 24 heures<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le 30 avril 2026 \u00e0 minuit, on a commenc\u00e9 \u00e0 parler architecture. Le 1er mai, l&rsquo;extension \u00e9tait publi\u00e9e sur le VS Code Marketplace sous l&rsquo;identifiant <code>mogwai.mogwai-language<\/code>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"653\" data-attachment-id=\"2419\" data-permalink=\"https:\/\/coding4phone.com\/?attachment_id=2419#main\" data-orig-file=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img08.png?fit=1110%2C708&amp;ssl=1\" data-orig-size=\"1110,708\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"c4p.vsce.img08\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img08.png?fit=1024%2C653&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img08.png?resize=1024%2C653&#038;ssl=1\" alt=\"Interface de support de langage MOGWAI montrant l'\u00e9tat d'ex\u00e9cution, avec des commandes et des \u00e9v\u00e9nements d'activation.\" class=\"wp-image-2419\" srcset=\"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img08.png?resize=1024%2C653&amp;ssl=1 1024w, https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img08.png?resize=300%2C191&amp;ssl=1 300w, https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img08.png?resize=768%2C490&amp;ssl=1 768w, https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/c4p.vsce_.img08.png?w=1110&amp;ssl=1 1110w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Extension sur le Marketplace<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">1762 lignes de code au total. Cinq fichiers. Une session de d\u00e9veloppement continue avec Claude. Z\u00e9ro biblioth\u00e8que externe \u2014 uniquement Node.js natif et l&rsquo;API VS Code<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour installer l&rsquo;extension, il suffit de chercher <strong>\u00ab\u00a0MOGWAI\u00a0\u00bb<\/strong> dans les extensions VS Code, ou d&rsquo;aller directement sur : <a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=mogwai.mogwai-language\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/marketplace.visualstudio.com\/items?itemName=mogwai.mogwai-language<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ce-que-jand39ai-appris\">Ce que j&rsquo;ai appris<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">D\u00e9velopper une extension VS Code est beaucoup plus accessible qu&rsquo;on ne le croit. L&rsquo;API est bien document\u00e9e, TypeScript est un choix naturel, et le cycle compile\/F5\/test est rapide une fois mis en place.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ce qui m&rsquo;a le plus surpris : la qualit\u00e9 du r\u00e9sultat quand on travaille avec Claude de fa\u00e7on structur\u00e9e. Pas \u00ab\u00a0g\u00e9n\u00e8re-moi une extension VS Code\u00a0\u00bb \u2014 mais une conversation progressive, bloc par bloc, avec validation \u00e0 chaque \u00e9tape. Claude n&rsquo;a jamais \u00e9crit de code sans avoir d&rsquo;abord compris le contexte, le protocole, les contraintes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il y a eu des bugs. Il y en aura d&rsquo;autres. Mais chaque bug a \u00e9t\u00e9 l&rsquo;occasion d&rsquo;une vraie session de d\u00e9bogage collaborative \u2014 logs, hypoth\u00e8ses, tests, correction. <a href=\"https:\/\/coding4phone.com\/?p=2133\" target=\"_blank\" rel=\"noreferrer noopener\">Exactement comme avec un coll\u00e8gue humain<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">MOGWAI Language Support continuera d&rsquo;\u00e9voluer. Le debug pas \u00e0 pas est d\u00e9j\u00e0 l\u00e0. Les variables et la pile aussi. La prochaine version apportera peut-\u00eatre les hover tooltips sur les primitives, ou une vue des tasks en cours d&rsquo;ex\u00e9cution. Mais pour une v1.0 n\u00e9e en une nuit, je suis plut\u00f4t satisfait.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><em>MOGWAI est disponible sur GitHub : <a href=\"https:\/\/github.com\/Sydney680928\/mogwai\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/Sydney680928\/mogwai<\/a><\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>L&rsquo;extension VS Code est disponible sur le Marketplace : <a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=mogwai.mogwai-language\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/marketplace.visualstudio.com\/items?itemName=mogwai.mogwai-language<\/a><\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>30 avril 2026. Il est environ minuit. Je suis devant mon \u00e9cran avec une id\u00e9e simple : et si MOGWAI avait sa propre extension VS Code ? Vingt-quatre heures plus tard, elle \u00e9tait publi\u00e9e sur le Marketplace. Voici l&rsquo;histoire de comment \u00e7a s&rsquo;est pass\u00e9 \u2014 et du r\u00f4le central qu&rsquo;a jou\u00e9 Claude dans cette aventure. &#8230; <a title=\"Un jour, une extension \u2014 L&rsquo;histoire de MOGWAI Language Support pour VS Code\" class=\"read-more\" href=\"https:\/\/coding4phone.com\/?p=2389\" aria-label=\"En savoir plus sur Un jour, une extension \u2014 L&rsquo;histoire de MOGWAI Language Support pour VS Code\">Lire la suite<\/a><\/p>\n","protected":false},"author":1,"featured_media":2416,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"D\u00e9couvrez comment une extension VS Code pour MOGWAI a \u00e9t\u00e9 d\u00e9velopp\u00e9e en 24 heures gr\u00e2ce \u00e0 la collaboration avec Claude. Accessible et efficace !","jetpack_seo_html_title":"Cr\u00e9er une Extension VS Code pour MOGWAI en 24 Heures","jetpack_seo_noindex":false,"jetpack_seo_schema_type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_wpcom_ai_launchpad_first_post":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[6,48,50],"tags":[],"class_list":["post-2389","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mogwai","category-rpn","category-scripting"],"jetpack_publicize_connections":[],"jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfoe4s-Cx","jetpack-related-posts":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/05\/coding-4-phone-69f9c217db035.png?fit=1264%2C843&ssl=1","_links":{"self":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2389","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2389"}],"version-history":[{"count":17,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2389\/revisions"}],"predecessor-version":[{"id":2446,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2389\/revisions\/2446"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/media\/2416"}],"wp:attachment":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2389"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2389"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}