create-vibe-stack 0.1.6 → 0.1.8

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 +4 -2
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,9 +1,11 @@
1
1
  #!/usr/bin/env node
2
- import{Command as F}from"commander";import r from"path";import i from"fs-extra";import B from"tiged";import u from"ora";import{input as D,select as v,confirm as T}from"@inquirer/prompts";import{execa as g}from"execa";import A from"open";import x from"picocolors";import L from"crypto";import E from"picocolors";var I=()=>{console.log(),console.log(E.cyan(`
2
+ import{Command as V}from"commander";import p from"path";import D from"os";import n from"fs-extra";import F from"tiged";import f from"ora";import{input as R,select as v,confirm as j,password as U}from"@inquirer/prompts";import{execa as c}from"execa";import _ from"open";import x from"picocolors";import B from"crypto";import E from"picocolors";var N=()=>{console.log(),console.log(E.cyan(`
3
3
  \u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557
4
4
  \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2551 \u2588\u2588\u2554\u255D\u2588\u2588\u2551\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D
5
5
  \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551 \u2588\u2588\u2551
6
6
  \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551
7
7
  \u2588\u2588\u2551\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551
8
8
  \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D
9
- `)),console.log(E.dim(" Next.js SaaS Starter Kit CLI")),console.log()};import m from"picocolors";var s={success:t=>console.log(m.green(`\u2714 ${t}`)),error:t=>console.log(m.red(`\u2716 ${t}`)),info:t=>console.log(m.blue(`\u2139 ${t}`)),warn:t=>console.log(m.yellow(`\u26A0 ${t}`))};var $=async t=>{I();let N=process.argv[1]||"",f=["create-indiekit","indie-kit","create-indie-kit","nextjs-saas-starter","create-nextjs-saas-starter","create-nextjs-saas-kit","ai-saas","create-ai-saas","create-indie-project"].find(e=>N.includes(e));f&&(s.info(`You ran '${f}', which is an alias for Indie Kit.`),console.log());let a=t[0];a||(a=await D({message:"Where should we create your new project?",default:"my-saas"}));let o=r.resolve(process.cwd(),a);i.existsSync(o)&&i.readdirSync(o).length>0&&(s.error(`Directory ${a} is not empty.`),process.exit(1));let b=await v({message:"Which version would you like to use?",choices:[{name:"Lite (Open Source) - Free, basic features",value:"lite"},{name:"Pro (Production SaaS) - Payments, Auth, Admin, AI",value:"pro"},{name:"Pro (B2B Multi-tenant) - Organizations, Roles, Invites",value:"b2b"}]}),h="Indie-Kit/nextjs-saas-starter",p=!1,d="";if(b==="pro"?(h="indie-kit/indie-kit",d="https://github.com/indie-kit/indie-kit.git",p=!0):b==="b2b"&&(h="indie-kit/b2b-boilerplate",d="https://github.com/indie-kit/b2b-boilerplate.git",p=!0),p){let e=u("Checking repository access...").start();try{await g("git",["ls-remote",d],{env:{GIT_TERMINAL_PROMPT:"0"}}),e.succeed("Access verified.")}catch{e.fail("Access denied."),s.error("You do not have access to this repository."),s.info("Opening access page..."),await A("https://indiekit.pro/app/repo-access?ref=cli&utm_source=cli&utm_medium=terminal"),process.exit(0)}}let S=u("Downloading template...").start();try{p?(await g("git",["clone","--depth","1",d,o]),await i.remove(r.join(o,".git"))):await B(h,{disableCache:!0,force:!0}).clone(o),S.succeed("Template downloaded successfully.")}catch(e){S.fail("Failed to download template."),s.error(e.message),process.exit(1)}let j=await T({message:"Install dependencies now?",default:!0});if(j){let e=u("Installing dependencies...").start(),n=process.env.npm_config_user_agent||"",y=n.startsWith("yarn")?"yarn":n.startsWith("pnpm")?"pnpm":"npm";try{await g(y,["install"],{cwd:o}),e.succeed("Dependencies installed.")}catch(l){e.fail("Failed to install dependencies."),s.error(l.message)}}if(await T({message:"Initialize .env.local file with fresh secrets?",default:!0})){let e=u("Generating secrets...").start();try{let n=r.join(o,".env.example"),y=r.join(o,".env.local");if(i.existsSync(n)){let l=i.readFileSync(n,"utf-8"),R=L.randomBytes(32).toString("hex");l=l.replace(/BETTER_AUTH_SECRET=.*|NEXTAUTH_SECRET=.*/g,`BETTER_AUTH_SECRET="${R}"`),i.writeFileSync(y,l),e.succeed("Generated .env.local with secure keys.")}else e.warn("No .env.example found, skipping.")}catch{e.fail("Failed to setup .env.local")}}let w=r.join(o,"package.json");if(i.existsSync(w)){let e=i.readJsonSync(w);e.name=r.basename(o),e.version="0.1.0",i.writeJsonSync(w,e,{spaces:2})}s.success(`Project created at ${x.green(o)}`),console.log(),console.log("Next steps:"),console.log(` cd ${a}`),j||console.log(" pnpm install"),console.log(" pnpm dev"),console.log(),console.log(x.yellow('AI Tip: "Open in Cursor/Claude and run /bootstrap"')),console.log(),console.log(`Looking for a co-founder? Join 500+ builders in our Discord: ${x.cyan("https://indiekit.pro/app/discord")}`),console.log();let C=f||"indiekit";if(await v({message:"Want to tweet your new project?",choices:[{name:`Yes (Pre-fills a tweet: "Just started a new Vibe Coding project with npx ${C}! \u{1F680}")`,value:"yes"},{name:"No",value:"no"}]})==="yes"){let e=`Just started a new Vibe Coding project with npx ${C}! \u{1F680}`,n=`https://twitter.com/intent/tweet?text=${encodeURIComponent(e)}`;await A(n)}let c=await v({message:"Open project in which editor?",choices:[{name:"Cursor (Recommended)",value:"cursor"},{name:"Claude (CLI)",value:"claude"},{name:"Antigravity",value:"antigravity"},{name:"Windsurf",value:"windsurf"},{name:"VS Code",value:"code"},{name:"None",value:"none"}]});if(c!=="none")try{await g(c,[o]),s.success(`Opened project in ${c}.`)}catch{s.warn(`Could not open ${c} automatically. Please run "${c} ." manually.`)}};var P={name:"indiekit",version:"0.1.6",description:"The AI-Native Next.js SaaS CLI",private:!1,homepage:"https://indiekit.pro",bugs:{url:"https://indiekit.pro/contact"},repository:{type:"git",url:"git+https://github.com/Indie-Kit/nextjs-saas-starter.git"},keywords:["nextjs","saas","boilerplate","starter","ai","cli"],type:"module",bin:{indiekit:"./dist/index.js"},scripts:{dev:"tsup --watch",build:"tsup",start:"node dist/index.js",release:"bumpp","multi-publish":"tsx scripts/publish-all.ts"},files:["dist"],publishConfig:{access:"public",provenance:!1},dependencies:{"@inquirer/prompts":"^8.2.0",commander:"^14.0.3",execa:"^9.6.1","fs-extra":"^11.3.3",open:"^11.0.0",ora:"^9.3.0",picocolors:"^1.1.1",tiged:"^2.12.7"},devDependencies:{"@types/fs-extra":"^11.0.4","@types/node":"^25.2.2",bumpp:"^10.4.1",handlebars:"^4.7.8",tsup:"^8.5.1",tsx:"^4.21.0",typescript:"^5.9.3"}};var _=()=>P.version;var k=new F;k.name("indiekit").description("CLI to scaffold Next.js SaaS applications").version(_());k.argument("[directory]","Directory to create the project in").action(t=>{$(t?[t]:[])});k.parse(process.argv);
9
+ `)),console.log(E.dim(" Next.js SaaS Starter Kit CLI")),console.log()};import y from"picocolors";var t={success:o=>console.log(y.green(`\u2714 ${o}`)),error:o=>console.log(y.red(`\u2716 ${o}`)),info:o=>console.log(y.blue(`\u2139 ${o}`)),warn:o=>console.log(y.yellow(`\u26A0 ${o}`))};var K=async o=>{N();let H=process.argv[1]||"",b=["create-indiekit","indie-kit","create-indie-kit","nextjs-saas-starter","create-nextjs-saas-starter","create-nextjs-saas-kit","ai-saas","create-ai-saas","create-indie-project"].find(e=>H.includes(e));b&&(t.info(`You ran '${b}', which is an alias for Indie Kit.`),console.log());let d=o[0];d||(d=await R({message:"Where should we create your new project?",default:"my-saas"}));let s=p.resolve(process.cwd(),d);n.existsSync(s)&&n.readdirSync(s).length>0&&(t.error(`Directory ${d} is not empty.`),process.exit(1));let I=await v({message:"Which version would you like to use?",choices:[{name:"Lite (Open Source) - Free, basic features",value:"lite"},{name:"Pro (Production SaaS) - Payments, Auth, Admin, AI",value:"pro"},{name:"Pro (B2B Multi-tenant) - Organizations, Roles, Invites",value:"b2b"}]}),h="Indie-Kit/nextjs-saas-starter",w=!1,u="";if(I==="pro"?(h="Indie-Kit/indie-kit",u="https://github.com/Indie-Kit/indie-kit.git",w=!0):I==="b2b"&&(h="Indie-Kit/b2b-boilerplate",u="https://github.com/Indie-Kit/b2b-boilerplate.git",w=!0),w){let e=`git@github.com:${h}.git`,i=!1;for(;!i;){let l=f("Checking repository access...").start();try{await c("git",["ls-remote",u],{env:{GIT_TERMINAL_PROMPT:"0"}}),l.succeed("Access verified (HTTPS)."),i=!0;continue}catch{}try{await c("git",["ls-remote",e],{env:{GIT_TERMINAL_PROMPT:"0"}}),l.succeed("Access verified (SSH)."),u=e,i=!0;continue}catch{}l.fail("Access denied.");try{let{stdout:r}=await c("git",["config","user.name"],{reject:!1}),{stdout:g}=await c("git",["config","user.email"],{reject:!1});(r||g)&&t.info(`Current Git User: ${r?.trim()||"N/A"} <${g?.trim()||"N/A"}>`)}catch{}t.error("You do not have access to this repository."),console.log(x.gray("Note: If you have a license, make sure your GitHub account is linked on IndieKit.pro"));let a=await v({message:"How would you like to proceed?",choices:[{name:"Login with GitHub Token (To login to your github account)",value:"login"},{name:"Open IndieKit Access Page (To get a license)",value:"open"},{name:"Retry",value:"retry"},{name:"Exit",value:"exit"}]});if(a==="exit")process.exit(0);else if(a==="open")t.info("Opening access page..."),await _("https://indiekit.pro/app/repo-access?ref=cli&utm_source=cli&utm_medium=terminal"),await j({message:"Did you link your account? Retry access check?",default:!0})||process.exit(0);else if(a==="login"){console.log(),t.info("To login, you need a Personal Access Token (classic) with 'repo' scope."),t.info("Generate one here: https://github.com/settings/tokens/new"),console.log();let r=await R({message:"GitHub Username:"}),g=await U({message:"Personal Access Token:"});if(r&&g){let P=f("Saving credentials...").start();try{await c("git",["config","--global","credential.helper","store"]);let S=p.join(D.homedir(),".git-credentials"),O=`https://${r}:${g}@github.com`;await n.appendFile(S,`
10
+ ${O}
11
+ `),P.succeed("Credentials saved globally.")}catch(S){P.fail("Failed to save credentials."),t.error(S.message)}}}}}let C=f("Downloading template...").start();try{w?(await c("git",["clone","--depth","1",u,s]),await n.remove(p.join(s,".git"))):await F(h,{disableCache:!0,force:!0}).clone(s),C.succeed("Template downloaded successfully.")}catch(e){C.fail("Failed to download template."),t.error(e.message),process.exit(1)}let A=await j({message:"Install dependencies now?",default:!0});if(A){let e=f("Installing dependencies...").start(),i=process.env.npm_config_user_agent||"",l=i.startsWith("yarn")?"yarn":i.startsWith("pnpm")?"pnpm":"npm";try{await c(l,["install"],{cwd:s}),e.succeed("Dependencies installed.")}catch(a){e.fail("Failed to install dependencies."),t.error(a.message)}}if(await j({message:"Initialize .env.local file with fresh secrets?",default:!0})){let e=f("Generating secrets...").start();try{let i=p.join(s,".env.example"),l=p.join(s,".env.local");if(n.existsSync(i)){let a=n.readFileSync(i,"utf-8"),r=B.randomBytes(32).toString("hex");a=a.replace(/BETTER_AUTH_SECRET=.*|NEXTAUTH_SECRET=.*/g,`BETTER_AUTH_SECRET="${r}"`),n.writeFileSync(l,a),e.succeed("Generated .env.local with secure keys.")}else e.warn("No .env.example found, skipping.")}catch{e.fail("Failed to setup .env.local")}}let k=p.join(s,"package.json");if(n.existsSync(k)){let e=n.readJsonSync(k);e.name=p.basename(s),e.version="0.1.0",n.writeJsonSync(k,e,{spaces:2})}t.success(`Project created at ${x.green(s)}`),console.log(),console.log("Next steps:"),console.log(` cd ${d}`),A||console.log(" pnpm install"),console.log(" pnpm dev"),console.log(),console.log(x.yellow('AI Tip: "Open in Cursor/Claude and run /bootstrap"')),console.log(),console.log(`Looking for a co-founder? Join 500+ builders in our Discord: ${x.cyan("https://indiekit.pro/app/discord")}`),console.log();let $=b||"indiekit";if(await v({message:"Want to tweet your new project?",choices:[{name:`Yes (Pre-fills a tweet: "Just started a new Vibe Coding project with npx ${$}! \u{1F680}")`,value:"yes"},{name:"No",value:"no"}]})==="yes"){let e=`Just started a new Vibe Coding project with npx ${$}! \u{1F680}`,i=`https://twitter.com/intent/tweet?text=${encodeURIComponent(e)}`;await _(i)}let m=await v({message:"Open project in which editor?",choices:[{name:"Cursor (Recommended)",value:"cursor"},{name:"Claude (CLI)",value:"claude"},{name:"Antigravity",value:"antigravity"},{name:"Windsurf",value:"windsurf"},{name:"VS Code",value:"code"},{name:"None",value:"none"}]});if(m!=="none")try{await c(m,[s]),t.success(`Opened project in ${m}.`)}catch{t.warn(`Could not open ${m} automatically. Please run "${m} ." manually.`)}};var L={name:"indiekit",version:"0.1.8",description:"The AI-Native Next.js SaaS CLI",private:!1,homepage:"https://indiekit.pro",bugs:{url:"https://indiekit.pro/contact"},repository:{type:"git",url:"git+https://github.com/Indie-Kit/nextjs-saas-starter.git"},keywords:["nextjs","saas","boilerplate","starter","ai","cli"],type:"module",bin:{indiekit:"./dist/index.js"},scripts:{dev:"tsup --watch",build:"tsup",start:"node dist/index.js",release:"bumpp","multi-publish":"tsx scripts/publish-all.ts"},files:["dist"],publishConfig:{access:"public",provenance:!1},dependencies:{"@inquirer/prompts":"^8.2.0",commander:"^14.0.3",execa:"^9.6.1","fs-extra":"^11.3.3",open:"^11.0.0",ora:"^9.3.0",picocolors:"^1.1.1",tiged:"^2.12.7"},devDependencies:{"@types/fs-extra":"^11.0.4","@types/node":"^25.2.2",bumpp:"^10.4.1",handlebars:"^4.7.8",tsup:"^8.5.1",tsx:"^4.21.0",typescript:"^5.9.3"}};var G=()=>L.version;var T=new V;T.name("indiekit").description("CLI to scaffold Next.js SaaS applications").version(G());T.argument("[directory]","Directory to create the project in").action(o=>{K(o?[o]:[])});T.parse(process.argv);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-vibe-stack",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "The AI-Native Next.js SaaS CLI",
5
5
  "private": false,
6
6
  "homepage": "https://indiekit.pro",