@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.
- package/README.md +125 -0
- package/dashboard-dist/assets/AdminApp-XtgMLudZ.js +6 -0
- package/dashboard-dist/assets/App-BD_pv1Jv.js +5 -0
- package/dashboard-dist/assets/InternalDashboard-BaxkB3eO.js +1 -0
- package/dashboard-dist/assets/api-DbuItvnH.js +1 -0
- package/dashboard-dist/assets/index-CKu0aeQ4.css +1 -0
- package/dashboard-dist/assets/index-DNhLzZDP.js +50 -0
- package/dashboard-dist/favicon.svg +10 -0
- package/dashboard-dist/index.html +17 -0
- package/dashboard-dist/logo.png +0 -0
- package/dashboard-dist/logo.svg +9 -0
- package/dist/cli.js +5858 -0
- package/dist/tools/bridge-client.js +1 -0
- package/dist/tools/change-applicator.js +6 -0
- package/dist/tools/element-selector.js +17 -0
- package/dist/tools/toolbar.js +245 -0
- package/package.json +68 -0
|
@@ -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 & 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
|
+
}
|