rapidkit 0.12.2 → 0.12.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.md CHANGED
@@ -98,9 +98,11 @@ rapidkit format # Format code
98
98
  rapidkit --help # Show all commands
99
99
  ```
100
100
 
101
- ### Alternative: Without Activation
101
+ > **Note:** The global `rapidkit` command automatically detects when you're inside a RapidKit project and delegates to the local CLI. No need for `./rapidkit` prefix or `source .rapidkit/activate`.
102
102
 
103
- You can also run commands directly without activation:
103
+ ### Alternative: Direct Commands
104
+
105
+ You can also run commands directly:
104
106
 
105
107
  ```bash
106
108
  ./rapidkit dev # Using the wrapper script
@@ -193,6 +195,8 @@ MIT
193
195
 
194
196
  ---
195
197
 
196
- **v0.12.1** - Simplified CLI: `rapidkit init` now handles environment activation automatically
198
+ **v0.12.4** - Friendly shell activation UX with green headers and robust fallback logic
199
+
200
+ **v0.12.2** - Simplified CLI: `rapidkit init` now handles environment activation automatically
197
201
 
198
202
  **v0.12.0** - Added NestJS template, workspace mode, and unified CLI
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- import {Command}from'commander';import r from'chalk';import P from'inquirer';import l,{dirname,join}from'path';import {execa}from'execa';import {readFileSync,promises}from'fs';import {fileURLToPath}from'url';import te from'os';import re from'validate-npm-package-name';import*as k from'fs-extra';import N from'ora';var E=class{debugEnabled=false;setDebug(t){this.debugEnabled=t;}debug(t,...i){this.debugEnabled&&console.log(r.gray(`[DEBUG] ${t}`),...i);}info(t,...i){console.log(r.blue(t),...i);}success(t,...i){console.log(r.green(t),...i);}warn(t,...i){console.log(r.yellow(t),...i);}error(t,...i){console.error(r.red(t),...i);}step(t,i,o){console.log(r.cyan(`
3
- [${t}/${i}]`),r.white(o));}},c=new E;var z="rapidkit",V=fileURLToPath(import.meta.url),q=dirname(V),X=join(q,"..","package.json"),Q=JSON.parse(readFileSync(X,"utf-8")),S=Q.version;async function T(){try{c.debug("Checking for updates...");let{stdout:e}=await execa("npm",["view",z,"version"],{timeout:3e3}),t=e.trim();t&&t!==S?(console.log(r.yellow(`
4
- \u26A0\uFE0F Update available: ${S} \u2192 ${t}`)),console.log(r.cyan(`Run: npm install -g rapidkit@latest
5
- `))):c.debug("You are using the latest version");}catch{c.debug("Could not check for updates");}}function w(){return S}var ie=".rapidkitrc.json";async function U(){let e=l.join(te.homedir(),ie);try{let t=await promises.readFile(e,"utf-8"),i=JSON.parse(t);return c.debug(`Loaded config from ${e}`),i}catch{return c.debug("No user config found, using defaults"),{}}}var v=class extends Error{constructor(i,o,n){super(i);this.code=o;this.details=n;this.name="RapidKitError",Error.captureStackTrace(this,this.constructor);}};var u=class extends v{constructor(t,i){super(`Invalid project name: "${t}"`,"INVALID_PROJECT_NAME",i);}};function O(e){let t=re(e);if(!t.validForNewPackages){let o=t.errors||[],n=t.warnings||[],s=[...o,...n];throw new u(e,`NPM validation failed: ${s.join(", ")}`)}if(!/^[a-z][a-z0-9_-]*$/.test(e))throw new u(e,"Must start with a lowercase letter and contain only lowercase letters, numbers, hyphens, and underscores");if(["test","tests","src","dist","build","lib","python","pip","poetry","node","npm","rapidkit","rapidkit"].includes(e.toLowerCase()))throw new u(e,`"${e}" is a reserved name. Please choose a different name.`);if(e.length<2)throw new u(e,"Name must be at least 2 characters long");if(e.length>214)throw new u(e,"Name must be less than 214 characters");return true}async function F(e,t){let i=N("Creating RapidKit workspace...").start();try{await promises.mkdir(e,{recursive:!0}),await promises.mkdir(l.join(e,".rapidkit"),{recursive:!0});let o={workspace_name:t.name,author:t.author,rapidkit_version:w(),created_at:new Date().toISOString(),type:"workspace"};await promises.writeFile(l.join(e,".rapidkit","config.json"),JSON.stringify(o,null,2));let n=ae();await promises.writeFile(l.join(e,"rapidkit"),n),await promises.chmod(l.join(e,"rapidkit"),493);let s=oe(t.name);if(await promises.writeFile(l.join(e,"README.md"),s),await promises.writeFile(l.join(e,".gitignore"),`# RapidKit workspace
2
+ import {Command}from'commander';import a from'chalk';import O from'inquirer';import g,{dirname,join}from'path';import {spawn}from'child_process';import {execa}from'execa';import v,{readFileSync,promises}from'fs';import {fileURLToPath}from'url';import me from'os';import ue from'validate-npm-package-name';import*as f from'fs-extra';import A from'ora';var F=class{debugEnabled=false;setDebug(e){this.debugEnabled=e;}debug(e,...i){this.debugEnabled&&console.log(a.gray(`[DEBUG] ${e}`),...i);}info(e,...i){console.log(a.blue(e),...i);}success(e,...i){console.log(a.green(e),...i);}warn(e,...i){console.log(a.yellow(e),...i);}error(e,...i){console.error(a.red(e),...i);}step(e,i,n){console.log(a.cyan(`
3
+ [${e}/${i}]`),a.white(n));}},l=new F;var oe="rapidkit",re=fileURLToPath(import.meta.url),se=dirname(re),ce=join(se,"..","package.json"),pe=JSON.parse(readFileSync(ce,"utf-8")),V=pe.version;async function H(){try{l.debug("Checking for updates...");let{stdout:t}=await execa("npm",["view",oe,"version"],{timeout:3e3}),e=t.trim();e&&e!==V?(console.log(a.yellow(`
4
+ \u26A0\uFE0F Update available: ${V} \u2192 ${e}`)),console.log(a.cyan(`Run: npm install -g rapidkit@latest
5
+ `))):l.debug("You are using the latest version");}catch{l.debug("Could not check for updates");}}function N(){return V}var ge=".rapidkitrc.json";async function J(){let t=g.join(me.homedir(),ge);try{let e=await promises.readFile(t,"utf-8"),i=JSON.parse(e);return l.debug(`Loaded config from ${t}`),i}catch{return l.debug("No user config found, using defaults"),{}}}var P=class extends Error{constructor(i,n,o){super(i);this.code=n;this.details=o;this.name="RapidKitError",Error.captureStackTrace(this,this.constructor);}};var j=class extends P{constructor(e,i){super(`Invalid project name: "${e}"`,"INVALID_PROJECT_NAME",i);}};function W(t){let e=ue(t);if(!e.validForNewPackages){let n=e.errors||[],o=e.warnings||[],c=[...n,...o];throw new j(t,`NPM validation failed: ${c.join(", ")}`)}if(!/^[a-z][a-z0-9_-]*$/.test(t))throw new j(t,"Must start with a lowercase letter and contain only lowercase letters, numbers, hyphens, and underscores");if(["test","tests","src","dist","build","lib","python","pip","poetry","node","npm","rapidkit","rapidkit"].includes(t.toLowerCase()))throw new j(t,`"${t}" is a reserved name. Please choose a different name.`);if(t.length<2)throw new j(t,"Name must be at least 2 characters long");if(t.length>214)throw new j(t,"Name must be less than 214 characters");return true}async function M(t,e){let i=A("Creating RapidKit workspace...").start();try{await promises.mkdir(t,{recursive:!0}),await promises.mkdir(g.join(t,".rapidkit"),{recursive:!0});let n={workspace_name:e.name,author:e.author,rapidkit_version:N(),created_at:new Date().toISOString(),type:"workspace"};await promises.writeFile(g.join(t,".rapidkit","config.json"),JSON.stringify(n,null,2));let o=he();await promises.writeFile(g.join(t,"rapidkit"),o),await promises.chmod(g.join(t,"rapidkit"),493);let c=fe(e.name);if(await promises.writeFile(g.join(t,"README.md"),c),await promises.writeFile(g.join(t,".gitignore"),`# RapidKit workspace
6
6
  .env
7
7
  .env.*
8
8
  !.env.example
@@ -17,36 +17,36 @@ Thumbs.db
17
17
 
18
18
  # Logs
19
19
  *.log
20
- `),await ne(e),i.succeed("Workspace created!"),!t.skipGit){let d=N("Initializing git repository...").start();try{await execa("git",["init"],{cwd:e}),await execa("git",["add","."],{cwd:e}),await execa("git",["commit","-m","Initial commit: RapidKit workspace"],{cwd:e}),d.succeed("Git repository initialized");}catch{d.warn("Could not initialize git repository");}}console.log(`
21
- ${r.green("\u2728 RapidKit workspace created successfully!")}
20
+ `),await $e(t),i.succeed("Workspace created!"),!e.skipGit){let r=A("Initializing git repository...").start();try{await execa("git",["init"],{cwd:t}),await execa("git",["add","."],{cwd:t}),await execa("git",["commit","-m","Initial commit: RapidKit workspace"],{cwd:t}),r.succeed("Git repository initialized");}catch{r.warn("Could not initialize git repository");}}console.log(`
21
+ ${a.green("\u2728 RapidKit workspace created successfully!")}
22
22
 
23
- ${r.bold("\u{1F4C2} Workspace structure:")}
24
- ${e}/
23
+ ${a.bold("\u{1F4C2} Workspace structure:")}
24
+ ${t}/
25
25
  \u251C\u2500\u2500 rapidkit # Local CLI (add to PATH or use ./rapidkit)
26
26
  \u251C\u2500\u2500 .rapidkit/ # Workspace configuration
27
27
  \u2502 \u251C\u2500\u2500 config.json # Workspace settings
28
28
  \u2502 \u2514\u2500\u2500 templates/ # Project templates
29
29
  \u2514\u2500\u2500 README.md
30
30
 
31
- ${r.bold("\u{1F680} Get started:")}
32
- ${r.cyan(`cd ${t.name}`)}
33
- ${r.cyan('export PATH="$PWD:$PATH"')} ${r.gray("# Add rapidkit to PATH")}
34
- ${r.cyan("rapidkit create my-api --template fastapi")}
35
- ${r.cyan("cd my-api")}
36
- ${r.cyan("rapidkit dev")}
31
+ ${a.bold("\u{1F680} Get started:")}
32
+ ${a.cyan(`cd ${e.name}`)}
33
+ ${a.cyan('export PATH="$PWD:$PATH"')} ${a.gray("# Add rapidkit to PATH")}
34
+ ${a.cyan("rapidkit create my-api --template fastapi")}
35
+ ${a.cyan("cd my-api")}
36
+ ${a.cyan("rapidkit dev")}
37
37
 
38
- ${r.bold("\u{1F4E6} Available templates:")}
38
+ ${a.bold("\u{1F4E6} Available templates:")}
39
39
  fastapi - FastAPI + Python (default)
40
40
  nestjs - NestJS + TypeScript
41
41
 
42
- ${r.bold("\u{1F4DA} Commands:")}
42
+ ${a.bold("\u{1F4DA} Commands:")}
43
43
  rapidkit create <name> Create a new project
44
44
  rapidkit create --help Show create options
45
45
  rapidkit help Show all commands
46
46
 
47
- ${r.gray("Tip: Add workspace to PATH for easier access:")}
48
- ${r.cyan(`echo 'export PATH="${e}:$PATH"' >> ~/.bashrc`)}
49
- `);}catch(o){throw i.fail("Failed to create workspace"),o}}function ae(){return `#!/usr/bin/env bash
47
+ ${a.gray("Tip: Add workspace to PATH for easier access:")}
48
+ ${a.cyan(`echo 'export PATH="${t}:$PATH"' >> ~/.bashrc`)}
49
+ `);}catch(n){throw i.fail("Failed to create workspace"),n}}function he(){return `#!/usr/bin/env bash
50
50
  #
51
51
  # RapidKit CLI - Local workspace commands
52
52
  # This script provides rapidkit commands within the workspace
@@ -382,7 +382,7 @@ main() {
382
382
  print_help
383
383
  ;;
384
384
  version|-v|--version)
385
- echo "RapidKit CLI (npm workspace) v${w()}"
385
+ echo "RapidKit CLI (npm workspace) v${N()}"
386
386
  ;;
387
387
  *)
388
388
  echo -e "\${RED}\u274C Unknown command: $cmd\${NC}"
@@ -394,7 +394,7 @@ main() {
394
394
  }
395
395
 
396
396
  main "$@"
397
- `}function oe(e){return `# ${e}
397
+ `}function fe(t){return `# ${t}
398
398
 
399
399
  RapidKit workspace for building API projects.
400
400
 
@@ -449,7 +449,7 @@ rapidkit dev # Start dev server
449
449
 
450
450
  - [RapidKit Documentation](https://rapidkit.dev)
451
451
  - [GitHub Repository](https://github.com/Baziar/rapidkit)
452
- `}async function ne(e){let{fileURLToPath:t}=await import('url'),i=t(import.meta.url),o=l.dirname(i),n=l.resolve(o,".."),s=l.join(n,"templates","kits"),p=l.join(e,".rapidkit","templates"),{default:d}=await import('fs-extra');await d.copy(s,p);let g=l.join(n,"templates","generator.js"),j=l.join(e,".rapidkit","generator.js");await d.copy(g,j);}async function B(e,t){let i=t.template==="fastapi",o=i?"FastAPI":"NestJS",n=N(`Creating ${o} project...`).start();try{let{fileURLToPath:s}=await import('url'),p=s(import.meta.url),d=l.dirname(p),g=l.resolve(d,".."),j=i?"fastapi-standard":"nestjs-standard",C=l.join(g,"templates","kits",j);await promises.mkdir(e,{recursive:!0});let _={project_name:i?t.name.replace(/-/g,"_").toLowerCase():t.name.replace(/_/g,"-").toLowerCase(),author:t.author,description:t.description||`${o} application generated with RapidKit`,app_version:"0.1.0",license:"MIT",package_manager:t.package_manager||"npm",created_at:new Date().toISOString(),rapidkit_version:w()};await K(C,e,_);let G=i?`# Python
452
+ `}async function $e(t){let{fileURLToPath:e}=await import('url'),i=e(import.meta.url),n=g.dirname(i),o=g.resolve(n,".."),c=g.join(o,"templates","kits"),p=g.join(t,".rapidkit","templates"),{default:r}=await import('fs-extra');await r.copy(c,p);let d=g.join(o,"templates","generator.js"),$=g.join(t,".rapidkit","generator.js");await r.copy(d,$);}async function Y(t,e){let i=e.template==="fastapi",n=i?"FastAPI":"NestJS",o=A(`Creating ${n} project...`).start();try{let{fileURLToPath:c}=await import('url'),p=c(import.meta.url),r=g.dirname(p),d=g.resolve(r,".."),$=i?"fastapi-standard":"nestjs-standard",h=g.join(d,"templates","kits",$);await promises.mkdir(t,{recursive:!0});let w={project_name:i?e.name.replace(/-/g,"_").toLowerCase():e.name.replace(/_/g,"-").toLowerCase(),author:e.author,description:e.description||`${n} application generated with RapidKit`,app_version:"0.1.0",license:"MIT",package_manager:e.package_manager||"npm",created_at:new Date().toISOString(),rapidkit_version:N()};await z(h,t,w);let _=i?`# Python
453
453
  __pycache__/
454
454
  *.py[cod]
455
455
  *$py.class
@@ -517,11 +517,11 @@ Thumbs.db
517
517
 
518
518
  # Coverage
519
519
  coverage/
520
- `;if(await promises.writeFile(l.join(e,".gitignore"),G),n.succeed(`${o} project created!`),!t.skipGit){let y=N("Initializing git repository...").start();try{await execa("git",["init"],{cwd:e}),await execa("git",["add","."],{cwd:e}),await execa("git",["commit","-m",`Initial commit: ${o} project via RapidKit`],{cwd:e}),y.succeed("Git repository initialized");}catch{y.warn("Could not initialize git repository");}}if(!t.skipInstall&&!i){let y=t.package_manager||"npm",D=N(`Installing dependencies with ${y}...`).start();try{await execa(y,["install"],{cwd:e}),D.succeed("Dependencies installed");}catch{D.warn(`Could not install dependencies. Run '${y} install' manually.`);}}let A=l.basename(e);console.log(i?`
521
- ${r.green("\u2728 FastAPI project created successfully!")}
520
+ `;if(await promises.writeFile(g.join(t,".gitignore"),_),o.succeed(`${n} project created!`),!e.skipGit){let k=A("Initializing git repository...").start();try{await execa("git",["init"],{cwd:t}),await execa("git",["add","."],{cwd:t}),await execa("git",["commit","-m",`Initial commit: ${n} project via RapidKit`],{cwd:t}),k.succeed("Git repository initialized");}catch{k.warn("Could not initialize git repository");}}if(!e.skipInstall&&!i){let k=e.package_manager||"npm",D=A(`Installing dependencies with ${k}...`).start();try{await execa(k,["install"],{cwd:t}),D.succeed("Dependencies installed");}catch{D.warn(`Could not install dependencies. Run '${k} install' manually.`);}}let L=g.basename(t);console.log(i?`
521
+ ${a.green("\u2728 FastAPI project created successfully!")}
522
522
 
523
- ${r.bold("\u{1F4C2} Project structure:")}
524
- ${e}/
523
+ ${a.bold("\u{1F4C2} Project structure:")}
524
+ ${t}/
525
525
  \u251C\u2500\u2500 .rapidkit/ # RapidKit CLI module
526
526
  \u251C\u2500\u2500 src/
527
527
  \u2502 \u251C\u2500\u2500 main.py # FastAPI application
@@ -532,12 +532,12 @@ ${e}/
532
532
  \u251C\u2500\u2500 pyproject.toml # Poetry configuration
533
533
  \u2514\u2500\u2500 README.md
534
534
 
535
- ${r.bold("\u{1F680} Get started:")}
536
- ${r.cyan(`cd ${A}`)}
537
- ${r.cyan("rapidkit init")} ${r.gray("# Install dependencies")}
538
- ${r.cyan("rapidkit dev")} ${r.gray("# Start dev server")}
535
+ ${a.bold("\u{1F680} Get started:")}
536
+ ${a.cyan(`cd ${L}`)}
537
+ ${a.cyan("rapidkit init")} ${a.gray("# Install dependencies")}
538
+ ${a.cyan("rapidkit dev")} ${a.gray("# Start dev server")}
539
539
 
540
- ${r.bold("\u{1F4DA} Available commands:")}
540
+ ${a.bold("\u{1F4DA} Available commands:")}
541
541
  rapidkit init # Install dependencies (poetry install)
542
542
  rapidkit dev # Start dev server with hot reload
543
543
  rapidkit start # Start production server
@@ -545,12 +545,12 @@ ${r.bold("\u{1F4DA} Available commands:")}
545
545
  rapidkit lint # Lint code
546
546
  rapidkit format # Format code
547
547
 
548
- ${r.gray("Alternative: use make commands (make dev, make test, ...)")}
548
+ ${a.gray("Alternative: use make commands (make dev, make test, ...)")}
549
549
  `:`
550
- ${r.green("\u2728 NestJS project created successfully!")}
550
+ ${a.green("\u2728 NestJS project created successfully!")}
551
551
 
552
- ${r.bold("\u{1F4C2} Project structure:")}
553
- ${e}/
552
+ ${a.bold("\u{1F4C2} Project structure:")}
553
+ ${t}/
554
554
  \u251C\u2500\u2500 .rapidkit/ # RapidKit CLI module
555
555
  \u251C\u2500\u2500 src/
556
556
  \u2502 \u251C\u2500\u2500 main.ts # Application entry point
@@ -561,13 +561,13 @@ ${e}/
561
561
  \u251C\u2500\u2500 package.json # Dependencies
562
562
  \u2514\u2500\u2500 README.md
563
563
 
564
- ${r.bold("\u{1F680} Get started:")}
565
- ${r.cyan(`cd ${A}`)}
566
- ${t.skipInstall?r.cyan("rapidkit init")+r.gray(" # npm install")+`
567
- `:""}${r.cyan("cp .env.example .env")}
568
- ${r.cyan("rapidkit dev")} ${r.gray("# Start dev server")}
564
+ ${a.bold("\u{1F680} Get started:")}
565
+ ${a.cyan(`cd ${L}`)}
566
+ ${e.skipInstall?a.cyan("rapidkit init")+a.gray(" # npm install")+`
567
+ `:""}${a.cyan("cp .env.example .env")}
568
+ ${a.cyan("rapidkit dev")} ${a.gray("# Start dev server")}
569
569
 
570
- ${r.bold("\u{1F4DA} Available commands:")}
570
+ ${a.bold("\u{1F4DA} Available commands:")}
571
571
  rapidkit init # Install dependencies
572
572
  rapidkit dev # Start dev server with hot reload
573
573
  rapidkit start # Start production server
@@ -576,30 +576,100 @@ ${r.bold("\u{1F4DA} Available commands:")}
576
576
  rapidkit lint # Lint code
577
577
  rapidkit format # Format code
578
578
 
579
- ${r.bold("\u{1F310} API endpoints:")}
579
+ ${a.bold("\u{1F310} API endpoints:")}
580
580
  http://localhost:8000/health # Health check
581
581
  http://localhost:8000/docs # Swagger docs
582
582
  http://localhost:8000/examples/notes # Example API
583
- `);}catch(s){throw n.fail(`Failed to create ${o} project`),s}}async function K(e,t,i){let o=await promises.readdir(e,{withFileTypes:true});for(let n of o){let s=l.join(e,n.name),p=n.name.replace(/\.j2$/,""),d=l.join(t,p);if(n.isDirectory())await promises.mkdir(d,{recursive:true}),await K(s,d,i);else {let g=await promises.readFile(s,"utf-8");n.name.endsWith(".j2")&&(g=se(g,i)),await promises.writeFile(d,g),(p==="rapidkit"||p==="activate"||p.endsWith(".py")&&d.includes(".rapidkit"))&&await promises.chmod(d,493);}}}function se(e,t){let i=e;for(let[o,n]of Object.entries(t)){let s=new RegExp(`\\{\\{\\s*${o}\\s*\\}\\}`,"g");i=i.replace(s,String(n));let p=new RegExp(`\\{\\{\\s*${o}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\}\\}`,"g");i=i.replace(p,(j,C,_)=>String(n).replace(new RegExp(C,"g"),_));let d=new RegExp(`\\{\\{\\s*${o}\\s*\\|\\s*lower\\s*\\}\\}`,"g");i=i.replace(d,String(n).toLowerCase());let g=new RegExp(`\\{\\{\\s*${o}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\|\\s*lower\\s*\\}\\}`,"g");i=i.replace(g,(j,C,_)=>String(n).replace(new RegExp(C,"g"),_).toLowerCase());}return i}var h=null,x=false,I=new Command;I.name("rapidkit").description("Create RapidKit workspaces and projects").version(w());I.argument("[name]","Name of the workspace or project directory").option("-t, --template <template>","Create project with template (fastapi, nestjs) instead of workspace").option("-y, --yes","Skip prompts and use defaults").option("--skip-git","Skip git initialization").option("--skip-install","Skip installing dependencies").option("--debug","Enable debug logging").option("--dry-run","Show what would be created without creating it").option("--no-update-check","Skip checking for updates").action(async(e,t)=>{try{t.debug&&(c.setDebug(!0),c.debug("Debug mode enabled"));let i=await U();c.debug("User config loaded",i),t.updateCheck!==!1&&await T(),console.log(r.blue.bold(`
583
+ `);}catch(c){throw o.fail(`Failed to create ${n} project`),c}}async function z(t,e,i){let n=await promises.readdir(t,{withFileTypes:true});for(let o of n){let c=g.join(t,o.name),p=o.name.replace(/\.j2$/,""),r=g.join(e,p);if(o.isDirectory())await promises.mkdir(r,{recursive:true}),await z(c,r,i);else {let d=await promises.readFile(c,"utf-8");o.name.endsWith(".j2")&&(d=ye(d,i)),await promises.writeFile(r,d),(p==="rapidkit"||p==="activate"||p.endsWith(".py")&&r.includes(".rapidkit"))&&await promises.chmod(r,493);}}}function ye(t,e){let i=t;for(let[n,o]of Object.entries(e)){let c=new RegExp(`\\{\\{\\s*${n}\\s*\\}\\}`,"g");i=i.replace(c,String(o));let p=new RegExp(`\\{\\{\\s*${n}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\}\\}`,"g");i=i.replace(p,($,h,w)=>String(o).replace(new RegExp(h,"g"),w));let r=new RegExp(`\\{\\{\\s*${n}\\s*\\|\\s*lower\\s*\\}\\}`,"g");i=i.replace(r,String(o).toLowerCase());let d=new RegExp(`\\{\\{\\s*${n}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\|\\s*lower\\s*\\}\\}`,"g");i=i.replace(d,($,h,w)=>String(o).replace(new RegExp(h,"g"),w).toLowerCase());}return i}var B=["init","dev","start","build","test","lint","format","help","--help","-h"];function we(t){let e=t;for(;;){let i=g.join(e,".rapidkit","context.json");if(v.existsSync(i))return i;let n=g.dirname(e);if(n===e)break;e=n;}return null}function ve(t){let e=t;for(;;){let i=g.join(e,"rapidkit"),n=g.join(e,".rapidkit","rapidkit");if(v.existsSync(i))return i;if(v.existsSync(n))return n;let o=g.dirname(e);if(o===e)break;e=o;}return null}(()=>{try{let t=process.cwd(),i=process.argv.slice(2)[0],n=we(t);if(n&&v.existsSync(n)){let o=v.readFileSync(n,"utf8");try{let c=JSON.parse(o),p=i==="shell"&&process.argv.slice(2)[1]==="activate",d=ve(t)&&i&&B.includes(i);c?.engine==="pip"&&!p&&!d&&i!=="init"&&(console.log(a.yellow(`
584
+ \u26A0\uFE0F This project uses the Python RapidKit engine (pip). The global npm RapidKit CLI will not operate on this project.
585
+ \u{1F4A1} To prepare this project run: 'rapidkit init' (it uses the project's Python toolchain)
586
+ `)),process.exit(0));}catch{}}}catch{}})();function X(t){let e=t;for(;;){let i=g.join(e,".rapidkit","context.json");if(v.existsSync(i))return i;let n=g.dirname(e);if(n===e)break;e=n;}return null}async function je(){let t=process.cwd(),e=X(t),i=e?g.dirname(e):g.join(t,".rapidkit");if(e&&await f.pathExists(e))try{if((await f.readJson(e)).engine==="pip"){let w=process.argv.slice(2),_=w[0],L=[g.join(t,"rapidkit"),g.join(t,".rapidkit","rapidkit")],k=null;for(let m of L)if(await f.pathExists(m)){k=m;break}if(k&&_&&B.includes(_)){l.debug(`Delegating to local CLI (early detection): ${k} ${w.join(" ")}`);let m=spawn(k,w,{stdio:"inherit",cwd:t});return m.on("close",E=>process.exit(E??0)),m.on("error",E=>{l.error(`Failed to run local rapidkit: ${E.message}`),process.exit(1);}),!0}if(_==="shell"&&w[1]==="activate"){let m=`# RapidKit: activation snippet - eval "$(rapidkit shell activate)"
587
+ VENV='.venv'
588
+ if [ -f "$VENV/bin/activate" ]; then
589
+ . "$VENV/bin/activate"
590
+ elif [ -f "$VENV/bin/activate.fish" ]; then
591
+ source "$VENV/bin/activate.fish"
592
+ fi
593
+ export RAPIDKIT_PROJECT_ROOT="$(pwd)"
594
+ export PATH="$(pwd)/.rapidkit:$(pwd):$PATH"
595
+ `;console.log(a.green.bold(`
596
+ \u2705 Activation snippet \u2014 run the following to activate this project in your current shell:
597
+ `)),console.log(m),console.log(a.gray(`
598
+ \u{1F4A1} After activation you can run: rapidkit dev
599
+ `)),process.exit(0);}if(_!=="init"){let m=(await import('chalk')).default;console.log(m.yellow(`
600
+ \u26A0\uFE0F This project uses the Python RapidKit engine (pip). The global npm RapidKit CLI will not operate on this project.
601
+ \u{1F4A1} To prepare this project run: 'rapidkit init' (it uses the project's Python toolchain)
602
+
603
+ `)),process.exit(0);}let D=(await import('chalk')).default;console.log(D.yellow(`
604
+ \u26A0\uFE0F This project was created with the Python engine (pip). RapidKit (npm) will try to install the Python CLI for you...
605
+ `));let{spawnSync:Q}=await import('child_process'),Z=[["python3",["-m","pip","install","rapidkit-core"]],["python",["-m","pip","install","rapidkit-core"]],["pip",["install","rapidkit-core"]]],S=!0;if(process.stdin.isTTY)try{S=!!(await O.prompt([{type:"confirm",name:"confirm",message:"This project needs the Python RapidKit CLI (rapidkit). Do you want to try installing it now using pip?",default:!0}])).confirm;}catch{S=!1;}else S=!1;if(!S){let m=(await import('chalk')).default;console.log(m.yellow(`
606
+ \u26A0\uFE0F Skipping automatic installation of the Python RapidKit CLI (rapidkit-core).
607
+ \u{1F4A1} To continue, either run 'rapidkit init' locally after installing rapidkit-core: \`python3 -m pip install rapidkit-core\`
608
+ `)),process.exit(0);}let R={status:1};if(S)for(let[m,E]of Z)try{if(console.log(a.gray(`Running: ${m} ${E.join(" ")}
609
+ `)),R=Q(m,E,{stdio:"inherit"}),R&&R.status===0)break}catch{}if(R&&R.status===0){let m=(await import('chalk')).default;console.log(m.green(`
610
+ \u2705 RapidKit Python CLI (rapidkit) installed successfully!
611
+ Please re-run your command.
612
+ `));}else {let m=(await import('chalk')).default;console.log(m.red(`
613
+ \u274C Failed to install RapidKit Python CLI automatically.
614
+ \u{1F4A1} Manual install options:
615
+ python3 -m pip install rapidkit
616
+ python -m pip install rapidkit
617
+ pip install rapidkit
618
+ `));}process.exit(R.status??1);}}catch{}let n=[g.join(t,"rapidkit"),g.join(t,".rapidkit","rapidkit")],o=g.join(t,"rapidkit");for(let h of n)if(await f.pathExists(h)){o=h;break}let c=await f.pathExists(o),p=await f.pathExists(i);if(!c||!p)return false;let r=process.argv.slice(2),d=r[0];if(!d||!B.includes(d))return false;l.debug(`Delegating to local CLI: ./rapidkit ${r.join(" ")}`);let $=spawn(o,r,{stdio:"inherit",cwd:t});return $.on("close",h=>{process.exit(h??0);}),$.on("error",h=>{l.error(`Failed to run local rapidkit: ${h.message}`),process.exit(1);}),true}var x=null,U=false,K=new Command;K.name("rapidkit").description("Create RapidKit workspaces and projects").version(N());K.argument("[name]","Name of the workspace or project directory").option("-t, --template <template>","Create project with template (fastapi, nestjs) instead of workspace").option("-y, --yes","Skip prompts and use defaults").option("--skip-git","Skip git initialization").option("--skip-install","Skip installing dependencies").option("--debug","Enable debug logging").option("--dry-run","Show what would be created without creating it").option("--no-update-check","Skip checking for updates").action(async(t,e)=>{try{e.debug&&(l.setDebug(!0),l.debug("Debug mode enabled"));let i=await J();l.debug("User config loaded",i),e.updateCheck!==!1&&await H(),console.log(a.blue.bold(`
584
619
  \u{1F680} Welcome to RapidKit!
585
- `)),e||(le(),process.exit(0));try{O(e);}catch(p){throw p instanceof v&&(c.error(`
586
- \u274C ${p.message}`),p.details&&c.warn(`\u{1F4A1} ${p.details}
587
- `),process.exit(1)),p}let o=l.resolve(process.cwd(),e);h=o,await k.pathExists(o)&&(c.error(`
588
- \u274C Directory "${e}" already exists`),console.log(r.cyan(`
620
+ `)),t||(xe(),process.exit(0));try{W(t);}catch(p){throw p instanceof P&&(l.error(`
621
+ \u274C ${p.message}`),p.details&&l.warn(`\u{1F4A1} ${p.details}
622
+ `),process.exit(1)),p}let n=g.resolve(process.cwd(),t);x=n,await f.pathExists(n)&&(l.error(`
623
+ \u274C Directory "${t}" already exists`),console.log(a.cyan(`
589
624
  \u{1F4A1} Choose a different name or delete the existing directory.
590
- `)),process.exit(1));let n=!!t.template;if(n){let p=t.template.toLowerCase(),d=["fastapi","nestjs"];d.includes(p)||(c.error(`
591
- \u274C Invalid template: ${t.template}`),console.log(r.cyan(`
592
- \u{1F4E6} Available templates: ${d.join(", ")}
593
- `)),process.exit(1));}if(t.dryRun){console.log(r.cyan(`
625
+ `)),process.exit(1));let o=!!e.template;if(o){let p=e.template.toLowerCase(),r=["fastapi","nestjs"];r.includes(p)||(l.error(`
626
+ \u274C Invalid template: ${e.template}`),console.log(a.cyan(`
627
+ \u{1F4E6} Available templates: ${r.join(", ")}
628
+ `)),process.exit(1));}if(e.dryRun){console.log(a.cyan(`
594
629
  \u{1F50D} Dry-run mode - showing what would be created:
595
- `)),console.log(r.white("\u{1F4C2} Path:"),o),console.log(r.white("\u{1F4E6} Type:"),n?`Project (${t.template})`:"Workspace"),console.log();return}let s;t.yes?(s={author:process.env.USER||"RapidKit User",description:n?`${t.template==="nestjs"?"NestJS":"FastAPI"} application generated with RapidKit`:void 0,package_manager:"npm"},console.log(r.gray(`Using default values (--yes flag)
596
- `))):n?t.template.toLowerCase()==="fastapi"?s=await P.prompt([{type:"input",name:"author",message:"Author name:",default:process.env.USER||"RapidKit User"},{type:"input",name:"description",message:"Project description:",default:"FastAPI service generated with RapidKit"}]):s=await P.prompt([{type:"input",name:"author",message:"Author name:",default:process.env.USER||"RapidKit User"},{type:"input",name:"description",message:"Project description:",default:"NestJS application generated with RapidKit"},{type:"list",name:"package_manager",message:"Package manager:",choices:["npm","yarn","pnpm"],default:"npm"}]):s=await P.prompt([{type:"input",name:"author",message:"Author name:",default:process.env.USER||"RapidKit User"}]),n?await B(o,{name:e,template:t.template.toLowerCase(),author:s.author,description:s.description,package_manager:s.package_manager,skipGit:t.skipGit,skipInstall:t.skipInstall}):await F(o,{name:e,author:s.author,skipGit:t.skipGit});}catch(i){i instanceof v?(c.error(`
597
- \u274C ${i.message}`),i.details&&c.warn(`\u{1F4A1} ${i.details}`),c.debug("Error code:",i.code)):(c.error(`
598
- \u274C An unexpected error occurred:`),console.error(i)),process.exit(1);}finally{h=null;}});function le(){console.log(r.white(`Usage: npx rapidkit <name> [options]
599
- `)),console.log(r.bold("Create a workspace (recommended):")),console.log(r.cyan(" npx rapidkit my-workspace")),console.log(r.cyan(" cd my-workspace")),console.log(r.cyan(" rapidkit create my-api --template fastapi")),console.log(r.cyan(" cd my-api")),console.log(r.cyan(` rapidkit dev
600
- `)),console.log(r.bold("Or create a project directly:")),console.log(r.cyan(" npx rapidkit my-project --template fastapi")),console.log(r.cyan(` npx rapidkit my-project --template nestjs
601
- `)),console.log(r.bold("Options:")),console.log(r.gray(" -t, --template <template> Create project with template (fastapi, nestjs)")),console.log(r.gray(" -y, --yes Skip prompts and use defaults")),console.log(r.gray(" --skip-git Skip git initialization")),console.log(r.gray(" --skip-install Skip installing dependencies")),console.log(r.gray(" --debug Enable debug logging")),console.log(r.gray(` --dry-run Show what would be created
602
- `)),console.log(r.bold("Templates:")),console.log(r.gray(" fastapi FastAPI + Python")),console.log(r.gray(` nestjs NestJS + TypeScript
603
- `));}process.on("SIGINT",async()=>{if(!x){if(x=true,console.log(r.yellow(`
604
-
605
- \u26A0\uFE0F Interrupted by user`)),h&&await k.pathExists(h)){console.log(r.gray("Cleaning up partial installation..."));try{await k.remove(h),console.log(r.green("\u2713 Cleanup complete"));}catch(e){c.debug("Cleanup failed:",e);}}process.exit(130);}});process.on("SIGTERM",async()=>{if(!x){if(x=true,c.debug("Received SIGTERM"),h&&await k.pathExists(h))try{await k.remove(h);}catch(e){c.debug("Cleanup failed:",e);}process.exit(143);}});I.parse();
630
+ `)),console.log(a.white("\u{1F4C2} Path:"),n),console.log(a.white("\u{1F4E6} Type:"),o?`Project (${e.template})`:"Workspace"),console.log();return}let c;e.yes?(c={author:process.env.USER||"RapidKit User",description:o?`${e.template==="nestjs"?"NestJS":"FastAPI"} application generated with RapidKit`:void 0,package_manager:"npm"},console.log(a.gray(`Using default values (--yes flag)
631
+ `))):o?e.template.toLowerCase()==="fastapi"?c=await O.prompt([{type:"input",name:"author",message:"Author name:",default:process.env.USER||"RapidKit User"},{type:"input",name:"description",message:"Project description:",default:"FastAPI service generated with RapidKit"}]):c=await O.prompt([{type:"input",name:"author",message:"Author name:",default:process.env.USER||"RapidKit User"},{type:"input",name:"description",message:"Project description:",default:"NestJS application generated with RapidKit"},{type:"list",name:"package_manager",message:"Package manager:",choices:["npm","yarn","pnpm"],default:"npm"}]):c=await O.prompt([{type:"input",name:"author",message:"Author name:",default:process.env.USER||"RapidKit User"}]),o?await Y(n,{name:t,template:e.template.toLowerCase(),author:c.author,description:c.description,package_manager:c.package_manager,skipGit:e.skipGit,skipInstall:e.skipInstall}):await M(n,{name:t,author:c.author,skipGit:e.skipGit});}catch(i){i instanceof P?(l.error(`
632
+ \u274C ${i.message}`),i.details&&l.warn(`\u{1F4A1} ${i.details}`),l.debug("Error code:",i.code)):(l.error(`
633
+ \u274C An unexpected error occurred:`),console.error(i)),process.exit(1);}finally{x=null;}});K.command("shell <action>").description("Shell helpers (activate virtualenv in current shell)").action(async t=>{t!=="activate"&&(console.log(a.red(`Unknown shell command: ${t}`)),process.exit(1));let e=process.cwd();function i(p){let r=p;for(;;){let d=g.join(r,".rapidkit","context.json");if(v.existsSync(d))return d;let $=g.dirname(r);if($===r)break;r=$;}return null}let n=i(e);function o(p){let r=p;for(;;){let d=g.join(r,".venv"),$=g.join(r,".rapidkit","activate");if(v.existsSync($)||v.existsSync(d))return {venv:d,activateFile:$};let h=g.dirname(r);if(h===r)break;r=h;}return null}let c=o(e);if(!n&&!c&&(console.log(a.red("No RapidKit project found to activate")),process.exit(1)),c){let p=`# RapidKit: activation snippet - eval "$(rapidkit shell activate)"
634
+ VENV='.venv'
635
+ if [ -f "$VENV/bin/activate" ]; then
636
+ . "$VENV/bin/activate"
637
+ elif [ -f "$VENV/bin/activate.fish" ]; then
638
+ source "$VENV/bin/activate.fish"
639
+ fi
640
+ export RAPIDKIT_PROJECT_ROOT="$(pwd)"
641
+ export PATH="$(pwd)/.rapidkit:$(pwd):$PATH"
642
+ `;console.log(a.green.bold(`
643
+ \u2705 Activation snippet \u2014 run the following to activate this project in your current shell:
644
+ `)),console.log(p),console.log(a.gray(`
645
+ \u{1F4A1} After activation you can run: rapidkit dev
646
+ `)),process.exit(0);}try{(await f.readJson(n)).engine!=="pip"&&(console.log(a.yellow("This project is not a pip-based RapidKit project.")),process.exit(1)),console.log(`# RapidKit: activation snippet - eval "$(rapidkit shell activate)"
647
+ VENV='.venv'
648
+ if [ -f "$VENV/bin/activate" ]; then
649
+ . "$VENV/bin/activate"
650
+ elif [ -f "$VENV/bin/activate.fish" ]; then
651
+ source "$VENV/bin/activate.fish"
652
+ fi
653
+ export RAPIDKIT_PROJECT_ROOT="$(pwd)"
654
+ export PATH="$(pwd)/.rapidkit:$(pwd):$PATH"
655
+ `),process.exit(0);}catch{console.log(a.yellow("Could not read project context but found a venv or activation file \u2014 printing activation snippet")),console.log(`# RapidKit: activation snippet - eval "$(rapidkit shell activate)"
656
+ VENV='.venv'
657
+ if [ -f "$VENV/bin/activate" ]; then
658
+ . "$VENV/bin/activate"
659
+ elif [ -f "$VENV/bin/activate.fish" ]; then
660
+ source "$VENV/bin/activate.fish"
661
+ fi
662
+ export RAPIDKIT_PROJECT_ROOT="$(pwd)"
663
+ export PATH="$(pwd):$PATH"
664
+ `),process.exit(0);}});function xe(){console.log(a.white(`Usage: npx rapidkit <name> [options]
665
+ `)),console.log(a.bold("Create a workspace (recommended):")),console.log(a.cyan(" npx rapidkit my-workspace")),console.log(a.cyan(" cd my-workspace")),console.log(a.cyan(" rapidkit create my-api --template fastapi")),console.log(a.cyan(" cd my-api")),console.log(a.cyan(` rapidkit dev
666
+ `)),console.log(a.bold("Or create a project directly:")),console.log(a.cyan(" npx rapidkit my-project --template fastapi")),console.log(a.cyan(` npx rapidkit my-project --template nestjs
667
+ `)),console.log(a.bold("Options:")),console.log(a.gray(" -t, --template <template> Create project with template (fastapi, nestjs)")),console.log(a.gray(" -y, --yes Skip prompts and use defaults")),console.log(a.gray(" --skip-git Skip git initialization")),console.log(a.gray(" --skip-install Skip installing dependencies")),console.log(a.gray(" --debug Enable debug logging")),console.log(a.gray(` --dry-run Show what would be created
668
+ `)),console.log(a.bold("Templates:")),console.log(a.gray(" fastapi FastAPI + Python")),console.log(a.gray(` nestjs NestJS + TypeScript
669
+ `));}process.on("SIGINT",async()=>{if(!U){if(U=true,console.log(a.yellow(`
670
+
671
+ \u26A0\uFE0F Interrupted by user`)),x&&await f.pathExists(x)){console.log(a.gray("Cleaning up partial installation..."));try{await f.remove(x),console.log(a.green("\u2713 Cleanup complete"));}catch(t){l.debug("Cleanup failed:",t);}}process.exit(130);}});process.on("SIGTERM",async()=>{if(!U){if(U=true,l.debug("Received SIGTERM"),x&&await f.pathExists(x))try{await f.remove(x);}catch(t){l.debug("Cleanup failed:",t);}process.exit(143);}});je().then(async t=>{if(!t){let e=process.cwd();try{let i=X(e);if(i&&await f.pathExists(i)){let n=await f.readJson(i),o=process.argv.slice(2)[0];if(n?.engine==="pip"&&o!=="init"){let c=(await import('chalk')).default;console.log(c.yellow(`
672
+ \u26A0\uFE0F This project uses the Python RapidKit engine (pip). The global npm RapidKit CLI will not operate on this project.
673
+ \u{1F4A1} To prepare this project run: 'rapidkit init' (it uses the project's Python toolchain)
674
+
675
+ `)),process.exit(0);}}}catch{}K.parse();}});
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rapidkit",
3
- "version": "0.12.2",
3
+ "version": "0.12.4",
4
4
  "type": "module",
5
5
  "description": "Create RapidKit projects with a single command - The official CLI for RapidKit framework",
6
6
  "keywords": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rapidkit",
3
- "version": "0.12.2",
3
+ "version": "0.12.4",
4
4
  "type": "module",
5
5
  "description": "Create RapidKit projects with a single command - The official CLI for RapidKit framework",
6
6
  "keywords": [
@@ -0,0 +1,3 @@
1
+ {
2
+ "engine": "npm"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "engine": "npm"
3
+ }