indiekit 0.1.2 → 0.1.4

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.hbs ADDED
@@ -0,0 +1,55 @@
1
+ # {{packageName}} - The Indie Kit CLI
2
+
3
+ {{#if isAlias}}
4
+ > **Note**: This is an alias for the official **[indiekit](https://www.npmjs.com/package/indiekit)** CLI.
5
+ {{/if}}
6
+
7
+ The official CLI for [Indie Kit](https://indiekit.pro) - The ultimate Next.js SaaS Starter Kit.
8
+
9
+ Scaffold a new production-ready SaaS application in seconds.
10
+
11
+ ## Usage
12
+
13
+ To scaffold a new project, run the following command directly:
14
+
15
+ ```bash
16
+ # ✅ Correct usage
17
+ {{command}}
18
+ ```
19
+
20
+ ## Features
21
+
22
+ - 🚀 **Instant Setup**: Scaffolds a Next.js 14+ project optimized for SaaS.
23
+ - 📦 **Smart Caching**: Uses `tiged` for fast, history-free cloning.
24
+ - 🛠 **Interactive Wizard**: Customized setup for your needs.
25
+ - 💎 **Version Selection**: Choose between the free Open Source version or the Pro Production Suite.
26
+
27
+ ## Versions
28
+
29
+ ### Lite (Open Source)
30
+ Free forever. Includes:
31
+ - Next.js 14 (App Router)
32
+ - Tailwind CSS & Shadcn UI
33
+ - Basic Authentication Setup
34
+ - Marketing Landing Page
35
+
36
+ ### Pro (Production SaaS)
37
+ Everything in Lite, plus:
38
+ - Stripe Payments & Subscriptions
39
+ - Admin Dashboard
40
+ - AI Integration
41
+ - Blog & Documentation Support
42
+ - Email Marketing Integration
43
+
44
+ ### Pro (B2B Multi-tenant)
45
+ Advanced features for B2B applications:
46
+ - Organization/Team Management
47
+ - Member Invites & Roles
48
+ - RBAC (Role-Based Access Control)
49
+ - Enterprise Features
50
+
51
+ [Get Indie Kit Pro](https://indiekit.pro)
52
+
53
+ ## License
54
+
55
+ ISC © [Indie Kit](https://indiekit.pro)
package/README.md CHANGED
@@ -1,4 +1,5 @@
1
- # Indie Kit CLI
1
+ # indiekit - The Indie Kit CLI
2
+
2
3
 
3
4
  The official CLI for [Indie Kit](https://indiekit.pro) - The ultimate Next.js SaaS Starter Kit.
4
5
 
@@ -11,21 +12,6 @@ To scaffold a new project, run the following command directly:
11
12
  ```bash
12
13
  # ✅ Correct usage
13
14
  npx indiekit@latest
14
-
15
- # or
16
- pnpm dlx indiekit@latest
17
-
18
- # or
19
- yarn dlx indiekit@latest
20
- ```
21
-
22
- **Note:** Do NOT use `npm init indiekit` or `pnpm create indiekit`. These commands attempt to run a package named `create-indiekit`, which is not this package. This CLI is named `indiekit` and should be executed directly.
23
-
24
- ```bash
25
- # ❌ Incorrect usage (will fail)
26
- npm init indiekit
27
- pnpm create indiekit
28
- yarn create indiekit
29
15
  ```
30
16
 
31
17
  ## Features
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
- import{Command as O}from"commander";import r from"path";import s from"fs-extra";import _ from"tiged";import u from"ora";import{input as $,select as C,confirm as j}from"@inquirer/prompts";import{execa as g}from"execa";import N from"open";import E from"picocolors";import R from"crypto";import b from"picocolors";var k=()=>{console.log(),console.log(b.cyan(`
2
+ import{Command as F}from"commander";import r from"path";import i from"fs-extra";import N from"tiged";import u from"ora";import{input as R,select as C,confirm as E}from"@inquirer/prompts";import{execa as g}from"execa";import B from"open";import T from"picocolors";import O from"crypto";import S from"picocolors";var j=()=>{console.log(),console.log(S.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(b.dim(" Next.js SaaS Starter Kit CLI")),console.log()};import d from"picocolors";var n={success:t=>console.log(d.green(`\u2714 ${t}`)),error:t=>console.log(d.red(`\u2716 ${t}`)),info:t=>console.log(d.blue(`\u2139 ${t}`)),warn:t=>console.log(d.yellow(`\u26A0 ${t}`))};var T=async t=>{k();let a=t[0];a||(a=await $({message:"Where should we create your new project?",default:"my-saas"}));let o=r.resolve(process.cwd(),a);s.existsSync(o)&&s.readdirSync(o).length>0&&(n.error(`Directory ${a} is not empty.`),process.exit(1));let w=await C({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"}]}),f="Indie-Kit/nextjs-saas-starter",p=!1,m="";if(w==="pro"?(f="indie-kit/indie-kit",m="https://github.com/indie-kit/indie-kit.git",p=!0):w==="b2b"&&(f="indie-kit/b2b-boilerplate",m="https://github.com/indie-kit/b2b-boilerplate.git",p=!0),p){let e=u("Checking repository access...").start();try{await g("git",["ls-remote",m],{env:{GIT_TERMINAL_PROMPT:"0"}}),e.succeed("Access verified.")}catch{e.fail("Access denied."),n.error("You do not have access to this repository."),n.info("Opening access page..."),await N("https://indiekit.pro/app/repo-access?ref=cli&utm_source=cli&utm_medium=terminal"),process.exit(0)}}let x=u("Downloading template...").start();try{p?(await g("git",["clone","--depth","1",m,o]),await s.remove(r.join(o,".git"))):await _(f,{disableCache:!0,force:!0}).clone(o),x.succeed("Template downloaded successfully.")}catch(e){x.fail("Failed to download template."),n.error(e.message),process.exit(1)}let S=await j({message:"Install dependencies now?",default:!0});if(S){let e=u("Installing dependencies...").start(),i=process.env.npm_config_user_agent||"",v=i.startsWith("yarn")?"yarn":i.startsWith("pnpm")?"pnpm":"npm";try{await g(v,["install"],{cwd:o}),e.succeed("Dependencies installed.")}catch(l){e.fail("Failed to install dependencies."),n.error(l.message)}}if(await j({message:"Initialize .env.local file with fresh secrets?",default:!0})){let e=u("Generating secrets...").start();try{let i=r.join(o,".env.example"),v=r.join(o,".env.local");if(s.existsSync(i)){let l=s.readFileSync(i,"utf-8"),P=R.randomBytes(32).toString("hex");l=l.replace(/BETTER_AUTH_SECRET=.*|NEXTAUTH_SECRET=.*/g,`BETTER_AUTH_SECRET="${P}"`),s.writeFileSync(v,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 h=r.join(o,"package.json");if(s.existsSync(h)){let e=s.readJsonSync(h);e.name=r.basename(o),e.version="0.1.0",s.writeJsonSync(h,e,{spaces:2})}n.success(`Project created at ${E.green(o)}`),console.log(),console.log("Next steps:"),console.log(` cd ${a}`),S||console.log(" pnpm install"),console.log(" pnpm dev"),console.log(),console.log(E.yellow('AI Tip: "Open in Cursor/Claude and run /bootstrap"'));let c=await C({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]),n.success(`Opened project in ${c}.`)}catch{n.warn(`Could not open ${c} automatically. Please run "${c} ." manually.`)}};var I={name:"indiekit",version:"0.1.2",description:"The AI-Native Next.js SaaS CLI",private:!1,homepage:"https://indiekit.pro",bugs:{url:"https://indiekit.pro/contact"},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"},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",tsup:"^8.5.1",typescript:"^5.9.3"}};var A=()=>I.version;var y=new O;y.name("indiekit").description("CLI to scaffold Next.js SaaS applications").version(A());y.argument("[directory]","Directory to create the project in").action(t=>{T(t?[t]:[])});y.parse(process.argv);
9
+ `)),console.log(S.dim(" Next.js SaaS Starter Kit CLI")),console.log()};import m from"picocolors";var o={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 A=async t=>{j();let _=process.argv[1]||"",w=["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=>_.includes(e));w&&(o.info(`You ran '${w}', which is an alias for Indie Kit.`),console.log());let a=t[0];a||(a=await R({message:"Where should we create your new project?",default:"my-saas"}));let s=r.resolve(process.cwd(),a);i.existsSync(s)&&i.readdirSync(s).length>0&&(o.error(`Directory ${a} is not empty.`),process.exit(1));let x=await C({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"}]}),f="Indie-Kit/nextjs-saas-starter",p=!1,d="";if(x==="pro"?(f="indie-kit/indie-kit",d="https://github.com/indie-kit/indie-kit.git",p=!0):x==="b2b"&&(f="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."),o.error("You do not have access to this repository."),o.info("Opening access page..."),await B("https://indiekit.pro/app/repo-access?ref=cli&utm_source=cli&utm_medium=terminal"),process.exit(0)}}let k=u("Downloading template...").start();try{p?(await g("git",["clone","--depth","1",d,s]),await i.remove(r.join(s,".git"))):await N(f,{disableCache:!0,force:!0}).clone(s),k.succeed("Template downloaded successfully.")}catch(e){k.fail("Failed to download template."),o.error(e.message),process.exit(1)}let b=await E({message:"Install dependencies now?",default:!0});if(b){let e=u("Installing dependencies...").start(),n=process.env.npm_config_user_agent||"",v=n.startsWith("yarn")?"yarn":n.startsWith("pnpm")?"pnpm":"npm";try{await g(v,["install"],{cwd:s}),e.succeed("Dependencies installed.")}catch(l){e.fail("Failed to install dependencies."),o.error(l.message)}}if(await E({message:"Initialize .env.local file with fresh secrets?",default:!0})){let e=u("Generating secrets...").start();try{let n=r.join(s,".env.example"),v=r.join(s,".env.local");if(i.existsSync(n)){let l=i.readFileSync(n,"utf-8"),$=O.randomBytes(32).toString("hex");l=l.replace(/BETTER_AUTH_SECRET=.*|NEXTAUTH_SECRET=.*/g,`BETTER_AUTH_SECRET="${$}"`),i.writeFileSync(v,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 h=r.join(s,"package.json");if(i.existsSync(h)){let e=i.readJsonSync(h);e.name=r.basename(s),e.version="0.1.0",i.writeJsonSync(h,e,{spaces:2})}o.success(`Project created at ${T.green(s)}`),console.log(),console.log("Next steps:"),console.log(` cd ${a}`),b||console.log(" pnpm install"),console.log(" pnpm dev"),console.log(),console.log(T.yellow('AI Tip: "Open in Cursor/Claude and run /bootstrap"'));let c=await C({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,[s]),o.success(`Opened project in ${c}.`)}catch{o.warn(`Could not open ${c} automatically. Please run "${c} ." manually.`)}};var I={name:"indiekit",version:"0.1.4",description:"The AI-Native Next.js SaaS CLI",private:!1,homepage:"https://indiekit.pro",bugs:{url:"https://indiekit.pro/contact"},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=()=>I.version;var y=new F;y.name("indiekit").description("CLI to scaffold Next.js SaaS applications").version(P());y.argument("[directory]","Directory to create the project in").action(t=>{A(t?[t]:[])});y.parse(process.argv);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "indiekit",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "The AI-Native Next.js SaaS CLI",
5
5
  "private": false,
6
6
  "homepage": "https://indiekit.pro",
@@ -40,13 +40,16 @@
40
40
  "@types/fs-extra": "^11.0.4",
41
41
  "@types/node": "^25.2.2",
42
42
  "bumpp": "^10.4.1",
43
+ "handlebars": "^4.7.8",
43
44
  "tsup": "^8.5.1",
45
+ "tsx": "^4.21.0",
44
46
  "typescript": "^5.9.3"
45
47
  },
46
48
  "scripts": {
47
49
  "dev": "tsup --watch",
48
50
  "build": "tsup",
49
51
  "start": "node dist/index.js",
50
- "release": "bumpp"
52
+ "release": "bumpp",
53
+ "multi-publish": "tsx scripts/publish-all.ts"
51
54
  }
52
55
  }