@dezignerdrugz/ade 0.1.2 → 0.1.3
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/.output/public/_shell.html +1 -1
- package/README.md +8 -8
- package/bin/ade.mjs +2 -2
- package/package.json +1 -1
- package/scripts/start-local.mjs +1 -1
- package/src/local/launch.mjs +1 -1
- package/src/local/server.mjs +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/assets/styles-DafH6Tpe.css" data-precedence="default"/><link rel="stylesheet" href="/assets/index-apqJzkVr.css" data-precedence="default"/><title>ADE — Project home</title><meta name="author" content="ADE"/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary_large_image"/><meta name="description" content="See your preview, active agent sessions, and recent changes for the current project in one calm workspace."/><meta property="og:title" content="ADE — Project home"/><meta property="og:description" content="A free, local-first workspace for building software with AI coding agents."/><link rel="modulepreload" href="/assets/index-3HxL6IhA.js"/><link rel="modulepreload" href="/assets/jsx-runtime-B-hcVAMW.js"/><link rel="modulepreload" href="/assets/react-dom-8HkkFvw6.js"/><link rel="modulepreload" href="/assets/link-B2U3BMsN.js"/><link rel="modulepreload" href="/assets/not-found-i5RsCZif.js"/><link rel="modulepreload" href="/assets/useSearch-CfA5YnfP.js"/><link rel="modulepreload" href="/assets/useRouter-BGpAXxmD.js"/><link rel="modulepreload" href="/assets/routes-an4DkwdD.js"/><link rel="modulepreload" href="/assets/navigation-BciIj42D.js"/><link rel="icon" href="/favicon.ico" type="image/x-icon"/><script>(function(){try{var t=localStorage.getItem("ade-theme");if(t!=="light"&&t!=="dark")t=matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light";document.documentElement.dataset.theme=t}catch(e){}})()</script></head><body><div class="flex h-screen flex-col overflow-hidden bg-paper text-ink"><header class="flex h-10 shrink-0 items-center gap-2 border-b border-line bg-panel px-3 sm:px-4"><a aria-label="ADE home" class="heading-display shrink-0 text-xl text-ink hover:text-ink active" href="/" data-status="active" aria-current="page">ADE</a><div class="flex min-w-0 flex-1 items-center gap-1 overflow-x-auto"><button type="button" aria-label="Add project" class="grid size-7 shrink-0 place-items-center rounded-md text-dim hover:bg-ink/[0.04] hover:text-ink focus-visible:outline-2 focus-visible:outline-amber"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-plus size-4" aria-hidden="true"><path d="M5 12h14"></path><path d="M12 5v14"></path></svg></button></div><div class="ml-auto flex shrink-0 items-center gap-1 sm:gap-2"><button type="button" id="radix-_R_75aq_" aria-haspopup="menu" aria-expanded="false" data-state="closed" class="inline-flex h-7 max-w-[14rem] items-center gap-1.5 rounded-md px-2 text-[13px] text-dim hover:bg-ink/[0.04] hover:text-ink focus-visible:outline-2 focus-visible:outline-amber" aria-label="Projects menu"><span class="min-w-0 truncate">Projects</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down size-3.5 shrink-0" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button><button type="button" aria-label="Agents settings" class="grid size-7 place-items-center rounded-md text-dim hover:bg-ink/[0.04] hover:text-ink focus-visible:outline-2 focus-visible:outline-amber"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-settings size-3.5" aria-hidden="true"><path d="M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915"></path><circle cx="12" cy="12" r="3"></circle></svg></button><button tabindex="0" class="G30ocW_button G30ocW_secondary G30ocW_sm weiLkW_themeSwitch weiLkW_rise weiLkW_iconOnly " type="button" data-theme="light" aria-label="Switch to dark mode" aria-pressed="false"><span class="G30ocW_labelSlot" style="width:auto"><span class="G30ocW_labelContent"><span class="G30ocW_labelPhase" style="opacity:1;filter:blur(0px);transform:none"><span class="weiLkW_iconWrap"><span class="weiLkW_icon" aria-hidden="true" style="opacity:1;filter:blur(0px);transform:none"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sun" aria-hidden="true"><circle cx="12" cy="12" r="4"></circle><path d="M12 2v2"></path><path d="M12 20v2"></path><path d="m4.93 4.93 1.41 1.41"></path><path d="m17.66 17.66 1.41 1.41"></path><path d="M2 12h2"></path><path d="M20 12h2"></path><path d="m6.34 17.66-1.41 1.41"></path><path d="m19.07 4.93-1.41 1.41"></path></svg></span></span></span></span></span></button></div></header><div class="flex min-h-0 flex-1"><div class="min-h-0 min-w-0 flex-1" data-group="true" data-testid="ade-shell-layout-v2" id="ade-shell-layout-v2" style="height:100%;width:100%;overflow:hidden;flex:1;min-height:0;display:flex;flex-direction:row;flex-wrap:nowrap;touch-action:pan-y"><div data-panel="true" data-testid="shell-main" id="shell-main" style="min-height:0;max-height:100%;height:auto;min-width:0;max-width:100%;width:auto;border:none;border-width:0;padding:0;margin:0;display:flex;flex-basis:0;flex-shrink:1;overflow:visible;flex-grow:56"><div class="min-w-0 overflow-hidden" style="max-height:100%;max-width:100%;flex-grow:1;overflow:hidden;min-width:0;touch-action:pan-y"><div class="flex h-full min-h-0 min-w-0 flex-1 flex-col overflow-hidden"><!--$--><!--$--><!--/$--><script>(function(a,f){let l;try{l=JSON.parse(sessionStorage.getItem(a)||"{}")}catch{return}const n=l?.[f||history.state?.__TSR_key];let c=!1;for(const t in n){const e=n[t],o=e?.scrollX,s=e?.scrollY;if(Number.isFinite(o)&&Number.isFinite(s)){if(t==="window")scrollTo(o,s),c=!0;else if(t)try{const r=document.querySelector(t);r&&(r.scrollLeft=o,r.scrollTop=s)}catch{}}}if(c)return;const i=location.hash.slice(1);if(i){const t=history.state?.__hashScrollIntoViewOptions??!0;if(t){const e=document.getElementById(i);e&&e.scrollIntoView(t)}return}scrollTo(0,0)})("tsr-scroll-restoration-v1_3");document.currentScript.remove()</script><!--/$--></div></div></div><div data-orientation="vertical" aria-orientation="vertical" class="panel-seam" data-separator="inactive" data-testid="seam-shell-right" id="seam-shell-right" role="separator" style="flex-basis:auto;flex-grow:0;flex-shrink:0;touch-action:none" tabindex="0"><button type="button" aria-label="Hide right pane" title="Hide right pane" aria-expanded="true" aria-controls="shell-right" class="panel-collapse-handle"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-panel-right-close size-3.5" aria-hidden="true"><rect width="18" height="18" x="3" y="3" rx="2"></rect><path d="M15 3v18"></path><path d="m8 9 3 3-3 3"></path></svg></button></div><div data-panel="true" data-testid="shell-right" id="shell-right" style="min-height:0;max-height:100%;height:auto;min-width:0;max-width:100%;width:auto;border:none;border-width:0;padding:0;margin:0;display:flex;flex-basis:0;flex-shrink:1;overflow:visible;flex-grow:44"><div class="min-w-0 overflow-hidden" style="max-height:100%;max-width:100%;flex-grow:1;overflow:hidden;min-width:0;touch-action:pan-y"><div class="relative flex h-full min-h-0 min-w-0 flex-col overflow-hidden"><div class="flex h-full min-h-0 min-w-0 flex-1 flex-col overflow-hidden"></div></div></div></div></div></div></div><script class="$tsr" id="$tsr-stream-barrier">(self.$R=self.$R||{})["tsr"]=[];self.$_TSR={h(){this.hydrated=!0,this.c()},e(){this.streamEnded=!0,this.c()},c(){this.hydrated&&this.streamEnded&&(delete self.$_TSR,delete self.$R.tsr)},p(e){this.initialized?e():this.buffer.push(e)},buffer:[]};$_TSR.router=($R=>$R[0]={manifest:$R[1]={routes:$R[2]={__root__:$R[3]={preloads:$R[4]=["/assets/index-3HxL6IhA.js","/assets/jsx-runtime-B-hcVAMW.js","/assets/react-dom-8HkkFvw6.js","/assets/link-B2U3BMsN.js","/assets/not-found-i5RsCZif.js","/assets/useSearch-CfA5YnfP.js","/assets/useRouter-BGpAXxmD.js"],scripts:$R[5]=[$R[6]={attrs:$R[7]={type:"module",async:!0,src:"/assets/index-3HxL6IhA.js"}}],css:$R[8]=["/assets/index-apqJzkVr.css"]}}},matches:$R[9]=[$R[10]={i:"__root__",u:
|
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/assets/styles-DafH6Tpe.css" data-precedence="default"/><link rel="stylesheet" href="/assets/index-apqJzkVr.css" data-precedence="default"/><title>ADE — Project home</title><meta name="author" content="ADE"/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary_large_image"/><meta name="description" content="See your preview, active agent sessions, and recent changes for the current project in one calm workspace."/><meta property="og:title" content="ADE — Project home"/><meta property="og:description" content="A free, local-first workspace for building software with AI coding agents."/><link rel="modulepreload" href="/assets/index-3HxL6IhA.js"/><link rel="modulepreload" href="/assets/jsx-runtime-B-hcVAMW.js"/><link rel="modulepreload" href="/assets/react-dom-8HkkFvw6.js"/><link rel="modulepreload" href="/assets/link-B2U3BMsN.js"/><link rel="modulepreload" href="/assets/not-found-i5RsCZif.js"/><link rel="modulepreload" href="/assets/useSearch-CfA5YnfP.js"/><link rel="modulepreload" href="/assets/useRouter-BGpAXxmD.js"/><link rel="modulepreload" href="/assets/routes-an4DkwdD.js"/><link rel="modulepreload" href="/assets/navigation-BciIj42D.js"/><link rel="icon" href="/favicon.ico" type="image/x-icon"/><script>(function(){try{var t=localStorage.getItem("ade-theme");if(t!=="light"&&t!=="dark")t=matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light";document.documentElement.dataset.theme=t}catch(e){}})()</script></head><body><div class="flex h-screen flex-col overflow-hidden bg-paper text-ink"><header class="flex h-10 shrink-0 items-center gap-2 border-b border-line bg-panel px-3 sm:px-4"><a aria-label="ADE home" class="heading-display shrink-0 text-xl text-ink hover:text-ink active" href="/" data-status="active" aria-current="page">ADE</a><div class="flex min-w-0 flex-1 items-center gap-1 overflow-x-auto"><button type="button" aria-label="Add project" class="grid size-7 shrink-0 place-items-center rounded-md text-dim hover:bg-ink/[0.04] hover:text-ink focus-visible:outline-2 focus-visible:outline-amber"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-plus size-4" aria-hidden="true"><path d="M5 12h14"></path><path d="M12 5v14"></path></svg></button></div><div class="ml-auto flex shrink-0 items-center gap-1 sm:gap-2"><button type="button" id="radix-_R_75aq_" aria-haspopup="menu" aria-expanded="false" data-state="closed" class="inline-flex h-7 max-w-[14rem] items-center gap-1.5 rounded-md px-2 text-[13px] text-dim hover:bg-ink/[0.04] hover:text-ink focus-visible:outline-2 focus-visible:outline-amber" aria-label="Projects menu"><span class="min-w-0 truncate">Projects</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down size-3.5 shrink-0" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button><button type="button" aria-label="Agents settings" class="grid size-7 place-items-center rounded-md text-dim hover:bg-ink/[0.04] hover:text-ink focus-visible:outline-2 focus-visible:outline-amber"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-settings size-3.5" aria-hidden="true"><path d="M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915"></path><circle cx="12" cy="12" r="3"></circle></svg></button><button tabindex="0" class="G30ocW_button G30ocW_secondary G30ocW_sm weiLkW_themeSwitch weiLkW_rise weiLkW_iconOnly " type="button" data-theme="light" aria-label="Switch to dark mode" aria-pressed="false"><span class="G30ocW_labelSlot" style="width:auto"><span class="G30ocW_labelContent"><span class="G30ocW_labelPhase" style="opacity:1;filter:blur(0px);transform:none"><span class="weiLkW_iconWrap"><span class="weiLkW_icon" aria-hidden="true" style="opacity:1;filter:blur(0px);transform:none"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sun" aria-hidden="true"><circle cx="12" cy="12" r="4"></circle><path d="M12 2v2"></path><path d="M12 20v2"></path><path d="m4.93 4.93 1.41 1.41"></path><path d="m17.66 17.66 1.41 1.41"></path><path d="M2 12h2"></path><path d="M20 12h2"></path><path d="m6.34 17.66-1.41 1.41"></path><path d="m19.07 4.93-1.41 1.41"></path></svg></span></span></span></span></span></button></div></header><div class="flex min-h-0 flex-1"><div class="min-h-0 min-w-0 flex-1" data-group="true" data-testid="ade-shell-layout-v2" id="ade-shell-layout-v2" style="height:100%;width:100%;overflow:hidden;flex:1;min-height:0;display:flex;flex-direction:row;flex-wrap:nowrap;touch-action:pan-y"><div data-panel="true" data-testid="shell-main" id="shell-main" style="min-height:0;max-height:100%;height:auto;min-width:0;max-width:100%;width:auto;border:none;border-width:0;padding:0;margin:0;display:flex;flex-basis:0;flex-shrink:1;overflow:visible;flex-grow:56"><div class="min-w-0 overflow-hidden" style="max-height:100%;max-width:100%;flex-grow:1;overflow:hidden;min-width:0;touch-action:pan-y"><div class="flex h-full min-h-0 min-w-0 flex-1 flex-col overflow-hidden"><!--$--><!--$--><!--/$--><script>(function(a,f){let l;try{l=JSON.parse(sessionStorage.getItem(a)||"{}")}catch{return}const n=l?.[f||history.state?.__TSR_key];let c=!1;for(const t in n){const e=n[t],o=e?.scrollX,s=e?.scrollY;if(Number.isFinite(o)&&Number.isFinite(s)){if(t==="window")scrollTo(o,s),c=!0;else if(t)try{const r=document.querySelector(t);r&&(r.scrollLeft=o,r.scrollTop=s)}catch{}}}if(c)return;const i=location.hash.slice(1);if(i){const t=history.state?.__hashScrollIntoViewOptions??!0;if(t){const e=document.getElementById(i);e&&e.scrollIntoView(t)}return}scrollTo(0,0)})("tsr-scroll-restoration-v1_3");document.currentScript.remove()</script><!--/$--></div></div></div><div data-orientation="vertical" aria-orientation="vertical" class="panel-seam" data-separator="inactive" data-testid="seam-shell-right" id="seam-shell-right" role="separator" style="flex-basis:auto;flex-grow:0;flex-shrink:0;touch-action:none" tabindex="0"><button type="button" aria-label="Hide right pane" title="Hide right pane" aria-expanded="true" aria-controls="shell-right" class="panel-collapse-handle"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-panel-right-close size-3.5" aria-hidden="true"><rect width="18" height="18" x="3" y="3" rx="2"></rect><path d="M15 3v18"></path><path d="m8 9 3 3-3 3"></path></svg></button></div><div data-panel="true" data-testid="shell-right" id="shell-right" style="min-height:0;max-height:100%;height:auto;min-width:0;max-width:100%;width:auto;border:none;border-width:0;padding:0;margin:0;display:flex;flex-basis:0;flex-shrink:1;overflow:visible;flex-grow:44"><div class="min-w-0 overflow-hidden" style="max-height:100%;max-width:100%;flex-grow:1;overflow:hidden;min-width:0;touch-action:pan-y"><div class="relative flex h-full min-h-0 min-w-0 flex-col overflow-hidden"><div class="flex h-full min-h-0 min-w-0 flex-1 flex-col overflow-hidden"></div></div></div></div></div></div></div><script class="$tsr" id="$tsr-stream-barrier">(self.$R=self.$R||{})["tsr"]=[];self.$_TSR={h(){this.hydrated=!0,this.c()},e(){this.streamEnded=!0,this.c()},c(){this.hydrated&&this.streamEnded&&(delete self.$_TSR,delete self.$R.tsr)},p(e){this.initialized?e():this.buffer.push(e)},buffer:[]};$_TSR.router=($R=>$R[0]={manifest:$R[1]={routes:$R[2]={__root__:$R[3]={preloads:$R[4]=["/assets/index-3HxL6IhA.js","/assets/jsx-runtime-B-hcVAMW.js","/assets/react-dom-8HkkFvw6.js","/assets/link-B2U3BMsN.js","/assets/not-found-i5RsCZif.js","/assets/useSearch-CfA5YnfP.js","/assets/useRouter-BGpAXxmD.js"],scripts:$R[5]=[$R[6]={attrs:$R[7]={type:"module",async:!0,src:"/assets/index-3HxL6IhA.js"}}],css:$R[8]=["/assets/index-apqJzkVr.css"]}}},matches:$R[9]=[$R[10]={i:"__root__",u:1793569818979,s:"success",ssr:!0}],lastMatchId:"__root__"})($R["tsr"]);$_TSR.e();document.currentScript.remove()</script><script type="module" async="" src="/assets/index-3HxL6IhA.js"></script></body></html>
|
package/README.md
CHANGED
|
@@ -14,10 +14,10 @@ Run ADE without cloning the repository or installing its development dependencie
|
|
|
14
14
|
npx @dezignerdrugz/ade
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
Open the printed address (by default `http://127.0.0.1:
|
|
17
|
+
Open the printed address (by default `http://127.0.0.1:3100`). To choose a port or open it automatically:
|
|
18
18
|
|
|
19
19
|
```sh
|
|
20
|
-
npx @dezignerdrugz/ade --port
|
|
20
|
+
npx @dezignerdrugz/ade --port 3200 --open
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
### Use it from your phone or another computer
|
|
@@ -30,19 +30,19 @@ ADE prints a sign-in link next to its usual address:
|
|
|
30
30
|
|
|
31
31
|
```text
|
|
32
32
|
ADE is running.
|
|
33
|
-
This computer: http://127.0.0.1:
|
|
34
|
-
Your devices: http://192.168.1.135:
|
|
33
|
+
This computer: http://127.0.0.1:3100
|
|
34
|
+
Your devices: http://192.168.1.135:3100/?token=… (same Wi-Fi)
|
|
35
35
|
Open a link once on each phone or laptop; it stays signed in. Ctrl+C stops ADE.
|
|
36
36
|
Wi-Fi links are plain HTTP: fine at home, not on public Wi-Fi.
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
-
Open the link on a phone or laptop connected to the same Wi-Fi. It signs that browser in and opens ADE; from then on the plain address (`http://192.168.1.135:
|
|
39
|
+
Open the link on a phone or laptop connected to the same Wi-Fi. It signs that browser in and opens ADE; from then on the plain address (`http://192.168.1.135:3100`) works there too. There is no account, password or configuration:
|
|
40
40
|
|
|
41
41
|
- **The link stays the same.** ADE makes its access token once and keeps it in `~/.ade/remote-token`. Delete that file to sign every device out; the next `ade --remote` makes a new link.
|
|
42
42
|
- **Home networks only.** The Wi-Fi link is plain HTTP, so anyone on the same network could read it in transit. Use it at home, not on public or shared Wi-Fi.
|
|
43
43
|
- **Tailscale is optional.** If [Tailscale](https://tailscale.com) is already connected, ADE adds a second link that works from your Tailscale devices wherever they are: HTTPS through `tailscale serve` while ADE runs (when your tailnet has HTTPS certificates turned on), otherwise the plain tailnet address. Nothing is left in your Tailscale settings when ADE stops.
|
|
44
44
|
- **Some tools stay on this computer.** The built-in terminal, the file editor, and installing or updating agent CLIs work only on the computer running ADE.
|
|
45
|
-
- **Another port:** `ade --remote --port
|
|
45
|
+
- **Another port:** `ade --remote --port 3200`. Ctrl+C stops ADE, and the links stop working until you run `ade --remote` again.
|
|
46
46
|
|
|
47
47
|
If the link does not open on the other device, check that both are on the same network (guest and office networks often keep devices apart), that this computer's firewall allows incoming connections on ADE's port, and that this computer's address has not changed since ADE started.
|
|
48
48
|
|
|
@@ -57,14 +57,14 @@ npm install
|
|
|
57
57
|
npm run dev
|
|
58
58
|
```
|
|
59
59
|
|
|
60
|
-
Open `http://127.0.0.1:3100` (the dev server is pinned there; override with `npm run dev -- --port <n>`). The development server and API bind to `127.0.0.1` by default, not the LAN; `ADE_HOST`/`ADE_TOKEN` (below) apply to `npm run dev` too, and a non-loopback `ADE_HOST` without `ADE_TOKEN` makes the dev server refuse to start. To run the built, self-hosted Node server instead:
|
|
60
|
+
Open `http://127.0.0.1:3100` (the dev server is pinned there, the same port the installed `ade` uses, so run one at a time; override with `npm run dev -- --port <n>`). The development server and API bind to `127.0.0.1` by default, not the LAN; `ADE_HOST`/`ADE_TOKEN` (below) apply to `npm run dev` too, and a non-loopback `ADE_HOST` without `ADE_TOKEN` makes the dev server refuse to start. To run the built, self-hosted Node server instead:
|
|
61
61
|
|
|
62
62
|
```sh
|
|
63
63
|
npm run build
|
|
64
64
|
npm start
|
|
65
65
|
```
|
|
66
66
|
|
|
67
|
-
That server listens on `127.0.0.1:
|
|
67
|
+
That server listens on `127.0.0.1:3100` (override with `PORT=... npm start`). To share a source checkout with your other devices the easy way, run `node bin/ade.mjs --remote` after `npm run build` (see **Use it from your phone or another computer** above); the rest of this paragraph describes the manual settings it uses. It stays loopback-only unless you explicitly opt in: set `ADE_HOST` (or pass `ade --host`) to a LAN/Tailscale interface address (or `0.0.0.0`) **and** `ADE_TOKEN` to a non-empty secret (`openssl rand -hex 16`); without a token `scripts/start-local.mjs` refuses to listen on a non-loopback address and exits 1. In exposed mode every `/api` request from a non-loopback client must prove the token — as `Authorization: Bearer <ADE_TOKEN>` for scripts, or via an `HttpOnly` `ade_auth` cookie that the UI's token gate obtains by POSTing the token to `/api/auth` once (wrong tokens get 401). A specific `ADE_HOST` also compares the request's Host header against that address as a DNS-rebinding fence; `ADE_HOST=0.0.0.0` (or `::`) spans every interface and accepts any Host name, with the token remaining the gate. Loopback clients — the agent CLIs and ADE on this machine — are exempt from the token either way. Plain HTTP carries the token in the clear, so prefer a Tailscale address, or keep the default loopback bind and front it with `tailscale serve --bg https / http://127.0.0.1:3100`: requests then arrive from the local proxy and the remote browser gets HTTPS. Without `ADE_TOKEN` the proxy is the only gate; with it, proxied browsers must prove the token too (a tailnet can include other people). Opening any ADE page with `?token=<ADE_TOKEN>` signs that browser in the same way, then reloads the page without the token so it does not stay in the address bar.
|
|
68
68
|
|
|
69
69
|
Add a project from the **+** button, in one of three ways: pick an **existing folder** (the native picker when available, ADE's own folder browser otherwise, or type its local path); **clone from GitHub** into a folder you choose (`owner/repo`, a GitHub URL, or an SSH address — runs `git clone` with prompts disabled, so a private repository needs `gh auth login`, a git credential helper, or an SSH key in `ssh-agent`; addresses carrying a password and non-remote paths are refused); or make a **new folder**, optionally initialized as a Git repository. The folder browser has a **New folder** button for creating a destination. A failed clone removes whatever it partially wrote, and an existing folder is never overwritten. To drop a project from the workspace, use **Remove** in the project header: it deletes only ADE's metadata (session records, process entries) for that project after an explicit confirmation, and never touches the folder or its files.
|
|
70
70
|
|
package/bin/ade.mjs
CHANGED
|
@@ -14,7 +14,7 @@ const USAGE = `Usage: ade [--port N] [--host H | --remote] [--open]
|
|
|
14
14
|
ade doctor
|
|
15
15
|
ade browser-setup
|
|
16
16
|
|
|
17
|
-
--port N listen on port N (default
|
|
17
|
+
--port N listen on port N (default 3100, like npm run dev; PORT also works)
|
|
18
18
|
--host H listen on H (default 127.0.0.1; non-loopback needs ADE_TOKEN)
|
|
19
19
|
--remote use ADE from your phone or other computers on the same Wi-Fi:
|
|
20
20
|
prints a link to open on them (plus one for Tailscale, if connected)
|
|
@@ -85,7 +85,7 @@ async function main() {
|
|
|
85
85
|
});
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
const raw = values.port ?? process.env.PORT ?? "
|
|
88
|
+
const raw = values.port ?? process.env.PORT ?? "3100";
|
|
89
89
|
const port = Number(raw);
|
|
90
90
|
if (!Number.isInteger(port) || port < 0 || port > 65535) {
|
|
91
91
|
console.error(`Invalid port: ${raw}`);
|
package/package.json
CHANGED
package/scripts/start-local.mjs
CHANGED
|
@@ -10,7 +10,7 @@ import { launchAde } from "../src/local/launch.mjs";
|
|
|
10
10
|
|
|
11
11
|
try {
|
|
12
12
|
await launchAde({
|
|
13
|
-
port: Number(process.env.PORT ??
|
|
13
|
+
port: Number(process.env.PORT ?? 3100),
|
|
14
14
|
staticDir: fileURLToPath(new URL("../.output/public", import.meta.url)),
|
|
15
15
|
});
|
|
16
16
|
} catch (error) {
|
package/src/local/launch.mjs
CHANGED
package/src/local/server.mjs
CHANGED
|
@@ -34,7 +34,7 @@ const TYPES = {
|
|
|
34
34
|
* `staticDir` is the SPA build's client directory (assets plus the shell HTML).
|
|
35
35
|
* @returns {Promise<http.Server>}
|
|
36
36
|
*/
|
|
37
|
-
export async function startAdeServer({ host = "127.0.0.1", port =
|
|
37
|
+
export async function startAdeServer({ host = "127.0.0.1", port = 3100, staticDir }) {
|
|
38
38
|
await start();
|
|
39
39
|
const root = path.resolve(staticDir);
|
|
40
40
|
const server = http.createServer((req, res) => {
|