@oodarun/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ "use strict";(()=>{var _=Object.defineProperty;var c=(s,e,t)=>e in s?_(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t;var n=(s,e,t)=>c(s,typeof e!="symbol"?e+"":e,t);var o=class{constructor(){n(this,"ws",null);n(this,"reconnectTimer",null);n(this,"connected",!1);this.connect(),this.setupMessageListener()}getWsUrl(){let e=location.protocol==="https:"?"wss:":"ws:",t=window.__OODA_WS_NONCE__||"";return`${e}//${location.host}/__ooda__/ws?nonce=${encodeURIComponent(t)}`}connect(){try{this.ws=new WebSocket(this.getWsUrl()),this.ws.onopen=()=>{this.connected=!0,console.log("[ooda-bridge] Connected"),window.postMessage({type:"__OODA_BRIDGE_CONNECTED__"},"*")},this.ws.onmessage=e=>{try{let t=JSON.parse(e.data);window.postMessage(t,"*")}catch{}},this.ws.onclose=()=>{this.connected=!1,console.log("[ooda-bridge] Disconnected, reconnecting in 3s..."),window.postMessage({type:"__OODA_BRIDGE_DISCONNECTED__"},"*"),this.scheduleReconnect()},this.ws.onerror=()=>{}}catch{this.scheduleReconnect()}}scheduleReconnect(){this.reconnectTimer||(this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},3e3))}setupMessageListener(){window.addEventListener("message",e=>{if(e.source!==window||!this.connected||!this.ws)return;let{type:t}=e.data||{};if(!t||!t.startsWith("__OODA_"))return;if(["__OODA_ELEMENT_SELECTED__","__OODA_INSPECTOR_STATE__","__OODA_SLASH_COMMAND__","__OODA_TEXT_EDITED__","__OODA_EDIT_STARTED__","__OODA_EDIT_FINISHED__","__OODA_READY__","__OODA_FEEDBACK__"].includes(t))try{this.ws.send(JSON.stringify(e.data))}catch{}})}};new o;})();
@@ -0,0 +1,6 @@
1
+ "use strict";(()=>{var h=Object.defineProperty;var c=(r,e,t)=>e in r?h(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var a=(r,e,t)=>c(r,typeof e!="symbol"?e+"":e,t);var d=class{constructor(){a(this,"styleElement",null);a(this,"changes",new Map);a(this,"domChanges",new Map);a(this,"originalDOM",new Map);a(this,"STYLE_ID","__ooda_custom_styles__");this.createStyleElement(),this.setupListeners()}createStyleElement(){let e=document.getElementById(this.STYLE_ID);if(e){this.styleElement=e;return}this.styleElement=document.createElement("style"),this.styleElement.id=this.STYLE_ID,this.styleElement.setAttribute("data-ooda","true"),document.documentElement.appendChild(this.styleElement)}setupListeners(){window.addEventListener("message",e=>{if(e.source!==window)return;let{type:t,data:s}=e.data||{};switch(t){case"__OODA_APPLY_CHANGES__":this.applyChanges(s.changes);break;case"__OODA_UPDATE_STYLE__":this.updateStyle(s.selector,s.properties);break;case"__OODA_REMOVE_STYLE__":this.removeStyle(s.selector);break;case"__OODA_CLEAR_ALL_STYLES__":this.clearAllStyles();break;case"__OODA_APPLY_DOM_CHANGES__":this.applyDOMChanges(s.changes);break;case"__OODA_UPDATE_DOM__":this.updateDOM(s.selector,s.action,s.textContent,s.attributes);break;case"__OODA_REVERT_DOM__":this.revertDOM(s.selector,s.savedToSource);break;case"__OODA_CLEAR_ALL_DOM_CHANGES__":this.clearAllDOMChanges();break}})}applyChanges(e){this.changes.clear();for(let t of e)this.changes.set(t.selector,t);this.rebuildStylesheet(),window.postMessage({type:"__OODA_CHANGES_APPLIED__",count:e.length},"*")}updateStyle(e,t){let s=this.changes.get(e);Object.keys(t).length===0?this.changes.delete(e):this.changes.set(e,{id:s?.id||`temp-${Date.now()}`,url:window.location.href,selector:e,properties:t}),this.rebuildStylesheet()}removeStyle(e){this.changes.delete(e),this.rebuildStylesheet()}clearAllStyles(){this.changes.clear(),this.rebuildStylesheet()}rebuildStylesheet(){this.styleElement||this.createStyleElement();let e=[];for(let t of this.changes.values()){let s=Object.entries(t.properties).map(([i,n])=>` ${i.replace(/([A-Z])/g,"-$1").toLowerCase()}: ${n} !important;`).join(`
2
+ `);s&&e.push(`${t.selector} {
3
+ ${s}
4
+ }`)}this.styleElement.textContent=e.join(`
5
+
6
+ `)}getChangesCount(){return this.changes.size}applyDOMChanges(e){this.clearAllDOMChanges();for(let t of e)this.domChanges.set(t.selector,t),this.applySingleDOMChange(t);window.postMessage({type:"__OODA_DOM_CHANGES_APPLIED__",count:e.length},"*")}updateDOM(e,t,s,i){let n={id:`temp-${Date.now()}`,url:window.location.href,selector:e,action:t,textContent:s,attributes:i};this.domChanges.set(e,n),this.applySingleDOMChange(n)}applySingleDOMChange(e){let t=document.querySelector(e.selector);if(t){if(!this.originalDOM.has(e.selector)){let s={};for(let i of Array.from(t.attributes))s[i.name]=i.value;this.originalDOM.set(e.selector,{textContent:t.textContent||"",attributes:s})}switch(e.action){case"hide":t.style.display="none",t.setAttribute("data-ooda-hidden","true");break;case"modify":if(t.getAttribute("data-ooda-hidden")&&(t.style.display="",t.removeAttribute("data-ooda-hidden")),e.textContent!==void 0){let s=this.getDirectTextNode(t);if(s)s.textContent=e.textContent;else if(t.childNodes.length===0)t.textContent=e.textContent;else{let i=t.firstChild;i&&i.nodeType===Node.TEXT_NODE?i.textContent=e.textContent:t.insertBefore(document.createTextNode(e.textContent),i)}}if(e.attributes)for(let[s,i]of Object.entries(e.attributes))t.setAttribute(s,i);break;case"remove":t.remove();break}}}getDirectTextNode(e){for(let t of Array.from(e.childNodes))if(t.nodeType===Node.TEXT_NODE&&t.textContent?.trim())return t;return null}revertDOM(e,t){let s=this.originalDOM.get(e),i=document.querySelector(e);if(i&&(i.style.display="",i.removeAttribute("data-ooda-hidden"),!t&&s)){let n=this.getDirectTextNode(i);n&&(n.textContent=s.textContent);let l=this.domChanges.get(e);if(l?.attributes)for(let o of Object.keys(l.attributes))s.attributes[o]!==void 0?i.setAttribute(o,s.attributes[o]):i.removeAttribute(o)}this.domChanges.delete(e),this.originalDOM.delete(e)}clearAllDOMChanges(){for(let e of this.domChanges.keys())this.revertDOM(e);this.domChanges.clear(),this.originalDOM.clear()}getDOMChangesCount(){return this.domChanges.size}},g=new d;window.__oodaApplicator=g;window.postMessage({type:"__OODA_REQUEST_CHANGES__"},"*");})();
@@ -0,0 +1,17 @@
1
+ "use strict";(()=>{var y=Object.defineProperty;var v=(d,e,t)=>e in d?y(d,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):d[e]=t;var a=(d,e,t)=>v(d,typeof e!="symbol"?e+"":e,t);var m=["color","backgroundColor","fontSize","fontFamily","fontWeight","lineHeight","padding","paddingTop","paddingRight","paddingBottom","paddingLeft","margin","marginTop","marginRight","marginBottom","marginLeft","border","borderRadius","display","position","width","height","maxWidth","maxHeight","minWidth","minHeight","flexDirection","justifyContent","alignItems","gap","gridTemplateColumns","gridTemplateRows","opacity","zIndex","overflow","textAlign","textDecoration"],h=class{constructor(){a(this,"hoverOverlay",null);a(this,"selectedOverlay",null);a(this,"isEnabled",!1);a(this,"selectedElement",null);a(this,"hoveredElement",null);a(this,"isEditing",!1);a(this,"originalText","");this.createOverlays(),this.setupListeners()}createOverlays(){this.hoverOverlay=document.createElement("div"),this.hoverOverlay.id="__ooda_overlay_hover__",this.hoverOverlay.style.cssText=`
2
+ position: fixed;
3
+ pointer-events: none;
4
+ z-index: 2147483646;
5
+ border: 2px solid #3b82f6;
6
+ background-color: rgba(59, 130, 246, 0.1);
7
+ transition: all 0.05s ease-out;
8
+ display: none;
9
+ `,document.documentElement.appendChild(this.hoverOverlay),this.selectedOverlay=document.createElement("div"),this.selectedOverlay.id="__ooda_overlay_selected__",this.selectedOverlay.style.cssText=`
10
+ position: fixed;
11
+ pointer-events: none;
12
+ z-index: 2147483647;
13
+ border: 2px solid #10b981;
14
+ background-color: rgba(16, 185, 129, 0.1);
15
+ transition: all 0.05s ease-out;
16
+ display: none;
17
+ `,document.documentElement.appendChild(this.selectedOverlay)}setupListeners(){window.addEventListener("message",e=>{e.source===window&&(e.data?.type==="__OODA_TOGGLE_INSPECTOR__"&&(e.data.enabled?this.enable():this.disable()),e.data?.type==="__OODA_SELECT_BY_SELECTOR__"&&this.selectBySelector(e.data.selector))}),document.addEventListener("mousemove",this.handleMouseMove.bind(this),!0),document.addEventListener("click",this.handleClick.bind(this),!0),document.addEventListener("dblclick",this.handleDoubleClick.bind(this),!0),document.addEventListener("scroll",this.updateOverlayPositions.bind(this),!0),window.addEventListener("resize",this.updateOverlayPositions.bind(this)),document.addEventListener("keydown",this.handleSlashKey.bind(this),!0),window.addEventListener("message",e=>{e.source===window&&e.data?.type==="__OODA_UPDATE_TEXT__"&&this.updateSelectedText(e.data.text)})}isOverlayElement(e){if(!e)return!1;let t=e.id;return!!(t==="__ooda_overlay_hover__"||t==="__ooda_overlay_selected__"||t==="__ooda_toolbar__"||e.closest?.("#__ooda_toolbar__"))}handleMouseMove(e){if(!this.isEnabled)return;let t=document.elementFromPoint(e.clientX,e.clientY);if(!(!t||this.isOverlayElement(t))){if(t===this.selectedElement){this.hoverOverlay&&(this.hoverOverlay.style.display="none");return}this.hoveredElement=t,this.updateHoverOverlay(t)}}handleClick(e){if(!this.isEnabled)return;let t=document.elementFromPoint(e.clientX,e.clientY);if(!t||this.isOverlayElement(t))return;e.preventDefault(),e.stopPropagation(),this.selectedElement=t,this.hoverOverlay&&(this.hoverOverlay.style.display="none"),this.updateSelectedOverlay(t);let i=this.extractElementData(t);window.postMessage({type:"__OODA_ELEMENT_SELECTED__",data:i},"*")}handleDoubleClick(e){if(!this.isEnabled||!this.selectedElement)return;let t=document.elementFromPoint(e.clientX,e.clientY);!t||t!==this.selectedElement||(e.preventDefault(),e.stopPropagation(),this.startEditing())}handleSlashKey(e){if(!this.isEnabled||!this.selectedElement)return;let t=document.activeElement;if(t?.shadowRoot?.activeElement&&(t=t.shadowRoot.activeElement),!(t&&(t.tagName==="INPUT"||t.tagName==="TEXTAREA"||t.contentEditable==="true"))&&e.key==="/"){e.preventDefault(),e.stopPropagation();let i=this.extractElementData(this.selectedElement);window.postMessage({type:"__OODA_SLASH_COMMAND__",data:{selector:i.selector,tagName:i.tagName,textContent:i.textContent}},"*")}}startEditing(){if(!this.selectedElement||this.isEditing)return;let e=this.selectedElement;this.originalText=e.textContent||"",this.isEditing=!0,e.contentEditable="true",e.style.outline="2px solid #f59e0b",e.style.outlineOffset="2px",e.focus();let t=window.getSelection(),i=document.createRange();i.selectNodeContents(e),t?.removeAllRanges(),t?.addRange(i),e.addEventListener("blur",this.finishEditing.bind(this),{once:!0}),e.addEventListener("keydown",this.handleEditKeydown.bind(this)),this.selectedOverlay&&(this.selectedOverlay.style.borderColor="#f59e0b",this.selectedOverlay.style.backgroundColor="rgba(245, 158, 11, 0.1)"),window.postMessage({type:"__OODA_EDIT_STARTED__",originalText:this.originalText},"*")}handleEditKeydown(e){e.key==="Enter"&&!e.shiftKey?(e.preventDefault(),this.selectedElement?.blur()):e.key==="Escape"&&(this.selectedElement&&(this.selectedElement.textContent=this.originalText),this.selectedElement?.blur())}finishEditing(){if(!this.selectedElement||!this.isEditing)return;let e=this.selectedElement,t=e.textContent||"";if(e.contentEditable="false",e.style.outline="",e.style.outlineOffset="",e.removeEventListener("keydown",this.handleEditKeydown.bind(this)),this.isEditing=!1,this.selectedOverlay&&(this.selectedOverlay.style.borderColor="#10b981",this.selectedOverlay.style.backgroundColor="rgba(16, 185, 129, 0.1)"),t!==this.originalText){let i=this.extractSourceLocation(this.selectedElement),n={tagName:this.selectedElement.tagName.toLowerCase(),attributes:{},componentName:i?.component||void 0};for(let l of this.selectedElement.attributes)n.attributes[l.name]=l.value;window.postMessage({type:"__OODA_TEXT_EDITED__",selector:this.generateSelector(this.selectedElement),originalText:this.originalText,newText:t,sourceLocation:i,tagName:n.tagName,attributes:n.attributes,componentName:n.componentName},"*")}window.postMessage({type:"__OODA_EDIT_FINISHED__"},"*")}updateSelectedText(e){this.selectedElement&&!this.isEditing&&(this.selectedElement.textContent=e)}updateHoverOverlay(e){if(!this.hoverOverlay)return;let t=e.getBoundingClientRect();this.hoverOverlay.style.display="block",this.hoverOverlay.style.left=`${t.left}px`,this.hoverOverlay.style.top=`${t.top}px`,this.hoverOverlay.style.width=`${t.width}px`,this.hoverOverlay.style.height=`${t.height}px`}updateSelectedOverlay(e){if(!this.selectedOverlay)return;let t=e.getBoundingClientRect();this.selectedOverlay.style.display="block",this.selectedOverlay.style.left=`${t.left}px`,this.selectedOverlay.style.top=`${t.top}px`,this.selectedOverlay.style.width=`${t.width}px`,this.selectedOverlay.style.height=`${t.height}px`,this.selectedOverlay.style.borderColor="#10b981",this.selectedOverlay.style.backgroundColor="rgba(16, 185, 129, 0.1)"}updateOverlayPositions(){if(this.isEnabled){if(this.selectedElement&&this.selectedOverlay){let e=this.selectedElement.getBoundingClientRect();this.selectedOverlay.style.left=`${e.left}px`,this.selectedOverlay.style.top=`${e.top}px`,this.selectedOverlay.style.width=`${e.width}px`,this.selectedOverlay.style.height=`${e.height}px`}if(this.hoveredElement&&this.hoverOverlay&&this.hoverOverlay.style.display!=="none"){let e=this.hoveredElement.getBoundingClientRect();this.hoverOverlay.style.left=`${e.left}px`,this.hoverOverlay.style.top=`${e.top}px`,this.hoverOverlay.style.width=`${e.width}px`,this.hoverOverlay.style.height=`${e.height}px`}}}extractElementData(e){let t=e.getBoundingClientRect(),i=window.getComputedStyle(e),n={};for(let s of e.attributes)n[s.name]=s.value;let l={};for(let s of m){let o=i.getPropertyValue(s);o&&(l[s]=o)}let r=this.generateSelector(e),c=this.extractSourceLocation(e);return{tagName:e.tagName.toLowerCase(),id:e.id||"",classList:Array.from(e.classList),attributes:n,computedStyles:l,bounds:{x:t.x,y:t.y,width:t.width,height:t.height},innerHTML:e.innerHTML.slice(0,500),textContent:(e.textContent||"").slice(0,200).trim(),selector:r,sourceLocation:c}}extractSourceLocation(e){let t=e,i=10;for(;t&&i>0;){let n=t.getAttribute("data-source-file");if(n)return{file:n,line:parseInt(t.getAttribute("data-source-line")||"",10)||null,column:parseInt(t.getAttribute("data-source-column")||"",10)||null,component:t.getAttribute("data-source-component"),element:t.getAttribute("data-source-element")};t=t.parentElement,i--}return this.extractSourceFromFiber(e)}extractSourceFromFiber(e){let t=Object.keys(e).find(r=>r.startsWith("__reactFiber$")||r.startsWith("__reactInternalInstance$"));if(!t)return null;let i=e[t];if(!i)return null;let n=i,l=15;for(;n&&l>0;){let r=n._debugSource;if(r?.fileName){let c=null,s=n._debugOwner||n.return,o=5;for(;s&&o>0;){if(typeof s.type=="function"||typeof s.type=="object"){let u=s.type?.displayName||s.type?.name;if(u){c=u;break}}s=s._debugOwner||s.return,o--}return{file:r.fileName,line:r.lineNumber||null,column:r.columnNumber||null,component:c,element:typeof n.type=="string"?null:n.type?.displayName||n.type?.name||null}}n=n.return,l--}return null}generateSelector(e){if(e.hasAttribute("data-testid"))return`[data-testid="${e.getAttribute("data-testid")}"]`;if(e.id)return`#${CSS.escape(e.id)}`;if(e.hasAttribute("aria-label"))return`[aria-label="${e.getAttribute("aria-label")}"]`;let t=[],i=e;for(;i&&i!==document.body&&t.length<5;){let n=i.tagName.toLowerCase();if(i.id){n=`#${CSS.escape(i.id)}`,t.unshift(n);break}let l=i.parentElement;if(l){let r=i.tagName,s=Array.from(l.children).filter(o=>o.tagName===r);if(s.length>1){let o=s.indexOf(i)+1;n+=`:nth-of-type(${o})`}}t.unshift(n),i=l}return t.join(" > ")}enable(){this.isEnabled=!0,document.body.style.cursor="crosshair",window.postMessage({type:"__OODA_INSPECTOR_STATE__",enabled:!0},"*")}disable(){this.isEnabled=!1,this.selectedElement=null,this.hoveredElement=null,document.body.style.cursor="",this.hoverOverlay&&(this.hoverOverlay.style.display="none"),this.selectedOverlay&&(this.selectedOverlay.style.display="none"),window.postMessage({type:"__OODA_INSPECTOR_STATE__",enabled:!1},"*")}toggle(){this.isEnabled?this.disable():this.enable()}selectBySelector(e){try{let t=document.querySelector(e);if(!t)return;this.isEnabled||this.enable(),this.selectedElement=t,this.updateSelectedOverlay(t),this.hoverOverlay&&(this.hoverOverlay.style.display="none"),t.scrollIntoView({behavior:"smooth",block:"center"});let i=this.extractElementData(t);window.postMessage({type:"__OODA_ELEMENT_SELECTED__",data:i},"*")}catch{}}},p=new h;window.__oodaSelector=p;window.postMessage({type:"__OODA_READY__"},"*");})();
@@ -0,0 +1,245 @@
1
+ "use strict";(()=>{(function(){if(document.getElementById("__ooda_toolbar__"))return;let c=document.createElement("div");c.id="__ooda_toolbar__",c.style.cssText="position:fixed;bottom:16px;right:16px;z-index:2147483640;",document.documentElement.appendChild(c);let C=c.attachShadow({mode:"open"}),l=!1,r=!1,p=location.pathname,a=!1,h=!1,v='<svg viewBox="0 0 1817 834" xmlns="http://www.w3.org/2000/svg" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"><g transform="matrix(1,0,0,1,-517.985,-301.18)"><g transform="matrix(2.75,0,0,2.75,0,0)"><path d="M459.906,234.021C466.142,239.305 466.194,239.123 467.334,240.616C482.088,259.943 478.007,275.517 479.54,277.475C481.213,279.614 500.242,266.692 509.865,253.776C530.496,226.082 544.721,221.754 547.399,220.225C590.03,203.06 595.138,229.532 600.113,224.265C604.481,215.909 606.646,206.053 607.007,204.411C609.209,194.388 630.71,136.358 631.019,135.364C643.088,96.626 675.019,106.911 672.762,130.538C672.28,135.58 612.164,281.957 617.224,317.549C620.438,340.149 651.152,295.03 654.533,283.511C660.555,262.993 658.109,255.957 681.217,226.288C696.145,207.122 733.529,181.705 762.667,206.271C765.928,209.02 767.5,203.627 771.772,196.653C775.531,190.514 787.274,187.353 793.612,190.235C813.229,199.156 803.253,216.802 793.945,239.67C790.47,248.209 766.778,311.37 786.658,304.938C801.281,300.207 814.521,274.746 819.187,266.32C826.443,253.215 840.475,257.613 842.174,258.952C856.357,270.135 845.699,288.352 832.201,306.275C829.348,310.063 809.003,337.076 783.457,340.014C758.79,342.851 748.869,323.481 747.374,320.562C743.578,313.152 743.327,323.952 725.894,336.968C687.421,365.695 663.381,332.652 663.378,332.648C660.85,330.116 651.67,344.934 641.267,351.123C599.079,376.223 584.527,338.071 583.404,337.744C580.384,336.865 554.602,383.219 515.311,366.893C498.038,358.393 494.936,346.441 492.622,336.484C491.065,327.333 490.468,325.951 491.679,308.509C492.015,303.661 488.529,307.701 480.699,310.964C471.684,314.721 472.949,316.431 469.402,325.465C445.477,386.404 394.802,406.596 363.121,383.989C359.828,381.639 342.152,369.026 343.204,337.511C343.527,327.839 344.376,327.972 344.55,324.491C344.719,321.086 342.601,323.712 325.396,330.287C319.793,332.428 318.871,361.917 281.905,393.959C242.891,427.777 209.347,408.104 198.878,394.224C172.348,359.049 198.959,276.903 245.631,262.915C249.497,261.757 247.672,259.375 259.866,249.945C284.458,230.93 323.246,242.374 329.083,273.588C332.435,291.509 329.229,296.884 334.325,294.145C352.77,284.232 353.165,281.646 358.175,277.228C362.84,272.352 376.996,253.408 388.623,249.918C392.478,248.761 392.178,248.181 398.022,242.024C401.35,238.837 401.28,238.847 401.578,238.587C428.82,214.895 454.137,229.453 459.906,234.021ZM294.092,301.445C294.288,299.771 295.88,286.204 293.824,280.383C292.184,275.744 289.071,274.792 288.469,274.608C272.675,269.777 267.926,298.731 284.445,302.705C292.123,304.552 293.189,304.687 294.092,301.445ZM432.474,259.238C416.673,263.184 415.475,287.985 440.499,289.032C442.16,289.101 446.944,289.301 443.624,268.481C442.169,259.353 433.633,259.252 432.474,259.238ZM701.503,309.123C715.958,307.079 723.77,293.95 734.134,276.277C734.604,275.475 734.356,275.374 738.655,265.568C746.649,247.334 746.368,239.501 743.044,232.747C739.357,225.254 712.967,228.754 695.449,273.481C691.384,283.861 691.184,295.816 692.252,299.566C695.168,309.798 699.145,308.734 701.503,309.123ZM277.176,346.288C281.184,339.079 281.19,339.142 281.504,338.502C284.151,333.109 279.553,335.121 273.52,333.438C255.805,328.497 249.963,319.982 243.677,309.335C240.841,304.532 226.443,336.348 227.061,354.509C228.386,393.443 264.009,370.131 277.176,346.288ZM419.069,342.167C424.368,335.114 435.784,321.8 429.576,320.264C411.189,315.717 406.494,313.611 395.767,299.315C393.987,296.942 393.371,295.137 391.76,297.689C381.955,313.224 368.806,363.919 400.529,355.596C401.222,355.414 401.102,355.283 408.579,351.651C410.766,350.588 418.274,342.973 419.069,342.167ZM528.885,312.524C528.874,313.851 528.707,315.173 528.696,316.499C528.494,340.505 546.43,331.437 551.093,326.119C567.396,307.525 567.02,304.859 573.208,292.357C580.442,277.743 590.416,243.431 566.544,249.693C556.846,252.237 546.903,265.788 546.458,266.466C533.005,286.97 530.408,300.482 528.885,312.524Z" style="fill:currentColor;"/></g></g></svg>',w='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>',u='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8"/><polyline points="16 6 12 2 8 6"/><line x1="12" y1="2" x2="12" y2="15"/></svg>',f='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>',x=document.createElement("style");x.textContent=`
2
+ @import url('https://cdn.jsdelivr.net/npm/geist@1.3.1/dist/fonts/geist-sans/style.min.css');
3
+
4
+ :host {
5
+ all: initial;
6
+ font-family: 'Geist Sans', 'Geist', system-ui, -apple-system, sans-serif;
7
+ font-size: 13px;
8
+ color: #272725;
9
+ }
10
+
11
+ * { box-sizing: border-box; margin: 0; padding: 0; }
12
+
13
+ .pill {
14
+ cursor: pointer;
15
+ width: 36px;
16
+ height: 36px;
17
+ border-radius: 18px;
18
+ background: #EBF1E5;
19
+ border: 1px solid #cdd4c7;
20
+ display: flex;
21
+ align-items: center;
22
+ justify-content: center;
23
+ box-shadow: 0 2px 8px rgba(0,0,0,0.10), 0 0 0 1px rgba(0,0,0,0.04);
24
+ transition: width 0.2s ease, border-radius 0.2s ease, box-shadow 0.15s ease;
25
+ overflow: hidden;
26
+ user-select: none;
27
+ }
28
+
29
+ .pill:hover {
30
+ box-shadow: 0 4px 14px rgba(0,0,0,0.13), 0 0 0 1px rgba(0,0,0,0.06);
31
+ }
32
+
33
+ .pill.expanded {
34
+ width: auto;
35
+ border-radius: 20px;
36
+ cursor: default;
37
+ overflow: visible;
38
+ }
39
+
40
+ .pill-logo {
41
+ width: 22px;
42
+ height: 22px;
43
+ flex-shrink: 0;
44
+ color: #272725;
45
+ display: flex;
46
+ align-items: center;
47
+ justify-content: center;
48
+ }
49
+
50
+ .pill-logo svg {
51
+ width: 22px;
52
+ height: 22px;
53
+ }
54
+
55
+ .pill-content {
56
+ display: none;
57
+ align-items: center;
58
+ gap: 8px;
59
+ padding-right: 6px;
60
+ white-space: nowrap;
61
+ }
62
+
63
+ .pill.expanded .pill-content {
64
+ display: flex;
65
+ }
66
+
67
+ .pill.expanded .pill-logo {
68
+ margin: 0 4px 0 7px;
69
+ }
70
+
71
+ .pill:not(.expanded) .pill-logo {
72
+ margin: 0;
73
+ }
74
+
75
+ .sep {
76
+ width: 1px;
77
+ height: 18px;
78
+ background: #cdd4c7;
79
+ flex-shrink: 0;
80
+ }
81
+
82
+ .path {
83
+ font-size: 12px;
84
+ color: #5a5a56;
85
+ max-width: 140px;
86
+ overflow: hidden;
87
+ text-overflow: ellipsis;
88
+ flex-shrink: 1;
89
+ }
90
+
91
+ .btn {
92
+ background: transparent;
93
+ border: 1px solid #cdd4c7;
94
+ color: #5a5a56;
95
+ padding: 4px 10px;
96
+ border-radius: 4px;
97
+ cursor: pointer;
98
+ font-size: 12px;
99
+ font-family: inherit;
100
+ transition: background 0.15s, border-color 0.15s, color 0.15s;
101
+ flex-shrink: 0;
102
+ display: flex;
103
+ align-items: center;
104
+ gap: 5px;
105
+ line-height: 1;
106
+ }
107
+
108
+ .btn:hover {
109
+ background: rgba(39,39,37,0.08);
110
+ color: #272725;
111
+ border-color: #a8a8a2;
112
+ }
113
+
114
+ .btn.active {
115
+ background: #272725;
116
+ border-color: #272725;
117
+ color: #EBF1E5;
118
+ }
119
+
120
+ .feedback-wrap {
121
+ display: flex;
122
+ align-items: center;
123
+ flex-shrink: 1;
124
+ min-width: 0;
125
+ }
126
+
127
+ .feedback-input {
128
+ width: 140px;
129
+ min-width: 0;
130
+ background: #fff;
131
+ border: 1px solid #cdd4c7;
132
+ color: #272725;
133
+ padding: 4px 10px;
134
+ border-radius: 4px;
135
+ font-size: 12px;
136
+ font-family: inherit;
137
+ outline: none;
138
+ transition: border-color 0.15s, box-shadow 0.3s;
139
+ }
140
+
141
+ .feedback-input::placeholder {
142
+ color: #8a8a84;
143
+ }
144
+
145
+ .feedback-input:focus {
146
+ border-color: #272725;
147
+ }
148
+
149
+ .feedback-input:disabled {
150
+ background: #f0f0ee;
151
+ color: #8a8a84;
152
+ cursor: not-allowed;
153
+ }
154
+
155
+ .feedback-input.sent {
156
+ box-shadow: 0 0 0 2px rgba(34,160,80,0.25);
157
+ border-color: #4a9;
158
+ }
159
+
160
+ .share-wrap {
161
+ position: relative;
162
+ flex-shrink: 0;
163
+ }
164
+
165
+ .share-dropdown {
166
+ position: absolute;
167
+ bottom: 100%;
168
+ right: 0;
169
+ margin-bottom: 6px;
170
+ background: #fff;
171
+ border: 1px solid #cdd4c7;
172
+ border-radius: 6px;
173
+ padding: 4px 0;
174
+ min-width: 200px;
175
+ display: none;
176
+ box-shadow: 0 4px 12px rgba(0,0,0,0.08);
177
+ }
178
+
179
+ .share-dropdown.open {
180
+ display: block;
181
+ }
182
+
183
+ .share-item {
184
+ display: block;
185
+ width: 100%;
186
+ padding: 8px 12px;
187
+ color: #5a5a56;
188
+ text-decoration: none;
189
+ font-size: 12px;
190
+ font-family: inherit;
191
+ background: none;
192
+ border: none;
193
+ text-align: left;
194
+ cursor: pointer;
195
+ transition: background 0.1s;
196
+ }
197
+
198
+ .share-item:hover {
199
+ background: #EBF1E5;
200
+ color: #272725;
201
+ }
202
+
203
+ .share-label {
204
+ display: block;
205
+ font-weight: 500;
206
+ color: #272725;
207
+ }
208
+
209
+ .share-desc {
210
+ display: block;
211
+ font-size: 11px;
212
+ color: #8a8a84;
213
+ margin-top: 2px;
214
+ }
215
+
216
+ .btn.flash {
217
+ background: #272725;
218
+ border-color: #272725;
219
+ color: #EBF1E5;
220
+ }
221
+ `,C.appendChild(x);let n=document.createElement("div");n.className="pill",n.innerHTML=`
222
+ <div class="pill-logo">${v}</div>
223
+ <div class="pill-content">
224
+ <div class="sep"></div>
225
+ <span class="path"></span>
226
+ <div class="sep"></div>
227
+ <button class="btn inspector-btn">${w} Inspector</button>
228
+ <div class="feedback-wrap">
229
+ <input class="feedback-input" type="text" placeholder="Send feedback to Claude\u2026" />
230
+ </div>
231
+ <div class="share-wrap">
232
+ <button class="btn share-btn">${u} Share</button>
233
+ <div class="share-dropdown"></div>
234
+ </div>
235
+ </div>
236
+ `,C.appendChild(n);let g=n.querySelector(".path"),b=n.querySelector(".inspector-btn"),o=n.querySelector(".feedback-input"),s=n.querySelector(".share-btn"),i=n.querySelector(".share-dropdown");function y(){l||(l=!0,n.classList.add("expanded"),d())}function k(){l&&(l=!1,n.classList.remove("expanded"),i.classList.remove("open"),a=!1)}n.querySelector(".pill-logo").addEventListener("click",e=>{e.stopPropagation(),l?k():y()}),document.addEventListener("click",()=>{a&&(i.classList.remove("open"),a=!1)});function d(){p=location.pathname,g.textContent=p,g.title=p}let E=history.pushState;history.pushState=function(...e){E.apply(this,e),d()};let _=history.replaceState;history.replaceState=function(...e){_.apply(this,e),d()},window.addEventListener("popstate",d),b.addEventListener("click",e=>{e.stopPropagation(),r=!r,b.classList.toggle("active",r),window.postMessage({type:"__OODA_TOGGLE_INSPECTOR__",enabled:r},"*")}),window.addEventListener("message",e=>{e.source===window&&(e.data?.type==="__OODA_INSPECTOR_STATE__"&&(r=!!e.data.enabled,b.classList.toggle("active",r)),e.data?.type==="__OODA_BRIDGE_CONNECTED__"&&(h=!0,o.placeholder="Send feedback to Claude\u2026",o.disabled=!1),e.data?.type==="__OODA_BRIDGE_DISCONNECTED__"&&(h=!1,o.placeholder="Connecting\u2026",o.disabled=!0))}),o.placeholder="Connecting\u2026",o.disabled=!0,o.addEventListener("click",e=>e.stopPropagation()),o.addEventListener("keydown",e=>{if(e.stopPropagation(),e.key==="Enter"&&o.value.trim()){let t=o.value.trim();console.log("[ooda-toolbar] Sending feedback:",t,"bridge:",h),window.postMessage({type:"__OODA_FEEDBACK__",text:t},"*"),o.value="",o.classList.add("sent"),setTimeout(()=>o.classList.remove("sent"),600)}});function L(){try{if(window.top!==window&&document.referrer){let t=new URL(document.referrer);if(t.hostname.endsWith(".ooda.run"))return`https://${t.hostname}`}}catch{}let e=location.hostname;return e.endsWith(".ooda.run")?`https://${e.replace(".ooda.run","")}.ooda.run`:location.origin}function m(e){let t=document.createElement("textarea");return t.value=e,t.style.cssText="position:fixed;left:-9999px;",document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t),Promise.resolve()}function S(){let e=L();i.innerHTML=`
237
+ <button class="share-item" data-action="copy">
238
+ <span class="share-label">Copy link</span>
239
+ <span class="share-desc">Copy ${e.replace("https://","")} to clipboard</span>
240
+ </button>
241
+ <button class="share-item" data-action="publish">
242
+ <span class="share-label">Publish</span>
243
+ <span class="share-desc">Ask Claude to build &amp; publish a snapshot</span>
244
+ </button>
245
+ `,i.querySelector('[data-action="copy"]').addEventListener("click",t=>{t.stopPropagation(),(navigator.clipboard?.writeText?navigator.clipboard.writeText(e).catch(()=>m(e)):m(e)).then(()=>{s.classList.add("flash"),s.innerHTML=`${f} Copied!`,setTimeout(()=>{s.classList.remove("flash"),s.innerHTML=`${u} Share`},1500)}),i.classList.remove("open"),a=!1}),i.querySelector('[data-action="publish"]').addEventListener("click",t=>{t.stopPropagation(),window.postMessage({type:"__OODA_FEEDBACK__",text:"/publish"},"*"),s.classList.add("flash"),s.innerHTML=`${f} Sent!`,setTimeout(()=>{s.classList.remove("flash"),s.innerHTML=`${u} Share`},1500),i.classList.remove("open"),a=!1})}s.addEventListener("click",e=>{e.stopPropagation(),a=!a,i.classList.toggle("open",a)}),S(),d()})();})();
package/package.json ADDED
@@ -0,0 +1,68 @@
1
+ {
2
+ "name": "@oodarun/cli",
3
+ "version": "0.1.0",
4
+ "description": "Launch Claude Code on cloud dev environments",
5
+ "type": "module",
6
+ "license": "UNLICENSED",
7
+ "homepage": "https://ooda.computer",
8
+ "bin": {
9
+ "ooda": "dist/cli.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "dashboard-dist",
14
+ "README.md"
15
+ ],
16
+ "scripts": {
17
+ "dev": "tsx src/cli/index.ts",
18
+ "cli": "bash scripts/dev-cli.sh",
19
+ "build": "pnpm build:cli && pnpm build:tools && pnpm build:dashboard",
20
+ "build:tools": "node build-tools.mjs",
21
+ "build:cli": "tsup --config tsup.config.ts",
22
+ "build:dashboard": "vite build --config dashboard/vite.config.ts",
23
+ "test": "vitest",
24
+ "test:run": "vitest run",
25
+ "typecheck": "tsc --noEmit",
26
+ "site": "pnpm --dir site dev",
27
+ "site:build": "pnpm --dir site build",
28
+ "site:deploy": "pnpm site:build && wrangler pages deploy site/dist --project-name ooda-marketing",
29
+ "server:dev": "pnpm --dir server run dev",
30
+ "server:deploy": "pnpm --dir server run deploy",
31
+ "create-org": "tsx server/scripts/create-org.ts",
32
+ "seed:local": "tsx server/scripts/seed-local.ts",
33
+ "sweep:local": "tsx server/scripts/sweep-local.ts",
34
+ "loader:dev": "pnpm --dir loader run dev",
35
+ "dashboard:dev": "vite --config dashboard/vite.config.ts",
36
+ "dashboard:deploy": "vite build --config dashboard/vite.config.ts && wrangler pages deploy dashboard-dist --project-name ooda-app",
37
+ "loader:deploy": "pnpm --dir loader run deploy",
38
+ "workers:dev": "bash scripts/workers-dev.sh",
39
+ "dev:all": "trap 'kill 0' EXIT; pnpm site & pnpm loader:dev & pnpm server:dev & pnpm dashboard:dev & wait",
40
+ "prepare": "husky"
41
+ },
42
+ "dependencies": {
43
+ "@hono/node-server": "^1.19.12",
44
+ "@inquirer/prompts": "^8.3.0",
45
+ "dotenv": "^17.2.3",
46
+ "hono": "^4.12.10",
47
+ "open": "^10.1.0",
48
+ "ws": "^8.19.0"
49
+ },
50
+ "devDependencies": {
51
+ "@tailwindcss/vite": "^4.0.0",
52
+ "@types/node": "^25.1.0",
53
+ "@types/react": "^19.0.0",
54
+ "@types/react-dom": "^19.0.0",
55
+ "@types/ws": "^8.18.1",
56
+ "@vitejs/plugin-react": "^4.3.0",
57
+ "esbuild": "^0.25.0",
58
+ "husky": "^9.1.7",
59
+ "react": "^19.0.0",
60
+ "react-dom": "^19.0.0",
61
+ "tailwindcss": "^4.0.0",
62
+ "tsup": "^8.4.0",
63
+ "tsx": "^4.19.0",
64
+ "typescript": "^5.7.0",
65
+ "vite": "^6.0.0",
66
+ "vitest": "^4.0.18"
67
+ }
68
+ }