[object Object]

← back to Studio Zero

studio-zero: one-click auto-build all 7 steps (chains niche→title→script; hero + toolbar buttons; SZ_PROVIDER=demo force-flag)

cceb51da5ffd044c266655e45d689247d7fdcb43 · 2026-07-25 08:51:48 -0700 · Steve

Files touched

Diff

commit cceb51da5ffd044c266655e45d689247d7fdcb43
Author: Steve <steve@designerwallcoverings.com>
Date:   Sat Jul 25 08:51:48 2026 -0700

    studio-zero: one-click auto-build all 7 steps (chains niche→title→script; hero + toolbar buttons; SZ_PROVIDER=demo force-flag)
---
 public/index.html | 65 +++++++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 58 insertions(+), 7 deletions(-)

diff --git a/public/index.html b/public/index.html
index 8650501..19f2cfc 100644
--- a/public/index.html
+++ b/public/index.html
@@ -137,6 +137,7 @@
       <p class="sub">Studio Zero runs the seven prompts a $10K/mo creator agency would — and hands you the actual deliverables: niche, brand, a full quarter of content, scripts, thumbnails, and a money map.</p>
       <div class="cta">
         <button class="btn" id="startBtn">Start my channel →</button>
+        <button class="btn ghost" id="autoHeroBtn">⚡ Auto-build all 7</button>
         <button class="btn ghost" id="demoBtn">See a demo run</button>
       </div>
       <div class="src">Method seeded by <a href="https://x.com/David263146/status/2079054195941147042" target="_blank" rel="noopener noreferrer">@David263146</a> · prompts run verbatim.</div>
@@ -159,7 +160,7 @@
 
 <script>
 const $=(s,r=document)=>r.querySelector(s), $$=(s,r=document)=>[...r.querySelectorAll(s)];
-let CFG={liveMode:false,model:'demo',rate:{in:3,out:15}}, PROMPTS=[], STATE=null, cur=0, sessionCost=0;
+let CFG={liveMode:false,model:'demo',rate:{in:3,out:15}}, PROMPTS=[], STATE=null, cur=0, sessionCost=0, autoMsg='';
 
 const LS_PROJECTS='sz_projects', LS_CAL='sz_cal_prefs';
 function toast(m){const t=$('#toast');t.textContent=m;t.classList.add('show');setTimeout(()=>t.classList.remove('show'),1800);}
@@ -241,16 +242,65 @@ function downloadFile(name,content,mime){
 }
 function renderBar(){
   const done=Object.keys(STATE.outputs||{}).length;
+  const running=!!autoMsg;
   const bar=$('#builderbar');
   bar.innerHTML=`
-    <input class="pname" id="pname" value="${escAttr(STATE.name||'Untitled channel')}" title="Rename this channel">
-    <span class="prog2">${done}/7 steps</span>
+    <input class="pname" id="pname" value="${escAttr(STATE.name||'Untitled channel')}" title="Rename this channel" ${running?'disabled':''}>
+    <span class="prog2" id="autostatus">${running?'<span class="spin"></span> '+esc(autoMsg):done+'/7 steps'}</span>
     <span class="sp"></span>
-    <button class="btn ghost sm ${done?'':'done0'}" id="dlBtn">⤓ Download plan</button>
-    <button class="btn ghost sm ${done?'':'done0'}" id="mdBtn">⧉ Copy markdown</button>`;
+    <button class="btn ghost sm" id="autoBtn" ${running?'disabled':''}>⚡ Auto-build all 7</button>
+    <button class="btn ghost sm ${done&&!running?'':'done0'}" id="dlBtn">⤓ Download plan</button>
+    <button class="btn ghost sm ${done&&!running?'':'done0'}" id="mdBtn">⧉ Copy markdown</button>`;
   $('#pname').onchange=()=>{STATE.name=$('#pname').value.trim()||'Untitled channel';persist();};
-  $('#dlBtn').onclick=()=>{ if(!done)return; downloadFile('studio-zero-'+slugify(STATE.name)+'.html',planHTML(),'text/html'); toast('Downloaded your channel plan'); };
-  $('#mdBtn').onclick=()=>{ if(!done)return; navigator.clipboard.writeText(planMarkdown()); toast('Copied full plan as Markdown'); };
+  $('#autoBtn').onclick=()=>autoBuildAll();
+  $('#dlBtn').onclick=()=>{ if(!done||running)return; downloadFile('studio-zero-'+slugify(STATE.name)+'.html',planHTML(),'text/html'); toast('Downloaded your channel plan'); };
+  $('#mdBtn').onclick=()=>{ if(!done||running)return; navigator.clipboard.writeText(planMarkdown()); toast('Copied full plan as Markdown'); };
+}
+function setAuto(m){ autoMsg=m; renderBar(); }
+
+// Generate a single step from an explicit value map (DOM-independent — used by auto-build).
+async function generateInto(step,vals){
+  const prompt=fillPrompt(step,vals);
+  const res=await fetch('/api/generate',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({prompt,stepKey:step.key})});
+  const j=await res.json();
+  if(vals['[NICHE]'])STATE.niche=vals['[NICHE]'];
+  STATE.outputs[step.key]={text:j.text,demo:j.demo,cost:j.cost||0,maxPlan:!!j.maxPlan,equiv:j.equiv||null,at:new Date().toISOString()};
+  STATE.costs[step.key]=j.cost||0;
+  if(j.cost){sessionCost+=j.cost;updateCostChip();}
+  persist();
+  return j;
+}
+
+// One-click auto-pilot: chains all 7 steps, deriving cross-step inputs (niche → title → script).
+async function autoBuildAll(){
+  if(autoMsg)return; // already running
+  let niche=STATE.niche;
+  if(!niche){ niche=(window.prompt('What is your channel about? (your niche)','')||'').trim(); if(!niche){ toast('Need a niche to auto-build'); return; } STATE.niche=niche; }
+  if(!STATE.name||STATE.name==='Untitled channel')STATE.name=niche.slice(0,42);
+  let autoTitle='', script='';
+  for(let i=0;i<PROMPTS.length;i++){
+    const s=PROMPTS[i]; cur=i;
+    setAuto('Generating step '+s.id+'/7 · '+s.title+'…'); renderStepper();
+    const vals={};
+    (s.inputs||[]).forEach(inp=>{
+      const t=inp.token;
+      if(t==='[NICHE]')vals[t]=niche;
+      else if(t==='[VIDEO TITLE]'||t==='[TITLE]')vals[t]=autoTitle||('The Complete '+niche+' Guide');
+      else if(t==='[TONE]')vals[t]=inp.default||'conversational';
+      else if(t==='[X]')vals[t]=inp.default||'0';
+      else if(t==='[SCRIPT]')vals[t]=(script||'').slice(0,6000)||('A video about '+niche);
+      else vals[t]=inp.default||'';
+    });
+    try{
+      const j=await generateInto(s,vals);
+      if(s.key==='roadmap'){ const ts=parseTitles(j.text); if(ts.length)autoTitle=ts[0]; }
+      if(s.key==='script'){ script=j.text; }
+    }catch(e){ toast('Step '+s.id+' failed — continuing'); }
+    renderStepper();
+  }
+  setAuto('');
+  cur=6; renderStep(); renderStepper(); renderBar();
+  toast('Auto-build complete — 7/7 · download your plan');
 }
 
 function renderStepper(){
@@ -476,6 +526,7 @@ function show(which){
   updateCostChip();
   $('#startBtn').onclick=startNew;
   $('#demoBtn').onclick=startNew;
+  $('#autoHeroBtn').onclick=()=>{ startNew(); autoBuildAll(); };
   $('#homeBtn').onclick=()=>show('home');
   show('home');
 })();

← edefa92 studio-zero: export — download full channel plan as standalo  ·  back to Studio Zero  ·  chore: guard clipboard copy (toast honesty), v0.2.0 (session 987c6f9 →