create-instant-app 0.22.120-experimental.drewh-admin-db-warn.21600986993.1 → 0.22.120-experimental.drewh-tanstack-start.21601761390.1

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.
Files changed (2) hide show
  1. package/dist/index.js +14 -14
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -1,33 +1,33 @@
1
1
  #!/usr/bin/env node
2
- import{Command as _e,Option as l}from"commander";import*as F from"@clack/prompts";import{spawn as be}from"child_process";import{execa as ke}from"execa";async function M(){return new Promise(e=>{let t=process.env.SHELL||"/bin/bash",n=be(t,["-i","-c","which claude"],{stdio:["ignore","pipe","ignore"]}),o="";n.stdout.on("data",i=>{o+=i.toString()}),n.on("close",i=>{if(i===0){let a=o.trim();a.includes("aliased to ")?e(a.split("aliased to ")[1]||null):e(a)}else e(null)})})}var W=async(e,t)=>{let n=await M();if(!n)throw new Error("Claude not found in path");await ke(n,[e],{stdio:"inherit",cwd:t})};import{version as Ae}from"@instantdb/version";import L from"path";var V=e=>(e.length>1&&e.endsWith("/")&&(e=e.slice(0,-1)),e),Ie=/^(?:@[a-z0-9-*~][a-z0-9-*._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/,z=e=>{let n=V(e).split("/"),o=n[n.length-1];if(o==="."){let r=L.resolve(process.cwd());o=L.basename(r)}let i=n.findIndex(r=>r.startsWith("@"));n.findIndex(r=>r.startsWith("@"))!==-1&&(o=n.slice(i).join("/"));let a=n.filter(r=>!r.startsWith("@")).join("/");return[o,a]},C=e=>e.trim(),$=e=>{let t=V(e),n=t.split("/"),o=n.findIndex(a=>a.startsWith("@")),i=n[n.length-1];if(n.findIndex(a=>a.startsWith("@"))!==-1&&(i=n.slice(o).join("/")),!(t==="."||Ie.test(i??"")))return"App name must consist of only lowercase alphanumeric characters, '-', and '_'"};import{renderUnwrap as N,UI as m}from"instant-cli/ui";var Pe={base:"next-js-app-dir",appName:"Awesome Todos",ruleFiles:null,createRepo:!0,prompt:null},H=async()=>{let e=Pe,t=new _e().name("Create Instant App").description("A CLI for creating web/mobile applications with InstantDB").argument("[dir]","The name of the application, as well as the name of the directory to create").addOption(new l("-b --base <template>","The base template to scaffold from").choices(["next-js-app-dir","vite-vanilla","expo"])).addOption(new l("-g --git","Create a git repo in the new project").default(!0)).addOption(new l("--expo","Use the Expo starter template").default(!1)).addOption(new l("--next","Use the NextJS starter template").default(!1)).addOption(new l("--vanilla","Use the vanilla JS starter template").default(!1)).addOption(new l("--no-git","Don't create a git repo in the new project")).addOption(new l("--cursor","Include a Cursor rules file in the scaffold")).addOption(new l("--claude","Include a CLAUDE.md file in the scaffold")).addOption(new l("--codex","Include an AGENTS.md file in the scaffold")).addOption(new l("--gemini","Include a GEMINI.md file in the scaffold")).addOption(new l("--rules","Include an AGENTS.md file in the scaffold")).addOption(new l("--ai","Create a new InstantDB app based off of a prompt. (requires Claude Code)")).addOption(new l("-a --app <app-id>","Link to an existing InstantDB app by ID (requires login or --token)")).addOption(new l("-t --token <token>","Auth token override (use with --app when not logged in)")).version(Ae).parse(process.argv),n=t.args[0]&&C(t.args[0]);if(n){let r=$(n);if(r)throw new Error("Invalid app name: "+r);e.appName=n}let o=t.opts();if(o.ai&&!await M())throw new Error("--ai only works with Claude Code, but we couldn't find it in your machine. Install it first, and run it again : ). Alternatively you can scaffold out a project without --ai");let i=await F.group({appName:async()=>{if(n)return n.trim();let r=await N(new m.TextInput({prompt:"What will your project/folder be called?",placeholder:"awesome-todos",defaultValue:"awesome-todos",validate:s=>$(C(s)),modifyOutput:m.ciaModifier()}));return C(r)},prompt:async()=>o.ai?await N(new m.TextInput({prompt:"What would you like to create?",placeholder:"Create an app that...",modifyOutput:m.modifiers.piped([m.ciaModifier()])})):null,base:async({results:r})=>o.base?o.base:o.vanilla?"vite-vanilla":o.next?"next-js-app-dir":o.expo?"expo":r.prompt?N(new m.Select({promptText:"What framework would you like to use?",options:[{value:"next-js-app-dir",label:"Next.js"},{value:"expo",label:"Expo: React Native"}],defaultValue:"next-js-app-dir",modifyOutput:m.modifiers.piped([m.ciaModifier()])})):N(new m.Select({promptText:"What framework would you like to use?",options:[{value:"next-js-app-dir",label:"Next.js"},{value:"vite-vanilla",label:"Vite: Vanilla TS"},{value:"expo",label:"Expo: React Native"}],defaultValue:"next-js-app-dir",modifyOutput:m.modifiers.piped([m.ciaModifier()])})),ruleFiles:async({results:r})=>r.prompt?"claude":o.cursor?"cursor":o.claude?"claude":o.codex?"codex":o.gemini?"gemini":o.rules?"codex":N(new m.Select({promptText:"Which AI tool would you like to add rule files for?",options:[{value:"claude",label:"Claude"},{value:"cursor",label:"Cursor"},{value:"codex",label:"Codex"},{value:"gemini",label:"Gemini"},{value:"zed",label:"Zed"},{value:"windsurf",label:"Windsurf"},{value:null,label:"None"}],defaultValue:"claude",modifyOutput:m.ciaModifier()})),createRepo:async()=>o.git!==void 0?o.git:!0},{onCancel(){process.exit(1)}}),a={app:o.app??null,token:o.token??null};return{project:i,appFlags:a}};import we from"path";import ye from"fs-extra";import{log as Te,outro as gt}from"@clack/prompts";import{intro as ve}from"@clack/prompts";import J from"chalk";var Ne=` _ _ _
2
+ import{Command as _e,Option as l}from"commander";import*as F from"@clack/prompts";import{spawn as be}from"child_process";import{execa as xe}from"execa";async function M(){return new Promise(e=>{let t=process.env.SHELL||"/bin/bash",n=be(t,["-i","-c","which claude"],{stdio:["ignore","pipe","ignore"]}),o="";n.stdout.on("data",a=>{o+=a.toString()}),n.on("close",a=>{if(a===0){let i=o.trim();i.includes("aliased to ")?e(i.split("aliased to ")[1]||null):e(i)}else e(null)})})}var W=async(e,t)=>{let n=await M();if(!n)throw new Error("Claude not found in path");await xe(n,[e],{stdio:"inherit",cwd:t})};import{version as Ae}from"@instantdb/version";import L from"path";var V=e=>(e.length>1&&e.endsWith("/")&&(e=e.slice(0,-1)),e),Ie=/^(?:@[a-z0-9-*~][a-z0-9-*._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/,z=e=>{let n=V(e).split("/"),o=n[n.length-1];if(o==="."){let r=L.resolve(process.cwd());o=L.basename(r)}let a=n.findIndex(r=>r.startsWith("@"));n.findIndex(r=>r.startsWith("@"))!==-1&&(o=n.slice(a).join("/"));let i=n.filter(r=>!r.startsWith("@")).join("/");return[o,i]},C=e=>e.trim(),$=e=>{let t=V(e),n=t.split("/"),o=n.findIndex(i=>i.startsWith("@")),a=n[n.length-1];if(n.findIndex(i=>i.startsWith("@"))!==-1&&(a=n.slice(o).join("/")),!(t==="."||Ie.test(a??"")))return"App name must consist of only lowercase alphanumeric characters, '-', and '_'"};import{renderUnwrap as v,UI as m}from"instant-cli/ui";var Pe={base:"next-js-app-dir",appName:"Awesome Todos",ruleFiles:null,createRepo:!0,prompt:null},H=async()=>{let e=Pe,t=new _e().name("Create Instant App").description("A CLI for creating web/mobile applications with InstantDB").argument("[dir]","The name of the application, as well as the name of the directory to create").addOption(new l("-b --base <template>","The base template to scaffold from").choices(["next-js-app-dir","vite-vanilla","expo"])).addOption(new l("-g --git","Create a git repo in the new project").default(!0)).addOption(new l("--expo","Use the Expo starter template").default(!1)).addOption(new l("--next","Use the NextJS starter template").default(!1)).addOption(new l("--vanilla","Use the vanilla JS starter template").default(!1)).addOption(new l("--no-git","Don't create a git repo in the new project")).addOption(new l("--cursor","Include a Cursor rules file in the scaffold")).addOption(new l("--claude","Include a CLAUDE.md file in the scaffold")).addOption(new l("--codex","Include an AGENTS.md file in the scaffold")).addOption(new l("--gemini","Include a GEMINI.md file in the scaffold")).addOption(new l("--rules","Include an AGENTS.md file in the scaffold")).addOption(new l("--ai","Create a new InstantDB app based off of a prompt. (requires Claude Code)")).addOption(new l("-a --app <app-id>","Link to an existing InstantDB app by ID (requires login or --token)")).addOption(new l("-t --token <token>","Auth token override (use with --app when not logged in)")).version(Ae).parse(process.argv),n=t.args[0]&&C(t.args[0]);if(n){let r=$(n);if(r)throw new Error("Invalid app name: "+r);e.appName=n}let o=t.opts();if(o.ai&&!await M())throw new Error("--ai only works with Claude Code, but we couldn't find it in your machine. Install it first, and run it again : ). Alternatively you can scaffold out a project without --ai");let a=await F.group({appName:async()=>{if(n)return n.trim();let r=await v(new m.TextInput({prompt:"What will your project/folder be called?",placeholder:"awesome-todos",defaultValue:"awesome-todos",validate:s=>$(C(s)),modifyOutput:m.ciaModifier()}));return C(r)},prompt:async()=>o.ai?await v(new m.TextInput({prompt:"What would you like to create?",placeholder:"Create an app that...",modifyOutput:m.modifiers.piped([m.ciaModifier()])})):null,base:async({results:r})=>o.base?o.base:o.vanilla?"vite-vanilla":o.next?"next-js-app-dir":o.expo?"expo":r.prompt?v(new m.Select({promptText:"What framework would you like to use?",options:[{value:"next-js-app-dir",label:"Next.js"},{value:"expo",label:"Expo: React Native"}],defaultValue:"next-js-app-dir",modifyOutput:m.modifiers.piped([m.ciaModifier()])})):v(new m.Select({promptText:"What framework would you like to use?",options:[{value:"next-js-app-dir",label:"Next.js"},{value:"vite-vanilla",label:"Vite: Vanilla TS"},{value:"expo",label:"Expo: React Native"},{value:"tanstack-start",label:"Tanstack Start"},{value:"tanstack-start-full",label:"Tanstack Start W/ Auth"}],defaultValue:"next-js-app-dir",modifyOutput:m.modifiers.piped([m.ciaModifier()])})),ruleFiles:async({results:r})=>r.prompt?"claude":o.cursor?"cursor":o.claude?"claude":o.codex?"codex":o.gemini?"gemini":o.rules?"codex":v(new m.Select({promptText:"Which AI tool would you like to add rule files for?",options:[{value:"claude",label:"Claude"},{value:"cursor",label:"Cursor"},{value:"codex",label:"Codex"},{value:"gemini",label:"Gemini"},{value:"zed",label:"Zed"},{value:"windsurf",label:"Windsurf"},{value:null,label:"None"}],defaultValue:"claude",modifyOutput:m.ciaModifier()})),createRepo:async()=>o.git!==void 0?o.git:!0},{onCancel(){process.exit(1)}}),i={app:o.app??null,token:o.token??null};return{project:a,appFlags:i}};import we from"path";import ye from"fs-extra";import{log as Te,outro as gt}from"@clack/prompts";import{intro as Ne}from"@clack/prompts";import J from"chalk";var ve=` _ _ _
3
3
  \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 (_) | | | |
4
4
  \u2588 \u2588\u2588\u2588\u2588 _ _ __ ___| |_ __ _ _ _ _| |_
5
5
  \u2588 \u2588\u2588\u2588\u2588 | | '_ \\/ __| __/ _\\\`| '_ \\| __|
6
6
  \u2588 \u2588\u2588\u2588\u2588 | | | | \\__ \\ || (_| | | | | |_
7
- \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 |_|_| |_|___/\\__\\__,_|_| |_|\\__|`,Y=()=>{ve(`
8
- `+Ne.split(`
7
+ \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 |_|_| |_|___/\\__\\__,_|_| |_|\\__|`,Y=()=>{Ne(`
8
+ `+ve.split(`
9
9
  `).map(e=>`${J.gray("\u2502")}${J.hex("#EA580D").bold(" "+e)}`).join(`
10
- `))};import f from"path";import g from"fs-extra";import Se from"degit";import b from"chalk";var x=()=>{let e=process.env.npm_config_user_agent;return e?e.startsWith("yarn")?"yarn":e.startsWith("pnpm")?"pnpm":e.startsWith("bun")?"bun":"npm":"npm"};import{renderUnwrap as Ce,UI as h}from"instant-cli/ui";import Ee from"slugify";import Oe from"ignore";var K=async(e,t)=>{let n=f.resolve(process.cwd(),t);if(g.existsSync(n))if(g.readdirSync(n).length===0)h.log(`${b.cyan.bold(e.appName)} exists but is empty, continuing...`,h.ciaModifier(null));else{let i=await Ce(new h.Select({promptText:b.redBright(`${b.bold("Warning:")} ${b.bold(e.appName)} already exists and isn't empty. How would you like to proceed?`),options:[{label:"Abort installation",value:"abort"},{label:"Clear the directory and continue installation",value:"clear"}],defaultValue:"abort",modifyOutput:h.ciaModifier()}));i==="abort"&&(h.log("Aborting installation..."),process.exit(1)),i==="clear"&&g.emptyDirSync(n)}if(await $e({projectDir:n,baseTemplateName:e.base}),g.pathExistsSync(f.join(n,"pnpm-lock.yaml"))&&g.removeSync(f.join(n,"pnpm-lock.yaml")),x()==="pnpm"&&e.base==="expo"&&g.appendFile(f.join(n,".npmrc"),`node-linker=hoisted
11
- enable-pre-post-scripts=true`),e.base==="expo"){let i=Ee.default(t);R(f.join(n,"app.json"),'"name": "expo-template"',`"name": "${t}"`),R(f.join(n,"app.json"),'"slug": "expo-template"',`"slug": "${i}"`),R(f.join(n,"app/_layout.tsx"),'"My Instant App"',`"${t}"`)}let o=e.appName==="."?"App":b.hex("#EA570B").bold(e.appName);return h.log(b.dim(`${o} scaffolded successfully!`),h.ciaModifier(null)),n},R=(e,t,n)=>{let i=g.readFileSync(e,"utf8").replaceAll(t,n);g.writeFileSync(e,i)},je=async({projectDir:e,baseTemplateName:t})=>{let n=`instantdb/instant/examples/${t}`;await Se(n).clone(e)};async function Me(e,t){let n=f.join(e,".gitignore"),o=Oe();o.add(".git");try{let i=await g.readFile(n,"utf8");o.add(i)}catch{}await g.copy(e,t,{filter:i=>{let a=f.relative(e,i);return a===""?!0:!o.ignores(a)}})}var $e=async({projectDir:e,baseTemplateName:t})=>{if(process.env.INSTANT_CLI_DEV&&process.env.INSTANT_REPO_FOLDER){let n=f.join(process.env.INSTANT_REPO_FOLDER,"examples",t);await Me(n,e);return}process.env.INSTANT_CLI_DEV&&h.log(b.bold.yellowBright(`WARNING: INSTANT_CLI_DEV is TRUE but no INSTANT_REPO_FOLDER is set.
12
- Using git to clone from main...`),h.ciaModifier(null)),await je({projectDir:e,baseTemplateName:t})};import{execa as Fe}from"execa";import{renderUnwrap as Re,UI as E}from"instant-cli/ui";var X=async(e,t)=>{let n=Fe(e,["install"],{cwd:t}),o=await Re(new E.Spinner({promise:n,workingText:`Installing dependencies with ${e}...`,doneText:"Successfully installed dependencies!",modifyOutput:E.ciaModifier(null)}));o.exitCode!==0&&(E.log(o.stderr,E.ciaModifier(null)),process.exit(1))};import ht from"chalk";import y from"fs-extra";import c from"path";import q from"path";import{fileURLToPath as Ge}from"url";var De=Ge(import.meta.url),Be=q.dirname(De),k=q.join(Be,"../");var Z=({projectDir:e,ruleFilesToAdd:t})=>{if(t!==null)switch(t){case"cursor":y.ensureDirSync(c.join(e,".cursor/rules")),y.copyFileSync(c.join(k,"template/rules/cursor-rules.md"),c.join(e,".cursor/rules/instant.mdc"));break;case"claude":y.copyFileSync(c.join(k,"template/rules/AGENTS.md"),c.join(e,"CLAUDE.md"));break;case"codex":y.copyFileSync(c.join(k,"template/rules/AGENTS.md"),c.join(e,"AGENTS.md"));break;case"gemini":y.copyFileSync(c.join(k,"template/rules/AGENTS.md"),c.join(e,"GEMINI.md"));break;case"zed":y.copyFileSync(c.join(k,"template/rules/AGENTS.md"),c.join(e,"AGENTS.md"));break;case"windsurf":y.ensureDirSync(c.join(e,".windsurf/rules")),y.copyFileSync(c.join(k,"template/rules/windsurf-rules.md"),c.join(e,".windsurf/rules/instant.md"));break}};import{execSync as D}from"child_process";import G from"path";import*as te from"@clack/prompts";import Q from"chalk";import{execa as P}from"execa";import ne from"fs-extra";import{renderUnwrap as ee,UI as A}from"instant-cli/ui";var Ue=e=>{try{return D("git --version",{cwd:e}),!0}catch{return!1}},We=e=>ne.existsSync(G.join(e,".git")),Le=async e=>{try{return await P("git",["rev-parse","--is-inside-work-tree"],{cwd:e,stdout:"ignore"}),!0}catch{return!1}},Ve=()=>{let t=D("git --version").toString().trim().split(" ")[2],n=t?.split(".")[0],o=t?.split(".")[1];return{major:Number(n),minor:Number(o)}},ze=()=>D("git config --global init.defaultBranch || echo main").toString().trim(),oe=async e=>{if(!Ue(e)){te.log.warn("Git is not installed. Skipping Git initialization.");return}let t=We(e),n=await Le(e),o=G.parse(e).name;if(n&&t){if(!await ee(new A.Confirmation({promptText:`${Q.redBright.bold("Warning:")} Git is already initialized in "${o}". Initializing a new git repository would delete the previous history. Would you like to continue anyways?`,defaultValue:!1,modifyOutput:A.ciaModifier()})))return;ne.removeSync(G.join(e,".git"))}else if(n&&!t&&!await ee(new A.Confirmation({promptText:`${Q.redBright.bold("Warning:")} "${o}" is already in a git worktree.
10
+ `))};import f from"path";import g from"fs-extra";import Se from"degit";import b from"chalk";var k=()=>{let e=process.env.npm_config_user_agent;return e?e.startsWith("yarn")?"yarn":e.startsWith("pnpm")?"pnpm":e.startsWith("bun")?"bun":"npm":"npm"};import{renderUnwrap as Ce,UI as h}from"instant-cli/ui";import Ee from"slugify";import Oe from"ignore";var K=async(e,t)=>{let n=f.resolve(process.cwd(),t);if(g.existsSync(n))if(g.readdirSync(n).length===0)h.log(`${b.cyan.bold(e.appName)} exists but is empty, continuing...`,h.ciaModifier(null));else{let a=await Ce(new h.Select({promptText:b.redBright(`${b.bold("Warning:")} ${b.bold(e.appName)} already exists and isn't empty. How would you like to proceed?`),options:[{label:"Abort installation",value:"abort"},{label:"Clear the directory and continue installation",value:"clear"}],defaultValue:"abort",modifyOutput:h.ciaModifier()}));a==="abort"&&(h.log("Aborting installation..."),process.exit(1)),a==="clear"&&g.emptyDirSync(n)}if(await $e({projectDir:n,baseTemplateName:e.base}),g.pathExistsSync(f.join(n,"pnpm-lock.yaml"))&&g.removeSync(f.join(n,"pnpm-lock.yaml")),k()==="pnpm"&&e.base==="expo"&&g.appendFile(f.join(n,".npmrc"),`node-linker=hoisted
11
+ enable-pre-post-scripts=true`),e.base==="expo"){let a=Ee.default(t);R(f.join(n,"app.json"),'"name": "expo-template"',`"name": "${t}"`),R(f.join(n,"app.json"),'"slug": "expo-template"',`"slug": "${a}"`),R(f.join(n,"app/_layout.tsx"),'"My Instant App"',`"${t}"`)}let o=e.appName==="."?"App":b.hex("#EA570B").bold(e.appName);return h.log(b.dim(`${o} scaffolded successfully!`),h.ciaModifier(null)),n},R=(e,t,n)=>{let a=g.readFileSync(e,"utf8").replaceAll(t,n);g.writeFileSync(e,a)},je=async({projectDir:e,baseTemplateName:t})=>{let n=`instantdb/instant/examples/${t}`;await Se(n).clone(e)};async function Me(e,t){let n=f.join(e,".gitignore"),o=Oe();o.add(".git");try{let a=await g.readFile(n,"utf8");o.add(a)}catch{}await g.copy(e,t,{filter:a=>{let i=f.relative(e,a);return i===""?!0:!o.ignores(i)}})}var $e=async({projectDir:e,baseTemplateName:t})=>{if(process.env.INSTANT_CLI_DEV&&process.env.INSTANT_REPO_FOLDER){let n=f.join(process.env.INSTANT_REPO_FOLDER,"examples",t);await Me(n,e);return}process.env.INSTANT_CLI_DEV&&h.log(b.bold.yellowBright(`WARNING: INSTANT_CLI_DEV is TRUE but no INSTANT_REPO_FOLDER is set.
12
+ Using git to clone from main...`),h.ciaModifier(null)),await je({projectDir:e,baseTemplateName:t})};import{execa as Fe}from"execa";import{renderUnwrap as Re,UI as E}from"instant-cli/ui";var X=async(e,t)=>{let n=Fe(e,["install"],{cwd:t}),o=await Re(new E.Spinner({promise:n,workingText:`Installing dependencies with ${e}...`,doneText:"Successfully installed dependencies!",modifyOutput:E.ciaModifier(null)}));o.exitCode!==0&&(E.log(o.stderr,E.ciaModifier(null)),process.exit(1))};import ht from"chalk";import y from"fs-extra";import c from"path";import q from"path";import{fileURLToPath as Ge}from"url";var De=Ge(import.meta.url),Be=q.dirname(De),x=q.join(Be,"../");var Z=({projectDir:e,ruleFilesToAdd:t})=>{if(t!==null)switch(t){case"cursor":y.ensureDirSync(c.join(e,".cursor/rules")),y.copyFileSync(c.join(x,"template/rules/cursor-rules.md"),c.join(e,".cursor/rules/instant.mdc"));break;case"claude":y.copyFileSync(c.join(x,"template/rules/AGENTS.md"),c.join(e,"CLAUDE.md"));break;case"codex":y.copyFileSync(c.join(x,"template/rules/AGENTS.md"),c.join(e,"AGENTS.md"));break;case"gemini":y.copyFileSync(c.join(x,"template/rules/AGENTS.md"),c.join(e,"GEMINI.md"));break;case"zed":y.copyFileSync(c.join(x,"template/rules/AGENTS.md"),c.join(e,"AGENTS.md"));break;case"windsurf":y.ensureDirSync(c.join(e,".windsurf/rules")),y.copyFileSync(c.join(x,"template/rules/windsurf-rules.md"),c.join(e,".windsurf/rules/instant.md"));break}};import{execSync as D}from"child_process";import G from"path";import*as te from"@clack/prompts";import Q from"chalk";import{execa as P}from"execa";import ne from"fs-extra";import{renderUnwrap as ee,UI as A}from"instant-cli/ui";var Ue=e=>{try{return D("git --version",{cwd:e}),!0}catch{return!1}},We=e=>ne.existsSync(G.join(e,".git")),Le=async e=>{try{return await P("git",["rev-parse","--is-inside-work-tree"],{cwd:e,stdout:"ignore"}),!0}catch{return!1}},Ve=()=>{let t=D("git --version").toString().trim().split(" ")[2],n=t?.split(".")[0],o=t?.split(".")[1];return{major:Number(n),minor:Number(o)}},ze=()=>D("git config --global init.defaultBranch || echo main").toString().trim(),oe=async e=>{if(!Ue(e)){te.log.warn("Git is not installed. Skipping Git initialization.");return}let t=We(e),n=await Le(e),o=G.parse(e).name;if(n&&t){if(!await ee(new A.Confirmation({promptText:`${Q.redBright.bold("Warning:")} Git is already initialized in "${o}". Initializing a new git repository would delete the previous history. Would you like to continue anyways?`,defaultValue:!1,modifyOutput:A.ciaModifier()})))return;ne.removeSync(G.join(e,".git"))}else if(n&&!t&&!await ee(new A.Confirmation({promptText:`${Q.redBright.bold("Warning:")} "${o}" is already in a git worktree.
13
13
  Would you still like to initialize a new git repository in this directory?
14
- `,defaultValue:!1,modifyOutput:A.ciaModifier()})))return;try{let i=ze(),{major:a,minor:r}=Ve();a<2||a==2&&r<28?(await P("git",["init"],{cwd:e}),await P("git",["symbolic-ref","HEAD",`refs/heads/${i}`],{cwd:e})):await P("git",["init",`--initial-branch=${i}`],{cwd:e}),await P("git",["add","."],{cwd:e}),await P("git",["commit","-m","Initial commit (create-instant-app)"],{cwd:e}),A.log("Git repository initialized successfully.",A.ciaModifier(null))}catch{}};import Je from"env-paths";import*as Ye from"@clack/prompts";import{mkdir as Ke,readFile as Xe,writeFile as qe}from"node:fs/promises";import Ze from"open";import{join as Qe}from"node:path";import{randomUUID as ae}from"node:crypto";import{version as He}from"@instantdb/version";var re=!!process.env.INSTANT_CLI_DEV,ie=re?"http://localhost:3000":"https://instantdb.com",B=process.env.INSTANT_CLI_API_URI||(re?"http://localhost:8888":"https://api.instantdb.com");async function T({path:e,body:t,method:n="GET",authToken:o,metadata:i}){let r={"Content-Type":"application/json","X-Instant-Source":"create-instant-app","X-Instant-Version":He,"X-Instant-Command":"create"};o&&(r.Authorization=`Bearer ${o}`),i&&(r["X-Instant-Metadata"]=JSON.stringify(i));let p=await fetch(`${B}${e}`,{method:n??"GET",headers:r,body:t?JSON.stringify(t):void 0,signal:AbortSignal.timeout(3e5)}),s;try{s=await p.json()}catch{s=null}if(!p.ok){let u=s.message||s.hint?.errors?.[0]?.message||"There was an error";throw new Error(u)}return s}import{renderUnwrap as O,UI as d}from"instant-cli/ui";var et=!!process.env.INSTANT_CLI_DEV,tt=!!process.env.INSTANT_CLI_FORCE_EPHEMERAL;function pe(){let e=`instantdb-${et?"dev":"prod"}`,{config:t}=Je(e);return{authConfigFilePath:Qe(t,"a"),appConfigDirPath:t}}var nt=async(e,t,n,o)=>{let i=ae(),a=ae();return await T({method:"POST",authToken:t,path:"/dash/apps",body:{id:i,title:e,admin_token:a,org_id:n},metadata:o}),{appID:i,adminToken:a,source:"created"}},U=(e,t,n)=>{T({method:"POST",path:`/dash/apps/${e}/track-import`,authToken:t,metadata:n}).catch(()=>{})},le=async e=>await T({method:"GET",path:"/dash",authToken:e}),ce=async(e,t)=>await T({method:"GET",path:`/dash/orgs/${t}`,authToken:e});var ot=async(e,t)=>{try{let n=await le(e),o=n.apps.find(i=>i.id===t);if(o)return{appId:o.id,adminToken:o.admin_token};for(let i of n.orgs){let{apps:a}=await ce(e,i.id),r=a.find(p=>p.id===t);if(r)return{appId:r.id,adminToken:r.admin_token}}return null}catch{return null}},rt=async(e,t)=>{try{return await T({method:"GET",path:`/dash/apps/${e}/schema/pull`,authToken:t}),!0}catch{return!1}},it=async()=>tt?null:process.env.INSTANT_CLI_AUTH_TOKEN?process.env.INSTANT_CLI_AUTH_TOKEN:await Xe(pe().authConfigFilePath,"utf-8").catch(()=>null),se=async(e,t)=>{let n=await T({authToken:null,method:"POST",path:"/dash/apps/ephemeral",body:{title:e,rules:{$users:{view:"true"},$files:{allow:{view:"true",create:"true",delete:"true"}}}},metadata:t});return{appId:n.app.id,adminToken:n.app["admin-token"]}},de=async(e,t)=>{let n=await it();if(e?.app){if(e.token){if(!await rt(e.app,e.token))throw new Error("Invalid app ID and token combination. Please verify both the app ID and token are correct.");return d.log(`Linking to app: ${e.app}`,d.ciaModifier(null)),U(e.app,e.token,t),{appId:e.app,adminToken:e.token,approach:"import"}}if(n){let r=await ot(n,e.app);if(!r)throw new Error(`You don't have access to app "${e.app}". Please check the app ID or use --token to provide a token.`);return d.log(`Linking to app: ${e.app}`,d.ciaModifier(null)),U(r.appId,n,t),{appId:r.appId,adminToken:r.adminToken,approach:"import"}}throw new Error(`You must be logged in or provide --token when using --app. Either run 'npx instant-cli login' first, or use: --app ${e.app} --token <token>`)}if(!n){let r=await O(new d.Select({promptText:"You are not logged in.",options:[{label:"Login to your Instant account",value:"login"},{label:"Create a temporary app",value:"ephemeral"},{label:"Create an app later",value:"skip"}],modifyOutput:d.ciaModifier()}));if(r==="login"){let p=await T({authToken:null,method:"POST",path:"/dash/cli/auth/register"}).catch(xe=>{throw new Error("Failed to register",{cause:xe})}),{secret:s,ticket:u}=p;Ze(`${ie}/dash?ticket=${u}`);let _=st({secret:s}),w=await O(new d.Spinner({promise:_,workingText:"Waiting for login in browser",disappearWhenDone:!0,modifyOutput:d.ciaModifier(null)}));await pt(w.token),n=w.token}if(r==="skip")return d.log("Skipping app link step",d.ciaModifier(null)),null;if(r==="ephemeral"){let p=await O(new d.TextInput({defaultValue:"my-cool-app",prompt:"Enter a name for your temporary app:",placeholder:"my-cool-app",modifyOutput:d.ciaModifier()}));return{...await se(p,t),approach:"ephemeral"}}}if(!n)return null;let o=await le(n).catch(r=>{throw new Error("Failed to fetch dashboard",{cause:r})}),i=o.orgs.filter(r=>r.role!=="app-member");o.orgs=i;let a=await O(new d.AppSelector({startingMenuIndex:0,allowCreate:!0,allowEphemeral:!0,api:{getDash(){return o},createEphemeralApp(r){return se(r,t)},getAppsForOrg:async r=>{let{apps:p}=await ce(n,r);return{apps:p}},createApp:async(r,p)=>{let{appID:s,adminToken:u}=await nt(r,n,p,t);return{appId:s,adminToken:u}}},modifyOutput:d.ciaModifier()}));return a?.approach==="import"&&U(a.appId,n,t),a};function at(e){return new Promise(t=>setTimeout(t,e))}async function st({secret:e}){for(let t=1;t<=120;t++){await at(1e3);let n=await fetch(`${B}/dash/cli/auth/check`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({secret:e})});if(!(!n.ok&&(await n.json()).hint.errors?.[0]?.issue==="waiting-for-user")&&n.ok)return n.json()}throw new Error("Timed out waiting for login")}async function pt(e){let t=pe();return await Ke(t.appConfigDirPath,{recursive:!0}),qe(t.authConfigFilePath,e,"utf-8")}import lt from"fs-extra";import ct from"path";var dt={"next-js-app-dir":"NEXT_PUBLIC_INSTANT_APP_ID","vite-vanilla":"VITE_INSTANT_APP_ID",expo:"EXPO_PUBLIC_INSTANT_APP_ID"},ue=(e,t,n,o)=>{let i=ct.join(t,".env"),r=`${dt[e.base]}=${n}
15
- INSTANT_APP_ADMIN_TOKEN=${o}`;lt.writeFileSync(i,r)};import{stdin as I,stdout as me}from"process";import{setRawModeWindowsFriendly as fe}from"instant-cli/ui";async function ut(){return new Promise(e=>{if(!me.isTTY||!I.isTTY){e(null);return}let t=I.isRaw;t||fe(I,!0);let n=setTimeout(()=>{i(),e(null)},100),o="",i=()=>{clearTimeout(n),I.removeListener("data",a),!t&&I.isTTY&&fe(I,!1)},a=r=>{let p=r.toString();o+=p;let s=o.match(/\x1b\]11;rgb:([0-9a-fA-F]+)\/([0-9a-fA-F]+)\/([0-9a-fA-F]+)(?:\x1b\\|\x07)/);if(s){i();let[,u,_,w]=s;e(`rgb:${u}/${_}/${w}`)}};I.on("data",a),me.write("\x1B]11;?\x1B\\")})}function mt(e){let t=e.match(/rgb:([0-9a-fA-F]+)\/([0-9a-fA-F]+)\/([0-9a-fA-F]+)/);if(!t)return null;let[,n,o,i]=t,a=Math.round(parseInt(n,16)/257),r=Math.round(parseInt(o,16)/257),p=Math.round(parseInt(i,16)/257);return{r:a,g:r,b:p}}function ft(e){return(.299*e.r+.587*e.g+.114*e.b)/255>.5}async function ge(){try{let e=await ut();if(!e)return"unknown";let t=mt(e);return t?ft(t)?"light":"dark":"unknown"}catch(e){return console.error("Error detecting terminal theme:",e),"unknown"}}import S from"chalk";var v=(e,t)=>e==="light"?S.bgYellowBright(t):S.bgBlackBright(t),he=(e,t=console.log,n=!1)=>{let o=(process.stdout.columns||80)-4,i=e.split(`
16
- `),a=!0;i.forEach(r=>{if(r.length===0){a?(t(""),a=!1):console.log(S.gray("\u2502"));return}for(let p=0;p<r.length;p+=o){let s=r.slice(p,p+o);p+o<r.length&&s.length===o&&(s=s+"-"),a?(t(s),a=!1):console.log(S.gray("\u2502 ")+s)}}),n&&console.log(S.gray("\u2502"))};var j="\x1B[?25h";import{execa as wt}from"execa";var yt=async()=>{process.argv.some(w=>["-h","--help","--version","-V"].includes(w))||Y();let e=await ge(),{project:t,appFlags:n}=await H(),[o,i]=z(t.appName),a=x(),r=await K(t,i);Z({projectDir:r,ruleFilesToAdd:t.ruleFiles});let p={template:t.base,aiTool:t.ruleFiles??"none",usedAiPrompt:!!t.prompt},s=await de(n,p);s&&ue(t,r,s.appId,s.adminToken);let u=ye.readJSONSync(we.join(r,"package.json"));if(u.name=o,u.packageManager&&delete u.packageManager,a!=="bun"){let{stdout:w}=await wt(a,["-v"],{cwd:r});u.packageManager=`${a}@${w.trim()}`}ye.writeJSONSync(we.join(r,"package.json"),u,{spaces:2}),await X(x(),r),t.createRepo&&await oe(r),t.prompt&&(await W(t.prompt,r),process.stdout.write(j)),gt("Done!");let _=t.base==="expo"?"start":"dev";s?(console.log(`
14
+ `,defaultValue:!1,modifyOutput:A.ciaModifier()})))return;try{let a=ze(),{major:i,minor:r}=Ve();i<2||i==2&&r<28?(await P("git",["init"],{cwd:e}),await P("git",["symbolic-ref","HEAD",`refs/heads/${a}`],{cwd:e})):await P("git",["init",`--initial-branch=${a}`],{cwd:e}),await P("git",["add","."],{cwd:e}),await P("git",["commit","-m","Initial commit (create-instant-app)"],{cwd:e}),A.log("Git repository initialized successfully.",A.ciaModifier(null))}catch{}};import Je from"env-paths";import*as Ye from"@clack/prompts";import{mkdir as Ke,readFile as Xe,writeFile as qe}from"node:fs/promises";import Ze from"open";import{join as Qe}from"node:path";import{randomUUID as ie}from"node:crypto";import{version as He}from"@instantdb/version";var re=!!process.env.INSTANT_CLI_DEV,ae=re?"http://localhost:3000":"https://instantdb.com",B=process.env.INSTANT_CLI_API_URI||(re?"http://localhost:8888":"https://api.instantdb.com");async function T({path:e,body:t,method:n="GET",authToken:o,metadata:a}){let r={"Content-Type":"application/json","X-Instant-Source":"create-instant-app","X-Instant-Version":He,"X-Instant-Command":"create"};o&&(r.Authorization=`Bearer ${o}`),a&&(r["X-Instant-Metadata"]=JSON.stringify(a));let p=await fetch(`${B}${e}`,{method:n??"GET",headers:r,body:t?JSON.stringify(t):void 0,signal:AbortSignal.timeout(3e5)}),s;try{s=await p.json()}catch{s=null}if(!p.ok){let u=s.message||s.hint?.errors?.[0]?.message||"There was an error";throw new Error(u)}return s}import{renderUnwrap as O,UI as d}from"instant-cli/ui";var et=!!process.env.INSTANT_CLI_DEV,tt=!!process.env.INSTANT_CLI_FORCE_EPHEMERAL;function pe(){let e=`instantdb-${et?"dev":"prod"}`,{config:t}=Je(e);return{authConfigFilePath:Qe(t,"a"),appConfigDirPath:t}}var nt=async(e,t,n,o)=>{let a=ie(),i=ie();return await T({method:"POST",authToken:t,path:"/dash/apps",body:{id:a,title:e,admin_token:i,org_id:n},metadata:o}),{appID:a,adminToken:i,source:"created"}},U=(e,t,n)=>{T({method:"POST",path:`/dash/apps/${e}/track-import`,authToken:t,metadata:n}).catch(()=>{})},le=async e=>await T({method:"GET",path:"/dash",authToken:e}),ce=async(e,t)=>await T({method:"GET",path:`/dash/orgs/${t}`,authToken:e});var ot=async(e,t)=>{try{let n=await le(e),o=n.apps.find(a=>a.id===t);if(o)return{appId:o.id,adminToken:o.admin_token};for(let a of n.orgs){let{apps:i}=await ce(e,a.id),r=i.find(p=>p.id===t);if(r)return{appId:r.id,adminToken:r.admin_token}}return null}catch{return null}},rt=async(e,t)=>{try{return await T({method:"GET",path:`/dash/apps/${e}/schema/pull`,authToken:t}),!0}catch{return!1}},at=async()=>tt?null:process.env.INSTANT_CLI_AUTH_TOKEN?process.env.INSTANT_CLI_AUTH_TOKEN:await Xe(pe().authConfigFilePath,"utf-8").catch(()=>null),se=async(e,t)=>{let n=await T({authToken:null,method:"POST",path:"/dash/apps/ephemeral",body:{title:e,rules:{$users:{view:"true"},$files:{allow:{view:"true",create:"true",delete:"true"}}}},metadata:t});return{appId:n.app.id,adminToken:n.app["admin-token"]}},de=async(e,t)=>{let n=await at();if(e?.app){if(e.token){if(!await rt(e.app,e.token))throw new Error("Invalid app ID and token combination. Please verify both the app ID and token are correct.");return d.log(`Linking to app: ${e.app}`,d.ciaModifier(null)),U(e.app,e.token,t),{appId:e.app,adminToken:e.token,approach:"import"}}if(n){let r=await ot(n,e.app);if(!r)throw new Error(`You don't have access to app "${e.app}". Please check the app ID or use --token to provide a token.`);return d.log(`Linking to app: ${e.app}`,d.ciaModifier(null)),U(r.appId,n,t),{appId:r.appId,adminToken:r.adminToken,approach:"import"}}throw new Error(`You must be logged in or provide --token when using --app. Either run 'npx instant-cli login' first, or use: --app ${e.app} --token <token>`)}if(!n){let r=await O(new d.Select({promptText:"You are not logged in.",options:[{label:"Login to your Instant account",value:"login"},{label:"Create a temporary app",value:"ephemeral"},{label:"Create an app later",value:"skip"}],modifyOutput:d.ciaModifier()}));if(r==="login"){let p=await T({authToken:null,method:"POST",path:"/dash/cli/auth/register"}).catch(ke=>{throw new Error("Failed to register",{cause:ke})}),{secret:s,ticket:u}=p;Ze(`${ae}/dash?ticket=${u}`);let _=st({secret:s}),w=await O(new d.Spinner({promise:_,workingText:"Waiting for login in browser",disappearWhenDone:!0,modifyOutput:d.ciaModifier(null)}));await pt(w.token),n=w.token}if(r==="skip")return d.log("Skipping app link step",d.ciaModifier(null)),null;if(r==="ephemeral"){let p=await O(new d.TextInput({defaultValue:"my-cool-app",prompt:"Enter a name for your temporary app:",placeholder:"my-cool-app",modifyOutput:d.ciaModifier()}));return{...await se(p,t),approach:"ephemeral"}}}if(!n)return null;let o=await le(n).catch(r=>{throw new Error("Failed to fetch dashboard",{cause:r})}),a=o.orgs.filter(r=>r.role!=="app-member");o.orgs=a;let i=await O(new d.AppSelector({startingMenuIndex:0,allowCreate:!0,allowEphemeral:!0,api:{getDash(){return o},createEphemeralApp(r){return se(r,t)},getAppsForOrg:async r=>{let{apps:p}=await ce(n,r);return{apps:p}},createApp:async(r,p)=>{let{appID:s,adminToken:u}=await nt(r,n,p,t);return{appId:s,adminToken:u}}},modifyOutput:d.ciaModifier()}));return i?.approach==="import"&&U(i.appId,n,t),i};function it(e){return new Promise(t=>setTimeout(t,e))}async function st({secret:e}){for(let t=1;t<=120;t++){await it(1e3);let n=await fetch(`${B}/dash/cli/auth/check`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({secret:e})});if(!(!n.ok&&(await n.json()).hint.errors?.[0]?.issue==="waiting-for-user")&&n.ok)return n.json()}throw new Error("Timed out waiting for login")}async function pt(e){let t=pe();return await Ke(t.appConfigDirPath,{recursive:!0}),qe(t.authConfigFilePath,e,"utf-8")}import lt from"fs-extra";import ct from"path";var dt={"next-js-app-dir":"NEXT_PUBLIC_INSTANT_APP_ID","vite-vanilla":"VITE_INSTANT_APP_ID",expo:"EXPO_PUBLIC_INSTANT_APP_ID","tanstack-start":"VITE_INSTANT_APP_ID","tanstack-start-full":"VITE_INSTANT_APP_ID"},ue=(e,t,n,o)=>{let a=ct.join(t,".env"),r=`${dt[e.base]}=${n}
15
+ INSTANT_APP_ADMIN_TOKEN=${o}`;lt.writeFileSync(a,r)};import{stdin as I,stdout as me}from"process";import{setRawModeWindowsFriendly as fe}from"instant-cli/ui";async function ut(){return new Promise(e=>{if(!me.isTTY||!I.isTTY){e(null);return}let t=I.isRaw;t||fe(I,!0);let n=setTimeout(()=>{a(),e(null)},100),o="",a=()=>{clearTimeout(n),I.removeListener("data",i),!t&&I.isTTY&&fe(I,!1)},i=r=>{let p=r.toString();o+=p;let s=o.match(/\x1b\]11;rgb:([0-9a-fA-F]+)\/([0-9a-fA-F]+)\/([0-9a-fA-F]+)(?:\x1b\\|\x07)/);if(s){a();let[,u,_,w]=s;e(`rgb:${u}/${_}/${w}`)}};I.on("data",i),me.write("\x1B]11;?\x1B\\")})}function mt(e){let t=e.match(/rgb:([0-9a-fA-F]+)\/([0-9a-fA-F]+)\/([0-9a-fA-F]+)/);if(!t)return null;let[,n,o,a]=t,i=Math.round(parseInt(n,16)/257),r=Math.round(parseInt(o,16)/257),p=Math.round(parseInt(a,16)/257);return{r:i,g:r,b:p}}function ft(e){return(.299*e.r+.587*e.g+.114*e.b)/255>.5}async function ge(){try{let e=await ut();if(!e)return"unknown";let t=mt(e);return t?ft(t)?"light":"dark":"unknown"}catch(e){return console.error("Error detecting terminal theme:",e),"unknown"}}import S from"chalk";var N=(e,t)=>e==="light"?S.bgYellowBright(t):S.bgBlackBright(t),he=(e,t=console.log,n=!1)=>{let o=(process.stdout.columns||80)-4,a=e.split(`
16
+ `),i=!0;a.forEach(r=>{if(r.length===0){i?(t(""),i=!1):console.log(S.gray("\u2502"));return}for(let p=0;p<r.length;p+=o){let s=r.slice(p,p+o);p+o<r.length&&s.length===o&&(s=s+"-"),i?(t(s),i=!1):console.log(S.gray("\u2502 ")+s)}}),n&&console.log(S.gray("\u2502"))};var j="\x1B[?25h";import{execa as wt}from"execa";var yt=async()=>{process.argv.some(w=>["-h","--help","--version","-V"].includes(w))||Y();let e=await ge(),{project:t,appFlags:n}=await H(),[o,a]=z(t.appName),i=k(),r=await K(t,a);Z({projectDir:r,ruleFilesToAdd:t.ruleFiles});let p={template:t.base,aiTool:t.ruleFiles??"none",usedAiPrompt:!!t.prompt},s=await de(n,p);s&&ue(t,r,s.appId,s.adminToken);let u=ye.readJSONSync(we.join(r,"package.json"));if(u.name=o,u.packageManager&&delete u.packageManager,i!=="bun"){let{stdout:w}=await wt(i,["-v"],{cwd:r});u.packageManager=`${i}@${w.trim()}`}ye.writeJSONSync(we.join(r,"package.json"),u,{spaces:2}),await X(k(),r),t.createRepo&&await oe(r),t.prompt&&(await W(t.prompt,r),process.stdout.write(j)),gt("Done!");let _=t.base==="expo"?"start":"dev";s?(console.log(`
17
17
  \u{1F389} Success! Your project is ready to go!
18
18
 
19
19
  To get started:
20
- 1. ${v(e,"cd "+i)}
21
- 2. ${v(e,x()+" run "+_)}
20
+ 1. ${N(e,"cd "+a)}
21
+ 2. ${N(e,k()+" run "+_)}
22
22
  `),s.approach==="ephemeral"&&console.log(`
23
23
  An ephemeral app has been created and added to your .env file.
24
- It will expire in two weeks. For a permanent app, sign in and use ${v(e,"npx instant-cli claim")}
24
+ It will expire in two weeks. For a permanent app, sign in and use ${N(e,"npx instant-cli claim")}
25
25
  `)):console.log(`
26
26
  \u{1F389} Success! Your project is ready to go!
27
27
 
28
28
  To get started:
29
- 1. ${v(e,"cd "+i)}
29
+ 1. ${N(e,"cd "+a)}
30
30
  2. Create a new app on ${ht.underline("www.instantdb.com")}
31
31
  3. Add your APP_ID to the .env file
32
- 4. ${v(e,x()+" run "+_)}
32
+ 4. ${N(e,k()+" run "+_)}
33
33
  `)};yt().catch(e=>{Te.error("Aborting installation..."),he(e.message,Te.error),process.stdout.write(j),process.exit(1)});process.on("SIGINT",()=>{process.stdout.write(j),process.exit(0)});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-instant-app",
3
- "version": "0.22.120-experimental.drewh-admin-db-warn.21600986993.1",
3
+ "version": "0.22.120-experimental.drewh-tanstack-start.21601761390.1",
4
4
  "description": "Scaffold a new web/mobile app with InstantDB",
5
5
  "homepage": "https://github.com/instantdb/instant/tree/main/client/packages/create-instant-app",
6
6
  "repository": {
@@ -35,8 +35,8 @@
35
35
  "ora": "6.3.1",
36
36
  "slugify": "^1.6.6",
37
37
  "sort-package-json": "^2.10.0",
38
- "instant-cli": "0.22.120-experimental.drewh-admin-db-warn.21600986993.1",
39
- "@instantdb/version": "0.22.120-experimental.drewh-admin-db-warn.21600986993.1"
38
+ "@instantdb/version": "0.22.120-experimental.drewh-tanstack-start.21601761390.1",
39
+ "instant-cli": "0.22.120-experimental.drewh-tanstack-start.21601761390.1"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@anthropic-ai/sdk": "^0.60.0",