rapidkit 0.30.0 → 0.32.0
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 +92 -11
- package/data/modules-embeddings.json +38525 -0
- package/dist/{analyze-NVQUHK5V.js → analyze-ZQHLV2YK.js} +1 -1
- package/dist/{autopilot-release-OLDRCIPK.js → autopilot-release-XRN56SCO.js} +1 -1
- package/dist/chunk-KXTXQODI.js +5 -0
- package/dist/chunk-QCZGNOTH.js +2 -0
- package/dist/chunk-S2FC4GUS.js +3 -0
- package/dist/{chunk-U7XJZHU6.js → chunk-X5KRT2DT.js} +12 -11
- package/dist/{create-RDLT34XT.js → create-6AMYKNEG.js} +73 -63
- package/dist/doctor-SGPUU7UT.js +50 -0
- package/dist/dotnet-webapi-clean-UZXCLWEV.js +357 -0
- package/dist/{gofiber-standard-TFPNBIMS.js → gofiber-standard-QGVZHHCP.js} +6 -6
- package/dist/{gogin-standard-7UJ2OBYL.js → gogin-standard-U746R3B5.js} +6 -6
- package/dist/index.d.ts +4 -2
- package/dist/index.js +185 -186
- package/dist/{springboot-standard-H6GYMH3P.js → springboot-standard-TZ3DKKWG.js} +7 -7
- package/dist/{workspace-2JHFIZ3J.js → workspace-EHYCBFXL.js} +17 -17
- package/dist/workspace-archive-EJIGYKSR.js +3 -0
- package/dist/workspace-contract-4UCEM44I.js +2 -0
- package/dist/workspace-run-OVDAQG4F.js +1 -0
- package/package.json +10 -4
- package/scripts/check-cli-resolution.cjs +69 -0
- package/dist/chunk-SCMT5HXC.js +0 -3
- package/dist/chunk-TYC54P7X.js +0 -4
- package/dist/doctor-DDIR7LBO.js +0 -50
- package/dist/workspace-run-AVX2C5IF.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {b as b$1,c
|
|
1
|
+
import {b as b$1,c}from'./chunk-X5KRT2DT.js';import {b}from'./chunk-AC6KIKII.js';import {promises}from'fs';import g from'path';import r from'chalk';import R from'ora';import {execa}from'execa';var y="21",$="3.5.0",j="2.8.9";function u(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"").replace(/\.{2,}/g,".").split(".").map(p=>p.replace(/^[^a-z]+/,"").replace(/[^a-z0-9]/g,"")).filter(Boolean).join(".")}function _(e,t){return e.replace(/[\r\n\t]+/g," ").trim()||t}function x(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-")}function M(e,t){let s=u(e)||"com.rapidkit.apps",p=u(t)||"service";return `${s}.${p}`}function E(e){return e.replace(/\./g,"/")}function T(){return JSON.stringify({engine:"npm",runtime:"java"},null,2)}function A(e,t){return JSON.stringify({kit_name:"springboot.standard",runtime:"java",module_support:false,project_name:e.project_name,artifact_id:e.artifact_id,group_id:e.group_id,package_name:e.package_name,app_version:e.app_version,created_by:"rapidkit-npm",rapidkit_version:t,created_at:new Date().toISOString()},null,2)}function P(e){return `<?xml version="1.0" encoding="UTF-8"?>
|
|
2
2
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
3
3
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
4
4
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
@@ -687,11 +687,11 @@ class ServiceRuntimeE2ETest {
|
|
|
687
687
|
assertThat(response.getBody()).containsEntry("status", "UP");
|
|
688
688
|
}
|
|
689
689
|
}
|
|
690
|
-
`}async function
|
|
691
|
-
\u26A0 Maven not found in PATH - project will be scaffolded, but init/build commands require Maven 3.9+`)),console.log(
|
|
692
|
-
`));}let
|
|
690
|
+
`}async function ne(e){try{await execa("mvn",["-N","wrapper:wrapper","-Dmaven=3.9.9"],{cwd:e,timeout:12e4});let t=g.join(e,"mvnw");return await promises.stat(t).then(()=>true).catch(()=>false)&&await promises.chmod(t,493),true}catch{return false}}async function le(e,t){let s=x(t.artifact_id||t.project_name)||"service",p=u(t.group_id||"com.rapidkit.apps")||"com.rapidkit.apps",I=u(t.package_name||M(p,s))||"com.rapidkit.apps.service",n={project_name:t.project_name,artifact_id:s,group_id:p,package_name:I,author:_(t.author||"","RapidKit User"),description:_(t.description||"",`Spring Boot service generated with RapidKit - ${t.project_name}`),java_version:t.java_version||y,spring_boot_version:t.spring_boot_version||$,springdoc_version:t.springdoc_version||j,app_version:t.app_version||"0.1.0",port:t.port||"8080",skipGit:t.skipGit??false,skipInstall:t.skipInstall??false},h=b(),l=`${b$1(n.project_name)}Application`,a=E(n.package_name);try{await execa("mvn",["-version"],{timeout:3e3});}catch{console.log(r.yellow(`
|
|
691
|
+
\u26A0 Maven not found in PATH - project will be scaffolded, but init/build commands require Maven 3.9+`)),console.log(r.gray(` Install: https://maven.apache.org/install.html
|
|
692
|
+
`));}let c$1=R(`Generating Spring Boot project: ${n.project_name}...`).start();try{let i=(d,f)=>c(g.join(e,d),f),S=g.join(e,"rapidkit"),b=g.join(e,"rapidkit.cmd");if(await Promise.all([i("pom.xml",P(n)),i(".gitignore",F()),i(".editorconfig",z()),i(".env.example",W(n)),i(".dockerignore",H()),i("Dockerfile",U()),i("docker-compose.yml",G(n)),i(".github/workflows/ci.yml",K(n)),i("README.md",Y(n)),i("src/main/resources/application.yml",N(n)),i("src/test/resources/application.yml",J()),i(`src/main/java/${a}/${l}.java`,C(n,l)),i(`src/main/java/${a}/config/ApplicationInfoProperties.java`,D(n)),i(`src/main/java/${a}/config/OpenApiConfiguration.java`,B(n)),i(`src/main/java/${a}/application/SystemInfoService.java`,O(n)),i(`src/main/java/${a}/api/http/dto/SystemInfoResponse.java`,V(n)),i(`src/main/java/${a}/api/http/SystemInfoController.java`,L(n)),i(`src/main/java/${a}/api/http/ApiExceptionHandler.java`,q(n)),i(`src/test/java/${a}/${l}Tests.java`,ee(n,l)),i(`src/test/java/${a}/api/http/SystemInfoControllerTest.java`,te(n)),i(`src/test/java/${a}/ServiceRuntimeE2ETest.java`,ie(n)),i("scripts/perf-smoke.sh",X(n)),i(".rapidkit/project.json",A(n,h)),i(".rapidkit/context.json",T()),i("rapidkit",Q(n)),i("rapidkit.cmd",Z())]),await promises.chmod(S,493),await promises.chmod(b,493),await promises.chmod(g.join(e,"scripts","perf-smoke.sh"),493),n.skipInstall||await ne(e)||console.log(r.yellow("\u26A0 Maven Wrapper could not be generated automatically. Run `mvn -N wrapper:wrapper -Dmaven=3.9.9` inside the project.")),c$1.succeed(r.green(`Project created at ${e}`)),n.skipInstall)c$1.info(r.gray("Skipped Maven dependency warm-up (--skip-install)."));else try{c$1.start("Resolving Maven dependencies...");let d=g.join(e,process.platform==="win32"?"mvnw.cmd":"mvnw"),f=await promises.stat(d).then(()=>d).catch(()=>"mvn");await execa(f,["-B","-q","-DskipTests","dependency:go-offline"],{cwd:e,timeout:18e4}),c$1.succeed(r.gray("\u2713 maven dependency warm-up completed"));}catch{c$1.warn(r.yellow("\u26A0 Maven dependency warm-up failed - run manually: mvn -B -DskipTests dependency:go-offline"));}if(!n.skipGit)try{await execa("git",["init"],{cwd:e}),await execa("git",["add","-A"],{cwd:e}),await execa("git",["commit","-m","chore: initial scaffold (rapidkit springboot.standard)"],{cwd:e});}catch{console.log(r.yellow("\u26A0 Git initialization failed - continuing without initial commit"));}console.log(r.green(`
|
|
693
693
|
\u2728 Spring Boot project created successfully!
|
|
694
|
-
`)),console.log(
|
|
694
|
+
`)),console.log(r.cyan("\u{1F4C2} Location:"),r.white(e)),console.log(r.cyan(`
|
|
695
695
|
\u{1F680} Get started:
|
|
696
|
-
`)),console.log(
|
|
697
|
-
`)),console.log(
|
|
696
|
+
`)),console.log(r.white(` cd ${n.project_name}`)),console.log(r.white(" ./rapidkit init")),console.log(r.white(` ./rapidkit dev
|
|
697
|
+
`)),console.log(r.gray("Endpoints: /actuator/health, /api/v1/system/info, /docs"));}catch(i){c$1.fail("Failed to create Spring Boot project");try{await promises.rm(e,{recursive:true,force:true});}catch{}throw i}}export{y as DEFAULT_JAVA_VERSION,j as DEFAULT_SPRINGDOC_VERSION,$ as DEFAULT_SPRING_BOOT_VERSION,le as generateSpringBootKit};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {a
|
|
1
|
+
import {a}from'./chunk-VKLL63TL.js';import {c}from'./chunk-NFUXULIF.js';import {j}from'./chunk-Z5LKRG57.js';import {b}from'./chunk-AC6KIKII.js';import {promises}from'fs';import o from'path';import i from'chalk';import S from'ora';import {execa}from'execa';function _(e){let t=o.resolve(e);return process.platform==="win32"?t.toLowerCase():t}function O(e){let t=_(e.path),r=Array.isArray(e.projects)?e.projects:[],a=[],c=new Set;for(let s of r){if(!s||typeof s.name!="string"||typeof s.path!="string")continue;let n=_(s.path);c.has(n)||(c.add(n),a.push({name:s.name,path:n}));}return {name:e.name,path:t,mode:e.mode,projects:a}}function P(e){let t=[],r=new Set;for(let a of e.workspaces||[]){if(!a||typeof a.name!="string"||typeof a.path!="string")continue;let c=O(a);r.has(c.path)||(r.add(c.path),t.push(c));}return {workspaces:t}}async function B(e,t){try{let r=_(e),a=j(),c=o.join(a,"workspaces.json");await promises.mkdir(a,{recursive:true});let s={workspaces:[]};try{let p=await promises.readFile(c,"utf8"),d=JSON.parse(p);d&&Array.isArray(d.workspaces)&&(s=P(d));}catch{}s.workspaces.some(p=>p.path===r)||(s.workspaces.push({name:t,path:r,mode:"full",projects:[]}),await promises.writeFile(c,JSON.stringify(s,null,2)));}catch{console.warn(i.gray("Note: Could not register workspace in shared registry"));}}async function ae(e,t=false){try{let r=_(e),a=j(),c=o.join(a,"workspaces.json"),s={workspaces:[]};try{let m=await promises.readFile(c,"utf8"),y=JSON.parse(m);y&&Array.isArray(y.workspaces)&&(s=P(y));}catch{t||console.log("\u26A0\uFE0F Workspace registry not found");return}let n=s.workspaces.find(m=>m.path===r);if(!n){t||console.log("\u26A0\uFE0F Workspace not registered in registry");return}Array.isArray(n.projects)||(n.projects=[]);let p=0,d=0,u=[e],g=new Set;for(;u.length>0;){let m=u.shift();if(!m||g.has(m))continue;g.add(m);let y=await promises.readdir(m,{withFileTypes:true});for(let w of y){if(!w.isDirectory()||w.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(w.name))continue;let h=o.join(m,w.name),f=_(h),R=o.join(f,".rapidkit","context.json"),k=o.join(f,".rapidkit","project.json");try{let $=false;try{await promises.access(R),$=true;}catch{await promises.access(k),$=true;}if($){let x=o.basename(f);n.projects.some(j=>j.path===f||j.name===x)?d++:(n.projects.push({name:x,path:f}),p++,t||console.log(`\u2714 Added: ${o.relative(e,f)}`));continue}}catch{}u.push(h);}}p>0?(await promises.writeFile(c,JSON.stringify(s,null,2)),t||console.log(`
|
|
2
2
|
\u2705 Synced ${p} project(s) to registry`)):t||console.log(`
|
|
3
|
-
\u2705 All projects already registered (${d} found)`);}catch(r){t||console.error("\u274C Failed to sync projects:",r.message);}}async function
|
|
3
|
+
\u2705 All projects already registered (${d} found)`);}catch(r){t||console.error("\u274C Failed to sync projects:",r.message);}}async function oe(e,t,r){try{let a=_(e),c=_(r),s=j(),n=o.join(s,"workspaces.json"),p={workspaces:[]};try{let g=await promises.readFile(n,"utf8"),m=JSON.parse(g);m&&Array.isArray(m.workspaces)&&(p=P(m));}catch{return}let d=p.workspaces.find(g=>g.path===a);if(!d)return;Array.isArray(d.projects)||(d.projects=[]),d.projects.some(g=>g.path===c||g.name===t)||(d.projects.push({name:t,path:c}),await promises.writeFile(n,JSON.stringify(p,null,2)));}catch{}}async function ne(e,t){let r=S("Creating RapidKit workspace...").start();try{await promises.mkdir(e,{recursive:true}),await promises.mkdir(o.join(e,".rapidkit"),{recursive:true});let a={workspace_name:t.name,author:t.author,rapidkit_version:b(),created_at:new Date().toISOString(),type:"workspace"};await promises.writeFile(o.join(e,".rapidkit","config.json"),JSON.stringify(a,null,2));let{syncWorkspaceFoundationFiles:c}=await import('./create-6AMYKNEG.js');await c(e,{workspaceName:t.name,installMethod:"venv",writeMarker:true,writeGitignore:false,onlyIfMissing:true});let s=T();await promises.writeFile(o.join(e,"rapidkit"),s),await promises.chmod(o.join(e,"rapidkit"),493);let n=z();await promises.writeFile(o.join(e,"rapidkit.cmd"),n);let p=U(t.name);if(await promises.writeFile(o.join(e,"README.md"),p),await promises.writeFile(o.join(e,".gitignore"),`# RapidKit workspace
|
|
4
4
|
.env
|
|
5
5
|
.env.*
|
|
6
6
|
!.env.example
|
|
@@ -15,7 +15,7 @@ Thumbs.db
|
|
|
15
15
|
|
|
16
16
|
# Logs
|
|
17
17
|
*.log
|
|
18
|
-
`),await promises.writeFile(
|
|
18
|
+
`),await promises.writeFile(o.join(e,".rapidkit-workspace"),JSON.stringify({signature:"RAPIDKIT_WORKSPACE",createdBy:"rapidkit-npm",version:b(),createdAt:new Date().toISOString(),name:t.name},null,2)),await J(e),r.succeed("Workspace created!"),!t.skipGit){let u=S("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}),u.succeed("Git repository initialized");}catch{u.warn("Could not initialize git repository");}}await B(e,t.name),console.log(`
|
|
19
19
|
${i.green("\u2728 RapidKit workspace created successfully!")}
|
|
20
20
|
|
|
21
21
|
${i.bold("\u{1F4C2} Workspace structure:")}
|
|
@@ -52,7 +52,7 @@ ${i.bold("\u{1F4DA} Commands:")}
|
|
|
52
52
|
|
|
53
53
|
${i.gray("Alternative: ./rapidkit dev (Windows: .\\rapidkit.cmd dev), make dev")}
|
|
54
54
|
${i.gray("\u{1F4A1} Tip: Install globally (npm i -g rapidkit) to use without npx")}
|
|
55
|
-
`);}catch(
|
|
55
|
+
`);}catch(a){throw r.fail("Failed to create workspace"),a}}function T(){return `#!/usr/bin/env bash
|
|
56
56
|
#
|
|
57
57
|
# RapidKit CLI - Local workspace commands
|
|
58
58
|
# This script provides rapidkit commands within the workspace
|
|
@@ -400,7 +400,7 @@ main() {
|
|
|
400
400
|
print_help
|
|
401
401
|
;;
|
|
402
402
|
version|-v|--version)
|
|
403
|
-
echo "RapidKit CLI (npm workspace) v${b
|
|
403
|
+
echo "RapidKit CLI (npm workspace) v${b()}"
|
|
404
404
|
;;
|
|
405
405
|
*)
|
|
406
406
|
echo -e "\${RED}\u274C Unknown command: $cmd\${NC}"
|
|
@@ -412,7 +412,7 @@ main() {
|
|
|
412
412
|
}
|
|
413
413
|
|
|
414
414
|
main "$@"
|
|
415
|
-
`}function
|
|
415
|
+
`}function z(){return `@echo off
|
|
416
416
|
setlocal enabledelayedexpansion
|
|
417
417
|
|
|
418
418
|
set "SCRIPT_DIR=%~dp0"
|
|
@@ -432,7 +432,7 @@ if %ERRORLEVEL%==0 (
|
|
|
432
432
|
echo [RapidKit] No sh/bash found. Falling back to npx rapidkit.
|
|
433
433
|
npx rapidkit %*
|
|
434
434
|
exit /b %ERRORLEVEL%
|
|
435
|
-
`}function
|
|
435
|
+
`}function U(e){return `# ${e}
|
|
436
436
|
|
|
437
437
|
RapidKit workspace for building API projects.
|
|
438
438
|
|
|
@@ -480,7 +480,7 @@ npx rapidkit dev # Start dev server
|
|
|
480
480
|
|
|
481
481
|
- [RapidKit Documentation](https://rapidkit.dev)
|
|
482
482
|
- [GitHub Repository](https://github.com/Baziar/rapidkit)
|
|
483
|
-
`}async function
|
|
483
|
+
`}async function J(e){let{fileURLToPath:t}=await import('url'),r=t(import.meta.url),a=o.dirname(r),c=o.resolve(a,".."),s=o.join(c,"templates","kits"),n=o.join(e,".rapidkit","templates"),{default:p}=await import('fs-extra');await p.copy(s,n);let d=o.join(c,"templates","generator.js"),u=o.join(e,".rapidkit","generator.js");await p.copy(d,u);}async function se(e,t){let r=t.template==="fastapi",a=r?"FastAPI":"NestJS",c=S(`Creating ${a} project...`).start();try{let{fileURLToPath:s}=await import('url'),n=s(import.meta.url),p=o.dirname(n),d=o.resolve(p,".."),u=r?"fastapi-standard":"nestjs-standard",g=o.join(d,"templates","kits",u);await promises.mkdir(e,{recursive:true});let m={project_name:r?t.name.replace(/-/g,"_").toLowerCase():t.name.replace(/_/g,"-").toLowerCase(),author:t.author,description:t.description||`${a} application generated with RapidKit`,app_version:"0.1.0",license:"MIT",package_manager:t.package_manager||"npm",created_at:new Date().toISOString(),rapidkit_version:b()};await F(g,e,m);let y=r?`# Python
|
|
484
484
|
__pycache__/
|
|
485
485
|
*.py[cod]
|
|
486
486
|
*$py.class
|
|
@@ -548,7 +548,7 @@ Thumbs.db
|
|
|
548
548
|
|
|
549
549
|
# Coverage
|
|
550
550
|
coverage/
|
|
551
|
-
`;if(await promises.writeFile(
|
|
551
|
+
`;if(await promises.writeFile(o.join(e,".gitignore"),y),c.succeed(`${a} project created!`),!t.skipGit){let h=S("Initializing git repository...").start();try{await execa("git",["init"],{cwd:e}),await execa("git",["add","."],{cwd:e}),await execa("git",["commit","-m",`Initial commit: ${a} project via RapidKit`],{cwd:e}),h.succeed("Git repository initialized");}catch{h.warn("Could not initialize git repository");}}if(!t.skipInstall&&!r){let h=t.package_manager||"npm",f=S(`Installing dependencies with ${h}...`).start();try{await execa(h,["install"],{cwd:e}),f.succeed("Dependencies installed");}catch{f.warn(`Could not install dependencies. Run '${h} install' manually.`);}}let w=o.basename(e);console.log(r?`
|
|
552
552
|
${i.green("\u2728 FastAPI project created successfully!")}
|
|
553
553
|
|
|
554
554
|
${i.bold("\u{1F4C2} Project structure:")}
|
|
@@ -564,7 +564,7 @@ ${e}/
|
|
|
564
564
|
\u2514\u2500\u2500 README.md
|
|
565
565
|
|
|
566
566
|
${i.bold("\u{1F680} Get started:")}
|
|
567
|
-
${i.cyan(`cd ${
|
|
567
|
+
${i.cyan(`cd ${w}`)}
|
|
568
568
|
${i.cyan("npx rapidkit init")} ${i.gray("# Install dependencies")}
|
|
569
569
|
${i.cyan("npx rapidkit dev")} ${i.gray("# Start dev server")}
|
|
570
570
|
|
|
@@ -594,7 +594,7 @@ ${e}/
|
|
|
594
594
|
\u2514\u2500\u2500 README.md
|
|
595
595
|
|
|
596
596
|
${i.bold("\u{1F680} Get started:")}
|
|
597
|
-
${i.cyan(`cd ${
|
|
597
|
+
${i.cyan(`cd ${w}`)}
|
|
598
598
|
${t.skipInstall?i.cyan("npx rapidkit init")+i.gray(" # npm install")+`
|
|
599
599
|
`:""}${i.cyan("cp .env.example .env")}
|
|
600
600
|
${i.cyan("npx rapidkit dev")} ${i.gray("# Start dev server")}
|
|
@@ -614,16 +614,16 @@ ${i.bold("\u{1F310} API endpoints:")}
|
|
|
614
614
|
http://localhost:8000/examples/notes # Example API
|
|
615
615
|
|
|
616
616
|
${i.gray("\u{1F4A1} Tip: Install globally (npm i -g rapidkit) to use without npx")}
|
|
617
|
-
`);}catch(s){throw
|
|
617
|
+
`);}catch(s){throw c.fail(`Failed to create ${a} project`),s}}async function F(e,t,r){let a=await promises.readdir(e,{withFileTypes:true});for(let c of a){let s=o.join(e,c.name),n=c.name.replace(/\.j2$/,""),p=o.join(t,n);if(c.isDirectory())await promises.mkdir(p,{recursive:true}),await F(s,p,r);else {let d=await promises.readFile(s,"utf-8");c.name.endsWith(".j2")&&(d=G(d,r)),await promises.writeFile(p,d),(n==="rapidkit"||n==="activate"||n.endsWith(".py")&&p.includes(".rapidkit"))&&await promises.chmod(p,493);}}}function G(e,t){let r=e;for(let[a,c]of Object.entries(t)){let s=new RegExp(`\\{\\{\\s*${a}\\s*\\}\\}`,"g");r=r.replace(s,String(c));let n=new RegExp(`\\{\\{\\s*${a}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\}\\}`,"g");r=r.replace(n,(u,g,m)=>String(c).replace(new RegExp(g,"g"),m));let p=new RegExp(`\\{\\{\\s*${a}\\s*\\|\\s*lower\\s*\\}\\}`,"g");r=r.replace(p,String(c).toLowerCase());let d=new RegExp(`\\{\\{\\s*${a}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\|\\s*lower\\s*\\}\\}`,"g");r=r.replace(d,(u,g,m)=>String(c).replace(new RegExp(g,"g"),m).toLowerCase());}return r}async function ce(){let e=j(),t=o.join(e,"workspaces.json");if(!await promises.stat(t).catch(()=>null)){console.log(i.yellow(`
|
|
618
618
|
\u26A0\uFE0F No workspaces registered yet.
|
|
619
619
|
`)),console.log(i.gray(`Create a workspace with: npx rapidkit <workspace-name>
|
|
620
|
-
`));return}try{let r=await promises.readFile(t,"utf8"),
|
|
620
|
+
`));return}try{let r=await promises.readFile(t,"utf8"),a=JSON.parse(r);if(!a||typeof a!="object"||!Array.isArray(a.workspaces)){console.log(i.yellow(`
|
|
621
621
|
\u26A0\uFE0F Workspace registry is invalid; resetting to empty state.
|
|
622
|
-
`)),await promises.writeFile(t,JSON.stringify({workspaces:[]},null,2));return}let
|
|
622
|
+
`)),await promises.writeFile(t,JSON.stringify({workspaces:[]},null,2));return}let c=P(a),s=[],n=0;for(let g of c.workspaces)await promises.stat(g.path).catch(()=>null)?s.push(g):n+=1;let p={workspaces:s},d=JSON.stringify(a),u=JSON.stringify(p);if(d!==u&&await promises.writeFile(t,JSON.stringify(p,null,2)),!p.workspaces||p.workspaces.length===0){console.log(i.yellow(`
|
|
623
623
|
\u26A0\uFE0F No workspaces registered yet.
|
|
624
|
-
`)),
|
|
624
|
+
`)),n>0&&console.log(i.gray(`Cleaned ${n} stale workspace entr${n===1?"y":"ies"}.
|
|
625
625
|
`));return}console.log(i.bold(`
|
|
626
626
|
\u{1F4E6} Registered RapidKit Workspaces:
|
|
627
|
-
`));for(let
|
|
627
|
+
`));for(let g of p.workspaces)console.log(i.cyan(` ${g.name}`)),console.log(i.gray(` Path: ${g.path}`)),console.log(i.gray(` Projects: ${g.projects?.length||0}`)),console.log();n>0&&console.log(i.gray(`Cleaned ${n} stale workspace entr${n===1?"y":"ies"}.`)),console.log(i.gray(`Total: ${p.workspaces.length} workspace(s)
|
|
628
628
|
`));}catch(r){console.error(i.red(`
|
|
629
|
-
\u274C Failed to read workspace registry`)),console.error(i.gray(String(r)));}}async function
|
|
629
|
+
\u274C Failed to read workspace registry`)),console.error(i.gray(String(r)));}}async function N(e){try{let t=await promises.readFile(e,"utf8");return JSON.parse(t)}catch{return null}}function K(e){return c(e)}async function M(e){return a(e,{skipDirs:new Set(["node_modules","dist","build","target","coverage","htmlcov"]),includeHiddenDirs:false,descendIntoMatchedProjects:true})}async function A(e){try{return (await promises.readdir(e,{withFileTypes:true})).filter(r=>r.isFile()&&r.name.toLowerCase().endsWith(".json")).map(r=>r.name).sort((r,a)=>r.localeCompare(a))}catch{return []}}async function pe(e,t){let r=t?.includePaths===true,a=t?.includeDoctorEvidence!==false,c=t?.includeBlueprint!==false,s=o.resolve(e),n=await N(o.join(s,".rapidkit","workspace.json")),p=typeof n?.workspace_name=="string"&&n.workspace_name.trim()||o.basename(s),d=typeof n?.profile=="string"?n.profile:void 0,u=typeof n?.rapidkit_version=="string"?n.rapidkit_version:void 0,g=await M(s),m=[];for(let k of g){let $=await N(o.join(k,".rapidkit","project.json")),x=o.relative(s,k)||".",D=o.join(k,".rapidkit","reports"),j={name:o.basename(k),relative_path:x,runtime:typeof $?.runtime=="string"?$.runtime:void 0,kit_name:typeof $?.kit_name=="string"?$.kit_name:void 0,modules:Array.isArray($?.modules)?$.modules.filter(E=>typeof E=="string"):void 0};if(r&&(j.absolute_path=k),a){let E=await N(o.join(D,"doctor-last-run.json"));K(E)&&(j.doctor_report=E);}let I=await A(D);I.length>0&&(j.reports=I),m.push(j);}let y=o.join(s,".rapidkit","reports"),w=await A(y),h=await N(o.join(s,".rapidkit","workspace.contract.json")),f={schema_version:"1.1",generated_at:new Date().toISOString(),generated_by:"rapidkit-npm",workspace:{name:p,relative_root:".",profile:d,rapidkit_version:u,...r?{absolute_root:s}:{}},summary:{project_count:m.length,doctor_evidence_included:a,contract_included:!!h},reports:{workspace:w},projects:m,...h?{contract:h}:{}};c&&(f.blueprint={schema_version:"rapidkit.workspace-blueprint.v1",purpose:"portable-reproducibility",workspace:{name:p,profile:d},projects:m.map(k=>({name:k.name,relative_path:k.relative_path,runtime:k.runtime,kit_name:k.kit_name,modules:k.modules??[],recreate_commands:[...k.kit_name?[`npx rapidkit create project ${k.kit_name} ${k.name} --yes --skip-install`]:[],`cd ${k.relative_path}`,"npx rapidkit init","npx rapidkit test"]})),recommended_commands:["npx rapidkit workspace contract verify --strict","npx rapidkit doctor workspace","npx rapidkit workspace run init --json","npx rapidkit workspace run test --strict --json","npx rapidkit readiness --strict --json"]});let R=t?.outputPath?o.resolve(t.outputPath):o.join(y,"share-bundle.json");return await promises.mkdir(o.dirname(R),{recursive:true}),await promises.writeFile(R,JSON.stringify(f,null,2),"utf8"),R}export{se as createProject,ne as createWorkspace,pe as createWorkspaceShareBundle,ce as listWorkspaces,oe as registerProjectInWorkspace,B as registerWorkspace,ae as syncWorkspaceProjects};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import _ from'crypto';import O from'os';import l from'path';import F from'zlib';import u from'fs-extra';var y=".rapidkit/archive-manifest.json",z="workspai.workspace.archive",L=new Set(["__pycache__",".venv","venv","node_modules",".git","dist","build","target",".pytest_cache",".mypy_cache",".ruff_cache","htmlcov",".next",".turbo",".cache"]),M=new Set([".DS_Store","Thumbs.db",".coverage","npm-debug.log","yarn-error.log","pnpm-debug.log"]),N=[/^\.env$/i,/^\.env\.(?!example$|sample$|template$).+/i,/^.*\.pem$/i,/^.*\.key$/i,/^id_rsa$/i,/^id_ed25519$/i];function A(e){return e.replace(/\\/g,"/")}function B(e){return e.replace(/\.rapidkit-archive\.zip$/i,"").replace(/\.zip$/i,"").trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,64)||"imported-workspace"}function j(e){let t=A(e).trim();if(!t||t.startsWith("/")||t.startsWith("~")||/^[a-zA-Z]:\//.test(t)||t.includes("\0"))return false;let r=t.split("/").filter(Boolean);return r.length>0&&!r.some(a=>a===".."||a===".")}function I(e){if(!j(e))throw new Error(`Archive contains an unsafe path: ${e}`)}function Z(e,t){let r=l.relative(t,e);return r===""||!!r&&!r.startsWith("..")&&!l.isAbsolute(r)}function H(e,t){let a=A(e).split("/").filter(Boolean);if(a[0]===".rapidkit"&&["cache","reports"].includes(a[1]||"")||a.some(n=>L.has(n)))return true;let i=a[a.length-1]||"";return M.has(i)||!t?.includeEnv&&N.some(n=>n.test(i))?true:i.endsWith(".pyc")||i.endsWith(".log")}function R(e){return _.createHash("sha256").update(e).digest("hex")}var T=new Uint32Array(256).map((e,t)=>{let r=t;for(let a=0;a<8;a+=1)r=r&1?3988292384^r>>>1:r>>>1;return r>>>0});function b(e){let t=4294967295;for(let r of e)t=T[(t^r)&255]^t>>>8;return (t^4294967295)>>>0}function h(e){let t=Buffer.allocUnsafe(2);return t.writeUInt16LE(e,0),t}function m(e){let t=Buffer.allocUnsafe(4);return t.writeUInt32LE(e>>>0,0),t}function V(e){let t=Math.max(e.getFullYear(),1980),r=e.getHours()<<11|e.getMinutes()<<5|Math.floor(e.getSeconds()/2),a=t-1980<<9|e.getMonth()+1<<5|e.getDate();return {time:r,date:a}}async function C(e,t,r,a){let i=await u.readdir(t,{withFileTypes:true});for(let n of i){let s=l.join(t,n.name),c=A(l.relative(e,s));if(!(!c||H(c,a))){if(n.isDirectory()){await C(e,s,r,a);continue}n.isFile()&&r.push({relativePath:c,fullPath:s});}}}async function K(e){let t=l.join(e,".rapidkit","workspace.json");try{let r=await u.readJson(t);if(typeof r.workspace_name=="string"&&r.workspace_name.trim())return r.workspace_name.trim();if(typeof r.name=="string"&&r.name.trim())return r.name.trim()}catch{}return l.basename(l.resolve(e))}async function q(e,t,r){let a=[];await C(e,e,a,r);let i=[];for(let s of a.sort((c,p)=>c.relativePath.localeCompare(p.relativePath))){let c=await u.readFile(s.fullPath);if(c.length>=4294967295)throw new Error(`File is too large for portable workspace archive: ${s.relativePath}`);t.files.push({path:s.relativePath,size:c.length,sha256:R(c)}),i.push({name:s.relativePath,data:c,crc32:b(c),size:c.length,offset:0});}let n=Buffer.from(`${JSON.stringify(t,null,2)}
|
|
2
|
+
`,"utf-8");return i.push({name:y,data:n,crc32:b(n),size:n.length,offset:0}),i}function J(e,t=new Date){let r=[],a=[],i=0,n=V(t);for(let f of e){let d=Buffer.from(f.name,"utf-8");f.offset=i;let w=Buffer.concat([m(67324752),h(20),h(2048),h(0),h(n.time),h(n.date),m(f.crc32),m(f.size),m(f.size),h(d.length),h(0),d]);r.push(w,f.data),i+=w.length+f.data.length;}let s=i;for(let f of e){let d=Buffer.from(f.name,"utf-8"),w=Buffer.concat([m(33639248),h(20),h(20),h(2048),h(0),h(n.time),h(n.date),m(f.crc32),m(f.size),m(f.size),h(d.length),h(0),h(0),h(0),h(0),m(0),m(f.offset),d]);a.push(w),i+=w.length;}let c=i-s,p=Buffer.concat([m(101010256),h(0),h(0),h(e.length),h(e.length),m(c),m(s),h(0)]);return Buffer.concat([...r,...a,p])}async function he(e){let t=l.resolve(e.workspacePath);if(!await u.pathExists(l.join(t,".rapidkit-workspace")))throw new Error("Workspace export requires a RapidKit workspace root with .rapidkit-workspace.");let r=await K(t),a=l.resolve(e.outputPath||`${B(r)}.rapidkit-archive.zip`),i={version:1,kind:z,workspaceName:r,exportedAt:(e.now??new Date).toISOString(),exportedBy:"rapidkit-npm",archiveFormat:"zip-store",security:{envFilesIncluded:e.includeEnv===true,excludedByDefault:[".git","node_modules",".venv","dist","build","target",".env","*.pem","*.key","*.log"]},files:[]},n=await q(t,i,{includeEnv:e.includeEnv===true}),s=J(n,e.now??new Date);return await u.ensureDir(l.dirname(a)),await u.writeFile(a,s),{archivePath:a,manifest:i,bytesWritten:s.length}}function X(e){let t=Math.max(0,e.length-65535-22);for(let r=e.length-22;r>=t;r-=1)if(e.readUInt32LE(r)===101010256)return r;throw new Error("Invalid ZIP archive: end of central directory not found.")}function G(e){let t=X(e),r=e.readUInt16LE(t+10),a=e.readUInt32LE(t+16),i=[],n=a;for(let s=0;s<r;s+=1){if(e.readUInt32LE(n)!==33639248)throw new Error("Invalid ZIP archive: central directory is corrupted.");let c=e.readUInt16LE(n+10);if(c!==0&&c!==8)throw new Error("Unsupported ZIP archive: only stored/deflated entries are supported by RapidKit npm.");let p=e.readUInt32LE(n+20),f=e.readUInt32LE(n+24),d=e.readUInt16LE(n+28),w=e.readUInt16LE(n+30),o=e.readUInt16LE(n+32),v=e.readUInt32LE(n+42),g=e.subarray(n+46,n+46+d).toString("utf-8");I(g);let D=g.endsWith("/");if(e.readUInt32LE(v)!==67324752)throw new Error(`Invalid ZIP archive: local header missing for ${g}.`);let S=e.readUInt16LE(v+26),$=e.readUInt16LE(v+28),x=v+30+S+$,k=e.subarray(x,x+p);if(k.length!==p)throw new Error(`Invalid ZIP archive: size mismatch for ${g}.`);if(D){if(p!==0||f!==0)throw new Error(`Invalid ZIP archive: directory entry contains data for ${g}.`);n+=46+d+w+o;continue}let W=c===8?F.inflateRawSync(k):k;if(W.length!==f)throw new Error(`Invalid ZIP archive: inflated size mismatch for ${g}.`);i.push({name:g,data:W,size:f}),n+=46+d+w+o;}return i}async function Y(e){if(/^https?:\/\//i.test(e)){let t=await fetch(e);if(!t.ok)throw new Error(`Failed to download workspace archive: HTTP ${t.status}`);let r=Buffer.from(await t.arrayBuffer()),a=await u.mkdtemp(l.join(O.tmpdir(),"rapidkit-workspace-archive-")),i=l.join(a,"workspace.rapidkit-archive.zip");return await u.writeFile(i,r),{archivePath:i,cleanup:a}}return {archivePath:l.resolve(e)}}function Q(e){let t=e.find(a=>a.name===y);if(!t)return null;let r=JSON.parse(t.data.toString("utf-8"));if(r.kind!==z)throw new Error("Archive manifest kind is not a RapidKit/Workspai workspace archive.");return r}async function E(e){let t=await Y(e);try{let r=await u.readFile(t.archivePath),a=G(r),i=Q(a);if(!i)throw new Error("Workspace archive is missing .rapidkit/archive-manifest.json.");return {archivePath:t.archivePath,entries:a,manifest:i,cleanup:t.cleanup}}catch(r){throw t.cleanup&&await u.remove(t.cleanup).catch(()=>{}),r}}async function P(e){e.cleanup&&await u.remove(e.cleanup).catch(()=>{});}async function ee(e){let t=await E(e.archivePathOrUrl);try{let r=new Map(t.entries.filter(i=>i.name!==y).map(i=>[i.name,i])),a=t.manifest.files.map(i=>({path:i.path,size:r.get(i.path)?.size??i.size,hasChecksum:typeof i.sha256=="string"&&i.sha256.length>0}));return {archivePath:t.archivePath,manifest:t.manifest,fileCount:a.length,totalBytes:a.reduce((i,n)=>i+n.size,0),entries:a}}finally{await P(t);}}async function U(e){let t=await E(e.archivePathOrUrl);try{let r=new Map(t.entries.filter(o=>o.name!==y).map(o=>[o.name,o])),a=new Set(t.manifest.files.map(o=>o.path)),i=[...r.keys()].filter(o=>!a.has(o)).sort(),n=[],s=[],c=[],p=0;for(let o of t.manifest.files){I(o.path);let v=r.get(o.path);if(!v){n.push(o.path);continue}let g={size:v.size,sha256:R(v.data)};if(v.size!==o.size){c.push({path:o.path,expected:{size:o.size,sha256:o.sha256},actual:g});continue}if(!o.sha256){s.push(o.path);continue}if(g.sha256!==o.sha256){c.push({path:o.path,expected:{size:o.size,sha256:o.sha256},actual:g});continue}p+=1;}let f=e.requireChecksums===true&&s.length>0,d=n.length>0||c.length>0||f||i.length>0,w=s.length>0;return {archivePath:t.archivePath,manifest:t.manifest,status:d?"failed":w?"warning":"passed",fileCount:t.manifest.files.length,totalBytes:t.manifest.files.reduce((o,v)=>o+v.size,0),verifiedFiles:p,missingChecksumFiles:s,missingArchiveEntries:n,extraArchiveEntries:i,mismatches:c}}finally{await P(t);}}async function fe(e){let t=await ee({archivePathOrUrl:e.archivePathOrUrl}),r=await U({archivePathOrUrl:e.archivePathOrUrl,requireChecksums:e.strict===true}),a=[],i=[];a.push({id:"manifest-present",status:"passed",message:`Archive manifest found for workspace "${t.manifest.workspaceName}".`}),a.push({id:"integrity",status:r.status,message:r.status==="passed"?`Verified ${r.verifiedFiles}/${r.fileCount} files.`:"Archive integrity verification did not fully pass."});let n=t.manifest.security?.envFilesIncluded===true;a.push({id:"secrets-policy",status:n?"warning":"passed",message:n?"Archive manifest says environment/private files were intentionally included.":"Archive manifest excludes environment/private files by default."}),n&&i.push("Share this archive only through trusted internal channels."),r.missingChecksumFiles.length>0&&i.push("Re-export the archive with the latest RapidKit/Workspai tooling."),r.mismatches.length>0&&i.push("Reject this archive and request a fresh export from the owner."),(r.extraArchiveEntries.length>0||r.missingArchiveEntries.length>0)&&i.push("Regenerate the archive so ZIP entries and manifest entries match."),e.strict===true&&r.status!=="passed"&&i.push("Do not hydrate this archive in strict or production workflows.");let s=a.some(p=>p.status==="failed"),c=a.some(p=>p.status==="warning");return {archivePath:t.archivePath,status:s?"failed":c?"warning":"passed",workspaceName:t.manifest.workspaceName,fileCount:t.fileCount,totalBytes:t.totalBytes,checks:a,recommendedActions:i}}async function te(e,t,r){if(!await u.pathExists(e)){r||await u.ensureDir(e);return}if((await u.readdir(e)).length>0&&!t)throw new Error(`Output directory is not empty: ${e}. Use --force to overwrite.`);r||await u.emptyDir(e);}async function le(e){let t=await E(e.archivePathOrUrl);try{let r=await U({archivePathOrUrl:t.archivePath,requireChecksums:e.strict===true});if(r.status==="failed"){let s=[r.missingArchiveEntries.length?`missing entries: ${r.missingArchiveEntries.join(", ")}`:"",r.extraArchiveEntries.length?`unexpected entries: ${r.extraArchiveEntries.join(", ")}`:"",r.mismatches.length?`checksum/size mismatches: ${r.mismatches.map(c=>c.path).join(", ")}`:"",r.missingChecksumFiles.length&&e.strict===true?`missing checksums: ${r.missingChecksumFiles.join(", ")}`:""].filter(Boolean).join("; ");throw new Error(`Workspace archive verification failed${s?` (${s})`:""}.`)}if(r.status==="warning"&&e.strict===true)throw new Error(`Workspace archive verification requires checksums for every file: ${r.missingChecksumFiles.join(", ")}`);let a=t.entries,i=t.manifest,n=l.resolve(e.outputPath||B(i.workspaceName||"imported-workspace"));await te(n,e.force===true,e.dryRun===true);for(let s of a){if(s.name===y)continue;let c=l.resolve(n,s.name);if(!Z(c,n))throw new Error(`Archive entry escapes output directory: ${s.name}`);e.dryRun||(await u.ensureDir(l.dirname(c)),await u.writeFile(c,s.data));}return {archivePath:t.archivePath,outputPath:n,dryRun:e.dryRun===true,manifest:i,files:a.filter(s=>s.name!==y).map(s=>({path:s.name,size:s.size}))}}finally{await P(t);}}
|
|
3
|
+
export{z as WORKSPACE_ARCHIVE_KIND,y as WORKSPACE_ARCHIVE_MANIFEST_PATH,fe as doctorWorkspaceArchive,he as exportWorkspaceArchive,le as hydrateWorkspaceArchive,ee as inspectWorkspaceArchive,j as isSafeArchiveEntryName,B as sanitizeWorkspaceArchiveName,H as shouldExcludeWorkspaceArchivePath,U as verifyWorkspaceArchive};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import u from'path';import l from'fs-extra';var w=".rapidkit/workspace.contract.json",h=1;function C(r){return r.replace(/\\/g,"/")}function v(r){let n=C(r).trim();return !n||n.startsWith("/")||n.startsWith("~")||/^[a-zA-Z]:\//.test(n)||n.includes("\0")?false:!n.split("/").filter(Boolean).some(e=>e===".."||e===".")}function b(r){return Array.isArray(r)?r.filter(n=>typeof n=="string"&&n.trim().length>0):[]}async function W(r){let n=u.join(r,".rapidkit","workspace.json");try{let e=await l.readJson(n);return {name:typeof e.workspace_name=="string"&&e.workspace_name.trim()||typeof e.name=="string"&&e.name.trim()||u.basename(r),profile:typeof e.profile=="string"?e.profile:void 0}}catch{return {name:u.basename(r)}}}async function A(r){let n=[],e=[r],s=new Set,i=new Set([".git","node_modules",".venv","venv","dist","build","target",".next",".turbo",".cache"]);for(;e.length>0;){let c=e.shift();if(!c||s.has(c))continue;s.add(c);let p=u.join(c,".rapidkit","project.json");if(await l.pathExists(p)){n.push(p);continue}let o;try{o=await l.readdir(c,{withFileTypes:true});}catch{continue}for(let t of o)!t.isDirectory()||i.has(t.name)||e.push(u.join(c,t.name));}return n.sort()}function S(r){let n=(r||"").toLowerCase();if(n.includes("fastapi"))return "fastapi";if(n.includes("nestjs"))return "nestjs";if(n.includes("springboot"))return "springboot";if(n.includes("gofiber"))return "fiber";if(n.includes("gogin"))return "gin"}function $(r,n){let e=(r||"").toLowerCase(),s=(n||"").toLowerCase();return e.includes("fastapi")?8e3:e.includes("nestjs")?3e3:e.includes("springboot")?8080:e.includes("gofiber")?3e3:e.includes("gogin")?8080:s==="node"?3e3:s==="python"?8e3:s==="java"||s==="go"?8080:null}function E(r,n){let e=r;for(;n.has(e)&&e<65535;)e+=1;return e}function k(r,n,e){let s=$(n.kit,n.runtime),i=r?.ports||[],c=i.length>0?i:s?[{name:"http",port:E(s,e),protocol:"http"}]:[];for(let t of c)e.add(t.port);let p={...n,...r,slug:r?.slug||n.slug,relativePath:r?.relativePath||n.relativePath,runtime:r?.runtime||n.runtime,framework:r?.framework||n.framework,kit:r?.kit||n.kit,modules:r?.modules?.length?r.modules:n.modules,ports:c,contracts:{owns:r?.contracts?.owns||[],apis:r?.contracts?.apis||[],publishes:r?.contracts?.publishes||[],consumes:r?.contracts?.consumes||[],dependsOn:r?.contracts?.dependsOn||[],env:r?.contracts?.env||[]}},o=JSON.stringify(r||null)!==JSON.stringify(p);return {project:p,changed:o}}async function j(r){let n=u.resolve(r.workspacePath),e=await W(n),s=await A(n),i=[];for(let c of s){let p=u.dirname(u.dirname(c)),o=C(u.relative(n,p)),t=await l.readJson(c),a=typeof t.kit_name=="string"&&t.kit_name||typeof t.kit=="string"&&t.kit||void 0,f=typeof t.framework=="string"&&t.framework||S(a);i.push({slug:o||u.basename(p),relativePath:o,runtime:typeof t.runtime=="string"?t.runtime:void 0,framework:f,kit:a,modules:b(t.modules),ports:[],contracts:{owns:[],apis:[],publishes:[],consumes:[],dependsOn:[],env:[]}});}return {schemaVersion:h,kind:"rapidkit.workspace.contract",generatedAt:(r.now??new Date).toISOString(),workspace:e,projects:i}}async function _(r){let n=u.resolve(r.outputPath||u.join(r.workspacePath,w));if(await l.pathExists(n)&&r.force!==true)throw new Error(`Workspace contract already exists: ${n}. Use --force to overwrite.`);let e=await j({workspacePath:r.workspacePath,now:r.now}),s=new Set,i={...e,projects:e.projects.map(c=>k(void 0,c,s).project)};return await l.ensureDir(u.dirname(n)),await l.writeJson(n,i,{spaces:2}),{contractPath:n,contract:i}}async function J(r){let n=u.resolve(r.workspacePath),e=u.join(n,w),s=await j({workspacePath:n,now:r.now}),i=await l.pathExists(e)?await l.readJson(e):null,c=new Map((i?.projects||[]).map(d=>[d.slug,d])),p=new Set,o=[],t=[],a=[];for(let d of s.projects){let g=c.get(d.slug),P=k(g,d,p);g?P.changed&&t.push(d.slug):o.push(d.slug),a.push(P.project),c.delete(d.slug);}for(let d of c.values()){let g=k(d,d,p);a.push(g.project);}let f={schemaVersion:h,kind:"rapidkit.workspace.contract",generatedAt:(r.now??new Date).toISOString(),workspace:{...s.workspace,...i?.workspace||{},name:i?.workspace?.name||s.workspace.name},projects:a.sort((d,g)=>d.slug.localeCompare(g.slug))};await l.ensureDir(u.dirname(e)),await l.writeJson(e,f,{spaces:2});let m=await O({workspacePath:n});return {contractPath:e,contract:f,addedProjects:o,updatedProjects:t,verification:m}}async function y(r){let n=u.resolve(r.contractPath||u.join(r.workspacePath,w)),e=await l.readJson(n);return {contractPath:n,contract:e}}async function D(r){let{contractPath:n,contract:e}=await y(r),s=e.projects.map(t=>({id:t.slug,label:t.slug,relativePath:t.relativePath,runtime:t.runtime,framework:t.framework,kit:t.kit,modules:t.modules,ports:t.ports,apis:t.contracts.apis,owns:t.contracts.owns,env:t.contracts.env})),i=new Set(s.map(t=>t.id)),c=new Map,p=[];for(let t of e.projects){for(let a of t.contracts.dependsOn||[])i.has(a)&&p.push({from:a,to:t.slug,type:"dependency",label:"dependsOn"});for(let a of t.contracts.publishes||[])c.has(a)||c.set(a,new Set),c.get(a)?.add(t.slug);}for(let t of e.projects)for(let a of t.contracts.consumes||[]){let f=c.get(a);if(f)for(let m of f)m!==t.slug&&p.push({from:m,to:t.slug,type:"event",label:a});}let o={schemaVersion:1,kind:"rapidkit.workspace.contract.graph",workspace:e.workspace,generatedAt:new Date().toISOString(),nodes:s.sort((t,a)=>t.id.localeCompare(a.id)),edges:p.sort((t,a)=>`${t.from}:${t.to}:${t.type}:${t.label}`.localeCompare(`${a.from}:${a.to}:${a.type}:${a.label}`)),summary:{projectCount:s.length,dependencyEdges:p.filter(t=>t.type==="dependency").length,eventEdges:p.filter(t=>t.type==="event").length,portCount:s.reduce((t,a)=>t+a.ports.length,0),apiCount:s.reduce((t,a)=>t+a.apis.length,0)}};return {contractPath:n,graph:o}}async function O(r){let{contractPath:n,contract:e}=await y(r),s=[],i=[];e.kind!=="rapidkit.workspace.contract"&&s.push("Contract kind must be rapidkit.workspace.contract."),e.schemaVersion!==h&&s.push(`Contract schemaVersion must be ${h}.`),e.workspace?.name||s.push("Contract workspace.name is required."),Array.isArray(e.projects)||s.push("Contract projects must be an array.");let c=new Set,p=new Map;for(let o of e.projects||[]){if(!o.slug){s.push("Every project must declare slug.");continue}c.has(o.slug)&&s.push(`Duplicate project slug: ${o.slug}.`),c.add(o.slug),o.relativePath?v(o.relativePath)||s.push(`Project ${o.slug} declares unsafe relativePath: ${o.relativePath}.`):s.push(`Project ${o.slug} must declare relativePath.`);for(let t of o.ports||[]){(!Number.isInteger(t.port)||t.port<1||t.port>65535)&&s.push(`Project ${o.slug} declares invalid port: ${t.port}.`);let a=p.get(t.port);a&&s.push(`Port ${t.port} is claimed by both ${a} and ${o.slug}.`),p.set(t.port,o.slug);}for(let t of o.contracts?.apis||[])(!t.name?.trim()||!t.basePath?.startsWith("/"))&&s.push(`Project ${o.slug} declares invalid API contract.`);for(let t of [...o.contracts?.publishes||[],...o.contracts?.consumes||[]])t.trim()||s.push(`Project ${o.slug} declares an empty event contract.`);for(let t of o.contracts?.env||[])/^[A-Z_][A-Z0-9_]*$/.test(t)||s.push(`Project ${o.slug} declares invalid env contract: ${t}.`);for(let t of o.contracts?.dependsOn||[])c.has(t);}for(let o of e.projects||[])for(let t of o.contracts?.dependsOn||[])c.has(t)||s.push(`Project ${o.slug} depends on unknown project: ${t}.`);return i.push({id:"schema",status:e.kind==="rapidkit.workspace.contract"&&e.schemaVersion===h?"passed":"failed",message:"Contract schema and kind are valid."}),i.push({id:"projects",status:Array.isArray(e.projects)?"passed":"failed",message:`Contract declares ${Array.isArray(e.projects)?e.projects.length:0} project(s).`}),i.push({id:"ports",status:s.some(o=>o.toLowerCase().includes("port"))?"failed":"passed",message:"Project port declarations are valid and collision-free."}),i.push({id:"dependencies",status:s.some(o=>o.includes("depends on unknown project"))?"failed":"passed",message:"Project dependencies point to known project slugs."}),i.push({id:"contracts",status:s.some(o=>o.includes("unsafe relativePath")||o.includes("invalid API contract")||o.includes("event contract")||o.includes("env contract"))?"failed":"passed",message:"Project path, API, event, and env contracts are valid."}),{status:s.length>0?"failed":"passed",contractPath:n,projectCount:Array.isArray(e.projects)?e.projects.length:0,checks:i,violations:s}}
|
|
2
|
+
export{w as WORKSPACE_CONTRACT_PATH,h as WORKSPACE_CONTRACT_SCHEMA_VERSION,j as buildWorkspaceContract,D as buildWorkspaceContractGraph,y as readWorkspaceContract,J as syncWorkspaceContract,O as verifyWorkspaceContract,_ as writeWorkspaceContract};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{a as runWorkspaceStage}from'./chunk-S2FC4GUS.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rapidkit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.32.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Official CLI for RapidKit, an open-source workspace platform that standardizes how teams build, scale, and deploy backend services.",
|
|
6
6
|
"keywords": [
|
|
@@ -29,12 +29,14 @@
|
|
|
29
29
|
"url": "git+https://github.com/rapidkitlabs/rapidkit-npm.git"
|
|
30
30
|
},
|
|
31
31
|
"bin": {
|
|
32
|
-
"rapidkit": "dist/index.js"
|
|
32
|
+
"rapidkit": "dist/index.js",
|
|
33
|
+
"rapidkit-npm": "dist/index.js"
|
|
33
34
|
},
|
|
34
35
|
"files": [
|
|
35
36
|
"dist",
|
|
36
37
|
"data/modules-embeddings.json",
|
|
37
|
-
"scripts/enforce-package-manager.cjs"
|
|
38
|
+
"scripts/enforce-package-manager.cjs",
|
|
39
|
+
"scripts/check-cli-resolution.cjs"
|
|
38
40
|
],
|
|
39
41
|
"publishConfig": {
|
|
40
42
|
"registry": "https://registry.npmjs.org",
|
|
@@ -42,6 +44,7 @@
|
|
|
42
44
|
},
|
|
43
45
|
"scripts": {
|
|
44
46
|
"preinstall": "node scripts/enforce-package-manager.cjs",
|
|
47
|
+
"postinstall": "node scripts/check-cli-resolution.cjs",
|
|
45
48
|
"sync-kits": "bash scripts/sync-kits.sh",
|
|
46
49
|
"build": "tsup",
|
|
47
50
|
"build:watch": "tsup --watch",
|
|
@@ -61,11 +64,14 @@
|
|
|
61
64
|
"test:coverage": "vitest run --coverage",
|
|
62
65
|
"test:prepare-embeddings": "npx tsx scripts/generate-mock-embeddings.ts",
|
|
63
66
|
"generate-embeddings": "npx tsx src/ai/generate-embeddings.ts",
|
|
64
|
-
"
|
|
67
|
+
"verify:package-cli": "node scripts/verify-package-cli.mjs",
|
|
68
|
+
"prepack": "npm run build && npm run test:prepare-embeddings && npm run verify:package-cli",
|
|
65
69
|
"test:e2e": "vitest run src/__tests__/e2e.test.ts",
|
|
66
70
|
"test:scenarios": "bash scripts/scenario-matrix-local.sh",
|
|
67
71
|
"test:scenarios:full": "RAPIDKIT_SCENARIO_FULL_BOOTSTRAP=1 bash scripts/scenario-matrix-local.sh",
|
|
68
72
|
"test:scenarios:docker": "bash scripts/scenario-matrix.sh",
|
|
73
|
+
"test:runtime-matrix": "node scripts/runtime-acceptance-matrix.mjs",
|
|
74
|
+
"test:runtime-matrix:full": "node scripts/runtime-acceptance-matrix.mjs --full",
|
|
69
75
|
"lint": "eslint src --ext .ts",
|
|
70
76
|
"lint:fix": "eslint src --ext .ts --fix",
|
|
71
77
|
"format": "prettier --write \"src/**/*.ts\"",
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const { execFileSync } = require('node:child_process');
|
|
4
|
+
const path = require('node:path');
|
|
5
|
+
const process = require('node:process');
|
|
6
|
+
|
|
7
|
+
function isWindows() {
|
|
8
|
+
return process.platform === 'win32';
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function npmGlobalBinDir() {
|
|
12
|
+
const prefix = process.env.npm_config_prefix;
|
|
13
|
+
if (!prefix) return null;
|
|
14
|
+
return isWindows() ? prefix : path.join(prefix, 'bin');
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function resolveRapidkitCandidates() {
|
|
18
|
+
const command = isWindows() ? 'where' : 'which';
|
|
19
|
+
const args = isWindows() ? ['rapidkit'] : ['-a', 'rapidkit'];
|
|
20
|
+
try {
|
|
21
|
+
return execFileSync(command, args, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] })
|
|
22
|
+
.split(/\r?\n/)
|
|
23
|
+
.map((line) => line.trim())
|
|
24
|
+
.filter(Boolean);
|
|
25
|
+
} catch {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function normalize(value) {
|
|
31
|
+
return value.replace(/\\/g, '/').toLowerCase();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function main() {
|
|
35
|
+
// The collision is painful mostly on Windows because Python creates rapidkit.exe
|
|
36
|
+
// under Python/Scripts while npm creates rapidkit.cmd under the npm prefix.
|
|
37
|
+
if (!isWindows()) return;
|
|
38
|
+
|
|
39
|
+
const candidates = resolveRapidkitCandidates();
|
|
40
|
+
if (candidates.length <= 1) return;
|
|
41
|
+
|
|
42
|
+
const npmBin = npmGlobalBinDir();
|
|
43
|
+
const expectedPrefix = npmBin ? normalize(npmBin) : null;
|
|
44
|
+
const first = normalize(candidates[0]);
|
|
45
|
+
const npmShimIsFirst = expectedPrefix ? first.startsWith(expectedPrefix) : false;
|
|
46
|
+
|
|
47
|
+
if (npmShimIsFirst) return;
|
|
48
|
+
|
|
49
|
+
const npmCandidate = expectedPrefix
|
|
50
|
+
? candidates.find((candidate) => normalize(candidate).startsWith(expectedPrefix))
|
|
51
|
+
: null;
|
|
52
|
+
|
|
53
|
+
console.warn('');
|
|
54
|
+
console.warn('[rapidkit] Windows CLI resolution warning');
|
|
55
|
+
console.warn('The first `rapidkit` command on PATH is not the npm global shim.');
|
|
56
|
+
console.warn(`First match: ${candidates[0]}`);
|
|
57
|
+
if (npmCandidate) {
|
|
58
|
+
console.warn(`npm shim: ${npmCandidate}`);
|
|
59
|
+
}
|
|
60
|
+
console.warn('');
|
|
61
|
+
console.warn('This can make `rapidkit doctor workspace`, `rapidkit workspace ...`,');
|
|
62
|
+
console.warn('`rapidkit bootstrap`, and other npm-owned commands route to the Python engine.');
|
|
63
|
+
console.warn('');
|
|
64
|
+
console.warn('Fix: move the npm global bin directory before Python Scripts in PATH, or run:');
|
|
65
|
+
console.warn(' npx --yes --package rapidkit rapidkit <command>');
|
|
66
|
+
console.warn('');
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
main();
|
package/dist/chunk-SCMT5HXC.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import {d,e,a as a$1,b}from'./chunk-TYC54P7X.js';import {a}from'./chunk-VKLL63TL.js';import j from'fs';import g from'path';import R from'chalk';import {execa}from'execa';var ce={"python-fastapi":{runtime:"python",framework:"FastAPI",markers:["pyproject.toml","fastapi"],commands:{init:"python -m pip install -e .",test:"pytest",build:"python -m build",start:"uvicorn main:app --reload"},errorPatterns:{setup:["ModuleNotFoundError","No module named","pip: command not found"],"test-failure":["FAILED","ERROR","test session started"],dependency:["ImportError","missing.*dependency"],runtime:["TypeError","AttributeError","ValueError"],timeout:["timeout","Timeout","timed out"],unknown:[]},healthCheck:{stage:"start",type:"http",value:"http://localhost:8000/docs"},validation:{command:"python -m pip list | grep fastapi",error:"FastAPI not installed"}},"python-django":{runtime:"python",framework:"Django",markers:["manage.py","django"],commands:{init:"python manage.py migrate",test:"python manage.py test",build:"python manage.py collectstatic --noinput",start:"python manage.py runserver 0.0.0.0:8000"},errorPatterns:{setup:["ModuleNotFoundError","ProgrammingError.*migrate"],"test-failure":["FAILED","ERROR","Ran.*test"],dependency:["ImportError","missing.*dependency"],runtime:["DatabaseError","ImproperlyConfigured"],timeout:["timeout","Timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:8e3},dependencies:["init"]},"node-nestjs":{runtime:"node",framework:"NestJS",markers:["package.json","@nestjs/core"],commands:{init:"npm install",test:"npm run test",build:"npm run build",start:"npm run start"},errorPatterns:{setup:["npm ERR!","ENOENT","not found"],"test-failure":["Tests.*failed","FAIL","fail.*test"],dependency:["Cannot find module","ERR_MODULE_NOT_FOUND"],runtime:["TypeError","Error: ","ReferenceError"],timeout:["timeout","TIMEOUT"],unknown:[]},healthCheck:{stage:"start",type:"port",value:3e3}},"node-express":{runtime:"node",framework:"Express",markers:["package.json","express"],commands:{init:"npm install",test:"npm run test",build:"npm run build",start:"npm start"},errorPatterns:{setup:["npm ERR!","ENOENT"],"test-failure":["failed","FAIL"],dependency:["Cannot find module"],runtime:["Error","TypeError"],timeout:["timeout"],unknown:[]}},"go-fiber":{runtime:"go",framework:"Fiber",markers:["go.mod","fiber"],commands:{init:"go mod download && go mod tidy",test:"go test ./...",build:"go build -o app .",start:"./app"},errorPatterns:{setup:["go: .*not found","cannot find","go mod tidy"],"test-failure":["FAIL","--- FAIL"],dependency:["missing.*module"],runtime:["panic","fatal","Error"],timeout:["timeout","context deadline"],unknown:[]},dependencies:["init"]},"go-gin":{runtime:"go",framework:"Gin",markers:["go.mod","gin-gonic"],commands:{init:"go mod download && go mod tidy",test:"go test ./...",build:"go build -o app .",start:"./app"},errorPatterns:{setup:["go: .*not found"],"test-failure":["FAIL"],dependency:["missing.*module"],runtime:["panic"],timeout:["timeout"],unknown:[]}},"java-springboot":{runtime:"java",framework:"Spring Boot",markers:["pom.xml","build.gradle","spring-boot"],commands:{init:"mvn dependency:go-offline",test:"mvn test",build:"mvn package -DskipTests",start:"mvn spring-boot:run"},errorPatterns:{setup:["\\[ERROR\\]","BUILD FAILURE","missing dependencies"],"test-failure":["\\[ERROR\\] Tests run:","BUILD FAILURE"],dependency:["missing.*dependency"],runtime:["Exception","Error","NullPointerException"],timeout:["timeout","Timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:8080}},"php-laravel":{runtime:"php",framework:"Laravel",markers:["composer.json","artisan","app/Models"],commands:{init:"composer install && php artisan migrate:fresh --seed",test:"php artisan test",build:"php artisan config:cache && php artisan route:cache && php artisan view:cache",start:"php artisan serve --host=0.0.0.0 --port=8000"},errorPatterns:{setup:["Composer.*lock","Fatal error","Class.*not found"],"test-failure":["FAILED","Tests.*failed"],dependency:["Class.*not found","require.*failed"],runtime:["Fatal error","Exception","Error"],timeout:["timeout","Timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:8e3},dependencies:["init"]},"php-symfony":{runtime:"php",framework:"Symfony",markers:["composer.json","symfony.lock","bin/console"],commands:{init:"composer install && php bin/console doctrine:database:create",test:"php bin/phpunit",build:"php bin/console cache:clear --env=prod",start:"symfony serve --no-tls"},errorPatterns:{setup:["Composer.*error","Fatal error"],"test-failure":["FAILED","failure"],dependency:["Class.*not found"],runtime:["Fatal error","Exception"],timeout:["timeout"],unknown:[]},dependencies:["init"]},"rust-actix":{runtime:"rust",framework:"Actix-web",markers:["Cargo.toml","actix"],commands:{init:"cargo fetch",test:"cargo test",build:"cargo build --release",start:"cargo run --release"},errorPatterns:{setup:["error: .*could not find","failed.*download"],"test-failure":["test result:","FAILED"],dependency:["can.t find.*crate"],runtime:["error\\[E","thread.*panicked"],timeout:["timeout"],unknown:[]},validation:{command:"cargo --version",error:"Rust/Cargo not installed"}},"rust-axum":{runtime:"rust",framework:"Axum",markers:["Cargo.toml","axum"],commands:{init:"cargo fetch",test:"cargo test",build:"cargo build --release",start:"cargo run --release"},errorPatterns:{setup:["error: .*could not find"],"test-failure":["test result:","FAILED"],dependency:["can.t find.*crate"],runtime:["error\\[E"],timeout:["timeout"],unknown:[]}},"rust-rocket":{runtime:"rust",framework:"Rocket",markers:["Cargo.toml","rocket"],commands:{init:"cargo fetch",test:"cargo test",build:"cargo build --release",start:"cargo run --release"},errorPatterns:{setup:["error: .*could not find"],"test-failure":["FAILED"],dependency:["can.t find"],runtime:["error\\[E"],timeout:["timeout"],unknown:[]}},"dotnet-aspnetcore":{runtime:"dotnet",framework:"ASP.NET Core",markers:[".csproj",".sln","Program.cs"],commands:{init:"dotnet restore",test:"dotnet test",build:"dotnet build -c Release",start:"dotnet run"},errorPatterns:{setup:["error CS","CSPROJ.*not found","NuGet.*restore"],"test-failure":["Failed:.*test","FAILED"],dependency:["error NU1101"],runtime:["error CS","Exception"],timeout:["timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:5e3}},"elixir-phoenix":{runtime:"elixir",framework:"Phoenix",markers:["mix.exs","phoenix"],commands:{init:"mix setup",test:"mix test",build:"mix compile --all-warnings",start:"mix phx.server"},errorPatterns:{setup:["\\*\\* \\(.*Error\\)","Mix.InstallError"],"test-failure":["\\d+\\sfailed","FAILED"],dependency:["dependencies are not available"],runtime:["\\*\\* \\(","RuntimeError"],timeout:["timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:4e3},dependencies:["init"]},"ruby-rails":{runtime:"ruby",framework:"Rails",markers:["Gemfile","config/application.rb","bin/rails"],commands:{init:"bundle install && rails db:prepare",test:"rails test",build:"rails assets:precompile",start:"rails server --binding=0.0.0.0 --port=3000"},errorPatterns:{setup:["Bundler::.*Error","Gem::.*Error"],"test-failure":["failures,","error,","FAILED"],dependency:["Could not find.*gem"],runtime:["Error","Exception","NoMethodError"],timeout:["timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:3e3},dependencies:["init"]},"ruby-sinatra":{runtime:"ruby",framework:"Sinatra",markers:["Gemfile","app.rb","sinatra"],commands:{init:"bundle install",test:"rspec",build:`echo "Sinatra apps don't require build"`,start:"ruby app.rb"},errorPatterns:{setup:["Bundler.*Error","Gem.*Error"],"test-failure":["failure","FAILED"],dependency:["Could not find.*gem"],runtime:["Error","NoMethodError"],timeout:["timeout"],unknown:[]}}},de={init:{python:["pip install -e .","poetry install","pip install -r requirements.txt"],node:["npm install","pnpm install","yarn install"],go:["go mod download && go mod tidy","go get ./..."],java:["mvn dependency:go-offline","gradle dependencies"],php:["composer install"],rust:["cargo fetch"],dotnet:["dotnet restore"],elixir:["mix deps.get"],ruby:["bundle install"],"jvm-generic":["mvn dependency:go-offline","gradle dependencies"],unknown:[]},test:{python:["pytest","python -m unittest","python -m pytest"],node:["npm test","npm run test"],go:["go test ./...","make test"],java:["mvn test","gradle test"],php:["php artisan test","phpunit","pest"],rust:["cargo test"],dotnet:["dotnet test"],elixir:["mix test"],ruby:["rspec","ruby -m minitest"],"jvm-generic":["mvn test","gradle test"],unknown:[]},build:{python:["python -m build","python setup.py build"],node:["npm run build"],go:["go build -o app .","go build ./..."],java:["mvn package -DskipTests","gradle build -x test"],php:['echo "PHP build: typically no build step"'],rust:["cargo build --release"],dotnet:["dotnet build -c Release"],elixir:["mix compile"],ruby:["gem build *.gemspec"],"jvm-generic":["mvn package -DskipTests","gradle build"],unknown:[]},start:{python:["python app.py","python main.py","uvicorn main:app --reload"],node:["npm start","node index.js","node src/index.js"],go:["./app","go run main.go","go run ./..."],java:["mvn spring-boot:run","gradle bootRun","java -jar target/*.jar"],php:["php -S 0.0.0.0:8000","php artisan serve"],rust:["cargo run --release","./target/release/app"],dotnet:["dotnet run"],elixir:["mix phx.server","iex -S mix"],ruby:["rails server","ruby app.rb","bundle exec puma"],"jvm-generic":["java -jar *.jar","gradle run"],unknown:[]}};function q(e,r,t){if(r){let a=r.trim().toLowerCase().replace(/[_.\s]+/g,"-"),c=a$1(r),s=`${e}-${c==="gofiber"?"fiber":c==="gogin"?"gin":c==="dotnet"?"aspnetcore":c!=="unknown"?c:a==="fiber"?"fiber":a==="aspnetcore"||a==="asp-net-core"?"aspnetcore":a}`,n=ce[s];if(n&&n.commands[t])return n.commands[t]}let o=de[t]?.[e]??[];return o.length>0?o[0]:void 0}function le(e){let r=d(e).map(t=>t==="python"?"python":t==="node"||t==="bun"?"node":t==="go"?"go":t==="java"?"java":t==="php"?"php":t==="rust"?"rust":t==="dotnet"?"dotnet":t==="elixir"?"elixir":t==="ruby"?"ruby":t==="clojure"||t==="scala"||t==="kotlin"?"jvm-generic":null).filter(t=>t!==null).filter((t,o,a)=>a.indexOf(t)===o);return {primary:r.length>0?r[0]:"unknown",secondary:r.slice(1)}}function Y(e){return le(e).primary}function Q(e,r){if(!e)return "unknown";r||(r={setup:["ModuleNotFoundError","npm ERR!","error:","not found"],"test-failure":["FAILED","FAIL","failed"],dependency:["cannot find module","import.*error"],runtime:["Exception","Error:","panic","TypeError"],timeout:["timeout","Timeout","deadline exceeded"],unknown:[]});for(let[t,o]of Object.entries(r))for(let a of o)if(new RegExp(a,"i").test(e))return t;return "unknown"}async function X(e){let r=e.split(/[&|;]\s*/)[0].trim().split(/\s+/)[0];if(["echo","cd","pwd","test","true","false","exit"].includes(r))return {valid:true};try{let o=process.platform==="win32"?"where":"which";if((await execa(o,[r],{reject:false})).exitCode===0)return {valid:true}}catch{}return {valid:false,reason:`Command '${r}' not found or not executable`}}function Z(e,r,t){return r?t&&typeof r[t]=="string"?r[t]:typeof r.default=="string"?r.default:e:e}var me=new Set(["init","test","build","start"]),pe=new Set([".git","node_modules",".rapidkit",".venv","dist","build","coverage","htmlcov"]);async function O(e){try{return await j.promises.access(e,j.constants.F_OK),true}catch{return false}}async function fe(e){let r=await j.promises.readFile(e,"utf-8");return JSON.parse(r)}async function ge(e,r){await j.promises.mkdir(g.dirname(e),{recursive:true}),await j.promises.writeFile(e,`${JSON.stringify(r,null,2)}
|
|
2
|
-
`,"utf-8");}function M(e){return e.replace(/\\/g,"/")}async function he(e){return a(e,{skipDirs:pe,includeHiddenDirs:false,descendIntoMatchedProjects:false,isProjectDir:async(r,t)=>await O(g.join(r,".rapidkit","context.json"))||await O(g.join(r,".rapidkit","project.json"))?true:g.resolve(r)===g.resolve(t)?false:d(r).length>0})}async function ye(e,r,t){let o=await execa("git",["diff","--name-only",`${t}...HEAD`],{cwd:e,reject:false});if(o.exitCode!==0)return new Set(r);let a=o.stdout.split(/\r?\n/).map(u=>u.trim()).filter(u=>u.length>0).map(u=>M(u));if(a.length===0)return new Set;let c=new Set;for(let u of r){let s=M(g.relative(e,u));if(!s||s===".")continue;let n=`${s}/`;a.some(m=>m===s||m.startsWith(n))&&c.add(u);}return c}async function ke(e,r,t){let o=g.join(e,".rapidkit","workspace-dependency-graph.json");if(!await O(o))return {expanded:t,graphStatus:"missing",expansionDepth:0};let a;try{a=await fe(o);}catch{return {expanded:t,graphStatus:"invalid",expansionDepth:0}}let c=new Set(r.map(f=>g.resolve(f))),u=new Map;if(!a||typeof a!="object"||Array.isArray(a))return {expanded:t,graphStatus:"invalid",expansionDepth:0};let s=Array.isArray(a.projects)?a.projects:[];for(let f of s){if(!f||typeof f!="object"||Array.isArray(f))continue;let y=f,b=typeof y.path=="string"?y.path:"",l=g.resolve(e,b);if(!c.has(l))continue;let h=Array.isArray(y.dependsOn)?y.dependsOn.filter(v=>typeof v=="string"):[];for(let v of h){let E=g.resolve(e,v);c.has(E)&&(u.has(E)||u.set(E,new Set),u.get(E)?.add(l));}}let n=new Set(t),m=[...n],k=0;for(;m.length>0;){let f=m.shift();if(!f)continue;let y=u.get(f);if(y)for(let b of y)n.has(b)||(n.add(b),m.push(b),k+=1);}return {expanded:n,graphStatus:"loaded",expansionDepth:k}}async function we(e,r){if(typeof r=="boolean")return r;let t=g.join(e,".rapidkit","policies.yml");if(!await O(t))return true;let o="";try{o=await j.promises.readFile(t,"utf-8");}catch{return true}let a=o.match(/^[\t ]*rules\.enforce_workspace_run_gates:\s*(true|false)\s*(?:#.*)?$/m);return a?a[1]==="true":true}async function N(e,r){let t=process.argv[1];if(!t)return {exitCode:1,stdout:"",stderr:"RapidKit entrypoint is unavailable for nested workspace-run execution."};let o=await execa(process.execPath,[t,...e],{cwd:r,reject:false,env:{...process.env,RAPIDKIT_WORKSPACE_RUN_CHILD:"1"}});return {exitCode:Number(o.exitCode??1),stdout:o.stdout,stderr:o.stderr}}function be(e){return e==="node"||e==="go"||e==="java"||e==="python"}function xe(){return process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"}async function Re(e){let r=process.cwd();try{process.chdir(e);let{handleInitCommand:t}=await import('./index.js');return {exitCode:await t(["init"]),stdout:"",stderr:""}}finally{process.chdir(r);}}async function ve(e$1){let r=s=>{let n=b(s);return n==="node"||n==="bun"?"node":n==="python"?"python":n==="go"?"go":n==="java"?"java":n==="php"?"php":n==="ruby"?"ruby":n==="rust"?"rust":n==="dotnet"?"dotnet":n==="elixir"?"elixir":n==="clojure"||n==="scala"||n==="kotlin"?"jvm-generic":Y(e$1)},t=s=>{if(!s)return;let n=a$1(s);if(new Set(["fastapi","django","flask","nestjs","express","fastify","koa","gofiber","gogin","echo","springboot","laravel","symfony","rails","sinatra","dotnet","actix","axum","rocket","phoenix"]).has(n))return n},o=g.join(e$1,".rapidkit","context.json");if(j.existsSync(o))try{let s=JSON.parse(j.readFileSync(o,"utf-8"));if(typeof s.runtime=="string"){let n={};if(s.commands&&typeof s.commands=="object")for(let[m,k]of Object.entries(s.commands))typeof k=="string"&&(n[m]=k);return {runtime:r(s.runtime),framework:t(typeof s.framework=="string"?s.framework:void 0),commandOverrides:Object.keys(n).length>0?n:void 0,environment:typeof s.environment=="string"?s.environment:void 0}}}catch{}let a=e(e$1),c=r(a.runtime),u=t(a.key);return {runtime:c,framework:u}}async function Ee(e,r,t,o,a,c){let u=!a?.[r]&&be(t),s;if(a&&a[r]?s=a[r]:u?s=`rapidkit ${r}`:s=q(t,o,r),!s)return {exitCode:127,command:`<stage not supported for ${t}>`,message:`No stage command found for runtime '${t}' and framework '${o||"unknown"}'`,errorCategory:"runtime"};let n=Z(s,a,c);if(!n)return {exitCode:127,command:s,message:"Failed to resolve stage command",errorCategory:"runtime"};if(!u){let l=await X(n);if(!l.valid)return {exitCode:127,command:n,message:l.reason||"Command not available",errorCategory:"setup"}}let m=0,k="",f="",y;try{let l=u?r==="init"&&xe()?await Re(e):await N([r],e):await execa(n,[],{cwd:e,reject:false,shell:true});if(m=Number(l.exitCode??0),k=l.stdout,f=l.stderr,m!==0){let h=`${k}
|
|
3
|
-
${f}`;y=Q(h);}}catch(l){return {exitCode:1,command:n,message:l instanceof Error?l.message:"Command execution failed",errorCategory:"runtime"}}return {exitCode:m,command:n,errorCategory:y,healthStatus:void 0,message:m!==0?`Stage failed with exit code ${m}`:void 0}}function ee(e){try{return JSON.parse(e)}catch{return null}}async function Se(e){let r=[],t=await N(["doctor","workspace","--json"],e);if(t.exitCode!==0)r.push({gate:"doctor-workspace",status:"fail",summary:"doctor workspace command failed"});else {let c=ee(t.stdout)?.healthScore,u=Number(c?.errors??0);Number.isFinite(u)&&u>0?r.push({gate:"doctor-workspace",status:"fail",summary:`doctor workspace reports ${u} error(s)`}):r.push({gate:"doctor-workspace",status:"pass",summary:"doctor workspace passed"});}let o=await N(["readiness","--json"],e);if(o.exitCode!==0)r.push({gate:"readiness",status:"fail",summary:"readiness command failed"});else {let a=ee(o.stdout),c=String(a?.overallStatus??"").toLowerCase();c==="fail"?r.push({gate:"readiness",status:"fail",summary:"readiness overall status is fail"}):c==="warn"?r.push({gate:"readiness",status:"warn",summary:"readiness overall status is warn"}):r.push({gate:"readiness",status:"pass",summary:"readiness overall status is pass"});}return r}function Ce(e){return me.has(e)}function je(e,r){let t=Math.max(1,Math.min(4,r)),o=Number(e??t);return Number.isFinite(o)?Math.max(1,Math.min(16,Math.trunc(o))):t}async function He(e){if(!Ce(e.stage))throw new Error(`Unsupported workspace run stage: ${e.stage}`);let r=Date.now(),t=g.resolve(e.workspacePath),o=await he(t),a=e.affected===true,c=e.blastRadius===true,u=e.since?.trim()||"HEAD~1",s=a?await ye(t,o,u):new Set(o),n,m="not-applicable",k=0,f="all";if(a&&c){let i=await ke(t,o,s);n=i.expanded,m=i.graphStatus,k=i.expansionDepth,f="affected+blast-radius";}else a?(n=s,f="affected"):(n=s,f="all");let y=e.stage==="init"?false:await we(t,e.enforceGates),b=y?await Se(t):[{gate:"doctor-workspace",status:"skipped",summary:"workspace run gates disabled"},{gate:"readiness",status:"skipped",summary:"workspace run gates disabled"}],l=b.find(i=>i.status==="fail"),h=o.filter(i=>n.has(i)),v=e.continueOnError===true,E=e.parallel===true,W=je(e.maxWorkers,h.length),A=h.length,$=0;e.json||console.log(R.gray(`Workspace run (${e.stage}) started: ${A} target(s), ${E?`parallel x${W}`:"sequential"}`));let S=new Map;for(let i of o)S.set(i,{path:i,relativePath:M(g.relative(t,i)),selected:n.has(i),affected:n.has(i),status:(n.has(i),"skipped"),exitCode:null,durationMs:0,reason:n.has(i)?void 0:"not affected",framework:void 0,runtimeDetected:void 0,executionCommand:void 0});if(l)for(let i of h){let p=S.get(i);p&&(p.status="skipped",p.reason=`blocked by ${l.gate}`);}else {let i=async p=>{let d=S.get(p);if(!d)return;let P=M(g.relative(t,p));e.json||console.log(R.gray(`\u23F3 [${$}/${A}] ${e.stage} ${P}`)),d.selected=true,d.affected=true;let C=Date.now(),{runtime:w,framework:x,commandOverrides:re,environment:ne}=await ve(p);d.runtimeDetected=w,d.framework=x;let F=await Ee(p,e.stage,w,x,re,ne);if(d.executionCommand=F.command,d.errorCategory=F.errorCategory,d.healthStatus=F.healthStatus,d.durationMs=Date.now()-C,d.exitCode=F.exitCode,F.exitCode===0?(d.status="passed",d.reason=void 0):(d.status="failed",d.reason=F.message||"stage command failed",d.errorMessage=F.message),$+=1,!e.json){let oe=A>0?Math.round($/A*100):100,ae=d.status==="passed"?R.green("\u2705"):R.red("\u274C");console.log(R.gray(`${ae} [${$}/${A}] (${oe}%) ${P} ${d.durationMs}ms`));}};if(E&&h.length>1){let p=0,d=false,P=new Array(W).fill(null).map(async()=>{for(;p<h.length;){if(d&&!v)return;let C=p;p+=1;let w=h[C];await i(w),S.get(w)?.status==="failed"&&(d=true);}});if(await Promise.all(P),!v&&d){let C=false;for(let w of h){let x=S.get(w);if(x){if(x.status==="failed"){C=true;continue}C&&x.status==="skipped"&&(x.reason=x.reason||"stopped after failure");}}}}else for(let p of h){await i(p);let d=S.get(p);if(!v&&d?.status==="failed"){let P=h.slice(h.indexOf(p)+1);for(let C of P){let w=S.get(C);w&&(w.status="skipped",w.reason="stopped after failure");}break}}}let T=[];for(let i of o){let p=S.get(i);p&&T.push(p);}let B=T.filter(i=>i.status==="passed").length,L=T.filter(i=>i.status==="failed").length,_=T.filter(i=>i.status==="skipped").length,H=e.strict===true,te=L>0||H&&b.some(i=>i.status!=="pass")?1:0,V={schemaVersion:"1.0",workspacePath:t,stage:e.stage,generatedAt:new Date().toISOString(),durationMs:Date.now()-r,options:{affected:a,blastRadius:c,since:a?u:null,parallel:E,maxWorkers:W,continueOnError:v,strict:H,enforceGates:y},selection:{mode:f,since:a?u:null,graphStatus:m,expansionDepth:k},gates:{enforced:y,results:b,blocked:!!l,blockingGate:l?.gate},summary:{projectCount:o.length,selectedCount:h.length,passed:B,failed:L,skipped:_,exitCode:te},projects:T},J=g.join(t,".rapidkit","reports","workspace-run-last.json");return await ge(J,V),e.json||(l&&(console.log(R.red(`\u274C Workspace run blocked by ${l.gate}`)),console.log(R.gray(` ${l.summary}`))),console.log(R.cyan(`Workspace run (${e.stage}) => passed: ${B}, failed: ${L}, skipped: ${_}`)),console.log(R.gray(`Report: ${J}`))),V}export{He as a};
|
package/dist/chunk-TYC54P7X.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import a from'fs';import o from'path';var c={fastapi:{key:"fastapi",runtime:"python",displayName:"FastAPI",supportTier:"first-class",importStack:"fastapi",aliases:["fastapi"],kitPrefixes:["fastapi"]},django:{key:"django",runtime:"python",displayName:"Django",supportTier:"extended",importStack:"django",aliases:["django"]},flask:{key:"flask",runtime:"python",displayName:"Flask",supportTier:"extended",importStack:"flask",aliases:["flask"]},python:{key:"python",runtime:"python",displayName:"Python",supportTier:"observed",importStack:"unknown",aliases:["python"]},nestjs:{key:"nestjs",runtime:"node",displayName:"NestJS",supportTier:"first-class",importStack:"nestjs",aliases:["nestjs","nest"],kitPrefixes:["nestjs"]},express:{key:"express",runtime:"node",displayName:"Express",supportTier:"extended",importStack:"express",aliases:["express"]},fastify:{key:"fastify",runtime:"node",displayName:"Fastify",supportTier:"extended",importStack:"unknown",aliases:["fastify"]},koa:{key:"koa",runtime:"node",displayName:"Koa",supportTier:"extended",importStack:"koa",aliases:["koa"]},node:{key:"node",runtime:"node",displayName:"Node.js",supportTier:"observed",importStack:"unknown",aliases:["node","nodejs","typescript","javascript"]},gofiber:{key:"gofiber",runtime:"go",displayName:"Go/Fiber",supportTier:"first-class",importStack:"go",aliases:["gofiber","fiber","go-fiber","go/fiber"],kitPrefixes:["gofiber"]},gogin:{key:"gogin",runtime:"go",displayName:"Go/Gin",supportTier:"first-class",importStack:"go",aliases:["gogin","gin","go-gin","go/gin"],kitPrefixes:["gogin"]},echo:{key:"echo",runtime:"go",displayName:"Echo",supportTier:"extended",importStack:"go",aliases:["echo"]},go:{key:"go",runtime:"go",displayName:"Go",supportTier:"observed",importStack:"go",aliases:["go","golang"],kitPrefixes:["go"]},springboot:{key:"springboot",runtime:"java",displayName:"Spring Boot",supportTier:"first-class",importStack:"springboot",aliases:["springboot","spring","spring-boot"],kitPrefixes:["springboot"]},java:{key:"java",runtime:"java",displayName:"Java",supportTier:"observed",importStack:"unknown",aliases:["java"]},laravel:{key:"laravel",runtime:"php",displayName:"Laravel",supportTier:"extended",importStack:"unknown",aliases:["laravel"]},symfony:{key:"symfony",runtime:"php",displayName:"Symfony",supportTier:"extended",importStack:"unknown",aliases:["symfony"]},php:{key:"php",runtime:"php",displayName:"PHP",supportTier:"observed",importStack:"unknown",aliases:["php"]},rails:{key:"rails",runtime:"ruby",displayName:"Ruby on Rails",supportTier:"extended",importStack:"rails",aliases:["rails","ruby-on-rails","ruby on rails"]},sinatra:{key:"sinatra",runtime:"ruby",displayName:"Sinatra",supportTier:"extended",importStack:"unknown",aliases:["sinatra"]},ruby:{key:"ruby",runtime:"ruby",displayName:"Ruby",supportTier:"observed",importStack:"unknown",aliases:["ruby"]},dotnet:{key:"dotnet",runtime:"dotnet",displayName:"ASP.NET",supportTier:"extended",importStack:"dotnet",aliases:["dotnet","asp.net","aspnet","asp.net core","csharp","c#"]},actix:{key:"actix",runtime:"rust",displayName:"Actix-web",supportTier:"extended",importStack:"unknown",aliases:["actix","actix-web"]},axum:{key:"axum",runtime:"rust",displayName:"Axum",supportTier:"extended",importStack:"unknown",aliases:["axum"]},rocket:{key:"rocket",runtime:"rust",displayName:"Rocket",supportTier:"extended",importStack:"unknown",aliases:["rocket"]},rust:{key:"rust",runtime:"rust",displayName:"Rust",supportTier:"first-class",importStack:"unknown",aliases:["rust"]},phoenix:{key:"phoenix",runtime:"elixir",displayName:"Phoenix",supportTier:"first-class",importStack:"unknown",aliases:["phoenix"]},elixir:{key:"elixir",runtime:"elixir",displayName:"Elixir",supportTier:"extended",importStack:"unknown",aliases:["elixir"]},clojure:{key:"clojure",runtime:"clojure",displayName:"Clojure",supportTier:"extended",importStack:"unknown",aliases:["clojure"]},scala:{key:"scala",runtime:"scala",displayName:"Scala",supportTier:"extended",importStack:"unknown",aliases:["scala"]},kotlin:{key:"kotlin",runtime:"kotlin",displayName:"Kotlin",supportTier:"extended",importStack:"unknown",aliases:["kotlin"]},deno:{key:"deno",runtime:"deno",displayName:"Deno",supportTier:"extended",importStack:"unknown",aliases:["deno"]},bun:{key:"bun",runtime:"bun",displayName:"Bun",supportTier:"extended",importStack:"unknown",aliases:["bun"]},unknown:{key:"unknown",runtime:"unknown",displayName:"Unknown",supportTier:"observed",importStack:"unknown",aliases:["unknown"]}},l=new Map;for(let e of Object.values(c))for(let n of e.aliases)l.set(n,e.key);function i(e,n,t){let r=c[e]??c.unknown;return {key:r.key,runtime:r.runtime,displayName:r.displayName,supportTier:r.supportTier,importStack:r.importStack,confidence:n,source:t}}function p(e){return e.trim().toLowerCase().replace(/[_\s]+/g,"-")}function u(e){try{return a.existsSync(e)?a.readFileSync(e,"utf8").toLowerCase():""}catch{return ""}}function y(e){try{return a.existsSync(e)?JSON.parse(a.readFileSync(e,"utf8")):null}catch{return null}}function f(e,n){if(n<0||!a.existsSync(e))return [];let t=[],r=[];try{r=a.readdirSync(e,{withFileTypes:true});}catch{return []}for(let s of r){let d=o.join(e,s.name);s.isDirectory()?t.push(...f(d,n-1)):t.push(d);}return t}function k(e,n,t=2){return f(e,t).some(r=>r.toLowerCase().endsWith(n.toLowerCase()))}function g(e){let n=p(e??"");if(!n)return "unknown";for(let t of Object.values(c))if(t.kitPrefixes?.some(r=>n.startsWith(r)))return t.key;return "unknown"}function m(e){return e?l.get(p(e))??"unknown":"unknown"}function D(e){return m(e)}function E(e){let n=m(e);return n!=="unknown"?c[n].runtime:"unknown"}function w(e){let n=g(e.kitName);if(n!=="unknown")return i(n,"high","kit");let t=m(e.framework);if(t!=="unknown")return i(t,"high","framework");let r=m(e.runtime);return r!=="unknown"?i(r,"medium","runtime"):i("unknown","low","unknown")}function x(e){let n=y(o.join(e,"package.json"));if(!n)return i("unknown","low","unknown");let t={...n.dependencies??{},...n.devDependencies??{}},r=n.scripts??{},s=Object.values(r).filter(d=>typeof d=="string").join(" ").toLowerCase();return t["@nestjs/core"]||s.includes("nest start")?i("nestjs","high","manifest"):t.express?i("express","high","manifest"):t.fastify?i("fastify","high","manifest"):t.koa?i("koa","high","manifest"):i("node","medium","marker")}function b(e){let n=[u(o.join(e,"pyproject.toml")),u(o.join(e,"requirements.txt")),u(o.join(e,"requirements.in"))].join(`
|
|
2
|
-
`);return n.includes("fastapi")?i("fastapi","high","manifest"):n.includes("django")?i("django","high","manifest"):n.includes("flask")?i("flask","high","manifest"):n.trim()?i("python","medium","marker"):i("unknown","low","unknown")}function S(e){let n=[u(o.join(e,"go.mod")),u(o.join(e,"main.go"))].join(`
|
|
3
|
-
`);return n.includes("github.com/gofiber/fiber")?i("gofiber","high","manifest"):n.includes("github.com/gin-gonic/gin")?i("gogin","high","manifest"):n.includes("github.com/labstack/echo")?i("echo","high","manifest"):n.trim()?i("go","medium","marker"):i("unknown","low","unknown")}function h(e){let n=[u(o.join(e,"pom.xml")),u(o.join(e,"build.gradle")),u(o.join(e,"build.gradle.kts"))].join(`
|
|
4
|
-
`);return n.includes("spring-boot")||n.includes("org.springframework")?i("springboot","high","manifest"):n.trim()?i("java","medium","marker"):i("unknown","low","unknown")}function j(e){let n=u(o.join(e,"composer.json"));return n.includes("laravel/framework")?i("laravel","high","manifest"):n.includes("symfony/")?i("symfony","high","manifest"):n.trim()?i("php","medium","marker"):i("unknown","low","unknown")}function B(e){let n=u(o.join(e,"Gemfile"));return n.includes("gem 'rails'")||n.includes('gem "rails"')?i("rails","high","manifest"):n.includes("gem 'sinatra'")||n.includes('gem "sinatra"')?i("sinatra","high","manifest"):n.trim()?i("ruby","medium","marker"):i("unknown","low","unknown")}function N(e){let n=u(o.join(e,"Cargo.toml"));return n.includes("actix-web")?i("actix","high","manifest"):n.includes("axum")?i("axum","high","manifest"):n.includes("rocket")?i("rocket","high","manifest"):n.trim()?i("rust","medium","marker"):i("unknown","low","unknown")}function F(e){let n=u(o.join(e,"mix.exs"));return n.includes("phoenix")?i("phoenix","high","manifest"):n.trim()?i("elixir","medium","marker"):i("unknown","low","unknown")}function T(e){let n=[],t=r=>{n.includes(r)||n.push(r);};return a.existsSync(o.join(e,"go.mod"))&&t("go"),a.existsSync(o.join(e,"Cargo.toml"))&&t("rust"),(a.existsSync(o.join(e,"pom.xml"))||a.existsSync(o.join(e,"build.gradle"))||a.existsSync(o.join(e,"build.gradle.kts")))&&t("java"),a.existsSync(o.join(e,"mix.exs"))&&t("elixir"),a.existsSync(o.join(e,"composer.json"))&&t("php"),(k(e,".csproj")||k(e,".sln"))&&t("dotnet"),a.existsSync(o.join(e,"package.json"))&&t("node"),a.existsSync(o.join(e,"Gemfile"))&&t("ruby"),(a.existsSync(o.join(e,"pyproject.toml"))||a.existsSync(o.join(e,"setup.py"))||a.existsSync(o.join(e,"requirements.txt"))||a.existsSync(o.join(e,"requirements.in")))&&t("python"),(a.existsSync(o.join(e,"deps.edn"))||a.existsSync(o.join(e,"project.clj")))&&t("clojure"),a.existsSync(o.join(e,"build.sbt"))&&t("scala"),(a.existsSync(o.join(e,"deno.json"))||a.existsSync(o.join(e,"deno.jsonc")))&&t("deno"),(a.existsSync(o.join(e,"bun.lockb"))||a.existsSync(o.join(e,"bun.lock")))&&t("bun"),(a.existsSync(o.join(e,"settings.gradle.kts"))||k(o.join(e,"src"),".kt",3))&&t("kotlin"),n}function L(e,n){let t=w({framework:typeof n?.framework=="string"?n.framework:void 0,runtime:typeof n?.runtime=="string"?n.runtime:void 0,kitName:typeof n?.kit_name=="string"?n.kit_name:typeof n?.kit=="string"?n.kit:void 0});if(t.key!=="unknown")return t;let r=T(e);if(r.includes("node")){let s=x(e);if(s.key!=="unknown")return s}if(r.includes("python")){let s=b(e);if(s.key!=="unknown")return s}if(r.includes("go")){let s=S(e);if(s.key!=="unknown")return s}if(r.includes("java")){let s=h(e);if(s.key!=="unknown")return s}if(r.includes("php")){let s=j(e);if(s.key!=="unknown")return s}if(r.includes("ruby")){let s=B(e);if(s.key!=="unknown")return s}if(r.includes("rust")){let s=N(e);if(s.key!=="unknown")return s}if(r.includes("elixir")){let s=F(e);if(s.key!=="unknown")return s}return r.includes("dotnet")?i("dotnet","medium","marker"):r.includes("clojure")?i("clojure","medium","marker"):r.includes("scala")?i("scala","medium","marker"):r.includes("kotlin")?i("kotlin","medium","marker"):r.includes("deno")?i("deno","high","marker"):r.includes("bun")?i("bun","high","marker"):r.length>0?i(m(r[0]),"medium","runtime"):i("unknown","low","unknown")}export{D as a,E as b,w as c,T as d,L as e};
|