rapidkit 0.26.0 → 0.27.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 CHANGED
@@ -98,8 +98,32 @@ npx rapidkit workspace policy set <key> <value>
98
98
  npx rapidkit doctor
99
99
  npx rapidkit doctor workspace [--fix]
100
100
  npx rapidkit workspace list # Display all workspaces created on this system
101
+ npx rapidkit workspace share [--output <file>] [--include-paths] [--no-doctor]
101
102
  ```
102
103
 
104
+ ### Workspace collaboration bundle
105
+
106
+ Use `workspace share` to export a portable JSON snapshot for team handoff,
107
+ debugging, and cross-machine diagnostics.
108
+
109
+ ```bash
110
+ npx rapidkit workspace share
111
+ # default output: .rapidkit/reports/share-bundle.json
112
+
113
+ npx rapidkit workspace share --output ./team-share.json
114
+ npx rapidkit workspace share --include-paths
115
+ npx rapidkit workspace share --no-doctor
116
+ ```
117
+
118
+ Bundle content includes:
119
+
120
+ - Workspace metadata (`name`, `profile`, RapidKit version)
121
+ - Discovered RapidKit projects (`relative_path`, runtime, kit)
122
+ - Workspace and project report file index
123
+ - Latest doctor evidence per project (unless `--no-doctor` is used)
124
+
125
+ `--include-paths` is intended for internal teams only because it includes absolute filesystem paths.
126
+
103
127
  ### Command ownership
104
128
 
105
129
  RapidKit keeps the wrapper boundary explicit so users know which layer owns each action.
@@ -103,7 +103,7 @@ npx rapidkit dev
103
103
  cd <project-name>
104
104
  npx rapidkit init
105
105
  npx rapidkit dev
106
- `)+"```\n","utf-8"),!e){f.start("Initializing git repository");try{await execa("git",["init"],{cwd:i$1}),await execa("git",["add","."],{cwd:i$1}),await execa("git",["commit","-m","Initial commit: RapidKit workspace"],{cwd:i$1}),f.succeed("Git repository initialized");}catch{f.warn("Could not initialize git repository");}}try{let{registerWorkspace:k}=await import('./workspace-VN3VF62I.js');await k(i$1,c);}catch{}if(console.log(o.green(`
106
+ `)+"```\n","utf-8"),!e){f.start("Initializing git repository");try{await execa("git",["init"],{cwd:i$1}),await execa("git",["add","."],{cwd:i$1}),await execa("git",["commit","-m","Initial commit: RapidKit workspace"],{cwd:i$1}),f.succeed("Git repository initialized");}catch{f.warn("Could not initialize git repository");}}try{let{registerWorkspace:k}=await import('./workspace-7JHX7L3E.js');await k(i$1,c);}catch{}if(console.log(o.green(`
107
107
  \u2728 Workspace created!
108
108
  `)),console.log(o.cyan("\u{1F4C2} Location:"),o.white(i$1)),console.log(o.cyan(`
109
109
  \u{1F680} Get started:
@@ -118,7 +118,7 @@ npx rapidkit dev
118
118
  `)),console.log(o.cyan(`\u{1F4A1} How to install Python:
119
119
  `)),console.log(o.white(" Ubuntu / Debian: sudo apt install python3.10")),console.log(o.white(" macOS (Homebrew): brew install python@3.10")),console.log(o.white(` Windows: https://python.org/downloads
120
120
  `)),console.log(o.gray(` After installing Python, run: npx rapidkit ${c}
121
- `)),process.exit(1));}a$1.step(1,3,"Setting up RapidKit environment");let P=z("Creating directory").start();try{await v.ensureDir(i$1),P.succeed("Directory created"),P.start("Detecting Python version");let f=null,R=await kt(x.pythonVersion);if(R)f=await pt(R),f?(a$1.info(` Detected Python ${f}`),P.succeed(`Python ${f} detected`)):P.warn("Could not detect exact Python version");else {let k=C();f=await pt(k),f?P.succeed(`Python ${f} detected`):P.warn("Could not detect Python version, proceeding with defaults");}if(x.installMethod==="poetry"&&!await wt()&&(P.warn("Poetry not found \u2014 auto-fallback to pip + venv"),x.installMethod="venv"),await et(i$1,c,x.installMethod,f||void 0),f&&await jt(i$1,f),await nt(i$1,c,x.installMethod,f||x.pythonVersion,p||h),await H(i$1),await ot(i$1,c),x.installMethod==="poetry")try{await bt(i$1,x.pythonVersion,P,r,g,u);}catch(k){let _=k?.details||k?.message||String(k);if(_.includes("pyenv")||_.includes("exit status 127")||_.includes("returned non-zero exit status 127")){P.warn("Poetry encountered Python discovery issues, trying venv method"),a$1.debug(`Poetry error (attempting venv fallback): ${_}`);try{await rt(i$1,x.pythonVersion,P,r,g),x.installMethod="venv";}catch(at){throw at}}else throw k}else x.installMethod==="venv"?await rt(i$1,x.pythonVersion,P,r,g):await Pt(i$1,P,r,g,u);if(await vt(i$1,x.installMethod),await xt(i$1,x.installMethod),P.succeed("RapidKit environment ready!"),!n.skipGit){P.start("Initializing git repository");try{await execa("git",["init"],{cwd:i$1}),await execa("git",["add","."],{cwd:i$1}),await execa("git",["commit","-m","Initial commit: RapidKit environment"],{cwd:i$1}),P.succeed("Git repository initialized");}catch{P.warn("Could not initialize git repository");}}try{let{registerWorkspace:k}=await import('./workspace-VN3VF62I.js');await k(i$1,c);}catch{console.warn(o.gray("Note: Could not register workspace in shared registry"));}if(console.log(o.green(`
121
+ `)),process.exit(1));}a$1.step(1,3,"Setting up RapidKit environment");let P=z("Creating directory").start();try{await v.ensureDir(i$1),P.succeed("Directory created"),P.start("Detecting Python version");let f=null,R=await kt(x.pythonVersion);if(R)f=await pt(R),f?(a$1.info(` Detected Python ${f}`),P.succeed(`Python ${f} detected`)):P.warn("Could not detect exact Python version");else {let k=C();f=await pt(k),f?P.succeed(`Python ${f} detected`):P.warn("Could not detect Python version, proceeding with defaults");}if(x.installMethod==="poetry"&&!await wt()&&(P.warn("Poetry not found \u2014 auto-fallback to pip + venv"),x.installMethod="venv"),await et(i$1,c,x.installMethod,f||void 0),f&&await jt(i$1,f),await nt(i$1,c,x.installMethod,f||x.pythonVersion,p||h),await H(i$1),await ot(i$1,c),x.installMethod==="poetry")try{await bt(i$1,x.pythonVersion,P,r,g,u);}catch(k){let _=k?.details||k?.message||String(k);if(_.includes("pyenv")||_.includes("exit status 127")||_.includes("returned non-zero exit status 127")){P.warn("Poetry encountered Python discovery issues, trying venv method"),a$1.debug(`Poetry error (attempting venv fallback): ${_}`);try{await rt(i$1,x.pythonVersion,P,r,g),x.installMethod="venv";}catch(at){throw at}}else throw k}else x.installMethod==="venv"?await rt(i$1,x.pythonVersion,P,r,g):await Pt(i$1,P,r,g,u);if(await vt(i$1,x.installMethod),await xt(i$1,x.installMethod),P.succeed("RapidKit environment ready!"),!n.skipGit){P.start("Initializing git repository");try{await execa("git",["init"],{cwd:i$1}),await execa("git",["add","."],{cwd:i$1}),await execa("git",["commit","-m","Initial commit: RapidKit environment"],{cwd:i$1}),P.succeed("Git repository initialized");}catch{P.warn("Could not initialize git repository");}}try{let{registerWorkspace:k}=await import('./workspace-7JHX7L3E.js');await k(i$1,c);}catch{console.warn(o.gray("Note: Could not register workspace in shared registry"));}if(console.log(o.green(`
122
122
  \u2728 RapidKit environment created successfully!
123
123
  `)),console.log(o.cyan("\u{1F4C2} Location:"),o.white(i$1)),console.log(o.cyan(`\u{1F680} Get started:
124
124
  `)),console.log(o.white(` cd ${c}`)),x.installMethod==="poetry"){let k="source $(poetry env info --path)/bin/activate";try{D();let{stdout:_}=await execa("poetry",["--version"]),M=_.match(/Poetry.*?(\d+)\.(\d+)/);M&&(parseInt(M[1])>=2?k="source $(poetry env info --path)/bin/activate":k="poetry shell");}catch{}console.log(o.white(` ${k} # Or: poetry run rapidkit`)),console.log(o.white(" rapidkit create # Interactive mode")),console.log(o.white(" cd <project-name>")),console.log(o.white(" rapidkit init")),console.log(o.white(" rapidkit dev"));}else x.installMethod==="venv"?(console.log(o.white(" source .venv/bin/activate # On Windows: .venv\\Scripts\\activate")),console.log(o.white(" rapidkit create # Interactive mode")),console.log(o.white(" cd <project-name>")),console.log(o.white(" rapidkit init")),console.log(o.white(" rapidkit dev"))):(console.log(o.white(" rapidkit create # Interactive mode")),console.log(o.white(" cd <project-name>")),console.log(o.white(" rapidkit init")),console.log(o.white(" rapidkit dev")));console.log(o.white(`
@@ -159,7 +159,7 @@ Possible solutions:
159
159
  1. Check your internet connection
160
160
  2. Try installing manually: cd ${m.basename(t)} && ${f(".venv")} -m pip install rapidkit-core
161
161
  3. Use Poetry instead: npx rapidkit ${m.basename(t)} --install-method=poetry`))}}e.succeed("RapidKit installed in project virtualenv");try{let{checkRapidkitCoreAvailable:y}=await import('./pythonRapidkitExec-K2SFGAYJ.js');if(!await y()&&!r){e.start("Checking optional global pipx installation");let c=await q(e,true);try{e.start("Installing RapidKit globally with pipx for CLI access"),await F(c,["install","rapidkit-core"]),e.succeed("RapidKit installed globally");}catch(i){e.warn("Could not install globally (non-fatal, project virtualenv has RapidKit)"),a$1.debug(`pipx install failed: ${i}`);}}}catch(y){e.succeed("Skipped optional global pipx installation"),a$1.debug(`Global install check skipped: ${y}`);}}async function Pt(t,n,e,r,s=false){let d=await q(n,s);if(n.start("Installing RapidKit globally with pipx"),e){let u=d$2(r||{});if(!u)throw new k("Test mode installation",new Error("No local RapidKit path configured. Set RAPIDKIT_DEV_PATH environment variable."));a$1.debug(`Installing from local path: ${u}`),n.text="Installing RapidKit from local path (test mode)",await F(d,["install","-e",u]);}else {n.text="Installing RapidKit from PyPI";try{await F(d,["install","rapidkit-core"]);}catch{throw new l}}n.succeed("RapidKit installed globally"),await v.outputFile(m.join(t,".rapidkit-global"),`RapidKit installed globally with pipx
162
- `,"utf-8");}async function ne(t,n){let{skipGit:e=false,testMode:r=false,userConfig:s={},yes:d=false,installMethod:u,pythonVersion:g="3.10"}=n||{},y=u||s.defaultInstallMethod||await(async()=>{try{return await execa("poetry",["--version"],{timeout:3e3}),"poetry"}catch{return a$1.warn("Poetry not found \u2014 auto-selecting venv. Pass --install-method poetry to override."),"venv"}})(),h=y==="poetry"&&!await wt()?"venv":y;await et(t,m.basename(t),h),await H(t),await nt(t,m.basename(t),h,g,n?.profile);let c=z("Registering workspace").start();try{h==="poetry"?(await ot(t,m.basename(t)),await bt(t,g,c,r,s,d)):h==="venv"?await rt(t,g,c,r,s):await Pt(t,c,r,s,d),await vt(t,h),await xt(t,h),c.succeed("Workspace registered");try{let{registerWorkspace:i}=await import('./workspace-VN3VF62I.js');await i(t,m.basename(t));}catch{}if(!e){c.start("Initializing git repository");try{await execa("git",["init"],{cwd:t}),await execa("git",["add","."],{cwd:t}),await execa("git",["commit","-m","Initial commit: RapidKit workspace"],{cwd:t}),c.succeed("Git repository initialized");}catch{c.warn("Could not initialize git repository");}}}catch(i){throw c.fail("Failed to register workspace"),i}}async function xt(t,n){let e=n==="poetry"?`source $(poetry env info --path)/bin/activate
162
+ `,"utf-8");}async function ne(t,n){let{skipGit:e=false,testMode:r=false,userConfig:s={},yes:d=false,installMethod:u,pythonVersion:g="3.10"}=n||{},y=u||s.defaultInstallMethod||await(async()=>{try{return await execa("poetry",["--version"],{timeout:3e3}),"poetry"}catch{return a$1.warn("Poetry not found \u2014 auto-selecting venv. Pass --install-method poetry to override."),"venv"}})(),h=y==="poetry"&&!await wt()?"venv":y;await et(t,m.basename(t),h),await H(t),await nt(t,m.basename(t),h,g,n?.profile);let c=z("Registering workspace").start();try{h==="poetry"?(await ot(t,m.basename(t)),await bt(t,g,c,r,s,d)):h==="venv"?await rt(t,g,c,r,s):await Pt(t,c,r,s,d),await vt(t,h),await xt(t,h),c.succeed("Workspace registered");try{let{registerWorkspace:i}=await import('./workspace-7JHX7L3E.js');await i(t,m.basename(t));}catch{}if(!e){c.start("Initializing git repository");try{await execa("git",["init"],{cwd:t}),await execa("git",["add","."],{cwd:t}),await execa("git",["commit","-m","Initial commit: RapidKit workspace"],{cwd:t}),c.succeed("Git repository initialized");}catch{c.warn("Could not initialize git repository");}}}catch(i){throw c.fail("Failed to register workspace"),i}}async function xt(t,n){let e=n==="poetry"?`source $(poetry env info --path)/bin/activate
163
163
  # Or simply use: poetry run rapidkit <command>`:n==="venv"?"source .venv/bin/activate # On Windows: .venv\\Scripts\\activate":"N/A (globally installed)",r=n==="poetry"?`# No activation needed (recommended):
164
164
  ./rapidkit --help
165
165
  # or:
package/dist/index.js CHANGED
@@ -101,16 +101,16 @@ No modules selected
101
101
  ${n.stderr||""}`,i=o.match(/version\s+"([^"]+)"/i);if(i?.[1])return this.parseMajorJavaVersion(i[1]);let s=o.match(/(?:openjdk|java)\s+(\d+(?:[._]\d+)?)/i);return s?.[1]?this.parseMajorJavaVersion(s[1]):null}catch{return null}}parseMavenVersion(e){if(!e)return null;let t=e.match(/Apache Maven\s+(\d+)\.(\d+)\.(\d+)/i);return t?[Number.parseInt(t[1],10),Number.parseInt(t[2],10),Number.parseInt(t[3],10)]:null}isMavenVersionAtLeast(e,t){for(let n=0;n<3;n+=1){if(e[n]>t[n])return true;if(e[n]<t[n])return false}return true}async checkSystemMavenVersion(e){try{let t=await execa("mvn",["-version"],{cwd:e,timeout:5e3,reject:false});if(t.exitCode!==0)return {exitCode:t.exitCode||1,message:"Maven is required and must be available on PATH (3.9+)."};let n=this.parseMavenVersion(`${t.stdout||""}
102
102
  ${t.stderr||""}`);return n?this.isMavenVersionAtLeast(n,[3,9,0])?{exitCode:0}:{exitCode:1,message:`Maven ${n.join(".")} detected; Maven 3.9+ is required.`}:{exitCode:1,message:"Unable to parse Maven version. Ensure Maven 3.9+ is installed and retry."}}catch{return {exitCode:1,message:"Maven version check failed. Install Maven 3.9+ and ensure mvn is on PATH."}}}shouldUseGradleNoDaemon(){return process.env.CI==="true"||process.env.RAPIDKIT_GRADLE_NO_DAEMON==="1"}inspectJavaProject(e){let t=v.existsSync(f.join(e,"pom.xml")),n=v.existsSync(f.join(e,"mvnw"))||v.existsSync(f.join(e,"mvnw.cmd")),o=v.existsSync(f.join(e,"build.gradle"))||v.existsSync(f.join(e,"build.gradle.kts"))||v.existsSync(f.join(e,"settings.gradle"))||v.existsSync(f.join(e,"settings.gradle.kts")),i=v.existsSync(f.join(e,"gradlew"))||v.existsSync(f.join(e,"gradlew.bat"));return {hasMavenProject:t||n,hasMavenWrapper:n,hasGradleProject:o||i,hasGradleWrapper:i}}findWorkspaceRoot(e){let t=e;for(;;){if(v.existsSync(f.join(t,".rapidkit-workspace")))return t;let n=f.dirname(t);if(n===t)break;t=n;}return null}resolveDependencyMode(e){let t=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(t==="shared-runtime-caches"||t==="shared-node-deps"||t==="isolated")return t;let n=this.findWorkspaceRoot(e);if(!n)return "isolated";let o=f.join(n,".rapidkit","policies.yml");if(!v.existsSync(o))return "isolated";try{let a=v.readFileSync(o,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(a==="shared-runtime-caches"||a==="shared-node-deps"||a==="isolated")return a}catch{}return "isolated"}buildToolCommand(e){return this.isGradleProject(e)?this.gradleCommand(e):this.mavenCommand(e)}mavenCommand(e){let t=f.join(e,"mvnw.cmd");if(process.platform==="win32"&&v.existsSync(t))return {command:t,baseArgs:[]};let n=f.join(e,"mvnw");return v.existsSync(n)?this.ensureWrapperExecutable(n)?{command:n,baseArgs:[]}:{command:"sh",baseArgs:[n]}:{command:"mvn",baseArgs:[]}}gradleCommand(e){let t=f.join(e,"gradlew.bat");if(process.platform==="win32"&&v.existsSync(t))return {command:t,baseArgs:[]};let n=f.join(e,"gradlew");return v.existsSync(n)?this.ensureWrapperExecutable(n)?{command:n,baseArgs:[]}:{command:"sh",baseArgs:[n]}:{command:"gradle",baseArgs:[]}}isGradleProject(e){return this.inspectJavaProject(e).hasGradleProject}isMavenProject(e){return this.inspectJavaProject(e).hasMavenProject}discoverWorkspaceJavaProjects(e){let t=[],n=new Set,o=[e];for(;o.length>0;){let i=o.shift();if(!i||n.has(i))continue;n.add(i);let s=[];try{s=v.readdirSync(i,{withFileTypes:true});}catch{continue}for(let a of s){if(!a.isDirectory()||a.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(a.name))continue;let d=f.join(i,a.name),p=this.inspectJavaProject(d);(p.hasMavenProject||p.hasGradleProject)&&t.push(d),o.push(d);}}return t}withJavaCacheEnv(e,t){let n=this.resolveDependencyMode(e),o=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=n==="shared-runtime-caches"?f.join(o||e,".rapidkit","cache","java","m2"):f.join(e,".rapidkit","cache","java","m2"),s=n==="shared-runtime-caches"?f.join(o||e,".rapidkit","cache","java","gradle"):f.join(e,".rapidkit","cache","java","gradle"),a=process.env.MAVEN_OPTS,d=process.env.GRADLE_USER_HOME,p=`-Dmaven.repo.local=${i}`;return process.env.MAVEN_OPTS=a?`${a} ${p}`:p,process.env.GRADLE_USER_HOME=s,t().finally(()=>{typeof a>"u"?delete process.env.MAVEN_OPTS:process.env.MAVEN_OPTS=a,typeof d>"u"?delete process.env.GRADLE_USER_HOME:process.env.GRADLE_USER_HOME=d;})}async runBuildTool(e,t,n=true){return this.withJavaCacheEnv(e,async()=>{try{let{command:o,baseArgs:i}=this.buildToolCommand(e),s=await this.runCommand(o,[...i,...t],e);if(s===0||!n)return {exitCode:s};let a=v.existsSync(f.join(e,"pom.xml")),d=v.existsSync(f.join(e,"build.gradle"))||v.existsSync(f.join(e,"build.gradle.kts"));return {exitCode:s,message:a||d?"Java build failed. Verify pom.xml/build.gradle syntax and dependencies, then retry.":"Java build tool is not installed or not available on PATH. Install Maven/Gradle and JDK 21+, or commit mvnw/gradlew wrapper scripts."}}catch(o){return {exitCode:1,message:`Java command execution failed: ${o instanceof Error?o.message:String(o)}. Verify pom.xml/build.gradle integrity and wrapper permissions.`}}})}resolveJarPath(e){let t=[f.join(e,"target"),f.join(e,"build","libs")];for(let n of t){if(!v.existsSync(n))continue;let i=v.readdirSync(n).filter(s=>s.toLowerCase().endsWith(".jar")).find(s=>!s.toLowerCase().endsWith("-sources.jar")&&!s.toLowerCase().endsWith("-javadoc.jar")&&!s.toLowerCase().endsWith("-plain.jar"));if(i)return f.join(n,i)}return null}commandArgsFor(e,t){if(e==="gradle"){let n=this.shouldUseGradleNoDaemon()?["--no-daemon"]:[];return t==="init"?[...n,"dependencies"]:t==="dev"?[...n,"bootRun"]:t==="test"?[...n,"test"]:[...n,"bootJar"]}return t==="init"?["-B","-q","-DskipTests","dependency:go-offline"]:t==="dev"?["spring-boot:run"]:t==="test"?["test"]:["-DskipTests","package"]}detectBuildTool(e){return this.isGradleProject(e)?"gradle":"maven"}async checkPrereqs(){let e=process.cwd(),t=this.resolveJavaCommand(e),n=await this.runCommand(t,["-version"],e);if(n!==0)return {exitCode:n,message:"JDK 21+ is required. Ensure java is on PATH or JAVA_HOME/bin/java is available."};if(this.isMavenProject(e)){let a=this.readRequiredJavaMajor(e),d=await this.detectInstalledJavaMajor(t,e);if(d!==null&&d<a)return {exitCode:1,message:`Detected Java ${d}, but project requires Java ${a}+.`};let p=f.join(process.env.JAVA_HOME||"","release");if(process.env.JAVA_HOME&&v.existsSync(p))try{let u=v.readFileSync(p,"utf-8").match(/^JAVA_VERSION="([^"]+)"/m),l=this.parseMajorJavaVersion(u?.[1]);if(l!==null&&l<a)return {exitCode:1,message:`Detected JAVA_HOME version ${l}, but project requires Java ${a}+.`}}catch{}}if(this.isMavenProject(e)||this.isGradleProject(e)){let a=this.detectBuildTool(e),d=a==="gradle"?["--version"]:["-version"],p=await this.runBuildTool(e,d);return p.exitCode!==0?p:a==="maven"&&!this.inspectJavaProject(e).hasMavenWrapper?this.checkSystemMavenVersion(e):p}let o=this.findWorkspaceRoot(e);if(o&&o===e){let a=this.discoverWorkspaceJavaProjects(o);if(a.length>0){let d=a.reduce((u,l)=>Math.max(u,this.readRequiredJavaMajor(l)),0);if(d>0){let u=await this.detectInstalledJavaMajor(t,e);if(u!==null&&u<d){let l=a.filter(h=>this.readRequiredJavaMajor(h)>u).map(h=>f.relative(e,h)).join(", ");return {exitCode:1,message:`Detected Java ${u}, but workspace project(s) [${l}] require Java ${d}+.`}}}let p=false,g=false;for(let u of a){let l=this.inspectJavaProject(u);l.hasMavenProject&&!l.hasMavenWrapper&&(p=true),l.hasGradleProject&&!l.hasGradleWrapper&&(g=true);}if(p){let u=await this.withJavaCacheEnv(e,async()=>this.runCommand("mvn",["-version"],e));if(u!==0)return {exitCode:u,message:"Maven is required for one or more workspace Java projects without Maven Wrapper. Install Maven 3.9+, or add mvnw/mvnw.cmd to those projects."};let l=await this.checkSystemMavenVersion(e);if(l.exitCode!==0)return l}if(g){let u=await this.withJavaCacheEnv(e,async()=>this.runCommand("gradle",["--version"],e));if(u!==0)return {exitCode:u,message:"Gradle is required for one or more workspace Java projects without Gradle Wrapper. Install Gradle 8+, or add gradlew/gradlew.bat to those projects."}}return {exitCode:0}}}let i=await this.withJavaCacheEnv(e,async()=>this.runCommand("mvn",["-version"],e));if(i===0){let a=await this.checkSystemMavenVersion(e);return a.exitCode!==0?a:{exitCode:0}}let s=await this.withJavaCacheEnv(e,async()=>this.runCommand("gradle",["--version"],e));return s===0?{exitCode:0}:{exitCode:i||s||1,message:"Neither Maven nor Gradle is available on PATH. Install one of them, or use mvnw/gradlew wrappers in project roots."}}async warmSetupCache(e){return this.withJavaCacheEnv(e,async()=>{try{let t=process.env.MAVEN_OPTS?.match(/-Dmaven\.repo\.local=([^\s]+)/)?.[1];return t&&v.mkdirSync(t,{recursive:true}),process.env.GRADLE_USER_HOME&&v.mkdirSync(process.env.GRADLE_USER_HOME,{recursive:true}),{exitCode:0}}catch{return {exitCode:1,message:"Failed to prepare Java cache directories"}}})}async initProject(e){return this.runBuildTool(e,this.commandArgsFor(this.detectBuildTool(e),"init"))}async runDev(e){return this.runBuildTool(e,this.commandArgsFor(this.detectBuildTool(e),"dev"))}async runTest(e){return this.runBuildTool(e,this.commandArgsFor(this.detectBuildTool(e),"test"))}async runBuild(e){return this.runBuildTool(e,this.commandArgsFor(this.detectBuildTool(e),"build"))}async runStart(e){let t=this.resolveJarPath(e);if(t)return {exitCode:await this.runCommand(this.resolveJavaCommand(e),["-jar",t],e)};let n=await this.runBuild(e);if(n.exitCode!==0)return n;let o=this.resolveJarPath(e);return o?{exitCode:await this.runCommand(this.resolveJavaCommand(e),["-jar",o],e)}:{exitCode:1,message:"Spring Boot build completed, but no runnable JAR was found under target/ or build/libs/. Verify build output naming and packaging plugins."}}async doctorHints(e){return ["Install JDK 21+ and Maven/Gradle (or commit mvnw/gradlew wrappers) for reliable local builds.","Run rapidkit init after dependency changes to warm Java caches for your build tool.","Use SPRING_PROFILES_ACTIVE to switch environments without changing source config."]}};var ht=class{constructor(e){this.runCommand=e;}runtime="node";async run(e,t,n){return {exitCode:await this.runCommand(e,t,n)}}findWorkspaceRoot(e){let t=e;for(;;){if(v.existsSync(f.join(t,".rapidkit-workspace")))return t;let n=f.dirname(t);if(n===t)break;t=n;}return null}resolveDependencyMode(e){let t=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(t==="shared-runtime-caches"||t==="shared-node-deps"||t==="isolated")return t;let n=this.findWorkspaceRoot(e);if(!n)return "isolated";let o=f.join(n,".rapidkit","policies.yml");if(!v.existsSync(o))return "isolated";try{let a=v.readFileSync(o,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(a==="shared-runtime-caches"||a==="shared-node-deps"||a==="isolated")return a}catch{}return "isolated"}withDependencyEnv(e,t,n){let o=this.resolveDependencyMode(e),i=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),s=o==="isolated"?f.join(e,".rapidkit","cache","node"):f.join(i||e,".rapidkit","cache","node"),a=process.env.npm_config_cache,d=process.env.npm_config_store_dir;return t==="pnpm"?(process.env.npm_config_store_dir=f.join(s,"pnpm-store"),process.env.npm_config_cache=f.join(s,"pnpm-cache")):t==="yarn"?process.env.npm_config_cache=f.join(s,"yarn-cache"):process.env.npm_config_cache=f.join(s,"npm-cache"),n().finally(()=>{typeof a>"u"?delete process.env.npm_config_cache:process.env.npm_config_cache=a,typeof d>"u"?delete process.env.npm_config_store_dir:process.env.npm_config_store_dir=d;})}detectPackageManager(e){return v.existsSync(f.join(e,"pnpm-lock.yaml"))?"pnpm":v.existsSync(f.join(e,"yarn.lock"))?"yarn":"npm"}scriptArgs(e,t){return e==="npm"?["run",t]:["run",t]}async checkPrereqs(){return this.run("node",["--version"],process.cwd())}async warmSetupCache(e){let t=this.detectPackageManager(e);return this.withDependencyEnv(e,t,async()=>{try{return process.env.npm_config_cache&&v.mkdirSync(process.env.npm_config_cache,{recursive:true}),t==="pnpm"&&process.env.npm_config_store_dir&&v.mkdirSync(process.env.npm_config_store_dir,{recursive:true}),{exitCode:0}}catch{return {exitCode:1,message:"Failed to prepare Node cache directories"}}})}async initProject(e){let t=this.detectPackageManager(e),n=this.resolveDependencyMode(e),o=n==="shared-runtime-caches"||n==="shared-node-deps"?["install","--prefer-offline"]:["install"];return this.withDependencyEnv(e,t,()=>this.run(t,o,e))}async runDev(e){let t=this.detectPackageManager(e);return this.withDependencyEnv(e,t,()=>this.run(t,this.scriptArgs(t,"dev"),e))}async runTest(e){let t=this.detectPackageManager(e);return this.withDependencyEnv(e,t,()=>this.run(t,this.scriptArgs(t,"test"),e))}async runBuild(e){let t=this.detectPackageManager(e);return this.withDependencyEnv(e,t,()=>this.run(t,this.scriptArgs(t,"build"),e))}async runStart(e){let t=this.detectPackageManager(e);return this.withDependencyEnv(e,t,()=>this.run(t,this.scriptArgs(t,"start"),e))}async doctorHints(e){return ["Install Node.js LTS and ensure node/npm are on PATH.","Use lockfiles (package-lock.json, pnpm-lock.yaml, yarn.lock) for deterministic installs.","Run install before dev/test/build if dependencies changed."]}};var wt=class{constructor(e){this.runCore=e;}runtime="python";async run(e,t){return {exitCode:await this.withPythonCacheEnv(t,()=>this.runCore(e,t))}}findWorkspaceRoot(e){let t=e;for(;;){if(v.existsSync(f.join(t,".rapidkit-workspace")))return t;let n=f.dirname(t);if(n===t)break;t=n;}return null}resolveDependencyMode(e){let t=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(t==="shared-runtime-caches"||t==="shared-node-deps"||t==="isolated")return t;let n=this.findWorkspaceRoot(e);if(!n)return "isolated";let o=f.join(n,".rapidkit","policies.yml");if(!v.existsSync(o))return "isolated";try{let a=v.readFileSync(o,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(a==="shared-runtime-caches"||a==="shared-node-deps"||a==="isolated")return a}catch{}return "isolated"}withPythonCacheEnv(e,t){let n=this.resolveDependencyMode(e),o=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=n==="shared-runtime-caches"?f.join(o||e,".rapidkit","cache","python"):f.join(e,".rapidkit","cache","python"),s=process.env.PIP_CACHE_DIR,a=process.env.POETRY_CACHE_DIR;return process.env.PIP_CACHE_DIR=f.join(i,"pip"),process.env.POETRY_CACHE_DIR=f.join(i,"poetry"),t().finally(()=>{typeof s>"u"?delete process.env.PIP_CACHE_DIR:process.env.PIP_CACHE_DIR=s,typeof a>"u"?delete process.env.POETRY_CACHE_DIR:process.env.POETRY_CACHE_DIR=a;})}async checkPrereqs(){let e=process.cwd(),t=await this.run(["doctor","check"],e);return t.exitCode===0?t:this.run(["doctor"],e)}async initProject(e){return this.run(["init"],e)}async runDev(e){return this.run(["dev"],e)}async runTest(e){return this.run(["test"],e)}async runBuild(e){return this.run(["build"],e)}async runStart(e){return this.run(["start"],e)}async doctorHints(e){return ['Run "npx rapidkit doctor workspace" for a full workspace scan.','Use "npx rapidkit init" after adding or changing modules.','Use workspace launcher "./rapidkit" to avoid environment drift.']}};function Gn(){let r={...process.env},e=r.PATH||"";if(e){let t=e.split(f.delimiter).filter(n=>!n.replace(/\\/g,"/").includes("/.pyenv/shims")).join(f.delimiter);r.PATH=t;}return r.PYENV_VERSION="system",r.POETRY_PYTHON=r.POETRY_PYTHON||c$3(),typeof r.RAPIDKIT_SKIP_LOCK_SYNC>"u"&&(r.RAPIDKIT_SKIP_LOCK_SYNC="1"),r}function Ee(r,e){return r==="go"?new gt((t,n,o)=>e.runCommandInCwd(t,n,o)):r==="node"?new ht((t,n,o)=>e.runCommandInCwd(t,n,o)):r==="java"?new yt((t,n,o)=>e.runCommandInCwd(t,n,o)):new wt((t,n)=>e.runCoreRapidkit(t,{cwd:n,env:Gn()}))}var Ar=f.join(vn.homedir(),".rapidkit","cache"),Ir=1440*60*1e3;function Gt(){let r=process.env.RAPIDKIT_CACHE_DIR?.trim();if(r)return r;let e=process.env.VITEST_WORKER_ID?.trim();return e?f.join(Ar,`vitest-${e}`):Ar}var vt=class r{static instance;memoryCache=new Map;constructor(){}static getInstance(){return r.instance||(r.instance=new r),r.instance}getCacheKey(e){return createHash("md5").update(e).digest("hex")}getCachePath(e){return f.join(Gt(),`${this.getCacheKey(e)}.json`)}getTempCachePath(e){let t=`${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`;return `${e}.${t}.tmp`}async get(e,t="1.0"){let n=this.memoryCache.get(e);if(n&&n.version===t&&Date.now()-n.timestamp<Ir)return a$1.debug(`Cache hit (memory): ${e}`),n.data;try{let o=this.getCachePath(e),i=await promises.readFile(o,"utf-8"),s=JSON.parse(i);if(s.version===t&&Date.now()-s.timestamp<Ir)return a$1.debug(`Cache hit (disk): ${e}`),this.memoryCache.set(e,s),s.data;await promises.unlink(o).catch(()=>{});}catch{a$1.debug(`Cache miss: ${e}`);}return null}async set(e,t,n="1.0"){let o={data:t,timestamp:Date.now(),version:n};this.memoryCache.set(e,o);try{await promises.mkdir(Gt(),{recursive:true});let i=this.getCachePath(e),s=this.getTempCachePath(i);await promises.writeFile(s,JSON.stringify(o),"utf-8"),await promises.rename(s,i),a$1.debug(`Cache set: ${e}`);}catch(i){a$1.debug(`Cache write failed: ${e}`,i);}}async invalidate(e){this.memoryCache.delete(e);try{let t=this.getCachePath(e);await promises.unlink(t),a$1.debug(`Cache invalidated: ${e}`);}catch{}}async clear(){this.memoryCache.clear();try{let e=Gt(),t=await promises.readdir(e);await Promise.all(t.map(n=>promises.unlink(f.join(e,n)))),a$1.debug("Cache cleared");}catch{}}};function ye(r){let e=r;for(;;){let t=f.join(e,".rapidkit","project.json");if(v.existsSync(t))try{return JSON.parse(v.readFileSync(t,"utf8"))}catch{return null}let n=f.dirname(e);if(n===e)break;e=n;}return null}function ne(r,e){let t=r?.runtime?.toLowerCase(),n=r?.kit_name?.toLowerCase(),o=v.existsSync(f.join(e,"go.mod"));return t==="go"||(n?.startsWith("gofiber")??false)||(n?.startsWith("gogin")??false)||o}function oe(r,e){let t=r?.runtime?.toLowerCase(),n=r?.kit_name?.toLowerCase(),o=v.existsSync(f.join(e,"package.json"));return t==="node"||t==="typescript"||(n?.startsWith("nestjs")??false)||o}function ie(r,e){let t=r?.runtime?.toLowerCase(),n=r?.kit_name?.toLowerCase(),o=v.existsSync(f.join(e,"pom.xml")),i=v.existsSync(f.join(e,"build.gradle"))||v.existsSync(f.join(e,"build.gradle.kts"));return t==="java"||t==="spring"||(n?.startsWith("springboot")??false)||o||i}function ae(r,e){let t=r?.runtime?.toLowerCase(),n=r?.kit_name?.toLowerCase(),o=v.existsSync(f.join(e,"pyproject.toml")),i=v.existsSync(f.join(e,"requirements.txt"))||v.existsSync(f.join(e,"requirements.in"));return t==="python"||(n?.startsWith("fastapi")??false)||o||i}async function Hn(r){let e=await promises.readFile(r);return createHash("sha256").update(e).digest("hex")}async function Mr(r,e){await R.outputFile(r,`${JSON.stringify(e,null,2)}
103
103
  `,"utf-8");}function ve(r,e){return f.isAbsolute(e)?e:f.join(r,e)}function Vn(r,e){if(r.target)return r.target;if(r.source)return f.basename(r.source);if(r.url)try{let t=new URL(r.url).pathname,n=f.basename(t);if(n&&n!=="/")return n}catch{}return `${e}.artifact`}async function Bn(r){let e=f.join(r,".rapidkit","trusted-sources.lock"),t=new Set(["localhost","127.0.0.1"]);if(!await R.pathExists(e))return t;try{let o=(await promises.readFile(e,"utf-8")).split(/\r?\n/).map(i=>i.trim()).filter(i=>i.length>0&&!i.startsWith("#"));for(let i of o)t.add(i.toLowerCase());}catch{}return t}async function Yn(r,e,t){await R.ensureDir(f.dirname(e)),await new Promise((n,o)=>{let s=(r.startsWith("https://")?Nr:Or).get(r,a=>{if(!a.statusCode||a.statusCode<200||a.statusCode>=300){o(new Error(`HTTP ${a.statusCode||"unknown"}`)),a.resume();return}let d=createWriteStream(e);a.pipe(d),d.on("finish",()=>{d.close(),n();}),d.on("error",p=>{o(p);});});s.setTimeout(t,()=>{s.destroy(new Error(`Request timeout after ${t}ms`));}),s.on("error",a=>{o(a);});});}async function zn(r,e,t,n,o){let i=new URL(r),s=JSON.stringify(e),a=i.protocol==="https:"?Nr:Or;await new Promise((d,p)=>{let g=a.request({method:"POST",hostname:i.hostname,port:i.port||(i.protocol==="https:"?443:80),path:`${i.pathname}${i.search}`,headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(s),...n?{Authorization:`Bearer ${n}`}:{},...o||{}}},u=>{if(!u.statusCode||u.statusCode<200||u.statusCode>=300){p(new Error(`HTTP ${u.statusCode||"unknown"}`)),u.resume();return}u.resume(),d();});g.setTimeout(t,()=>{g.destroy(new Error(`Request timeout after ${t}ms`));}),g.on("error",u=>{p(u);}),g.write(s),g.end();});}function $r(r){return new Promise(e=>setTimeout(e,r))}async function Qn(r,e,t,n){let o=ve(r,e||".rapidkit/reports/evidence-export-dead-letter.ndjson");return await R.ensureDir(f.dirname(o)),await promises.appendFile(o,`${JSON.stringify({timestamp:new Date().toISOString(),reason:n,payload:t})}
104
- `,"utf-8"),o}function Zn(r,e){if(!e?.enabled)return {headers:{}};let t=process.env[e.hmacKeyEnv];if(!t)return {headers:{},error:`Evidence signing key env is missing: ${e.hmacKeyEnv}`};let n=(e.algorithm||"sha256").toLowerCase(),o=e.headerName||"x-rapidkit-evidence-signature",i=createHmac(n,t).update(JSON.stringify(r)).digest("hex");return {headers:{[o]:i,"x-rapidkit-evidence-signature-alg":n}}}async function Xn(r,e,t){let n=(t.algorithm||"sha256").toLowerCase(),o=ve(r,t.publicKeyPath);if(!await R.pathExists(o))return {verified:false,algorithm:n,publicKeyPath:o,publicKeyFingerprint:"",signature:t.signature,message:`Public key not found: ${o}`};try{let i=await promises.readFile(o,"utf-8"),s=await promises.readFile(e),a=createVerify(n);a.update(s),a.end();let d=Buffer.from(t.signature,"base64"),p=a.verify(i,d),g=createHash("sha256").update(i).digest("hex");return {verified:p,algorithm:n,publicKeyPath:o,publicKeyFingerprint:g,signature:t.signature,message:p?"Attestation verified.":"Attestation signature verification failed."}}catch(i){return {verified:false,algorithm:n,publicKeyPath:o,publicKeyFingerprint:"",signature:t.signature,message:`Attestation verification error: ${i.message}`}}}async function eo(r,e,t,n){let o=process.env.RAPIDKIT_SIGSTORE_MOCK;if(o==="success")return {verified:true,tlogVerified:n.requireTransparencyLog,message:"Sigstore verification passed (mock).",identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:t.bundlePath||null,certificatePath:t.certificatePath||null,signaturePath:t.signaturePath||null};if(o==="fail")return {verified:false,tlogVerified:false,message:"Sigstore verification failed (mock).",identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:t.bundlePath||null,certificatePath:t.certificatePath||null,signaturePath:t.signaturePath||null};let i=t.signaturePath?ve(r,t.signaturePath):null;if(!i||!await R.pathExists(i))return {verified:false,tlogVerified:false,message:"Sigstore signaturePath is missing or not found.",identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:t.bundlePath||null,certificatePath:t.certificatePath||null,signaturePath:i};let s=["verify-blob",e,"--signature",i],a=t.certificatePath?ve(r,t.certificatePath):null;a&&s.push("--certificate",a);let d=t.bundlePath?ve(r,t.bundlePath):null;d&&s.push("--bundle",d);let p=t.keyPath?ve(r,t.keyPath):null;p&&s.push("--key",p),t.identity&&s.push("--certificate-identity",t.identity),t.issuer&&s.push("--certificate-oidc-issuer",t.issuer),t.rekorUrl&&s.push("--rekor-url",t.rekorUrl),n.requireTransparencyLog||s.push("--insecure-ignore-tlog");try{let g=await execa("cosign",s,{reject:false});return g.exitCode===0?{verified:true,tlogVerified:n.requireTransparencyLog,message:"Sigstore verification passed.",identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:d,certificatePath:a,signaturePath:i}:{verified:false,tlogVerified:false,message:`Sigstore verification failed: ${g.stderr||g.stdout||"unknown error"}`,identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:d,certificatePath:a,signaturePath:i}}catch(g){return {verified:false,tlogVerified:false,message:`Sigstore verification error: ${g.message}`,identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:d,certificatePath:a,signaturePath:i}}}async function to(r,e){let t=e.algorithm||"sha256",n=ve(r,e.policyPath),o=ve(r,e.signaturePath),i=ve(r,e.publicKeyPath);if(!await R.pathExists(n))return {verified:false,message:`Governance policy bundle not found: ${n}`,policies:null};if(!await R.pathExists(o))return {verified:false,message:`Governance policy signature not found: ${o}`,policies:null};if(!await R.pathExists(i))return {verified:false,message:`Governance policy public key not found: ${i}`,policies:null};try{let s=await promises.readFile(n,"utf-8"),a=(await promises.readFile(o,"utf-8")).trim(),d=await promises.readFile(i,"utf-8"),p=createVerify(t);return p.update(s),p.end(),p.verify(d,Buffer.from(a,"base64"))?{verified:true,message:"Governance policy bundle verified.",policies:JSON.parse(s).policies||{}}:{verified:false,message:"Governance policy bundle signature verification failed.",policies:null}}catch(s){return {verified:false,message:`Governance policy bundle verification error: ${s.message}`,policies:null}}}async function Ft(r,e){let t=[],n={syncedArtifacts:0,verifiedArtifacts:0,rotatedFiles:0,lockWritten:false,governanceBundleVerified:false,transparencyEvidenceWritten:false,transparencyEvidenceRecords:0,evidenceExported:false,evidenceExportTarget:null},o=f.join(r,".rapidkit"),i=f.join(o,"mirror-config.json"),s=f.join(o,"mirror.lock"),a=f.join(o,"mirror","artifacts"),d=f.join(o,"reports"),p=await Bn(r);if(!await R.pathExists(i))return t.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: .rapidkit/mirror-config.json not found."}),{checks:t,details:n};let g={};try{g=JSON.parse(await promises.readFile(i,"utf-8"));}catch{return t.push({id:"mirror.lifecycle.config",status:"failed",message:"Mirror lifecycle failed: invalid JSON in mirror-config.json."}),{checks:t,details:n}}if(!(e.forceRun===true||e.ciMode||e.offlineMode||g.mode==="offline-only"))return t.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: not in ci/offline mode."}),{checks:t,details:n};await R.ensureDir(a);let l=Math.max(0,g.prefetch?.retries??2),h=Math.max(0,g.prefetch?.backoffMs??250),m=Math.max(1e3,g.prefetch?.timeoutMs??15e3),w=g.security?.requireAttestation===true,k=g.security?.requireSigstore===true,y=g.security?.requireTransparencyLog===true,S=g.security?.requireSignedGovernance===true,P=g.security?.evidenceExport,_=(process.env.RAPIDKIT_ENV||g.security?.governance?.environment||"dev").toLowerCase(),A=g.security?.governance?.policies||{};if(g.security?.governanceBundle){let U=await to(r,g.security.governanceBundle);if(t.push({id:"governance.bundle.verify",status:U.verified?"passed":"failed",message:U.message}),U.verified&&U.policies)A=U.policies,n.governanceBundleVerified=true;else if(S)return {checks:t,details:n}}let $=A[_],K=y||$?.requireTransparencyLog===true,q=[],G=Array.isArray(g.artifacts)?g.artifacts:[],je=[];for(let U=0;U<G.length;U+=1){let M=G[U],C=M.id||`artifact-${U+1}`,J=M.source?ve(r,M.source):null,ue=Vn(M,C),L=f.join(a,ue),Z=false,fe={sourceType:"path",source:J||M.url||"unknown",host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true};if(J&&await R.pathExists(J))await R.ensureDir(f.dirname(L)),await R.copyFile(J,L),n.syncedArtifacts+=1,Z=true,fe={sourceType:"path",source:J,host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true},t.push({id:`mirror.sync.${C}`,status:"passed",message:`Mirrored artifact ${C} from source path.`});else if(M.url){let re="";try{re=new URL(M.url).hostname.toLowerCase();}catch{t.push({id:`mirror.prefetch.${C}`,status:"failed",message:`Invalid URL for ${C}: ${M.url}`});continue}if(!(process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||p.has(re))){t.push({id:`mirror.prefetch.trust.${C}`,status:"failed",message:`Untrusted mirror host for ${C}: ${re}. Add host to .rapidkit/trusted-sources.lock or set RAPIDKIT_TRUSTED_SOURCES=1.`});continue}if(e.offlineMode&&(await R.pathExists(L)?(Z=true,fe={sourceType:"url",source:M.url,host:re,fetchedAt:new Date().toISOString(),attempts:0,trusted:true},t.push({id:`mirror.prefetch.${C}`,status:"passed",message:`Offline mode reused existing mirrored artifact ${C}.`})):t.push({id:`mirror.prefetch.${C}`,status:"failed",message:`Offline mode cannot prefetch remote artifact ${C} without an existing mirrored copy.`}),!Z))continue;if(!Z){let H=null,be=0;for(let Te=1;Te<=l+1;Te+=1){be=Te;try{await Yn(M.url,L,m),n.syncedArtifacts+=1,Z=true,fe={sourceType:"url",source:M.url,host:re,fetchedAt:new Date().toISOString(),attempts:be,trusted:true},t.push({id:`mirror.prefetch.${C}`,status:"passed",message:be>1?`Prefetched artifact ${C} from ${re} after ${be} attempts.`:`Prefetched artifact ${C} from ${re}.`});break}catch(He){if(H=He,Te<=l){await $r(h*Te);continue}}}if(!Z){t.push({id:`mirror.prefetch.${C}`,status:"failed",message:`Failed to prefetch ${C} after ${l+1} attempt(s): ${H?.message||"unknown error"}`});continue}}if(!Z){t.push({id:`mirror.prefetch.${C}`,status:"failed",message:`Failed to prefetch ${C}.`});continue}}if(!Z){M.required||e.offlineMode?t.push({id:`mirror.sync.${C}`,status:"failed",message:`Mirror source missing for ${C}${J?`: ${J}`:""}`}):t.push({id:`mirror.sync.${C}`,status:"skipped",message:`Mirror source not found for optional artifact ${C}.`});continue}let Se=await Hn(L);if(M.sha256&&M.sha256.toLowerCase()!==Se.toLowerCase()){t.push({id:`mirror.verify.${C}`,status:"failed",message:`Checksum mismatch for ${C}.`});continue}n.verifiedArtifacts+=1,t.push({id:`mirror.verify.${C}`,status:"passed",message:`Checksum verified for ${C}.`});let X=M.attestation?await Xn(r,L,M.attestation):null;if(M.attestation){if(t.push({id:`mirror.attest.${C}`,status:X?.verified?"passed":"failed",message:X?.message||"Attestation verification failed."}),!X?.verified)continue}else if(w){t.push({id:`mirror.attest.${C}`,status:"failed",message:`Attestation is required but missing for ${C}.`});continue}else t.push({id:`mirror.attest.${C}`,status:"skipped",message:`No attestation provided for ${C}.`});let j=M.attestation?.sigstore,x=j?await eo(r,L,j,{requireTransparencyLog:K}):null;if(j){if(t.push({id:`mirror.sigstore.${C}`,status:x?.verified?"passed":"failed",message:x?.message||"Sigstore verification failed."}),q.push({artifactId:C,verified:!!x?.verified,tlogVerified:!!x?.tlogVerified,identity:x?.identity||null,issuer:x?.issuer||null,rekorUrl:x?.rekorUrl||null,timestamp:new Date().toISOString(),environment:_}),!x?.verified)continue}else if(k){t.push({id:`mirror.sigstore.${C}`,status:"failed",message:`Sigstore attestation is required but missing for ${C}.`});continue}else t.push({id:`mirror.sigstore.${C}`,status:"skipped",message:`No Sigstore attestation provided for ${C}.`});if(j&&x?.verified&&$){let re=$.allowedIdentities||[];if(re.length>0){let H=!!x.identity&&re.includes(x.identity);if(t.push({id:`mirror.sigstore.policy.identity.${C}`,status:H?"passed":"failed",message:H?`Sigstore identity policy passed for ${C} in ${_}.`:`Sigstore identity policy failed for ${C} in ${_}.`}),!H)continue}let se=$.allowedIssuers||[];if(se.length>0){let H=!!x.issuer&&se.includes(x.issuer);if(t.push({id:`mirror.sigstore.policy.issuer.${C}`,status:H?"passed":"failed",message:H?`Sigstore issuer policy passed for ${C} in ${_}.`:`Sigstore issuer policy failed for ${C} in ${_}.`}),!H)continue}let ge=$.allowedRekorUrls||[];if(ge.length>0){let H=!!x.rekorUrl&&ge.includes(x.rekorUrl);if(t.push({id:`mirror.sigstore.policy.rekor.${C}`,status:H?"passed":"failed",message:H?`Sigstore Rekor policy passed for ${C} in ${_}.`:`Sigstore Rekor policy failed for ${C} in ${_}.`}),!H)continue}}else $&&t.push({id:`mirror.sigstore.policy.${C}`,status:"skipped",message:`Sigstore governance policy configured for ${_} but no verified Sigstore attestation for ${C}.`});let F=await promises.stat(L);je.push({id:C,path:f.relative(r,L),sha256:Se,size:F.size,provenance:fe,attestation:{detached:{provided:!!M.attestation,verified:X?.verified||false,algorithm:X?.algorithm||null,publicKeyPath:X?.publicKeyPath||null,publicKeyFingerprint:X?.publicKeyFingerprint||null,signature:X?.signature||null,verifiedAt:X?.verified?new Date().toISOString():null},sigstore:{provided:!!j,verified:x?.verified||false,tlogVerified:x?.tlogVerified||false,identity:x?.identity||null,issuer:x?.issuer||null,rekorUrl:x?.rekorUrl||null,bundlePath:x?.bundlePath||null,certificatePath:x?.certificatePath||null,signaturePath:x?.signaturePath||null,verifiedAt:x?.verified?new Date().toISOString():null}}});}let te=g.retention?.keepLast;if(typeof te=="number"&&te>0){let M=(await promises.readdir(a,{withFileTypes:true})).filter(C=>C.isFile()).map(C=>f.join(a,C.name));if(M.length>te){let C=await Promise.all(M.map(async ue=>({filePath:ue,stat:await promises.stat(ue)})));C.sort((ue,L)=>L.stat.mtimeMs-ue.stat.mtimeMs);let J=C.slice(te);for(let ue of J)await promises.unlink(ue.filePath),n.rotatedFiles+=1;}}t.push({id:"mirror.rotate",status:"passed",message:n.rotatedFiles>0?`Mirror retention rotation removed ${n.rotatedFiles} file(s).`:"Mirror retention rotation completed with no removals."});let ce={schemaVersion:"1.0",generatedAt:new Date().toISOString(),mode:g.mode||null,environment:_,artifacts:je};if(await promises.writeFile(s,`${JSON.stringify(ce,null,2)}
105
- `,"utf-8"),n.lockWritten=true,t.push({id:"mirror.lock.write",status:"passed",message:`Mirror lock updated at ${f.relative(r,s)}.`}),n.transparencyEvidenceRecords=q.length,q.length>0){let U={schemaVersion:"1.0",generatedAt:new Date().toISOString(),environment:_,records:q},M=new Date().toISOString().replace(/[:.]/g,"-"),C=f.join(d,`transparency-evidence-${M}.json`),J=f.join(d,"transparency-evidence.latest.json");if(await R.ensureDir(d),await Mr(C,U),await Mr(J,U),n.transparencyEvidenceWritten=true,t.push({id:"sigstore.evidence.write",status:"passed",message:`Transparency evidence written to ${f.relative(r,J)}.`}),P?.enabled){let ue=Math.max(1e3,P.timeoutMs??1e4);if(P.target==="file")if(!P.filePath)t.push({id:"sigstore.evidence.export.file",status:"failed",message:"Evidence export target=file requires security.evidenceExport.filePath."});else try{let L=ve(r,P.filePath);await R.ensureDir(f.dirname(L)),await promises.appendFile(L,`${JSON.stringify(U)}
106
- `,"utf-8"),n.evidenceExported=true,n.evidenceExportTarget=L,t.push({id:"sigstore.evidence.export.file",status:"passed",message:`Transparency evidence exported to file sink ${L}.`});}catch(L){t.push({id:"sigstore.evidence.export.file",status:"failed",message:`Evidence file export failed: ${L.message}`});}else if(P.target==="http")if(!P.endpoint)t.push({id:"sigstore.evidence.export.http",status:"failed",message:"Evidence export target=http requires security.evidenceExport.endpoint."});else {let L=Math.max(0,P.retries??0),Z=Math.max(0,P.backoffMs??500),fe=Zn(U,P.signing);fe.error&&t.push({id:"sigstore.evidence.export.http",status:"failed",message:fe.error});try{let Se=P.authTokenEnv?process.env[P.authTokenEnv]:void 0,X=false,j=null;for(let x=1;x<=L+1;x+=1)try{if(fe.error)throw new Error(fe.error);await zn(P.endpoint,U,ue,Se,fe.headers),n.evidenceExported=true,n.evidenceExportTarget=P.endpoint,t.push({id:"sigstore.evidence.export.http",status:"passed",message:x>1?`Transparency evidence exported to HTTP endpoint ${P.endpoint} after ${x} attempts.`:`Transparency evidence exported to HTTP endpoint ${P.endpoint}.`}),X=true;break}catch(F){j=F,x<=L&&await $r(Z*x);}if(!X)throw j||new Error("unknown evidence export error")}catch(Se){let X=`Evidence HTTP export failed: ${Se.message}`;t.push({id:"sigstore.evidence.export.http",status:"failed",message:X});try{let j=await Qn(r,P.deadLetterPath,U,X);t.push({id:"sigstore.evidence.export.deadletter",status:"passed",message:`Evidence export failure persisted to dead-letter sink ${j}.`});}catch(j){t.push({id:"sigstore.evidence.export.deadletter",status:"failed",message:`Evidence dead-letter write failed: ${j.message}`});}}}if(P.failOnError&&t.some(Z=>Z.status==="failed"&&(Z.id==="sigstore.evidence.export.file"||Z.id==="sigstore.evidence.export.http")))return {checks:t,details:n}}else t.push({id:"sigstore.evidence.export",status:"skipped",message:"Central evidence export not configured (security.evidenceExport.enabled=false)."});}else t.push({id:"sigstore.evidence.write",status:"skipped",message:"No Sigstore records available for transparency evidence output."}),t.push({id:"sigstore.evidence.export",status:"skipped",message:"Central evidence export skipped because no transparency evidence records exist."});return {checks:t,details:n}}function Wt(r){if(!r||typeof r!="object")return null;let e=r.code;return e==="PYTHON_NOT_FOUND"||e==="BRIDGE_VENV_BOOTSTRAP_FAILED"||e==="BRIDGE_VENV_CREATE_FAILED"||e==="BRIDGE_PIP_BOOTSTRAP_FAILED"?e:null}function no(r){let e=r.trim().toLowerCase();return e?e.startsWith("fastapi")?"fastapi":e.startsWith("nestjs")?"nestjs":null:null}function _t(r){let e=r.trim().toLowerCase();return e.startsWith("gofiber")||e==="go"||e==="go.standard"||e==="fiber"}function Ze(r){let e=r.trim().toLowerCase();return e.startsWith("gogin")||e==="gin"}function Xe(r){let e=r.trim().toLowerCase();return e.startsWith("springboot")||e==="spring"||e==="springboot"||e==="java"}function me(r,e){let t=r.indexOf(e);if(t>=0&&t+1<r.length)return r[t+1];let n=r.find(o=>o.startsWith(`${e}=`));if(n)return n.slice(e.length+1)}function Bt(){return d$1()}function Lr(){let r={...process.env},e=r.PATH||"";return e&&(r.PATH=e.split(f.delimiter).filter(t=>!t.replace(/\\/g,"/").includes("/.pyenv/shims")).join(f.delimiter)),r.PYENV_VERSION="system",r.POETRY_PYTHON||(r.POETRY_PYTHON=c$3()),r.RAPIDKIT_SKIP_LOCK_SYNC||(r.RAPIDKIT_SKIP_LOCK_SYNC="1"),r.POETRY_KEYRING_ENABLED||(r.POETRY_KEYRING_ENABLED="false"),r.PYTHON_KEYRING_BACKEND||(r.PYTHON_KEYRING_BACKEND="keyring.backends.null.Keyring"),r.POETRY_NO_INTERACTION||(r.POETRY_NO_INTERACTION="1"),r}function oo(r){return f$1(f.join(r,".venv"))}async function Xr(r,e){return await N(r,["--version"],e)===0}async function Jt(r){let e=f.join(r,"go.mod");if(await R__default.pathExists(e))return "go";let t=f.join(r,"pom.xml"),n=f.join(r,"build.gradle"),o=f.join(r,"build.gradle.kts");if(await R__default.pathExists(t)||await R__default.pathExists(n)||await R__default.pathExists(o))return "java";let i=f.join(r,"package.json");if(await R__default.pathExists(i))return "node";let s=f.join(r,"pyproject.toml"),a=f.join(r,"requirements.txt"),d=f.join(r,"poetry.lock");return await R__default.pathExists(s)||await R__default.pathExists(a)||await R__default.pathExists(d)?"python":null}async function io(r){for(let e of Bt())if(await N(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],r)===0)return 0;return 1}async function en(r){for(let e of Bt())if(await N(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],r)===0)return 0;return 1}async function so(r){let e=f$1(f.join(r,".venv"));if(!await R__default.pathExists(e)){let i=await en(r);if(i!==0)return i}if(!await Xr("poetry",r))return 0;let n=await N("poetry",["config","virtualenvs.in-project","true","--local"],r);if(n!==0)return n;let o=await N("poetry",["env","use",e],r);return o!==0?o:0}async function ao(r){let e=f$1(f.join(r,".venv"));if(!await R__default.pathExists(e)){let o=await en(r);if(o!==0)return o}await N(e,["-m","pip","install","--upgrade","pip","setuptools","wheel"],r);let t=f.join(r,"requirements.txt");if(await R__default.pathExists(t)&&await N(e,["-m","pip","install","-r","requirements.txt"],r)===0)return 0;let n=f.join(r,"pyproject.toml");return await R__default.pathExists(n)&&(await N(e,["-m","pip","install","-e","."],r)===0||await N(e,["-m","pip","install","."],r)===0)?0:1}async function bt(r,e){return await so(r)!==0&&console.log(c$1.yellow("\u26A0\uFE0F Could not fully configure Poetry local venv. Trying fallback installer...")),(await e.initProject(r)).exitCode===0&&await R__default.pathExists(f.join(r,".venv"))?0:(console.log(c$1.yellow("\u26A0\uFE0F Python init fallback: installing dependencies directly into project .venv")),await ao(r))}async function Pt(r){let e=await et("init",r);if(e===0)return 0;let t=["npm","pnpm","yarn"];for(let n of t){if(!await Xr(n,r))continue;if(await N(n,["install"],r)===0)return console.log(c$1.green(`\u2705 Node init fallback succeeded with ${n} install`)),0}return e}async function Gr(r){if(r[0]!=="create"||r[1]!=="project")return 1;let e=r[2],t=r[3];if(!e||!t)return process.stderr.write(`Usage: rapidkit create project gofiber.standard <name> [--output <dir>]
104
+ `,"utf-8"),o}function Zn(r,e){if(!e?.enabled)return {headers:{}};let t=process.env[e.hmacKeyEnv];if(!t)return {headers:{},error:`Evidence signing key env is missing: ${e.hmacKeyEnv}`};let n=(e.algorithm||"sha256").toLowerCase(),o=e.headerName||"x-rapidkit-evidence-signature",i=createHmac(n,t).update(JSON.stringify(r)).digest("hex");return {headers:{[o]:i,"x-rapidkit-evidence-signature-alg":n}}}async function Xn(r,e,t){let n=(t.algorithm||"sha256").toLowerCase(),o=ve(r,t.publicKeyPath);if(!await R.pathExists(o))return {verified:false,algorithm:n,publicKeyPath:o,publicKeyFingerprint:"",signature:t.signature,message:`Public key not found: ${o}`};try{let i=await promises.readFile(o,"utf-8"),s=await promises.readFile(e),a=createVerify(n);a.update(s),a.end();let d=Buffer.from(t.signature,"base64"),p=a.verify(i,d),g=createHash("sha256").update(i).digest("hex");return {verified:p,algorithm:n,publicKeyPath:o,publicKeyFingerprint:g,signature:t.signature,message:p?"Attestation verified.":"Attestation signature verification failed."}}catch(i){return {verified:false,algorithm:n,publicKeyPath:o,publicKeyFingerprint:"",signature:t.signature,message:`Attestation verification error: ${i.message}`}}}async function eo(r,e,t,n){let o=process.env.RAPIDKIT_SIGSTORE_MOCK;if(o==="success")return {verified:true,tlogVerified:n.requireTransparencyLog,message:"Sigstore verification passed (mock).",identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:t.bundlePath||null,certificatePath:t.certificatePath||null,signaturePath:t.signaturePath||null};if(o==="fail")return {verified:false,tlogVerified:false,message:"Sigstore verification failed (mock).",identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:t.bundlePath||null,certificatePath:t.certificatePath||null,signaturePath:t.signaturePath||null};let i=t.signaturePath?ve(r,t.signaturePath):null;if(!i||!await R.pathExists(i))return {verified:false,tlogVerified:false,message:"Sigstore signaturePath is missing or not found.",identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:t.bundlePath||null,certificatePath:t.certificatePath||null,signaturePath:i};let s=["verify-blob",e,"--signature",i],a=t.certificatePath?ve(r,t.certificatePath):null;a&&s.push("--certificate",a);let d=t.bundlePath?ve(r,t.bundlePath):null;d&&s.push("--bundle",d);let p=t.keyPath?ve(r,t.keyPath):null;p&&s.push("--key",p),t.identity&&s.push("--certificate-identity",t.identity),t.issuer&&s.push("--certificate-oidc-issuer",t.issuer),t.rekorUrl&&s.push("--rekor-url",t.rekorUrl),n.requireTransparencyLog||s.push("--insecure-ignore-tlog");try{let g=await execa("cosign",s,{reject:false});return g.exitCode===0?{verified:true,tlogVerified:n.requireTransparencyLog,message:"Sigstore verification passed.",identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:d,certificatePath:a,signaturePath:i}:{verified:false,tlogVerified:false,message:`Sigstore verification failed: ${g.stderr||g.stdout||"unknown error"}`,identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:d,certificatePath:a,signaturePath:i}}catch(g){return {verified:false,tlogVerified:false,message:`Sigstore verification error: ${g.message}`,identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:d,certificatePath:a,signaturePath:i}}}async function to(r,e){let t=e.algorithm||"sha256",n=ve(r,e.policyPath),o=ve(r,e.signaturePath),i=ve(r,e.publicKeyPath);if(!await R.pathExists(n))return {verified:false,message:`Governance policy bundle not found: ${n}`,policies:null};if(!await R.pathExists(o))return {verified:false,message:`Governance policy signature not found: ${o}`,policies:null};if(!await R.pathExists(i))return {verified:false,message:`Governance policy public key not found: ${i}`,policies:null};try{let s=await promises.readFile(n,"utf-8"),a=(await promises.readFile(o,"utf-8")).trim(),d=await promises.readFile(i,"utf-8"),p=createVerify(t);return p.update(s),p.end(),p.verify(d,Buffer.from(a,"base64"))?{verified:true,message:"Governance policy bundle verified.",policies:JSON.parse(s).policies||{}}:{verified:false,message:"Governance policy bundle signature verification failed.",policies:null}}catch(s){return {verified:false,message:`Governance policy bundle verification error: ${s.message}`,policies:null}}}async function Ft(r,e){let t=[],n={syncedArtifacts:0,verifiedArtifacts:0,rotatedFiles:0,lockWritten:false,governanceBundleVerified:false,transparencyEvidenceWritten:false,transparencyEvidenceRecords:0,evidenceExported:false,evidenceExportTarget:null},o=f.join(r,".rapidkit"),i=f.join(o,"mirror-config.json"),s=f.join(o,"mirror.lock"),a=f.join(o,"mirror","artifacts"),d=f.join(o,"reports"),p=await Bn(r);if(!await R.pathExists(i))return t.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: .rapidkit/mirror-config.json not found."}),{checks:t,details:n};let g={};try{g=JSON.parse(await promises.readFile(i,"utf-8"));}catch{return t.push({id:"mirror.lifecycle.config",status:"failed",message:"Mirror lifecycle failed: invalid JSON in mirror-config.json."}),{checks:t,details:n}}if(!(e.forceRun===true||e.ciMode||e.offlineMode||g.mode==="offline-only"))return t.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: not in ci/offline mode."}),{checks:t,details:n};await R.ensureDir(a);let l=Math.max(0,g.prefetch?.retries??2),h=Math.max(0,g.prefetch?.backoffMs??250),m=Math.max(1e3,g.prefetch?.timeoutMs??15e3),w=g.security?.requireAttestation===true,k=g.security?.requireSigstore===true,y=g.security?.requireTransparencyLog===true,S=g.security?.requireSignedGovernance===true,P=g.security?.evidenceExport,_=(process.env.RAPIDKIT_ENV||g.security?.governance?.environment||"dev").toLowerCase(),A=g.security?.governance?.policies||{};if(g.security?.governanceBundle){let H=await to(r,g.security.governanceBundle);if(t.push({id:"governance.bundle.verify",status:H.verified?"passed":"failed",message:H.message}),H.verified&&H.policies)A=H.policies,n.governanceBundleVerified=true;else if(S)return {checks:t,details:n}}let $=A[_],K=y||$?.requireTransparencyLog===true,U=[],G=Array.isArray(g.artifacts)?g.artifacts:[],je=[];for(let H=0;H<G.length;H+=1){let M=G[H],C=M.id||`artifact-${H+1}`,J=M.source?ve(r,M.source):null,ue=Vn(M,C),L=f.join(a,ue),Z=false,fe={sourceType:"path",source:J||M.url||"unknown",host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true};if(J&&await R.pathExists(J))await R.ensureDir(f.dirname(L)),await R.copyFile(J,L),n.syncedArtifacts+=1,Z=true,fe={sourceType:"path",source:J,host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true},t.push({id:`mirror.sync.${C}`,status:"passed",message:`Mirrored artifact ${C} from source path.`});else if(M.url){let re="";try{re=new URL(M.url).hostname.toLowerCase();}catch{t.push({id:`mirror.prefetch.${C}`,status:"failed",message:`Invalid URL for ${C}: ${M.url}`});continue}if(!(process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||p.has(re))){t.push({id:`mirror.prefetch.trust.${C}`,status:"failed",message:`Untrusted mirror host for ${C}: ${re}. Add host to .rapidkit/trusted-sources.lock or set RAPIDKIT_TRUSTED_SOURCES=1.`});continue}if(e.offlineMode&&(await R.pathExists(L)?(Z=true,fe={sourceType:"url",source:M.url,host:re,fetchedAt:new Date().toISOString(),attempts:0,trusted:true},t.push({id:`mirror.prefetch.${C}`,status:"passed",message:`Offline mode reused existing mirrored artifact ${C}.`})):t.push({id:`mirror.prefetch.${C}`,status:"failed",message:`Offline mode cannot prefetch remote artifact ${C} without an existing mirrored copy.`}),!Z))continue;if(!Z){let V=null,be=0;for(let Te=1;Te<=l+1;Te+=1){be=Te;try{await Yn(M.url,L,m),n.syncedArtifacts+=1,Z=true,fe={sourceType:"url",source:M.url,host:re,fetchedAt:new Date().toISOString(),attempts:be,trusted:true},t.push({id:`mirror.prefetch.${C}`,status:"passed",message:be>1?`Prefetched artifact ${C} from ${re} after ${be} attempts.`:`Prefetched artifact ${C} from ${re}.`});break}catch(He){if(V=He,Te<=l){await $r(h*Te);continue}}}if(!Z){t.push({id:`mirror.prefetch.${C}`,status:"failed",message:`Failed to prefetch ${C} after ${l+1} attempt(s): ${V?.message||"unknown error"}`});continue}}if(!Z){t.push({id:`mirror.prefetch.${C}`,status:"failed",message:`Failed to prefetch ${C}.`});continue}}if(!Z){M.required||e.offlineMode?t.push({id:`mirror.sync.${C}`,status:"failed",message:`Mirror source missing for ${C}${J?`: ${J}`:""}`}):t.push({id:`mirror.sync.${C}`,status:"skipped",message:`Mirror source not found for optional artifact ${C}.`});continue}let Se=await Hn(L);if(M.sha256&&M.sha256.toLowerCase()!==Se.toLowerCase()){t.push({id:`mirror.verify.${C}`,status:"failed",message:`Checksum mismatch for ${C}.`});continue}n.verifiedArtifacts+=1,t.push({id:`mirror.verify.${C}`,status:"passed",message:`Checksum verified for ${C}.`});let X=M.attestation?await Xn(r,L,M.attestation):null;if(M.attestation){if(t.push({id:`mirror.attest.${C}`,status:X?.verified?"passed":"failed",message:X?.message||"Attestation verification failed."}),!X?.verified)continue}else if(w){t.push({id:`mirror.attest.${C}`,status:"failed",message:`Attestation is required but missing for ${C}.`});continue}else t.push({id:`mirror.attest.${C}`,status:"skipped",message:`No attestation provided for ${C}.`});let j=M.attestation?.sigstore,x=j?await eo(r,L,j,{requireTransparencyLog:K}):null;if(j){if(t.push({id:`mirror.sigstore.${C}`,status:x?.verified?"passed":"failed",message:x?.message||"Sigstore verification failed."}),U.push({artifactId:C,verified:!!x?.verified,tlogVerified:!!x?.tlogVerified,identity:x?.identity||null,issuer:x?.issuer||null,rekorUrl:x?.rekorUrl||null,timestamp:new Date().toISOString(),environment:_}),!x?.verified)continue}else if(k){t.push({id:`mirror.sigstore.${C}`,status:"failed",message:`Sigstore attestation is required but missing for ${C}.`});continue}else t.push({id:`mirror.sigstore.${C}`,status:"skipped",message:`No Sigstore attestation provided for ${C}.`});if(j&&x?.verified&&$){let re=$.allowedIdentities||[];if(re.length>0){let V=!!x.identity&&re.includes(x.identity);if(t.push({id:`mirror.sigstore.policy.identity.${C}`,status:V?"passed":"failed",message:V?`Sigstore identity policy passed for ${C} in ${_}.`:`Sigstore identity policy failed for ${C} in ${_}.`}),!V)continue}let se=$.allowedIssuers||[];if(se.length>0){let V=!!x.issuer&&se.includes(x.issuer);if(t.push({id:`mirror.sigstore.policy.issuer.${C}`,status:V?"passed":"failed",message:V?`Sigstore issuer policy passed for ${C} in ${_}.`:`Sigstore issuer policy failed for ${C} in ${_}.`}),!V)continue}let ge=$.allowedRekorUrls||[];if(ge.length>0){let V=!!x.rekorUrl&&ge.includes(x.rekorUrl);if(t.push({id:`mirror.sigstore.policy.rekor.${C}`,status:V?"passed":"failed",message:V?`Sigstore Rekor policy passed for ${C} in ${_}.`:`Sigstore Rekor policy failed for ${C} in ${_}.`}),!V)continue}}else $&&t.push({id:`mirror.sigstore.policy.${C}`,status:"skipped",message:`Sigstore governance policy configured for ${_} but no verified Sigstore attestation for ${C}.`});let F=await promises.stat(L);je.push({id:C,path:f.relative(r,L),sha256:Se,size:F.size,provenance:fe,attestation:{detached:{provided:!!M.attestation,verified:X?.verified||false,algorithm:X?.algorithm||null,publicKeyPath:X?.publicKeyPath||null,publicKeyFingerprint:X?.publicKeyFingerprint||null,signature:X?.signature||null,verifiedAt:X?.verified?new Date().toISOString():null},sigstore:{provided:!!j,verified:x?.verified||false,tlogVerified:x?.tlogVerified||false,identity:x?.identity||null,issuer:x?.issuer||null,rekorUrl:x?.rekorUrl||null,bundlePath:x?.bundlePath||null,certificatePath:x?.certificatePath||null,signaturePath:x?.signaturePath||null,verifiedAt:x?.verified?new Date().toISOString():null}}});}let te=g.retention?.keepLast;if(typeof te=="number"&&te>0){let M=(await promises.readdir(a,{withFileTypes:true})).filter(C=>C.isFile()).map(C=>f.join(a,C.name));if(M.length>te){let C=await Promise.all(M.map(async ue=>({filePath:ue,stat:await promises.stat(ue)})));C.sort((ue,L)=>L.stat.mtimeMs-ue.stat.mtimeMs);let J=C.slice(te);for(let ue of J)await promises.unlink(ue.filePath),n.rotatedFiles+=1;}}t.push({id:"mirror.rotate",status:"passed",message:n.rotatedFiles>0?`Mirror retention rotation removed ${n.rotatedFiles} file(s).`:"Mirror retention rotation completed with no removals."});let ce={schemaVersion:"1.0",generatedAt:new Date().toISOString(),mode:g.mode||null,environment:_,artifacts:je};if(await promises.writeFile(s,`${JSON.stringify(ce,null,2)}
105
+ `,"utf-8"),n.lockWritten=true,t.push({id:"mirror.lock.write",status:"passed",message:`Mirror lock updated at ${f.relative(r,s)}.`}),n.transparencyEvidenceRecords=U.length,U.length>0){let H={schemaVersion:"1.0",generatedAt:new Date().toISOString(),environment:_,records:U},M=new Date().toISOString().replace(/[:.]/g,"-"),C=f.join(d,`transparency-evidence-${M}.json`),J=f.join(d,"transparency-evidence.latest.json");if(await R.ensureDir(d),await Mr(C,H),await Mr(J,H),n.transparencyEvidenceWritten=true,t.push({id:"sigstore.evidence.write",status:"passed",message:`Transparency evidence written to ${f.relative(r,J)}.`}),P?.enabled){let ue=Math.max(1e3,P.timeoutMs??1e4);if(P.target==="file")if(!P.filePath)t.push({id:"sigstore.evidence.export.file",status:"failed",message:"Evidence export target=file requires security.evidenceExport.filePath."});else try{let L=ve(r,P.filePath);await R.ensureDir(f.dirname(L)),await promises.appendFile(L,`${JSON.stringify(H)}
106
+ `,"utf-8"),n.evidenceExported=true,n.evidenceExportTarget=L,t.push({id:"sigstore.evidence.export.file",status:"passed",message:`Transparency evidence exported to file sink ${L}.`});}catch(L){t.push({id:"sigstore.evidence.export.file",status:"failed",message:`Evidence file export failed: ${L.message}`});}else if(P.target==="http")if(!P.endpoint)t.push({id:"sigstore.evidence.export.http",status:"failed",message:"Evidence export target=http requires security.evidenceExport.endpoint."});else {let L=Math.max(0,P.retries??0),Z=Math.max(0,P.backoffMs??500),fe=Zn(H,P.signing);fe.error&&t.push({id:"sigstore.evidence.export.http",status:"failed",message:fe.error});try{let Se=P.authTokenEnv?process.env[P.authTokenEnv]:void 0,X=false,j=null;for(let x=1;x<=L+1;x+=1)try{if(fe.error)throw new Error(fe.error);await zn(P.endpoint,H,ue,Se,fe.headers),n.evidenceExported=true,n.evidenceExportTarget=P.endpoint,t.push({id:"sigstore.evidence.export.http",status:"passed",message:x>1?`Transparency evidence exported to HTTP endpoint ${P.endpoint} after ${x} attempts.`:`Transparency evidence exported to HTTP endpoint ${P.endpoint}.`}),X=true;break}catch(F){j=F,x<=L&&await $r(Z*x);}if(!X)throw j||new Error("unknown evidence export error")}catch(Se){let X=`Evidence HTTP export failed: ${Se.message}`;t.push({id:"sigstore.evidence.export.http",status:"failed",message:X});try{let j=await Qn(r,P.deadLetterPath,H,X);t.push({id:"sigstore.evidence.export.deadletter",status:"passed",message:`Evidence export failure persisted to dead-letter sink ${j}.`});}catch(j){t.push({id:"sigstore.evidence.export.deadletter",status:"failed",message:`Evidence dead-letter write failed: ${j.message}`});}}}if(P.failOnError&&t.some(Z=>Z.status==="failed"&&(Z.id==="sigstore.evidence.export.file"||Z.id==="sigstore.evidence.export.http")))return {checks:t,details:n}}else t.push({id:"sigstore.evidence.export",status:"skipped",message:"Central evidence export not configured (security.evidenceExport.enabled=false)."});}else t.push({id:"sigstore.evidence.write",status:"skipped",message:"No Sigstore records available for transparency evidence output."}),t.push({id:"sigstore.evidence.export",status:"skipped",message:"Central evidence export skipped because no transparency evidence records exist."});return {checks:t,details:n}}function Wt(r){if(!r||typeof r!="object")return null;let e=r.code;return e==="PYTHON_NOT_FOUND"||e==="BRIDGE_VENV_BOOTSTRAP_FAILED"||e==="BRIDGE_VENV_CREATE_FAILED"||e==="BRIDGE_PIP_BOOTSTRAP_FAILED"?e:null}function no(r){let e=r.trim().toLowerCase();return e?e.startsWith("fastapi")?"fastapi":e.startsWith("nestjs")?"nestjs":null:null}function _t(r){let e=r.trim().toLowerCase();return e.startsWith("gofiber")||e==="go"||e==="go.standard"||e==="fiber"}function Ze(r){let e=r.trim().toLowerCase();return e.startsWith("gogin")||e==="gin"}function Xe(r){let e=r.trim().toLowerCase();return e.startsWith("springboot")||e==="spring"||e==="springboot"||e==="java"}function me(r,e){let t=r.indexOf(e);if(t>=0&&t+1<r.length)return r[t+1];let n=r.find(o=>o.startsWith(`${e}=`));if(n)return n.slice(e.length+1)}function Bt(){return d$1()}function Lr(){let r={...process.env},e=r.PATH||"";return e&&(r.PATH=e.split(f.delimiter).filter(t=>!t.replace(/\\/g,"/").includes("/.pyenv/shims")).join(f.delimiter)),r.PYENV_VERSION="system",r.POETRY_PYTHON||(r.POETRY_PYTHON=c$3()),r.RAPIDKIT_SKIP_LOCK_SYNC||(r.RAPIDKIT_SKIP_LOCK_SYNC="1"),r.POETRY_KEYRING_ENABLED||(r.POETRY_KEYRING_ENABLED="false"),r.PYTHON_KEYRING_BACKEND||(r.PYTHON_KEYRING_BACKEND="keyring.backends.null.Keyring"),r.POETRY_NO_INTERACTION||(r.POETRY_NO_INTERACTION="1"),r}function oo(r){return f$1(f.join(r,".venv"))}async function Xr(r,e){return await N(r,["--version"],e)===0}async function Jt(r){let e=f.join(r,"go.mod");if(await R__default.pathExists(e))return "go";let t=f.join(r,"pom.xml"),n=f.join(r,"build.gradle"),o=f.join(r,"build.gradle.kts");if(await R__default.pathExists(t)||await R__default.pathExists(n)||await R__default.pathExists(o))return "java";let i=f.join(r,"package.json");if(await R__default.pathExists(i))return "node";let s=f.join(r,"pyproject.toml"),a=f.join(r,"requirements.txt"),d=f.join(r,"poetry.lock");return await R__default.pathExists(s)||await R__default.pathExists(a)||await R__default.pathExists(d)?"python":null}async function io(r){for(let e of Bt())if(await N(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],r)===0)return 0;return 1}async function en(r){for(let e of Bt())if(await N(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],r)===0)return 0;return 1}async function so(r){let e=f$1(f.join(r,".venv"));if(!await R__default.pathExists(e)){let i=await en(r);if(i!==0)return i}if(!await Xr("poetry",r))return 0;let n=await N("poetry",["config","virtualenvs.in-project","true","--local"],r);if(n!==0)return n;let o=await N("poetry",["env","use",e],r);return o!==0?o:0}async function ao(r){let e=f$1(f.join(r,".venv"));if(!await R__default.pathExists(e)){let o=await en(r);if(o!==0)return o}await N(e,["-m","pip","install","--upgrade","pip","setuptools","wheel"],r);let t=f.join(r,"requirements.txt");if(await R__default.pathExists(t)&&await N(e,["-m","pip","install","-r","requirements.txt"],r)===0)return 0;let n=f.join(r,"pyproject.toml");return await R__default.pathExists(n)&&(await N(e,["-m","pip","install","-e","."],r)===0||await N(e,["-m","pip","install","."],r)===0)?0:1}async function bt(r,e){return await so(r)!==0&&console.log(c$1.yellow("\u26A0\uFE0F Could not fully configure Poetry local venv. Trying fallback installer...")),(await e.initProject(r)).exitCode===0&&await R__default.pathExists(f.join(r,".venv"))?0:(console.log(c$1.yellow("\u26A0\uFE0F Python init fallback: installing dependencies directly into project .venv")),await ao(r))}async function Pt(r){let e=await et("init",r);if(e===0)return 0;let t=["npm","pnpm","yarn"];for(let n of t){if(!await Xr(n,r))continue;if(await N(n,["install"],r)===0)return console.log(c$1.green(`\u2705 Node init fallback succeeded with ${n} install`)),0}return e}async function Gr(r){if(r[0]!=="create"||r[1]!=="project")return 1;let e=r[2],t=r[3];if(!e||!t)return process.stderr.write(`Usage: rapidkit create project gofiber.standard <name> [--output <dir>]
107
107
  `),1;try{Ge(t);}catch(s){let a=s instanceof Error?s.message:String(s);return process.stderr.write(`${a}
108
108
  `),1}let n=me(r,"--output")||process.cwd(),o=f.resolve(n,t),i=r.includes("--skip-git")||r.includes("--no-git");try{let{default:s}=await import('fs-extra');if(await s.ensureDir(f.dirname(o)),await s.pathExists(o))return process.stderr.write(`\u274C Directory "${o}" already exists
109
- `),1;await s.ensureDir(o);let{generateGoFiberKit:a}=await import('./gofiber-standard-JDPREQCP.js');await a(o,{project_name:t,module_path:t,skipGit:i});let d=V(process.cwd());if(d){let{syncWorkspaceProjects:p}=await import('./workspace-VN3VF62I.js');await p(d,true);}return 0}catch(s){return process.stderr.write(`RapidKit Go/Fiber generator failed: ${s?.message??s}
109
+ `),1;await s.ensureDir(o);let{generateGoFiberKit:a}=await import('./gofiber-standard-JDPREQCP.js');await a(o,{project_name:t,module_path:t,skipGit:i});let d=q(process.cwd());if(d){let{syncWorkspaceProjects:p}=await import('./workspace-7JHX7L3E.js');await p(d,true);}return 0}catch(s){return process.stderr.write(`RapidKit Go/Fiber generator failed: ${s?.message??s}
110
110
  `),1}}async function Fr(r){if(r[0]!=="create"||r[1]!=="project")return 1;let e=r[2],t=r[3];if(!e||!t)return process.stderr.write(`Usage: rapidkit create project gogin.standard <name> [--output <dir>]
111
111
  `),1;try{Ge(t);}catch(s){let a=s instanceof Error?s.message:String(s);return process.stderr.write(`${a}
112
112
  `),1}let n=me(r,"--output")||process.cwd(),o=f.resolve(n,t),i=r.includes("--skip-git")||r.includes("--no-git");try{let{default:s}=await import('fs-extra');if(await s.ensureDir(f.dirname(o)),await s.pathExists(o))return process.stderr.write(`\u274C Directory "${o}" already exists
113
- `),1;await s.ensureDir(o);let{generateGoGinKit:a}=await import('./gogin-standard-DCERHHVB.js');await a(o,{project_name:t,module_path:t,skipGit:i});let d=V(process.cwd());if(d){let{syncWorkspaceProjects:p}=await import('./workspace-VN3VF62I.js');await p(d,true);}return 0}catch(s){return process.stderr.write(`RapidKit Go/Gin generator failed: ${s?.message??s}
113
+ `),1;await s.ensureDir(o);let{generateGoGinKit:a}=await import('./gogin-standard-DCERHHVB.js');await a(o,{project_name:t,module_path:t,skipGit:i});let d=q(process.cwd());if(d){let{syncWorkspaceProjects:p}=await import('./workspace-7JHX7L3E.js');await p(d,true);}return 0}catch(s){return process.stderr.write(`RapidKit Go/Gin generator failed: ${s?.message??s}
114
114
  `),1}}async function Wr(r){if(r[0]!=="create"||r[1]!=="project")return 1;let e=r[2],t=r[3];if(!e||!t)return process.stderr.write(`Usage: rapidkit create project springboot.standard <name> [--output <dir>] [--java-version <major>] [--spring-boot-version <semver>] [--springdoc-version <semver>] [--group-id <com.example>] [--package-name <com.example.app>] [--port <number>]
115
115
  `),1;try{Ge(t);}catch(m){let w=m instanceof Error?m.message:String(m);return process.stderr.write(`${w}
116
116
  `),1}let n=me(r,"--output")||process.cwd(),o=f.resolve(n,t),i=r.includes("--skip-git")||r.includes("--no-git"),s=me(r,"--java-version"),a=me(r,"--spring-boot-version"),d=me(r,"--springdoc-version"),p=me(r,"--group-id"),g=me(r,"--package-name"),u=me(r,"--description"),l=me(r,"--port"),h=m=>/^\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?$/.test(m);if(s&&!/^\d+$/.test(s.trim()))return process.stderr.write(`Invalid --java-version. Expected major version number, e.g. 21
@@ -120,7 +120,7 @@ ${t.stderr||""}`);return n?this.isMavenVersionAtLeast(n,[3,9,0])?{exitCode:0}:{e
120
120
  `),1;if(g&&!/^[A-Za-z0-9_.-]+$/.test(g.trim()))return process.stderr.write(`Invalid --package-name. Use dot-separated Java package identifiers only.
121
121
  `),1;if(l&&!/^\d+$/.test(l.trim()))return process.stderr.write(`Invalid --port. Expected numeric TCP port, e.g. 8080
122
122
  `),1;try{let{default:m}=await import('fs-extra');if(await m.ensureDir(f.dirname(o)),await m.pathExists(o))return process.stderr.write(`\u274C Directory "${o}" already exists
123
- `),1;await m.ensureDir(o);let{generateSpringBootKit:w}=await import('./springboot-standard-AGTOOTNT.js');await w(o,{project_name:t,artifact_id:t,java_version:s?.trim(),spring_boot_version:a?.trim(),springdoc_version:d?.trim(),group_id:p?.trim(),package_name:g?.trim(),description:u?.trim(),port:l?.trim(),skipGit:i});let k=V(process.cwd());if(k){let{syncWorkspaceProjects:y}=await import('./workspace-VN3VF62I.js');await y(k,true);}return 0}catch(m){return process.stderr.write(`RapidKit Spring Boot generator failed: ${m?.message??m}
123
+ `),1;await m.ensureDir(o);let{generateSpringBootKit:w}=await import('./springboot-standard-AGTOOTNT.js');await w(o,{project_name:t,artifact_id:t,java_version:s?.trim(),spring_boot_version:a?.trim(),springdoc_version:d?.trim(),group_id:p?.trim(),package_name:g?.trim(),description:u?.trim(),port:l?.trim(),skipGit:i});let k=q(process.cwd());if(k){let{syncWorkspaceProjects:y}=await import('./workspace-7JHX7L3E.js');await y(k,true);}return 0}catch(m){return process.stderr.write(`RapidKit Spring Boot generator failed: ${m?.message??m}
124
124
  `),1}}async function qt(r,e){if(r.includes("--json"))return process.stderr.write("RapidKit (npm) offline fallback does not support --json for `create` commands.\nInstall Python 3.10+ and retry the same command.\n"),1;if(r[0]!=="create")return 1;if(r[1]!=="project")return process.stderr.write(`RapidKit (npm) could not run the Python core engine for \`create\`.
125
125
  Reason: ${e}.
126
126
  Install Python 3.10+ to use the interactive wizard and full kit catalog.
@@ -132,19 +132,19 @@ Requested kit: ${o}
132
132
  Offline fallback only supports: fastapi.standard, nestjs.standard (and their shorthands).
133
133
  Install Python 3.10+ to access all kits.
134
134
  `),1;let a=me(r,"--output")||process.cwd(),d=f.resolve(a,i),p=r.includes("--skip-git")||r.includes("--no-git"),g=r.includes("--skip-install");try{if(await R__default.ensureDir(f.dirname(d)),await R__default.pathExists(d))return process.stderr.write(`\u274C Directory "${d}" already exists
135
- `),1;let u="pip",l=V(process.cwd());if(l)try{let{readWorkspaceMarker:m}=await import('./workspace-marker-IOPQ42A7.js'),w=await m(l);w?.metadata?.npm?.installMethod&&(u=w.metadata.npm.installMethod,a$1.debug(`Detected workspace engine: ${u}`));}catch(m){a$1.debug("Failed to read workspace marker",m);}else a$1.debug("No workspace found, using default engine: pip");await R__default.ensureDir(d);let{generateDemoKit:h}=await import('./demo-kit-HMJZ3A3M.js');if(await h(d,{project_name:i,template:s,kit_name:o,skipGit:p,skipInstall:g,engine:u}),l){let{syncWorkspaceProjects:m}=await import('./workspace-VN3VF62I.js');await m(l,true);}return 0}catch(u){return process.stderr.write(`RapidKit (npm) offline fallback failed: ${u?.message??u}
135
+ `),1;let u="pip",l=q(process.cwd());if(l)try{let{readWorkspaceMarker:m}=await import('./workspace-marker-IOPQ42A7.js'),w=await m(l);w?.metadata?.npm?.installMethod&&(u=w.metadata.npm.installMethod,a$1.debug(`Detected workspace engine: ${u}`));}catch(m){a$1.debug("Failed to read workspace marker",m);}else a$1.debug("No workspace found, using default engine: pip");await R__default.ensureDir(d);let{generateDemoKit:h}=await import('./demo-kit-HMJZ3A3M.js');if(await h(d,{project_name:i,template:s,kit_name:o,skipGit:p,skipInstall:g,engine:u}),l){let{syncWorkspaceProjects:m}=await import('./workspace-7JHX7L3E.js');await m(l,true);}return 0}catch(u){return process.stderr.write(`RapidKit (npm) offline fallback failed: ${u?.message??u}
136
136
  `),1}}async function tn(r){let e$1=new Set(["--yes","-y","--skip-git","--skip-install","--debug","--dry-run","--no-update-check","--create-workspace","--no-workspace"]);if(r[0]==="create"&&(!r[1]||r[1].startsWith("-"))){let t=r.includes("--yes")||r.includes("-y"),n=r.slice(1),o;!process.stdin.isTTY||t?(o="workspace",process.stdin.isTTY&&console.log(c$1.gray("\u2139\uFE0F No subcommand provided for `create`; defaulting to `create workspace`."))):o=(await _e.prompt([{type:"rawlist",name:"createTarget",message:"What do you want to create?",choices:[{name:"workspace",value:"workspace"},{name:"project",value:"project"}]}])).createTarget;let i=["create",o,...n];return await tn(i)}if(r[0]==="create"&&r[1]==="workspace")try{let t=r.includes("--yes")||r.includes("-y"),n=r.includes("--skip-git")||r.includes("--no-git"),o=r[2]&&!r[2].startsWith("-")?r[2]:void 0,i=me(r,"--install-method"),s=i==="poetry"||i==="venv"||i==="pipx"?i:void 0,a=me(r,"--profile"),d=a==="minimal"||a==="java-only"||a==="go-only"||a==="python-only"||a==="node-only"||a==="polyglot"||a==="enterprise"?a:void 0,p=o||(t?"my-workspace":(await _e.prompt([{type:"input",name:"workspaceName",message:"Workspace name:",default:"my-workspace"}])).workspaceName);if(!p||!p.trim())return process.stderr.write(`Workspace name is required.
137
137
  `),1;try{Ge(p);}catch(m){if(m instanceof e)return process.stderr.write(`${m.message}
138
138
  `),1;throw m}let g=f.resolve(process.cwd(),p);if(await R__default.pathExists(g))return process.stderr.write(`\u274C Directory "${p}" already exists
139
- `),1;let u=await a$2(),l=u.author||process.env.USER||"RapidKit User";if(!t){let m=await _e.prompt([{type:"input",name:"author",message:"Author name:",default:l}]);m.author?.trim()&&(l=m.author.trim());}let{createProject:h}=await import('./create-YIUV6RUX.js');return await h(p,{skipGit:n,yes:t,userConfig:{...u,author:l},installMethod:s,profile:d}),0}catch(t){return process.stderr.write(`RapidKit (npm) failed to create workspace: ${t?.message??t}
139
+ `),1;let u=await a$2(),l=u.author||process.env.USER||"RapidKit User";if(!t){let m=await _e.prompt([{type:"input",name:"author",message:"Author name:",default:l}]);m.author?.trim()&&(l=m.author.trim());}let{createProject:h}=await import('./create-3V7O72CO.js');return await h(p,{skipGit:n,yes:t,userConfig:{...u,author:l},installMethod:s,profile:d}),0}catch(t){return process.stderr.write(`RapidKit (npm) failed to create workspace: ${t?.message??t}
140
140
  `),1}try{if(r[0]==="create"&&r[1]==="project"){if(r.includes("--help")||r.includes("-h"))try{return await c$2(),await d(["create","project","--help"],{cwd:process.cwd()})}catch(m){return process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${m?.message??m}
141
141
  `),1}if(!r[2]||r[2].startsWith("-")){console.log(c$1.bold(`
142
142
  \u{1F680} RapidKit
143
- `));let{kitChoice:m}=await _e.prompt([{type:"rawlist",name:"kitChoice",message:"Select a kit to scaffold:",choices:[{name:"fastapi \u2014 FastAPI Standard Kit",value:"fastapi.standard"},{name:"fastapi \u2014 FastAPI DDD Kit",value:"fastapi.ddd"},{name:"nestjs \u2014 NestJS Standard Kit",value:"nestjs.standard"},{name:"spring \u2014 Spring Boot Standard Kit",value:"springboot.standard"},{name:"go/fiber \u2014 Go Fiber Standard Kit",value:"gofiber.standard"},{name:"go/gin \u2014 Go Gin Standard Kit",value:"gogin.standard"}]}]);if(_t(m)||Ze(m)||Xe(m)){let{projectName:k}=await _e.prompt([{type:"input",name:"projectName",message:"Project name:",validate:S=>S.trim().length>0||"Project name is required"}]),y=r.slice(2).filter(S=>S.startsWith("-"));return Ze(m)?await Fr(["create","project",m,k.trim(),...y]):Xe(m)?await Wr(["create","project",m,k.trim(),...y]):await Gr(["create","project",m,k.trim(),...y])}let{projectName:w}=await _e.prompt([{type:"input",name:"projectName",message:"Project name:",validate:k=>k.trim().length>0||"Project name is required"}]);r.splice(2,0,m,w.trim());}{let m=V(process.cwd()),w=(r[2]||"").toLowerCase();if(m&&w){let k=f.join(m,".rapidkit","workspace.json"),y=f.join(m,".rapidkit","policies.yml");try{let[S,P]=await Promise.all([R__default.pathExists(k).then(ce=>ce?v.promises.readFile(k,"utf-8"):"{}"),R__default.pathExists(y).then(ce=>ce?v.promises.readFile(y,"utf-8"):"")]),_=JSON.parse(S).profile,$=P.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]??"warn",K=_t(w)||Ze(w)||w.startsWith("go"),q=Xe(w)||w.includes("spring"),G=["nestjs","react","vue","nextjs","next","vite","angular","svelte","express","koa","fastify"].some(ce=>w.includes(ce)),je=!K&&!G&&!q,te=null;if(_==="python-only"&&!je?te=`Kit "${w}" is not a Python kit, but workspace profile is "python-only".`:_==="node-only"&&!G?te=`Kit "${w}" is not a Node kit, but workspace profile is "node-only".`:_==="go-only"&&!K?te=`Kit "${w}" is not a Go kit, but workspace profile is "go-only".`:_==="java-only"&&!q&&(te=`Kit "${w}" is not a Java kit, but workspace profile is "java-only".`),te){if($==="strict")return console.log(c$1.red(`\u274C Profile violation (strict mode): ${te}`)),console.log(c$1.gray("\u{1F4A1} Change workspace profile or use --no-workspace to skip enforcement.")),1;console.log(c$1.yellow(`\u26A0\uFE0F Profile warning: ${te}`)),console.log(c$1.gray('\u{1F4A1} Consider using a "polyglot" workspace profile for multi-language projects.'));}}catch{}}}if(_t(r[2]||""))return await Gr(r);if(Ze(r[2]||""))return await Fr(r);if(Xe(r[2]||""))return await Wr(r);let n=r.includes("--create-workspace"),o=r.includes("--no-workspace"),i=r.includes("--yes")||r.includes("-y"),s=r.includes("--skip-git")||r.includes("--no-git");if(!!!Ht(process.cwd())){let{registerWorkspaceAtPath:m}=await import('./create-YIUV6RUX.js');if(n)await m(process.cwd(),{skipGit:s,yes:i,userConfig:await a$2()});else if(!o)if(i)await m(process.cwd(),{skipGit:s,yes:true,userConfig:await a$2()});else {let{createWs:w}=await _e.prompt([{type:"confirm",name:"createWs",message:"This project will be created outside a RapidKit workspace. Create and register a workspace here?",default:true}]);w&&await m(process.cwd(),{skipGit:s,yes:false,userConfig:await a$2()});}}let p=[...r.filter(m=>{let w=m.split("=")[0];return !e$1.has(m)&&!e$1.has(w)})],g=V(process.cwd()),h=r.includes("--skip-install")||!!g?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0;try{await c$2();let m=await d(p,{cwd:process.cwd(),env:h});if(m===0&&g&&!r.includes("--skip-install")&&(console.log(c$1.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(c$1.white(" Next: cd <project-name> && npx rapidkit init"))),m===0){let w=g||V(process.cwd());if(w){try{let y=r[3];if(y){let S=r.indexOf("--output"),P=S>=0?r[S+1]:".",_=f.resolve(process.cwd(),P,y),A=f.join(w,".python-version"),$=f.join(_,".python-version");if(v.existsSync(A)&&v.existsSync(_)){let K=v.readFileSync(A,"utf-8");v.writeFileSync($,K.trim()+`
144
- `),a$1.debug(`Synced Python version ${K.trim()} from workspace to ${y}`);}}}catch(y){a$1.debug("Could not sync Python version from workspace:",y);}let{syncWorkspaceProjects:k}=await import('./workspace-VN3VF62I.js');await k(w,true);}}return m}catch(m){let w=Wt(m);return w?await qt(p,w):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${m?.message??m}
145
- `),1)}}if(r[0]==="create"&&r[1]!=="project")try{await c$2();let t=await d(r,{cwd:process.cwd()});if(t===0){let n=V(process.cwd());if(n){let{syncWorkspaceProjects:o}=await import('./workspace-VN3VF62I.js');await o(n,true);}}return t}catch(t){let n=Wt(t);return n?await qt(r,n):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${t?.message??t}
143
+ `));let{kitChoice:m}=await _e.prompt([{type:"rawlist",name:"kitChoice",message:"Select a kit to scaffold:",choices:[{name:"fastapi \u2014 FastAPI Standard Kit",value:"fastapi.standard"},{name:"fastapi \u2014 FastAPI DDD Kit",value:"fastapi.ddd"},{name:"nestjs \u2014 NestJS Standard Kit",value:"nestjs.standard"},{name:"spring \u2014 Spring Boot Standard Kit",value:"springboot.standard"},{name:"go/fiber \u2014 Go Fiber Standard Kit",value:"gofiber.standard"},{name:"go/gin \u2014 Go Gin Standard Kit",value:"gogin.standard"}]}]);if(_t(m)||Ze(m)||Xe(m)){let{projectName:k}=await _e.prompt([{type:"input",name:"projectName",message:"Project name:",validate:S=>S.trim().length>0||"Project name is required"}]),y=r.slice(2).filter(S=>S.startsWith("-"));return Ze(m)?await Fr(["create","project",m,k.trim(),...y]):Xe(m)?await Wr(["create","project",m,k.trim(),...y]):await Gr(["create","project",m,k.trim(),...y])}let{projectName:w}=await _e.prompt([{type:"input",name:"projectName",message:"Project name:",validate:k=>k.trim().length>0||"Project name is required"}]);r.splice(2,0,m,w.trim());}{let m=q(process.cwd()),w=(r[2]||"").toLowerCase();if(m&&w){let k=f.join(m,".rapidkit","workspace.json"),y=f.join(m,".rapidkit","policies.yml");try{let[S,P]=await Promise.all([R__default.pathExists(k).then(ce=>ce?v.promises.readFile(k,"utf-8"):"{}"),R__default.pathExists(y).then(ce=>ce?v.promises.readFile(y,"utf-8"):"")]),_=JSON.parse(S).profile,$=P.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]??"warn",K=_t(w)||Ze(w)||w.startsWith("go"),U=Xe(w)||w.includes("spring"),G=["nestjs","react","vue","nextjs","next","vite","angular","svelte","express","koa","fastify"].some(ce=>w.includes(ce)),je=!K&&!G&&!U,te=null;if(_==="python-only"&&!je?te=`Kit "${w}" is not a Python kit, but workspace profile is "python-only".`:_==="node-only"&&!G?te=`Kit "${w}" is not a Node kit, but workspace profile is "node-only".`:_==="go-only"&&!K?te=`Kit "${w}" is not a Go kit, but workspace profile is "go-only".`:_==="java-only"&&!U&&(te=`Kit "${w}" is not a Java kit, but workspace profile is "java-only".`),te){if($==="strict")return console.log(c$1.red(`\u274C Profile violation (strict mode): ${te}`)),console.log(c$1.gray("\u{1F4A1} Change workspace profile or use --no-workspace to skip enforcement.")),1;console.log(c$1.yellow(`\u26A0\uFE0F Profile warning: ${te}`)),console.log(c$1.gray('\u{1F4A1} Consider using a "polyglot" workspace profile for multi-language projects.'));}}catch{}}}if(_t(r[2]||""))return await Gr(r);if(Ze(r[2]||""))return await Fr(r);if(Xe(r[2]||""))return await Wr(r);let n=r.includes("--create-workspace"),o=r.includes("--no-workspace"),i=r.includes("--yes")||r.includes("-y"),s=r.includes("--skip-git")||r.includes("--no-git");if(!!!Ht(process.cwd())){let{registerWorkspaceAtPath:m}=await import('./create-3V7O72CO.js');if(n)await m(process.cwd(),{skipGit:s,yes:i,userConfig:await a$2()});else if(!o)if(i)await m(process.cwd(),{skipGit:s,yes:true,userConfig:await a$2()});else {let{createWs:w}=await _e.prompt([{type:"confirm",name:"createWs",message:"This project will be created outside a RapidKit workspace. Create and register a workspace here?",default:true}]);w&&await m(process.cwd(),{skipGit:s,yes:false,userConfig:await a$2()});}}let p=[...r.filter(m=>{let w=m.split("=")[0];return !e$1.has(m)&&!e$1.has(w)})],g=q(process.cwd()),h=r.includes("--skip-install")||!!g?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0;try{await c$2();let m=await d(p,{cwd:process.cwd(),env:h});if(m===0&&g&&!r.includes("--skip-install")&&(console.log(c$1.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(c$1.white(" Next: cd <project-name> && npx rapidkit init"))),m===0){let w=g||q(process.cwd());if(w){try{let y=r[3];if(y){let S=r.indexOf("--output"),P=S>=0?r[S+1]:".",_=f.resolve(process.cwd(),P,y),A=f.join(w,".python-version"),$=f.join(_,".python-version");if(v.existsSync(A)&&v.existsSync(_)){let K=v.readFileSync(A,"utf-8");v.writeFileSync($,K.trim()+`
144
+ `),a$1.debug(`Synced Python version ${K.trim()} from workspace to ${y}`);}}}catch(y){a$1.debug("Could not sync Python version from workspace:",y);}let{syncWorkspaceProjects:k}=await import('./workspace-7JHX7L3E.js');await k(w,true);}}return m}catch(m){let w=Wt(m);return w?await qt(p,w):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${m?.message??m}
145
+ `),1)}}if(r[0]==="create"&&r[1]!=="project")try{await c$2();let t=await d(r,{cwd:process.cwd()});if(t===0){let n=q(process.cwd());if(n){let{syncWorkspaceProjects:o}=await import('./workspace-7JHX7L3E.js');await o(n,true);}}return t}catch(t){let n=Wt(t);return n?await qt(r,n):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${t?.message??t}
146
146
  `),1)}return await c$2(),await d(r,{cwd:process.cwd()})}catch(t){let n=Wt(t);return n?await qt(r,n):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${t?.message??t}
147
- `),1)}}var Jr=["init","dev","start","build","test","docs","lint","format","create","help","--help","-h"],co=["doctor","workspace","bootstrap","setup","cache","mirror","ai","config","shell"],lo=["doctor","workspace","ai","config","shell"],po=["bootstrap","setup","cache","mirror"],rn=["lint","format","docs"],uo=["init"],nn=["build","dev","start","test"],qr=[...nn,...rn];function jt(r){return !!r&&co.includes(r)}function Ur(r){return !!r&&lo.includes(r)}function mo(r){return !!r&&po.includes(r)}function on(r){return v.existsSync(f.join(r,".rapidkit-workspace"))||v.existsSync(f.join(r,".rapidkit","workspace.json"))}function sn(r){let e=r;for(;;){let t=f.join(e,".rapidkit","context.json");if(v.existsSync(t))return t;let n=f.dirname(e);if(n===e)break;e=n;}return null}function Ht(r){let e=r,t=f.resolve(tmpdir());for(;;){let n=f.join(e,".rapidkit-workspace");if(v.existsSync(n)&&f.resolve(e)!==t)return n;let o=f.dirname(e);if(o===e)break;e=o;}return null}function V(r){let e=r,t=f.resolve(tmpdir());for(;;){let n=f.join(e,".rapidkit-workspace");if(v.existsSync(n)&&f.resolve(e)!==t)return e;let o=f.dirname(e);if(o===e)break;e=o;}return null}async function fo(r,e=process.cwd(),t=process.platform){if(!(r.workspaceFlag||r.scope==="workspace")||!a(t))return {detected:false};let o=i(e,t);for(let i of o){if(!await R__default.pathExists(i))continue;let s=i.toLowerCase();if(s.endsWith("rapidkit.cmd")||s.endsWith("rapidkit.exe"))return {detected:true,candidatePath:i,reason:"Found workspace-local rapidkit launcher on Windows."}}return {detected:false}}function go(r){let e=r;for(;;){let t=f.join(e,".rapidkit-workspace"),n=f.join(e,".rapidkit","workspace.json");if(!v.existsSync(t)&&v.existsSync(n))return e;let o=f.dirname(e);if(o===e)break;e=o;}return null}var an={enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true};function yo(r){return r&&r.match(/^[\t ]*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]==="strict"?"strict":"warn"}function Qe(r,e){let t=r.match(new RegExp(`^[\\t ]*${e}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return t?t[1]==="true":an[e]}function Hr(r){let e=r??"";return {mode:yo(e),dependency_sharing_mode:cn(e),rules:{enforce_workspace_marker:Qe(e,"enforce_workspace_marker"),enforce_toolchain_lock:Qe(e,"enforce_toolchain_lock"),disallow_untrusted_tool_sources:Qe(e,"disallow_untrusted_tool_sources"),enforce_compatibility_matrix:Qe(e,"enforce_compatibility_matrix"),require_mirror_lock_for_offline:Qe(e,"require_mirror_lock_for_offline")}}}function Vr(r,e,t){let n=`${e}: ${t}`,o=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`^[\\t ]*${o}:\\s*.*$`,"m");if(i.test(r))return r.replace(i,n);let s=/^[\t ]*rules:\s*(?:#.*)?$/m;return s.test(r)?r.replace(s,`${n}
147
+ `),1)}}var Jr=["init","dev","start","build","test","docs","lint","format","create","help","--help","-h"],co=["doctor","workspace","bootstrap","setup","cache","mirror","ai","config","shell"],lo=["doctor","workspace","ai","config","shell"],po=["bootstrap","setup","cache","mirror"],rn=["lint","format","docs"],uo=["init"],nn=["build","dev","start","test"],qr=[...nn,...rn];function jt(r){return !!r&&co.includes(r)}function Ur(r){return !!r&&lo.includes(r)}function mo(r){return !!r&&po.includes(r)}function on(r){return v.existsSync(f.join(r,".rapidkit-workspace"))||v.existsSync(f.join(r,".rapidkit","workspace.json"))}function sn(r){let e=r;for(;;){let t=f.join(e,".rapidkit","context.json");if(v.existsSync(t))return t;let n=f.dirname(e);if(n===e)break;e=n;}return null}function Ht(r){let e=r,t=f.resolve(tmpdir());for(;;){let n=f.join(e,".rapidkit-workspace");if(v.existsSync(n)&&f.resolve(e)!==t)return n;let o=f.dirname(e);if(o===e)break;e=o;}return null}function q(r){let e=r,t=f.resolve(tmpdir());for(;;){let n=f.join(e,".rapidkit-workspace");if(v.existsSync(n)&&f.resolve(e)!==t)return e;let o=f.dirname(e);if(o===e)break;e=o;}return null}async function fo(r,e=process.cwd(),t=process.platform){if(!(r.workspaceFlag||r.scope==="workspace")||!a(t))return {detected:false};let o=i(e,t);for(let i of o){if(!await R__default.pathExists(i))continue;let s=i.toLowerCase();if(s.endsWith("rapidkit.cmd")||s.endsWith("rapidkit.exe"))return {detected:true,candidatePath:i,reason:"Found workspace-local rapidkit launcher on Windows."}}return {detected:false}}function go(r){let e=r;for(;;){let t=f.join(e,".rapidkit-workspace"),n=f.join(e,".rapidkit","workspace.json");if(!v.existsSync(t)&&v.existsSync(n))return e;let o=f.dirname(e);if(o===e)break;e=o;}return null}var an={enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true};function yo(r){return r&&r.match(/^[\t ]*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]==="strict"?"strict":"warn"}function Qe(r,e){let t=r.match(new RegExp(`^[\\t ]*${e}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return t?t[1]==="true":an[e]}function Hr(r){let e=r??"";return {mode:yo(e),dependency_sharing_mode:cn(e),rules:{enforce_workspace_marker:Qe(e,"enforce_workspace_marker"),enforce_toolchain_lock:Qe(e,"enforce_toolchain_lock"),disallow_untrusted_tool_sources:Qe(e,"disallow_untrusted_tool_sources"),enforce_compatibility_matrix:Qe(e,"enforce_compatibility_matrix"),require_mirror_lock_for_offline:Qe(e,"require_mirror_lock_for_offline")}}}function Vr(r,e,t){let n=`${e}: ${t}`,o=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`^[\\t ]*${o}:\\s*.*$`,"m");if(i.test(r))return r.replace(i,n);let s=/^[\t ]*rules:\s*(?:#.*)?$/m;return s.test(r)?r.replace(s,`${n}
148
148
  rules:`):`${r.endsWith(`
149
149
  `)?r:`${r}
150
150
  `}${n}
@@ -156,27 +156,27 @@ ${n}
156
156
  `}function wo(){return ['version: "1.0"','mode: warn # "warn" or "strict"','dependency_sharing_mode: isolated # "isolated" or "shared-runtime-caches" or "shared-node-deps"',"# change profile (recommended): npx rapidkit bootstrap --profile polyglot","# change mode/dependency manually: edit this file and rerun npx rapidkit init","rules:"," enforce_workspace_marker: true"," enforce_toolchain_lock: false"," disallow_untrusted_tool_sources: false"," enforce_compatibility_matrix: false"," require_mirror_lock_for_offline: true",""].join(`
157
157
  `)}async function Br(r){let e=f.join(r,".rapidkit","policies.yml");return await R__default.pathExists(e)?v.promises.readFile(e,"utf-8"):wo()}async function ko(r,e){let t=f.join(r,".rapidkit"),n=f.join(t,"policies.yml");await R__default.ensureDir(t);let o=e.endsWith(`
158
158
  `)?e:`${e}
159
- `;await v.promises.writeFile(n,o,"utf-8");}function vo(r){let e=r.trim().toLowerCase();return e==="true"||e==="1"||e==="on"?true:e==="false"||e==="0"||e==="off"?false:null}function cn(r){if(!r)return "isolated";let t=r.match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();return t==="shared-runtime-caches"||t==="shared-node-deps"||t==="isolated"?t:"isolated"}function ln(r){if(!r)return {mode:"isolated",status:"skipped",message:"No policies.yml found; dependency_sharing_mode defaults to isolated."};let e=r.match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m);if(!e)return {mode:"isolated",status:"skipped",message:"dependency_sharing_mode is not set; defaulting to isolated."};let t=e[1].toLowerCase();return t==="isolated"||t==="shared-runtime-caches"||t==="shared-node-deps"?{mode:t,status:"passed",message:`dependency_sharing_mode is valid: ${t}.`}:{mode:"isolated",status:"failed",message:`Invalid dependency_sharing_mode: ${t}. Use one of: isolated, shared-runtime-caches, shared-node-deps.`}}async function dn(r,e){let t=V(r),n=t?f.join(t,".rapidkit","policies.yml"):null,o="isolated";if(n&&await R__default.pathExists(n))try{let a=await v.promises.readFile(n,"utf-8"),d=ln(a);if(d.status==="failed")return console.log(c$1.red(`\u274C ${d.message}`)),{ok:false,code:1};o=d.mode;}catch{return console.log(c$1.red("\u274C Failed to read workspace policy file (.rapidkit/policies.yml).")),{ok:false,code:1}}let i=process.env.RAPIDKIT_DEP_SHARING_MODE,s=process.env.RAPIDKIT_WORKSPACE_PATH;process.env.RAPIDKIT_DEP_SHARING_MODE=o,t&&(process.env.RAPIDKIT_WORKSPACE_PATH=t);try{return {ok:true,value:await e()}}finally{typeof i>"u"?delete process.env.RAPIDKIT_DEP_SHARING_MODE:process.env.RAPIDKIT_DEP_SHARING_MODE=i,typeof s>"u"?delete process.env.RAPIDKIT_WORKSPACE_PATH:process.env.RAPIDKIT_WORKSPACE_PATH=s;}}async function N(r,e,t){return await new Promise(n=>{let o=spawn(r,e,{stdio:"inherit",cwd:t,shell:b$2()});o.on("close",i=>n(i??1)),o.on("error",()=>n(1));})}async function Ue(r,e){await R__default.outputFile(r,`${JSON.stringify(e,null,2)}
160
- `,"utf-8");}async function bo(r){let e=new Set(["python-only","polyglot","enterprise"]),t="minimal";try{let i=f.join(r,".rapidkit","workspace.json");t=JSON.parse(await v.promises.readFile(i,"utf-8")).profile??"minimal";}catch{t="minimal";}if(!await(async()=>{if(e.has(t))return true;let i=await St(r);if(i.length===0)return false;for(let s of i){let a=ye(s),d=a?.module_support;if(!(ne(a,s)||ie(a,s))&&d!==false)return ae(a,s)||oe(a,s),true}return false})())return 0;let o="poetry";try{let{readWorkspaceMarker:i}=await import('./workspace-marker-IOPQ42A7.js'),a=(await i(r))?.metadata?.npm?.installMethod;(a==="poetry"||a==="venv"||a==="pipx"||a==="pip")&&(o=a);}catch{}if(o==="poetry"||o==="venv"){let i=f.join(r,"pyproject.toml"),s=false;try{s=(await v.promises.readFile(i,"utf-8")).includes("rapidkit-core");}catch{s=false;}let a=process.env.RAPIDKIT_DEV_PATH,d=a?await R__default.pathExists(a):false;if(s){let p=oo(r);if(!await R__default.pathExists(p)){let l=await io(r);if(l!==0)return l}let u=await N(p,d&&a?["-m","pip","install",a,"--quiet","--disable-pip-version-check"]:["-m","pip","install","rapidkit-core","--quiet","--disable-pip-version-check"],r);if(u!==0)return u}else {let p=await N("poetry",["install","--no-root"],r);if(p!==0)return p;let g=await N("poetry",["add","rapidkit-core"],r);if(g!==0)return g}try{let{writeWorkspaceLauncher:p}=await import('./create-YIUV6RUX.js');await p(r,o==="venv"?"venv":"poetry");}catch{}return 0}return 0}async function St(r){let e=[],t=new Set,n=[r];for(;n.length>0;){let o=n.pop();if(!o||t.has(o))continue;t.add(o);let i=[];try{i=await v.promises.readdir(o,{withFileTypes:true});}catch{continue}for(let s of i){if(!s.isDirectory()||s.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(s.name))continue;let a=f.join(o,s.name),d=f.join(a,".rapidkit","context.json"),p=f.join(a,".rapidkit","project.json");if(await R__default.pathExists(d)||await R__default.pathExists(p)){e.push(a);continue}n.push(a);}}return e}function Po(r){let e="my-workspace",t=1;for(;;){let n=t===1?e:`${e}-${t}`,o=f.join(r,n);if(!v.existsSync(o))return {name:n,targetPath:o};t+=1;}}async function Ct(r){let t=await Ee("go",{runCommandInCwd:N,runCoreRapidkit:d}).initProject(r);return t.message&&console.log(c$1.red(`\u274C ${t.message}`)),t.exitCode}async function et(r,e){let t=Ee("node",{runCommandInCwd:N,runCoreRapidkit:d});return r==="init"?(await t.initProject(e)).exitCode:r==="dev"?(await t.runDev(e)).exitCode:r==="test"?(await t.runTest(e)).exitCode:r==="build"?(await t.runBuild(e)).exitCode:(await t.runStart(e)).exitCode}async function $e(r,e){let t=Ee("java",{runCommandInCwd:N,runCoreRapidkit:d});return r==="init"?(await t.initProject(e)).exitCode:r==="dev"?(await t.runDev(e)).exitCode:r==="test"?(await t.runTest(e)).exitCode:r==="build"?(await t.runBuild(e)).exitCode:(await t.runStart(e)).exitCode}async function Co(r,e=Vt){let t=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof t>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let i=function(j){if(!j)return null;let x=j.trim().toLowerCase();return x==="minimal"||x==="java-only"||x==="go-only"||x==="python-only"||x==="node-only"||x==="polyglot"||x==="enterprise"?x:null},s=function(j){let re=j.match(/^\s*mode:\s*([a-zA-Z]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase()==="strict"?"strict":"warn",se=(ge,H)=>{let be=j.match(new RegExp(`^\\s*${ge}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return be?be[1].toLowerCase()==="true":H};return {mode:re,dependency_sharing_mode:cn(j),rules:{enforce_workspace_marker:se("enforce_workspace_marker",true),enforce_toolchain_lock:se("enforce_toolchain_lock",false),disallow_untrusted_tool_sources:se("disallow_untrusted_tool_sources",false),enforce_compatibility_matrix:se("enforce_compatibility_matrix",false),require_mirror_lock_for_offline:se("require_mirror_lock_for_offline",true)}}};let a=["init"],d,p=false,g=false,u=false;for(let j=1;j<r.length;j+=1){let x=r[j];if(x==="--ci"){p=true;continue}if(x==="--offline"){g=true;continue}if(x==="--json"){u=true;continue}if(x==="--profile"){let F=r[j+1];if(!F||F.startsWith("-"))return console.log(c$1.yellow("Usage: rapidkit bootstrap [path] [--profile <minimal|java-only|go-only|python-only|node-only|polyglot|enterprise>] [--ci] [--offline] [--json]")),1;d=F,j+=1;continue}if(x.startsWith("--profile=")){d=x.slice(10);continue}a.push(x);}let l=i(d);if(d&&!l)return console.log(c$1.red(`Invalid profile: ${d}. Use one of: minimal, java-only, go-only, python-only, node-only, polyglot, enterprise.`)),1;let h=process.cwd(),m=f.join(h,".rapidkit-workspace"),w=f.join(h,".rapidkit","workspace.json"),k;!v.existsSync(m)&&v.existsSync(w)?k=h:(k=V(h),k||(k=go(h)));let y=[],S=null,P=null;if(k)try{let j=f.join(k,".rapidkit","workspace.json"),x=await v.promises.readFile(j,"utf-8"),F=JSON.parse(x);P=i(F.profile);}catch{P=null;}let _=["minimal","java-only","python-only","node-only","go-only","polyglot","enterprise"],A={minimal:"minimal \u2014 Foundation files only (fastest bootstrap, mixed projects)","java-only":"java-only \u2014 Java runtime (Spring Boot services)","python-only":"python-only \u2014 Python + Poetry (FastAPI, Django, ML pipelines)","node-only":"node-only \u2014 Node.js runtime (NestJS, Express, Next.js)","go-only":"go-only \u2014 Go runtime (Fiber, Gin, gRPC, microservices)",polyglot:"polyglot \u2014 Python + Node.js + Go + Java multi-runtime workspace",enterprise:"enterprise \u2014 Polyglot + governance + Sigstore verification"},$=l;if(!!k&&!l&&!p&&!u&&!!process.stdin.isTTY&&!!process.stdout.isTTY){let j=P||"minimal",{chosenProfile:x}=await _e.prompt([{type:"rawlist",name:"chosenProfile",message:`Select workspace profile for bootstrap (current: ${j})`,choices:_.map(F=>({name:F===j?`${A[F]} \u2190 current`:A[F],value:F})),default:_.indexOf(j)}]);$=x;}let q=$||P||"minimal";if(k)try{let x=q==="python-only"||q==="polyglot"||q==="enterprise"?"poetry":"venv",F;try{let H=(await v.promises.readFile(f.join(k,".python-version"),"utf-8")).trim();H&&(F=H);}catch{}let{syncWorkspaceFoundationFiles:re}=await import('./create-YIUV6RUX.js'),se=await re(k,{workspaceName:f.basename(k),installMethod:x,pythonVersion:F,profile:q,writeMarker:true,writeGitignore:true,onlyIfMissing:true});y.push({id:"workspace.legacy.sync",status:se.length>0?"passed":"skipped",message:se.length>0?`Legacy workspace foundation synchronized: ${se.join(", ")}`:"Workspace foundation files are already up to date."});}catch(j){y.push({id:"workspace.legacy.sync",status:"failed",message:`Failed to synchronize legacy workspace foundation files: ${j.message}`});}if(k&&$&&$!==P)try{let j=f.join(k,".rapidkit","workspace.json"),x=await v.promises.readFile(j,"utf-8"),F=JSON.parse(x);F.profile=$,await v.promises.writeFile(j,JSON.stringify(F,null,2)+`
161
- `,"utf-8");}catch{}let G={mode:"warn",dependency_sharing_mode:"isolated",rules:{enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true}},je=null;if(k)try{let j=await v.promises.readFile(f.join(k,".rapidkit","policies.yml"),"utf-8");je=j,G=s(j);}catch{y.push({id:"policy.file",status:"skipped",message:"No workspace policy file found; using default bootstrap policy."});}else y.push({id:"workspace.detect",status:"skipped",message:"No workspace marker found; bootstrap runs in project/single-path mode."});if(k){let j=ln(je);G.dependency_sharing_mode=j.mode,y.push({id:"policy.schema.dependency_sharing_mode",status:j.status,message:j.message}),y.push({id:"policy.dependency_sharing_mode.effective",status:"passed",message:G.dependency_sharing_mode==="isolated"?"Effective dependency mode: isolated (default secure mode).":G.dependency_sharing_mode==="shared-node-deps"?"Effective dependency mode: shared-node-deps (Node projects share workspace-level caches).":"Effective dependency mode: shared-runtime-caches (Node/Python/Go share workspace-level caches)."});let x=v.existsSync(f.join(k,".rapidkit-workspace"));y.push({id:"policy.enforce_workspace_marker",status:!G.rules.enforce_workspace_marker||x?"passed":"failed",message:!G.rules.enforce_workspace_marker||x?"Workspace marker policy satisfied.":"Workspace marker policy failed: .rapidkit-workspace is missing."});let F=v.existsSync(f.join(k,".rapidkit","toolchain.lock"));y.push({id:"policy.enforce_toolchain_lock",status:!G.rules.enforce_toolchain_lock||F?"passed":"failed",message:!G.rules.enforce_toolchain_lock||F?"Toolchain lock policy satisfied.":"Toolchain lock policy failed: .rapidkit/toolchain.lock is missing."});let re=process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||v.existsSync(f.join(k,".rapidkit","trusted-sources.lock"));y.push({id:"policy.disallow_untrusted_tool_sources",status:!G.rules.disallow_untrusted_tool_sources||re?"passed":"failed",message:!G.rules.disallow_untrusted_tool_sources||re?"Trusted tool sources policy satisfied.":"Trusted tool sources policy failed: set RAPIDKIT_TRUSTED_SOURCES=1 or provide .rapidkit/trusted-sources.lock."});let se=f.join(k,".rapidkit","compatibility-matrix.json"),ge=v.existsSync(se),H=G.rules.enforce_compatibility_matrix;if(y.push({id:"policy.enforce_compatibility_matrix",status:!H||ge?"passed":"failed",message:!H||ge?"Compatibility matrix policy satisfied.":"Compatibility matrix policy failed: .rapidkit/compatibility-matrix.json is missing."}),ge)try{let O=await v.promises.readFile(se,"utf-8"),B=JSON.parse(O),tt=!!B&&typeof B=="object";y.push({id:"compatibility.matrix.parse",status:tt?"passed":"failed",message:tt?"Compatibility matrix parsed successfully.":"Compatibility matrix parse failed: invalid JSON object."});}catch{y.push({id:"compatibility.matrix.parse",status:"failed",message:"Compatibility matrix parse failed: invalid JSON."});}let be=f.join(k,".rapidkit","mirror-config.json"),Te=f.join(k,".rapidkit","mirror.lock"),He=v.existsSync(be),Rt=v.existsSync(Te),Yt={};if(He)try{Yt=JSON.parse(await v.promises.readFile(be,"utf-8")),y.push({id:"mirror.config.parse",status:"passed",message:"Mirror configuration parsed successfully."});}catch{y.push({id:"mirror.config.parse",status:"failed",message:"Mirror configuration parse failed: invalid JSON in .rapidkit/mirror-config.json."});}let Et=await Ft(k,{ciMode:p,offlineMode:g});if(y.push(...Et.checks.map(O=>({id:O.id,status:O.status,message:O.message}))),S=Et.details,Et.details.lockWritten&&(Rt=true),g){let O=process.env.RAPIDKIT_MIRROR_ENABLED==="1"||Yt.enabled===true;y.push({id:"offline.mirror.enabled",status:O?"passed":"failed",message:O?"Offline mode mirror is enabled.":'Offline mode requires mirror enablement (set RAPIDKIT_MIRROR_ENABLED=1 or .rapidkit/mirror-config.json {"enabled": true}).'});let B=G.rules.require_mirror_lock_for_offline;y.push({id:"offline.mirror.lock",status:!B||Rt?"passed":"failed",message:!B||Rt?"Offline mode mirror lock policy satisfied.":"Offline mode mirror lock policy failed: .rapidkit/mirror.lock is missing."});}else y.push({id:"offline.mirror.enabled",status:"skipped",message:"Offline mirror checks skipped (offline mode is disabled)."});let un=await St(k),ee=new Set;for(let O of un){let B=ye(O);if(ne(B,O)){ee.add("go");continue}if(ie(B,O)){ee.add("java");continue}if(oe(B,O)){ee.add("node");continue}if(ae(B,O)){ee.add("python");continue}ee.add("unknown");}if(q==="go-only"){let O=ee.size===0||[...ee].every(B=>B==="go");y.push({id:"profile.go-only",status:O?"passed":"failed",message:O?"go-only profile validated for discovered projects.":`go-only profile mismatch: detected runtimes [${[...ee].join(", ")}].`});}else if(q==="java-only"){let O=ee.size===0||[...ee].every(B=>B==="java");y.push({id:"profile.java-only",status:O?"passed":"failed",message:O?"java-only profile validated for discovered projects.":`java-only profile mismatch: detected runtimes [${[...ee].join(", ")}].`});}else if(q==="python-only"){let O=ee.size===0||[...ee].every(B=>B==="python");y.push({id:"profile.python-only",status:O?"passed":"failed",message:O?"python-only profile validated for discovered projects.":`python-only profile mismatch: detected runtimes [${[...ee].join(", ")}].`});}else if(q==="node-only"){let O=ee.size===0||[...ee].every(B=>B==="node");y.push({id:"profile.node-only",status:O?"passed":"failed",message:O?"node-only profile validated for discovered projects.":`node-only profile mismatch: detected runtimes [${[...ee].join(", ")}].`});}else if(q==="minimal"){let O=[...ee].filter(tt=>tt!=="unknown"),B=O.length<=1;y.push({id:"profile.minimal",status:B?"passed":"failed",message:B?"minimal profile is compatible with detected runtime mix.":`minimal profile mismatch: multiple runtimes detected [${O.join(", ")}].`});}else q==="enterprise"&&(y.push({id:"profile.enterprise.ci",status:p?"passed":"failed",message:p?"enterprise profile running with --ci.":"enterprise profile expects --ci for deterministic non-interactive mode."}),y.push({id:"profile.enterprise.compatibility-matrix",status:ge?"passed":"failed",message:ge?"enterprise profile has compatibility matrix.":"enterprise profile requires .rapidkit/compatibility-matrix.json."}),y.push({id:"profile.enterprise.mirror-config",status:He?"passed":"failed",message:He?"enterprise profile has mirror configuration.":"enterprise profile requires .rapidkit/mirror-config.json."}));}p&&(process.env.RAPIDKIT_BOOTSTRAP_CI="1"),g&&(process.env.RAPIDKIT_OFFLINE_MODE="1");let ce=y.some(j=>j.id.startsWith("policy.schema.")&&j.status==="failed")||G.mode==="strict"&&y.some(j=>j.status==="failed"),U=k||h,M=f.join(U,".rapidkit","reports"),C=new Date().toISOString().replace(/[:.]/g,"-"),J=f.join(M,`bootstrap-compliance-${C}.json`),ue=f.join(M,"bootstrap-compliance.latest.json"),L={command:"bootstrap",timestamp:new Date().toISOString(),workspacePath:k,profile:q,options:{ci:p,offline:g,strict:G.mode==="strict"},policyMode:G.mode,policyRules:G.rules,mirrorLifecycle:S,checks:y};if(ce){let j={...L,result:"blocked",initExitCode:null};return await R__default.ensureDir(M),await Ue(J,j),await Ue(ue,j),u?process.stdout.write(`${JSON.stringify(j,null,2)}
159
+ `;await v.promises.writeFile(n,o,"utf-8");}function vo(r){let e=r.trim().toLowerCase();return e==="true"||e==="1"||e==="on"?true:e==="false"||e==="0"||e==="off"?false:null}function cn(r){if(!r)return "isolated";let t=r.match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();return t==="shared-runtime-caches"||t==="shared-node-deps"||t==="isolated"?t:"isolated"}function ln(r){if(!r)return {mode:"isolated",status:"skipped",message:"No policies.yml found; dependency_sharing_mode defaults to isolated."};let e=r.match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m);if(!e)return {mode:"isolated",status:"skipped",message:"dependency_sharing_mode is not set; defaulting to isolated."};let t=e[1].toLowerCase();return t==="isolated"||t==="shared-runtime-caches"||t==="shared-node-deps"?{mode:t,status:"passed",message:`dependency_sharing_mode is valid: ${t}.`}:{mode:"isolated",status:"failed",message:`Invalid dependency_sharing_mode: ${t}. Use one of: isolated, shared-runtime-caches, shared-node-deps.`}}async function dn(r,e){let t=q(r),n=t?f.join(t,".rapidkit","policies.yml"):null,o="isolated";if(n&&await R__default.pathExists(n))try{let a=await v.promises.readFile(n,"utf-8"),d=ln(a);if(d.status==="failed")return console.log(c$1.red(`\u274C ${d.message}`)),{ok:false,code:1};o=d.mode;}catch{return console.log(c$1.red("\u274C Failed to read workspace policy file (.rapidkit/policies.yml).")),{ok:false,code:1}}let i=process.env.RAPIDKIT_DEP_SHARING_MODE,s=process.env.RAPIDKIT_WORKSPACE_PATH;process.env.RAPIDKIT_DEP_SHARING_MODE=o,t&&(process.env.RAPIDKIT_WORKSPACE_PATH=t);try{return {ok:true,value:await e()}}finally{typeof i>"u"?delete process.env.RAPIDKIT_DEP_SHARING_MODE:process.env.RAPIDKIT_DEP_SHARING_MODE=i,typeof s>"u"?delete process.env.RAPIDKIT_WORKSPACE_PATH:process.env.RAPIDKIT_WORKSPACE_PATH=s;}}async function N(r,e,t){return await new Promise(n=>{let o=spawn(r,e,{stdio:"inherit",cwd:t,shell:b$2()});o.on("close",i=>n(i??1)),o.on("error",()=>n(1));})}async function Ue(r,e){await R__default.outputFile(r,`${JSON.stringify(e,null,2)}
160
+ `,"utf-8");}async function bo(r){let e=new Set(["python-only","polyglot","enterprise"]),t="minimal";try{let i=f.join(r,".rapidkit","workspace.json");t=JSON.parse(await v.promises.readFile(i,"utf-8")).profile??"minimal";}catch{t="minimal";}if(!await(async()=>{if(e.has(t))return true;let i=await St(r);if(i.length===0)return false;for(let s of i){let a=ye(s),d=a?.module_support;if(!(ne(a,s)||ie(a,s))&&d!==false)return ae(a,s)||oe(a,s),true}return false})())return 0;let o="poetry";try{let{readWorkspaceMarker:i}=await import('./workspace-marker-IOPQ42A7.js'),a=(await i(r))?.metadata?.npm?.installMethod;(a==="poetry"||a==="venv"||a==="pipx"||a==="pip")&&(o=a);}catch{}if(o==="poetry"||o==="venv"){let i=f.join(r,"pyproject.toml"),s=false;try{s=(await v.promises.readFile(i,"utf-8")).includes("rapidkit-core");}catch{s=false;}let a=process.env.RAPIDKIT_DEV_PATH,d=a?await R__default.pathExists(a):false;if(s){let p=oo(r);if(!await R__default.pathExists(p)){let l=await io(r);if(l!==0)return l}let u=await N(p,d&&a?["-m","pip","install",a,"--quiet","--disable-pip-version-check"]:["-m","pip","install","rapidkit-core","--quiet","--disable-pip-version-check"],r);if(u!==0)return u}else {let p=await N("poetry",["install","--no-root"],r);if(p!==0)return p;let g=await N("poetry",["add","rapidkit-core"],r);if(g!==0)return g}try{let{writeWorkspaceLauncher:p}=await import('./create-3V7O72CO.js');await p(r,o==="venv"?"venv":"poetry");}catch{}return 0}return 0}async function St(r){let e=[],t=new Set,n=[r];for(;n.length>0;){let o=n.pop();if(!o||t.has(o))continue;t.add(o);let i=[];try{i=await v.promises.readdir(o,{withFileTypes:true});}catch{continue}for(let s of i){if(!s.isDirectory()||s.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(s.name))continue;let a=f.join(o,s.name),d=f.join(a,".rapidkit","context.json"),p=f.join(a,".rapidkit","project.json");if(await R__default.pathExists(d)||await R__default.pathExists(p)){e.push(a);continue}n.push(a);}}return e}function Po(r){let e="my-workspace",t=1;for(;;){let n=t===1?e:`${e}-${t}`,o=f.join(r,n);if(!v.existsSync(o))return {name:n,targetPath:o};t+=1;}}async function Ct(r){let t=await Ee("go",{runCommandInCwd:N,runCoreRapidkit:d}).initProject(r);return t.message&&console.log(c$1.red(`\u274C ${t.message}`)),t.exitCode}async function et(r,e){let t=Ee("node",{runCommandInCwd:N,runCoreRapidkit:d});return r==="init"?(await t.initProject(e)).exitCode:r==="dev"?(await t.runDev(e)).exitCode:r==="test"?(await t.runTest(e)).exitCode:r==="build"?(await t.runBuild(e)).exitCode:(await t.runStart(e)).exitCode}async function $e(r,e){let t=Ee("java",{runCommandInCwd:N,runCoreRapidkit:d});return r==="init"?(await t.initProject(e)).exitCode:r==="dev"?(await t.runDev(e)).exitCode:r==="test"?(await t.runTest(e)).exitCode:r==="build"?(await t.runBuild(e)).exitCode:(await t.runStart(e)).exitCode}async function Co(r,e=Vt){let t=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof t>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let i=function(j){if(!j)return null;let x=j.trim().toLowerCase();return x==="minimal"||x==="java-only"||x==="go-only"||x==="python-only"||x==="node-only"||x==="polyglot"||x==="enterprise"?x:null},s=function(j){let re=j.match(/^\s*mode:\s*([a-zA-Z]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase()==="strict"?"strict":"warn",se=(ge,V)=>{let be=j.match(new RegExp(`^\\s*${ge}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return be?be[1].toLowerCase()==="true":V};return {mode:re,dependency_sharing_mode:cn(j),rules:{enforce_workspace_marker:se("enforce_workspace_marker",true),enforce_toolchain_lock:se("enforce_toolchain_lock",false),disallow_untrusted_tool_sources:se("disallow_untrusted_tool_sources",false),enforce_compatibility_matrix:se("enforce_compatibility_matrix",false),require_mirror_lock_for_offline:se("require_mirror_lock_for_offline",true)}}};let a=["init"],d,p=false,g=false,u=false;for(let j=1;j<r.length;j+=1){let x=r[j];if(x==="--ci"){p=true;continue}if(x==="--offline"){g=true;continue}if(x==="--json"){u=true;continue}if(x==="--profile"){let F=r[j+1];if(!F||F.startsWith("-"))return console.log(c$1.yellow("Usage: rapidkit bootstrap [path] [--profile <minimal|java-only|go-only|python-only|node-only|polyglot|enterprise>] [--ci] [--offline] [--json]")),1;d=F,j+=1;continue}if(x.startsWith("--profile=")){d=x.slice(10);continue}a.push(x);}let l=i(d);if(d&&!l)return console.log(c$1.red(`Invalid profile: ${d}. Use one of: minimal, java-only, go-only, python-only, node-only, polyglot, enterprise.`)),1;let h=process.cwd(),m=f.join(h,".rapidkit-workspace"),w=f.join(h,".rapidkit","workspace.json"),k;!v.existsSync(m)&&v.existsSync(w)?k=h:(k=q(h),k||(k=go(h)));let y=[],S=null,P=null;if(k)try{let j=f.join(k,".rapidkit","workspace.json"),x=await v.promises.readFile(j,"utf-8"),F=JSON.parse(x);P=i(F.profile);}catch{P=null;}let _=["minimal","java-only","python-only","node-only","go-only","polyglot","enterprise"],A={minimal:"minimal \u2014 Foundation files only (fastest bootstrap, mixed projects)","java-only":"java-only \u2014 Java runtime (Spring Boot services)","python-only":"python-only \u2014 Python + Poetry (FastAPI, Django, ML pipelines)","node-only":"node-only \u2014 Node.js runtime (NestJS, Express, Next.js)","go-only":"go-only \u2014 Go runtime (Fiber, Gin, gRPC, microservices)",polyglot:"polyglot \u2014 Python + Node.js + Go + Java multi-runtime workspace",enterprise:"enterprise \u2014 Polyglot + governance + Sigstore verification"},$=l;if(!!k&&!l&&!p&&!u&&!!process.stdin.isTTY&&!!process.stdout.isTTY){let j=P||"minimal",{chosenProfile:x}=await _e.prompt([{type:"rawlist",name:"chosenProfile",message:`Select workspace profile for bootstrap (current: ${j})`,choices:_.map(F=>({name:F===j?`${A[F]} \u2190 current`:A[F],value:F})),default:_.indexOf(j)}]);$=x;}let U=$||P||"minimal";if(k)try{let x=U==="python-only"||U==="polyglot"||U==="enterprise"?"poetry":"venv",F;try{let V=(await v.promises.readFile(f.join(k,".python-version"),"utf-8")).trim();V&&(F=V);}catch{}let{syncWorkspaceFoundationFiles:re}=await import('./create-3V7O72CO.js'),se=await re(k,{workspaceName:f.basename(k),installMethod:x,pythonVersion:F,profile:U,writeMarker:true,writeGitignore:true,onlyIfMissing:true});y.push({id:"workspace.legacy.sync",status:se.length>0?"passed":"skipped",message:se.length>0?`Legacy workspace foundation synchronized: ${se.join(", ")}`:"Workspace foundation files are already up to date."});}catch(j){y.push({id:"workspace.legacy.sync",status:"failed",message:`Failed to synchronize legacy workspace foundation files: ${j.message}`});}if(k&&$&&$!==P)try{let j=f.join(k,".rapidkit","workspace.json"),x=await v.promises.readFile(j,"utf-8"),F=JSON.parse(x);F.profile=$,await v.promises.writeFile(j,JSON.stringify(F,null,2)+`
161
+ `,"utf-8");}catch{}let G={mode:"warn",dependency_sharing_mode:"isolated",rules:{enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true}},je=null;if(k)try{let j=await v.promises.readFile(f.join(k,".rapidkit","policies.yml"),"utf-8");je=j,G=s(j);}catch{y.push({id:"policy.file",status:"skipped",message:"No workspace policy file found; using default bootstrap policy."});}else y.push({id:"workspace.detect",status:"skipped",message:"No workspace marker found; bootstrap runs in project/single-path mode."});if(k){let j=ln(je);G.dependency_sharing_mode=j.mode,y.push({id:"policy.schema.dependency_sharing_mode",status:j.status,message:j.message}),y.push({id:"policy.dependency_sharing_mode.effective",status:"passed",message:G.dependency_sharing_mode==="isolated"?"Effective dependency mode: isolated (default secure mode).":G.dependency_sharing_mode==="shared-node-deps"?"Effective dependency mode: shared-node-deps (Node projects share workspace-level caches).":"Effective dependency mode: shared-runtime-caches (Node/Python/Go share workspace-level caches)."});let x=v.existsSync(f.join(k,".rapidkit-workspace"));y.push({id:"policy.enforce_workspace_marker",status:!G.rules.enforce_workspace_marker||x?"passed":"failed",message:!G.rules.enforce_workspace_marker||x?"Workspace marker policy satisfied.":"Workspace marker policy failed: .rapidkit-workspace is missing."});let F=v.existsSync(f.join(k,".rapidkit","toolchain.lock"));y.push({id:"policy.enforce_toolchain_lock",status:!G.rules.enforce_toolchain_lock||F?"passed":"failed",message:!G.rules.enforce_toolchain_lock||F?"Toolchain lock policy satisfied.":"Toolchain lock policy failed: .rapidkit/toolchain.lock is missing."});let re=process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||v.existsSync(f.join(k,".rapidkit","trusted-sources.lock"));y.push({id:"policy.disallow_untrusted_tool_sources",status:!G.rules.disallow_untrusted_tool_sources||re?"passed":"failed",message:!G.rules.disallow_untrusted_tool_sources||re?"Trusted tool sources policy satisfied.":"Trusted tool sources policy failed: set RAPIDKIT_TRUSTED_SOURCES=1 or provide .rapidkit/trusted-sources.lock."});let se=f.join(k,".rapidkit","compatibility-matrix.json"),ge=v.existsSync(se),V=G.rules.enforce_compatibility_matrix;if(y.push({id:"policy.enforce_compatibility_matrix",status:!V||ge?"passed":"failed",message:!V||ge?"Compatibility matrix policy satisfied.":"Compatibility matrix policy failed: .rapidkit/compatibility-matrix.json is missing."}),ge)try{let O=await v.promises.readFile(se,"utf-8"),B=JSON.parse(O),tt=!!B&&typeof B=="object";y.push({id:"compatibility.matrix.parse",status:tt?"passed":"failed",message:tt?"Compatibility matrix parsed successfully.":"Compatibility matrix parse failed: invalid JSON object."});}catch{y.push({id:"compatibility.matrix.parse",status:"failed",message:"Compatibility matrix parse failed: invalid JSON."});}let be=f.join(k,".rapidkit","mirror-config.json"),Te=f.join(k,".rapidkit","mirror.lock"),He=v.existsSync(be),Rt=v.existsSync(Te),Yt={};if(He)try{Yt=JSON.parse(await v.promises.readFile(be,"utf-8")),y.push({id:"mirror.config.parse",status:"passed",message:"Mirror configuration parsed successfully."});}catch{y.push({id:"mirror.config.parse",status:"failed",message:"Mirror configuration parse failed: invalid JSON in .rapidkit/mirror-config.json."});}let Et=await Ft(k,{ciMode:p,offlineMode:g});if(y.push(...Et.checks.map(O=>({id:O.id,status:O.status,message:O.message}))),S=Et.details,Et.details.lockWritten&&(Rt=true),g){let O=process.env.RAPIDKIT_MIRROR_ENABLED==="1"||Yt.enabled===true;y.push({id:"offline.mirror.enabled",status:O?"passed":"failed",message:O?"Offline mode mirror is enabled.":'Offline mode requires mirror enablement (set RAPIDKIT_MIRROR_ENABLED=1 or .rapidkit/mirror-config.json {"enabled": true}).'});let B=G.rules.require_mirror_lock_for_offline;y.push({id:"offline.mirror.lock",status:!B||Rt?"passed":"failed",message:!B||Rt?"Offline mode mirror lock policy satisfied.":"Offline mode mirror lock policy failed: .rapidkit/mirror.lock is missing."});}else y.push({id:"offline.mirror.enabled",status:"skipped",message:"Offline mirror checks skipped (offline mode is disabled)."});let un=await St(k),ee=new Set;for(let O of un){let B=ye(O);if(ne(B,O)){ee.add("go");continue}if(ie(B,O)){ee.add("java");continue}if(oe(B,O)){ee.add("node");continue}if(ae(B,O)){ee.add("python");continue}ee.add("unknown");}if(U==="go-only"){let O=ee.size===0||[...ee].every(B=>B==="go");y.push({id:"profile.go-only",status:O?"passed":"failed",message:O?"go-only profile validated for discovered projects.":`go-only profile mismatch: detected runtimes [${[...ee].join(", ")}].`});}else if(U==="java-only"){let O=ee.size===0||[...ee].every(B=>B==="java");y.push({id:"profile.java-only",status:O?"passed":"failed",message:O?"java-only profile validated for discovered projects.":`java-only profile mismatch: detected runtimes [${[...ee].join(", ")}].`});}else if(U==="python-only"){let O=ee.size===0||[...ee].every(B=>B==="python");y.push({id:"profile.python-only",status:O?"passed":"failed",message:O?"python-only profile validated for discovered projects.":`python-only profile mismatch: detected runtimes [${[...ee].join(", ")}].`});}else if(U==="node-only"){let O=ee.size===0||[...ee].every(B=>B==="node");y.push({id:"profile.node-only",status:O?"passed":"failed",message:O?"node-only profile validated for discovered projects.":`node-only profile mismatch: detected runtimes [${[...ee].join(", ")}].`});}else if(U==="minimal"){let O=[...ee].filter(tt=>tt!=="unknown"),B=O.length<=1;y.push({id:"profile.minimal",status:B?"passed":"failed",message:B?"minimal profile is compatible with detected runtime mix.":`minimal profile mismatch: multiple runtimes detected [${O.join(", ")}].`});}else U==="enterprise"&&(y.push({id:"profile.enterprise.ci",status:p?"passed":"failed",message:p?"enterprise profile running with --ci.":"enterprise profile expects --ci for deterministic non-interactive mode."}),y.push({id:"profile.enterprise.compatibility-matrix",status:ge?"passed":"failed",message:ge?"enterprise profile has compatibility matrix.":"enterprise profile requires .rapidkit/compatibility-matrix.json."}),y.push({id:"profile.enterprise.mirror-config",status:He?"passed":"failed",message:He?"enterprise profile has mirror configuration.":"enterprise profile requires .rapidkit/mirror-config.json."}));}p&&(process.env.RAPIDKIT_BOOTSTRAP_CI="1"),g&&(process.env.RAPIDKIT_OFFLINE_MODE="1");let ce=y.some(j=>j.id.startsWith("policy.schema.")&&j.status==="failed")||G.mode==="strict"&&y.some(j=>j.status==="failed"),H=k||h,M=f.join(H,".rapidkit","reports"),C=new Date().toISOString().replace(/[:.]/g,"-"),J=f.join(M,`bootstrap-compliance-${C}.json`),ue=f.join(M,"bootstrap-compliance.latest.json"),L={command:"bootstrap",timestamp:new Date().toISOString(),workspacePath:k,profile:U,options:{ci:p,offline:g,strict:G.mode==="strict"},policyMode:G.mode,policyRules:G.rules,mirrorLifecycle:S,checks:y};if(ce){let j={...L,result:"blocked",initExitCode:null};return await R__default.ensureDir(M),await Ue(J,j),await Ue(ue,j),u?process.stdout.write(`${JSON.stringify(j,null,2)}
162
162
  `):(console.log(c$1.red("\u274C Bootstrap blocked by strict policy checks.")),console.log(c$1.gray(`Compliance report: ${J}`))),1}let Z=0;u||(Z=await e(a));let fe=y.filter(j=>j.status==="failed").length,Se=Z!==0?"failed":fe>0?"ok_with_warnings":"ok",X={...L,result:Se,initExitCode:Z};if(await R__default.ensureDir(M),await Ue(J,X),await Ue(ue,X),u)process.stdout.write(`${JSON.stringify(X,null,2)}
163
- `);else {let j=y.filter(x=>x.status==="failed").length;j>0&&console.log(c$1.yellow(`\u26A0\uFE0F Bootstrap completed with ${j} policy/profile warnings.`)),console.log(c$1.gray(`Compliance report: ${J}`));}return Z}finally{typeof t>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=t;}}async function xo(r){let e=(r[1]||"").toLowerCase(),t=r.includes("--warm-deps")||r.includes("--warm-dependencies");if(!e||!["python","node","go","java"].includes(e))return console.log(c$1.yellow("Usage: rapidkit setup <python|node|go|java> [--warm-deps]")),1;let n=async(u,l)=>{if(u==="node"){if(!v.existsSync(f.join(l,"package.json")))return {exitCode:0,message:"Node warm-up skipped: package.json not found in current directory."};let m=v.existsSync(f.join(l,"pnpm-lock.yaml")),w=v.existsSync(f.join(l,"yarn.lock"));return m?{exitCode:await N("pnpm",["install","--lockfile-only","--ignore-scripts"],l)}:w?{exitCode:await N("yarn",["install","--ignore-scripts"],l)}:{exitCode:await N("npm",["install","--package-lock-only","--ignore-scripts"],l)}}if(u==="go")return v.existsSync(f.join(l,"go.mod"))?{exitCode:await N("go",["mod","download"],l)}:{exitCode:0,message:"Go warm-up skipped: go.mod not found in current directory."};if(u==="java"){let h=v.existsSync(f.join(l,"pom.xml")),m=v.existsSync(f.join(l,"build.gradle"))||v.existsSync(f.join(l,"build.gradle.kts")),w=f.join(l,process.platform==="win32"?"gradlew.bat":"gradlew"),k=v.existsSync(w);return !h&&!m?{exitCode:0,message:"Java warm-up skipped: pom.xml or build.gradle not found in current directory."}:h?{exitCode:await N("mvn",["-B","-q","-DskipTests","dependency:go-offline"],l)}:{exitCode:await N(k?w:"gradle",["--no-daemon","dependencies"],l)}}return {exitCode:0,message:"Dependency warm-up currently applies to node/go/java runtimes."}},o=Ee(e,{runCommandInCwd:N,runCoreRapidkit:(u,l)=>d(u,{...l,cwd:void 0})}),i=await o.checkPrereqs(),s=await o.doctorHints(process.cwd()),a=V(process.cwd()),d$1=a||process.cwd(),p=null,g=async()=>e!=="java"||!a?[]:p||(p=(await St(a)).filter(l=>{let h=ye(l);return ie(h,l)}),p);if(i.exitCode===0){console.log(c$1.green(`\u2705 ${e} prerequisites look good.`));let u=["python","node","go","java"].filter(l=>l!==e).join("/");if(console.log(c$1.gray(` Scope: validated ${e} runtime only. ${u} checks are optional unless your workspace profile uses them.`)),e==="python"&&console.log(c$1.gray(" Note: Poetry is recommended, but venv/pipx-based flows are supported in workspace creation.")),o.warmSetupCache&&((await o.warmSetupCache(d$1)).exitCode===0?console.log(c$1.gray(` ${e} cache warm-up completed.`)):console.log(c$1.yellow(` ${e} cache warm-up skipped (non-fatal).`))),t)if(e==="java"&&a){let l=await g();if(l.length>0){let h=0,m=0,w=0;for(let k of l){let y=await n("java",k),S=/skipped/i.test(y.message||""),P=f.relative(a,k)||f.basename(k);y.message&&console.log(c$1.gray(` [${P}] ${y.message}`)),y.exitCode===0&&!S?h+=1:y.exitCode===0&&S?w+=1:m+=1;}h>0&&console.log(c$1.gray(` java dependency warm-up completed for ${h} project(s) (--warm-deps).`)),m>0&&console.log(c$1.yellow(` java dependency warm-up failed for ${m} project(s) (non-fatal).`)),h===0&&m===0&&w>0&&console.log(c$1.gray(" java dependency warm-up skipped for discovered workspace projects."));}else {let h=await n("java",d$1),m=/skipped/i.test(h.message||"");h.message&&console.log(c$1.gray(` ${h.message}`)),h.exitCode===0&&!m?console.log(c$1.gray(` ${e} dependency warm-up completed (--warm-deps).`)):h.exitCode!==0&&console.log(c$1.yellow(` ${e} dependency warm-up failed (non-fatal).`));}}else {let l=await n(e,d$1),h=/skipped/i.test(l.message||"");l.message&&console.log(c$1.gray(` ${l.message}`)),l.exitCode===0&&!h?console.log(c$1.gray(` ${e} dependency warm-up completed (--warm-deps).`)):l.exitCode!==0&&console.log(c$1.yellow(` ${e} dependency warm-up failed (non-fatal).`));}if(a)try{let l=f.join(a,".rapidkit","toolchain.lock"),h={};try{h=JSON.parse(await v.promises.readFile(l,"utf-8"));}catch{}(!h.runtime||typeof h.runtime!="object")&&(h.runtime={});let m=h.runtime;if(e==="python"){let w=null;try{let{execa:k}=await import('execa');for(let y of Bt()){let P=await k(y,y==="py"?["-3","--version"]:["--version"],{cwd:a,stdio:"pipe",reject:false,timeout:3e3});if(P.exitCode===0){let A=(P.stdout||P.stderr||"").match(/Python\s+(\S+)/);if(w=A?A[1]:null,w)break}}}catch{}m.python={...m.python||{},version:w,last_setup:new Date().toISOString()};}else if(e==="node")m.node={...m.node||{},version:process.version,last_setup:new Date().toISOString()};else if(e==="go"){let w=null;try{let{execa:k}=await import('execa'),S=((await k("go",["version"],{cwd:a,stdio:"pipe"})).stdout||"").match(/go(\d+\.\d+(?:\.\d+)?)/i);w=S?S[1]:null;}catch{}m.go={...m.go||{},version:w,last_setup:new Date().toISOString()};}else if(e==="java"){let w=null,k=null,y=null,S=await g(),_=v.existsSync(f.join(d$1,"pom.xml"))||v.existsSync(f.join(d$1,"build.gradle"))||v.existsSync(f.join(d$1,"build.gradle.kts"))?d$1:S[0]||d$1;try{let{execa:A}=await import('execa'),$=await A("java",["-version"],{cwd:a,stdio:"pipe",reject:false,timeout:3e3}),q=`${$.stdout||""}
164
- ${$.stderr||""}`.match(/version\s+"([^"]+)"/i);w=q?q[1]:null;let G=v.existsSync(f.join(_,"pom.xml")),je=v.existsSync(f.join(_,"build.gradle"))||v.existsSync(f.join(_,"build.gradle.kts"));if(G){k="maven";let te=(()=>{let C=f.join(_,"mvnw.cmd");if(process.platform==="win32"&&v.existsSync(C))return C;let J=f.join(_,"mvnw");return v.existsSync(J)?J:"mvn"})(),ce=await A(te,["-version"],{cwd:_,stdio:"pipe",reject:false,timeout:3e3}),M=`${ce.stdout||""}
163
+ `);else {let j=y.filter(x=>x.status==="failed").length;j>0&&console.log(c$1.yellow(`\u26A0\uFE0F Bootstrap completed with ${j} policy/profile warnings.`)),console.log(c$1.gray(`Compliance report: ${J}`));}return Z}finally{typeof t>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=t;}}async function xo(r){let e=(r[1]||"").toLowerCase(),t=r.includes("--warm-deps")||r.includes("--warm-dependencies");if(!e||!["python","node","go","java"].includes(e))return console.log(c$1.yellow("Usage: rapidkit setup <python|node|go|java> [--warm-deps]")),1;let n=async(u,l)=>{if(u==="node"){if(!v.existsSync(f.join(l,"package.json")))return {exitCode:0,message:"Node warm-up skipped: package.json not found in current directory."};let m=v.existsSync(f.join(l,"pnpm-lock.yaml")),w=v.existsSync(f.join(l,"yarn.lock"));return m?{exitCode:await N("pnpm",["install","--lockfile-only","--ignore-scripts"],l)}:w?{exitCode:await N("yarn",["install","--ignore-scripts"],l)}:{exitCode:await N("npm",["install","--package-lock-only","--ignore-scripts"],l)}}if(u==="go")return v.existsSync(f.join(l,"go.mod"))?{exitCode:await N("go",["mod","download"],l)}:{exitCode:0,message:"Go warm-up skipped: go.mod not found in current directory."};if(u==="java"){let h=v.existsSync(f.join(l,"pom.xml")),m=v.existsSync(f.join(l,"build.gradle"))||v.existsSync(f.join(l,"build.gradle.kts")),w=f.join(l,process.platform==="win32"?"gradlew.bat":"gradlew"),k=v.existsSync(w);return !h&&!m?{exitCode:0,message:"Java warm-up skipped: pom.xml or build.gradle not found in current directory."}:h?{exitCode:await N("mvn",["-B","-q","-DskipTests","dependency:go-offline"],l)}:{exitCode:await N(k?w:"gradle",["--no-daemon","dependencies"],l)}}return {exitCode:0,message:"Dependency warm-up currently applies to node/go/java runtimes."}},o=Ee(e,{runCommandInCwd:N,runCoreRapidkit:(u,l)=>d(u,{...l,cwd:void 0})}),i=await o.checkPrereqs(),s=await o.doctorHints(process.cwd()),a=q(process.cwd()),d$1=a||process.cwd(),p=null,g=async()=>e!=="java"||!a?[]:p||(p=(await St(a)).filter(l=>{let h=ye(l);return ie(h,l)}),p);if(i.exitCode===0){console.log(c$1.green(`\u2705 ${e} prerequisites look good.`));let u=["python","node","go","java"].filter(l=>l!==e).join("/");if(console.log(c$1.gray(` Scope: validated ${e} runtime only. ${u} checks are optional unless your workspace profile uses them.`)),e==="python"&&console.log(c$1.gray(" Note: Poetry is recommended, but venv/pipx-based flows are supported in workspace creation.")),o.warmSetupCache&&((await o.warmSetupCache(d$1)).exitCode===0?console.log(c$1.gray(` ${e} cache warm-up completed.`)):console.log(c$1.yellow(` ${e} cache warm-up skipped (non-fatal).`))),t)if(e==="java"&&a){let l=await g();if(l.length>0){let h=0,m=0,w=0;for(let k of l){let y=await n("java",k),S=/skipped/i.test(y.message||""),P=f.relative(a,k)||f.basename(k);y.message&&console.log(c$1.gray(` [${P}] ${y.message}`)),y.exitCode===0&&!S?h+=1:y.exitCode===0&&S?w+=1:m+=1;}h>0&&console.log(c$1.gray(` java dependency warm-up completed for ${h} project(s) (--warm-deps).`)),m>0&&console.log(c$1.yellow(` java dependency warm-up failed for ${m} project(s) (non-fatal).`)),h===0&&m===0&&w>0&&console.log(c$1.gray(" java dependency warm-up skipped for discovered workspace projects."));}else {let h=await n("java",d$1),m=/skipped/i.test(h.message||"");h.message&&console.log(c$1.gray(` ${h.message}`)),h.exitCode===0&&!m?console.log(c$1.gray(` ${e} dependency warm-up completed (--warm-deps).`)):h.exitCode!==0&&console.log(c$1.yellow(` ${e} dependency warm-up failed (non-fatal).`));}}else {let l=await n(e,d$1),h=/skipped/i.test(l.message||"");l.message&&console.log(c$1.gray(` ${l.message}`)),l.exitCode===0&&!h?console.log(c$1.gray(` ${e} dependency warm-up completed (--warm-deps).`)):l.exitCode!==0&&console.log(c$1.yellow(` ${e} dependency warm-up failed (non-fatal).`));}if(a)try{let l=f.join(a,".rapidkit","toolchain.lock"),h={};try{h=JSON.parse(await v.promises.readFile(l,"utf-8"));}catch{}(!h.runtime||typeof h.runtime!="object")&&(h.runtime={});let m=h.runtime;if(e==="python"){let w=null;try{let{execa:k}=await import('execa');for(let y of Bt()){let P=await k(y,y==="py"?["-3","--version"]:["--version"],{cwd:a,stdio:"pipe",reject:false,timeout:3e3});if(P.exitCode===0){let A=(P.stdout||P.stderr||"").match(/Python\s+(\S+)/);if(w=A?A[1]:null,w)break}}}catch{}m.python={...m.python||{},version:w,last_setup:new Date().toISOString()};}else if(e==="node")m.node={...m.node||{},version:process.version,last_setup:new Date().toISOString()};else if(e==="go"){let w=null;try{let{execa:k}=await import('execa'),S=((await k("go",["version"],{cwd:a,stdio:"pipe"})).stdout||"").match(/go(\d+\.\d+(?:\.\d+)?)/i);w=S?S[1]:null;}catch{}m.go={...m.go||{},version:w,last_setup:new Date().toISOString()};}else if(e==="java"){let w=null,k=null,y=null,S=await g(),_=v.existsSync(f.join(d$1,"pom.xml"))||v.existsSync(f.join(d$1,"build.gradle"))||v.existsSync(f.join(d$1,"build.gradle.kts"))?d$1:S[0]||d$1;try{let{execa:A}=await import('execa'),$=await A("java",["-version"],{cwd:a,stdio:"pipe",reject:false,timeout:3e3}),U=`${$.stdout||""}
164
+ ${$.stderr||""}`.match(/version\s+"([^"]+)"/i);w=U?U[1]:null;let G=v.existsSync(f.join(_,"pom.xml")),je=v.existsSync(f.join(_,"build.gradle"))||v.existsSync(f.join(_,"build.gradle.kts"));if(G){k="maven";let te=(()=>{let C=f.join(_,"mvnw.cmd");if(process.platform==="win32"&&v.existsSync(C))return C;let J=f.join(_,"mvnw");return v.existsSync(J)?J:"mvn"})(),ce=await A(te,["-version"],{cwd:_,stdio:"pipe",reject:false,timeout:3e3}),M=`${ce.stdout||""}
165
165
  ${ce.stderr||""}`.match(/Apache Maven\s+(\S+)/i);y=M?M[1]:null;}else if(je){k="gradle";let te=(()=>{let C=f.join(_,"gradlew.bat");if(process.platform==="win32"&&v.existsSync(C))return C;let J=f.join(_,"gradlew");return v.existsSync(J)?J:"gradle"})(),ce=await A(te,["--version"],{cwd:_,stdio:"pipe",reject:false,timeout:3e3}),M=`${ce.stdout||""}
166
166
  ${ce.stderr||""}`.match(/Gradle\s+(\S+)/i);y=M?M[1]:null;}}catch{}m.java={...m.java||{},version:w,build_tool:k,build_tool_version:y,last_setup:new Date().toISOString()};}h.updated_at=new Date().toISOString(),await v.promises.writeFile(l,JSON.stringify(h,null,2)+`
167
167
  `,"utf-8"),console.log(c$1.gray(" toolchain.lock updated (.rapidkit/toolchain.lock)"));}catch{}}else console.log(c$1.red(`\u274C ${e} prerequisites check failed.`));if(s.length>0){console.log(c$1.gray(`
168
168
  Hints:`));for(let u of s)console.log(c$1.gray(`- ${u}`));}return i.exitCode}function _o(r){let e={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};for(let t of r.split(`
169
- `)){let n=t.trim(),o=n.match(/^strategy:\s*(\S+)/);o&&(e.strategy=o[1].replace(/['"]]/g,""));let i=n.match(/^prune_on_bootstrap:\s*(true|false)/);i&&(e.prune_on_bootstrap=i[1]==="true");let s=n.match(/^self_heal:\s*(true|false)/);s&&(e.self_heal=s[1]==="true");let a=n.match(/^verify_integrity:\s*(true|false)/);a&&(e.verify_integrity=a[1]==="true");}return e}async function jo(r){let e=(r[1]||"status").toLowerCase(),t=vt.getInstance(),n=V(process.cwd()),o={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};if(n)try{let i=await v.promises.readFile(f.join(n,".rapidkit","cache-config.yml"),"utf-8");o=_o(i);}catch{}return e==="status"?(console.log(c$1.cyan("RapidKit cache is enabled")),console.log(c$1.cyan("RapidKit cache status")),n?(console.log(c$1.gray(` Workspace: ${n}`)),console.log(c$1.gray(` Strategy: ${o.strategy}`)),console.log(c$1.gray(` Self-heal: ${o.self_heal}`)),console.log(c$1.gray(` Prune on bootstrap:${o.prune_on_bootstrap}`)),console.log(c$1.gray(` Verify integrity: ${o.verify_integrity}`))):console.log(c$1.gray(" (not inside a workspace \u2014 showing in-memory cache only)")),console.log(c$1.gray(" In-memory cache: enabled")),console.log(c$1.gray(" Use: rapidkit cache clear|prune|repair")),0):e==="clear"?(await t.clear(),console.log(c$1.green("Cache clear completed")),console.log(c$1.green("\u2705 Cache cleared (all entries removed).")),0):e==="prune"?(await t.clear(),console.log(c$1.green("\u2705 Cache pruned (stale entries removed).")),o.prune_on_bootstrap||console.log(c$1.gray(" Tip: set prune_on_bootstrap: true in .rapidkit/cache-config.yml to auto-prune on every bootstrap.")),0):e==="repair"?o.self_heal?(await t.clear(),console.log(c$1.green("\u2705 Cache repaired (self-heal applied, stale entries evicted).")),o.verify_integrity&&console.log(c$1.gray(" Integrity verification is enabled in cache-config.yml.")),0):(console.log(c$1.yellow("\u26A0\uFE0F self_heal is disabled in .rapidkit/cache-config.yml \u2014 skipping repair.")),0):(console.log(c$1.yellow("Usage: rapidkit cache <status|clear|prune|repair>")),1)}async function So(r,e,t,n){let o=(e||"show").toLowerCase(),i=f.join(r,".rapidkit","policies.yml");if(o==="show"||o==="status"||o==="get"){let g=await Br(r),u=Hr(g);return console.log(c$1.cyan(`Policy file: ${i}`)),console.log(c$1.gray(` mode: ${u.mode}`)),console.log(c$1.gray(` dependency_sharing_mode: ${u.dependency_sharing_mode}`)),console.log(c$1.gray(" rules:")),console.log(c$1.gray(` enforce_workspace_marker: ${u.rules.enforce_workspace_marker}`)),console.log(c$1.gray(` enforce_toolchain_lock: ${u.rules.enforce_toolchain_lock}`)),console.log(c$1.gray(` disallow_untrusted_tool_sources: ${u.rules.disallow_untrusted_tool_sources}`)),console.log(c$1.gray(` enforce_compatibility_matrix: ${u.rules.enforce_compatibility_matrix}`)),console.log(c$1.gray(` require_mirror_lock_for_offline: ${u.rules.require_mirror_lock_for_offline}`)),console.log(c$1.gray("Examples:")),console.log(c$1.gray(" npx rapidkit workspace policy set mode strict")),console.log(c$1.gray(" npx rapidkit workspace policy set dependency_sharing_mode shared-runtime-caches")),console.log(c$1.gray(" npx rapidkit workspace policy set rules.enforce_toolchain_lock true")),0}if(o!=="set")return console.log(c$1.red(`Unknown workspace policy action: ${e||""}`)),console.log(c$1.gray("Available: show, set")),1;if(!t||typeof n>"u")return console.log(c$1.yellow("Usage: rapidkit workspace policy set <key> <value>")),console.log(c$1.gray("Allowed keys:")),console.log(c$1.gray(" mode (warn|strict)")),console.log(c$1.gray(" dependency_sharing_mode (isolated|shared-runtime-caches|shared-node-deps)")),console.log(c$1.gray(" rules.enforce_workspace_marker (true|false)")),console.log(c$1.gray(" rules.enforce_toolchain_lock (true|false)")),console.log(c$1.gray(" rules.disallow_untrusted_tool_sources (true|false)")),console.log(c$1.gray(" rules.enforce_compatibility_matrix (true|false)")),console.log(c$1.gray(" rules.require_mirror_lock_for_offline (true|false)")),1;let s=t.trim(),d=await Br(r);if(s==="mode"){let g=n.trim().toLowerCase();if(g!=="warn"&&g!=="strict")return console.log(c$1.red("\u274C Invalid mode. Use: warn | strict")),1;d=Vr(d,"mode",`${g} # "warn" or "strict"`);}else if(s==="dependency_sharing_mode"){let g=n.trim().toLowerCase();if(g!=="isolated"&&g!=="shared-runtime-caches"&&g!=="shared-node-deps")return console.log(c$1.red("\u274C Invalid dependency_sharing_mode. Use: isolated | shared-runtime-caches | shared-node-deps")),1;d=Vr(d,"dependency_sharing_mode",`${g} # "isolated" or "shared-runtime-caches" or "shared-node-deps"`);}else if(s.startsWith("rules.")){let g=s.slice(6);if(!(g in an))return console.log(c$1.red(`\u274C Unknown policy rule: ${g}`)),1;let u=vo(n);if(u===null)return console.log(c$1.red("\u274C Rule values must be boolean: true | false")),1;d=ho(d,g,u);}else return console.log(c$1.red(`\u274C Unknown policy key: ${s}`)),1;await ko(r,d);let p=Hr(d);return console.log(c$1.green(`\u2705 Updated ${s} in .rapidkit/policies.yml`)),console.log(c$1.gray(` mode: ${p.mode}`)),console.log(c$1.gray(` dependency_sharing_mode: ${p.dependency_sharing_mode}`)),console.log(c$1.gray(" Tip: run `npx rapidkit workspace policy show` to inspect all values.")),0}async function Ro(r){let e=(r[1]||"status").toLowerCase(),t=r.includes("--json"),n=V(process.cwd());if(!n)return console.log(c$1.red("\u274C Not inside a RapidKit workspace")),console.log(c$1.gray("\u{1F4A1} Run this command from within a workspace directory")),1;let o=f.join(n,".rapidkit"),i=f.join(o,"mirror-config.json"),s=f.join(o,"mirror.lock"),a=f.join(o,"mirror","artifacts"),d=f.join(o,"reports");async function p(g){let u=new Date().toISOString().replace(/[:.]/g,"-"),l=f.join(d,`mirror-ops-${u}.json`),h=f.join(d,"mirror-ops.latest.json");await R__default.ensureDir(d),await Ue(l,g),await Ue(h,g);}if(e==="status"){if(!await R__default.pathExists(i))try{let k={schema_version:"1.0",enabled:false,strategy:"on-demand",artifacts:[],created_at:new Date().toISOString(),note:"Auto-generated by rapidkit mirror status. Set enabled: true and add artifact entries to activate mirroring."};await R__default.ensureDir(o),await v.promises.writeFile(i,JSON.stringify(k,null,2)+`
169
+ `)){let n=t.trim(),o=n.match(/^strategy:\s*(\S+)/);o&&(e.strategy=o[1].replace(/['"]]/g,""));let i=n.match(/^prune_on_bootstrap:\s*(true|false)/);i&&(e.prune_on_bootstrap=i[1]==="true");let s=n.match(/^self_heal:\s*(true|false)/);s&&(e.self_heal=s[1]==="true");let a=n.match(/^verify_integrity:\s*(true|false)/);a&&(e.verify_integrity=a[1]==="true");}return e}async function jo(r){let e=(r[1]||"status").toLowerCase(),t=vt.getInstance(),n=q(process.cwd()),o={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};if(n)try{let i=await v.promises.readFile(f.join(n,".rapidkit","cache-config.yml"),"utf-8");o=_o(i);}catch{}return e==="status"?(console.log(c$1.cyan("RapidKit cache is enabled")),console.log(c$1.cyan("RapidKit cache status")),n?(console.log(c$1.gray(` Workspace: ${n}`)),console.log(c$1.gray(` Strategy: ${o.strategy}`)),console.log(c$1.gray(` Self-heal: ${o.self_heal}`)),console.log(c$1.gray(` Prune on bootstrap:${o.prune_on_bootstrap}`)),console.log(c$1.gray(` Verify integrity: ${o.verify_integrity}`))):console.log(c$1.gray(" (not inside a workspace \u2014 showing in-memory cache only)")),console.log(c$1.gray(" In-memory cache: enabled")),console.log(c$1.gray(" Use: rapidkit cache clear|prune|repair")),0):e==="clear"?(await t.clear(),console.log(c$1.green("Cache clear completed")),console.log(c$1.green("\u2705 Cache cleared (all entries removed).")),0):e==="prune"?(await t.clear(),console.log(c$1.green("\u2705 Cache pruned (stale entries removed).")),o.prune_on_bootstrap||console.log(c$1.gray(" Tip: set prune_on_bootstrap: true in .rapidkit/cache-config.yml to auto-prune on every bootstrap.")),0):e==="repair"?o.self_heal?(await t.clear(),console.log(c$1.green("\u2705 Cache repaired (self-heal applied, stale entries evicted).")),o.verify_integrity&&console.log(c$1.gray(" Integrity verification is enabled in cache-config.yml.")),0):(console.log(c$1.yellow("\u26A0\uFE0F self_heal is disabled in .rapidkit/cache-config.yml \u2014 skipping repair.")),0):(console.log(c$1.yellow("Usage: rapidkit cache <status|clear|prune|repair>")),1)}async function So(r,e,t,n){let o=(e||"show").toLowerCase(),i=f.join(r,".rapidkit","policies.yml");if(o==="show"||o==="status"||o==="get"){let g=await Br(r),u=Hr(g);return console.log(c$1.cyan(`Policy file: ${i}`)),console.log(c$1.gray(` mode: ${u.mode}`)),console.log(c$1.gray(` dependency_sharing_mode: ${u.dependency_sharing_mode}`)),console.log(c$1.gray(" rules:")),console.log(c$1.gray(` enforce_workspace_marker: ${u.rules.enforce_workspace_marker}`)),console.log(c$1.gray(` enforce_toolchain_lock: ${u.rules.enforce_toolchain_lock}`)),console.log(c$1.gray(` disallow_untrusted_tool_sources: ${u.rules.disallow_untrusted_tool_sources}`)),console.log(c$1.gray(` enforce_compatibility_matrix: ${u.rules.enforce_compatibility_matrix}`)),console.log(c$1.gray(` require_mirror_lock_for_offline: ${u.rules.require_mirror_lock_for_offline}`)),console.log(c$1.gray("Examples:")),console.log(c$1.gray(" npx rapidkit workspace policy set mode strict")),console.log(c$1.gray(" npx rapidkit workspace policy set dependency_sharing_mode shared-runtime-caches")),console.log(c$1.gray(" npx rapidkit workspace policy set rules.enforce_toolchain_lock true")),0}if(o!=="set")return console.log(c$1.red(`Unknown workspace policy action: ${e||""}`)),console.log(c$1.gray("Available: show, set")),1;if(!t||typeof n>"u")return console.log(c$1.yellow("Usage: rapidkit workspace policy set <key> <value>")),console.log(c$1.gray("Allowed keys:")),console.log(c$1.gray(" mode (warn|strict)")),console.log(c$1.gray(" dependency_sharing_mode (isolated|shared-runtime-caches|shared-node-deps)")),console.log(c$1.gray(" rules.enforce_workspace_marker (true|false)")),console.log(c$1.gray(" rules.enforce_toolchain_lock (true|false)")),console.log(c$1.gray(" rules.disallow_untrusted_tool_sources (true|false)")),console.log(c$1.gray(" rules.enforce_compatibility_matrix (true|false)")),console.log(c$1.gray(" rules.require_mirror_lock_for_offline (true|false)")),1;let s=t.trim(),d=await Br(r);if(s==="mode"){let g=n.trim().toLowerCase();if(g!=="warn"&&g!=="strict")return console.log(c$1.red("\u274C Invalid mode. Use: warn | strict")),1;d=Vr(d,"mode",`${g} # "warn" or "strict"`);}else if(s==="dependency_sharing_mode"){let g=n.trim().toLowerCase();if(g!=="isolated"&&g!=="shared-runtime-caches"&&g!=="shared-node-deps")return console.log(c$1.red("\u274C Invalid dependency_sharing_mode. Use: isolated | shared-runtime-caches | shared-node-deps")),1;d=Vr(d,"dependency_sharing_mode",`${g} # "isolated" or "shared-runtime-caches" or "shared-node-deps"`);}else if(s.startsWith("rules.")){let g=s.slice(6);if(!(g in an))return console.log(c$1.red(`\u274C Unknown policy rule: ${g}`)),1;let u=vo(n);if(u===null)return console.log(c$1.red("\u274C Rule values must be boolean: true | false")),1;d=ho(d,g,u);}else return console.log(c$1.red(`\u274C Unknown policy key: ${s}`)),1;await ko(r,d);let p=Hr(d);return console.log(c$1.green(`\u2705 Updated ${s} in .rapidkit/policies.yml`)),console.log(c$1.gray(` mode: ${p.mode}`)),console.log(c$1.gray(` dependency_sharing_mode: ${p.dependency_sharing_mode}`)),console.log(c$1.gray(" Tip: run `npx rapidkit workspace policy show` to inspect all values.")),0}async function Ro(r){let e=(r[1]||"status").toLowerCase(),t=r.includes("--json"),n=q(process.cwd());if(!n)return console.log(c$1.red("\u274C Not inside a RapidKit workspace")),console.log(c$1.gray("\u{1F4A1} Run this command from within a workspace directory")),1;let o=f.join(n,".rapidkit"),i=f.join(o,"mirror-config.json"),s=f.join(o,"mirror.lock"),a=f.join(o,"mirror","artifacts"),d=f.join(o,"reports");async function p(g){let u=new Date().toISOString().replace(/[:.]/g,"-"),l=f.join(d,`mirror-ops-${u}.json`),h=f.join(d,"mirror-ops.latest.json");await R__default.ensureDir(d),await Ue(l,g),await Ue(h,g);}if(e==="status"){if(!await R__default.pathExists(i))try{let k={schema_version:"1.0",enabled:false,strategy:"on-demand",artifacts:[],created_at:new Date().toISOString(),note:"Auto-generated by rapidkit mirror status. Set enabled: true and add artifact entries to activate mirroring."};await R__default.ensureDir(o),await v.promises.writeFile(i,JSON.stringify(k,null,2)+`
170
170
  `,"utf-8"),console.log(c$1.gray(" mirror-config.json created with defaults (.rapidkit/mirror-config.json)"));}catch{}let u=await R__default.pathExists(i),l=await R__default.pathExists(a),h=await R__default.pathExists(s),m=l?(await v.promises.readdir(a,{withFileTypes:true})).filter(k=>k.isFile()).length:0,w={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:n,mirror:{configExists:u,lockExists:h,artifactsCount:m}};return await p(w),t?(process.stdout.write(`${JSON.stringify(w,null,2)}
171
171
  `),0):(console.log(c$1.cyan("RapidKit mirror status")),console.log(c$1.gray(`Workspace: ${n}`)),console.log(c$1.gray(`Config: ${u?"present":"missing"} (${i})`)),console.log(c$1.gray(`Lock: ${h?"present":"missing"} (${s})`)),console.log(c$1.gray(`Artifacts: ${m}`)),0)}if(e==="sync"||e==="verify"||e==="rotate"){let g=await Ft(n,{ciMode:true,offlineMode:e==="verify",forceRun:true}),u=g.checks.filter(m=>m.status==="failed"),l=g.checks.some(m=>m.id.startsWith("mirror.verify.")&&m.status==="failed");if(e==="verify"&&l){let m={command:"mirror",action:e,result:"failed",timestamp:new Date().toISOString(),workspacePath:n,details:g.details,checks:g.checks};if(await p(m),t)return process.stdout.write(`${JSON.stringify(m,null,2)}
172
172
  `),1;console.log(c$1.red("\u274C Mirror verify failed."));for(let w of g.checks.filter(k=>k.id.startsWith("mirror.verify.")))console.log(c$1.gray(`- ${w.id}: ${w.message}`));return 1}if(u.length>0){let m={command:"mirror",action:e,result:"failed",timestamp:new Date().toISOString(),workspacePath:n,details:g.details,checks:g.checks};if(await p(m),t)return process.stdout.write(`${JSON.stringify(m,null,2)}
173
173
  `),1;console.log(c$1.yellow(`\u26A0\uFE0F Mirror ${e} completed with ${u.length} issue(s).`));for(let w of u)console.log(c$1.gray(`- ${w.id}: ${w.message}`));return 1}let h={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:n,details:g.details,checks:g.checks};return await p(h),t?(process.stdout.write(`${JSON.stringify(h,null,2)}
174
- `),0):e==="rotate"?(console.log(c$1.green(`\u2705 Mirror rotate completed. Rotated files: ${g.details.rotatedFiles}.`)),0):e==="verify"?(console.log(c$1.green(`\u2705 Mirror verify completed. Verified artifacts: ${g.details.verifiedArtifacts}.`)),0):(console.log(c$1.green(`\u2705 Mirror sync completed. Synced artifacts: ${g.details.syncedArtifacts}.`)),0)}return console.log(c$1.yellow("Usage: rapidkit mirror <status|sync|verify|rotate> [--json]")),1}async function Vt(r){let e=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof e>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let t=process.cwd(),n=await dn(t,async()=>{let o=V(t),i=Ee("python",{runCommandInCwd:N,runCoreRapidkit:d});if(r.length>1){let l=f.resolve(t,r[1]),h=ye(l),m=await Jt(l);return ne(h,l)||m==="go"?await Ct(l):ie(h,l)||m==="java"?await $e("init",l):oe(h,l)||m==="node"?await Pt(l):ae(h,l)||m==="python"?await bt(l,i):await d(r,{cwd:t})}let s=ye(t),a=!!V(t)&&t===V(t);if(!a&&ne(s,t))return await Ct(t);let d$1=await Jt(t);if(!a&&(ie(s,t)||d$1==="java"))return await $e("init",t);if(!a&&(oe(s,t)||d$1==="node"))return await Pt(t);if(!a&&(ae(s,t)||d$1==="python"))return await bt(t,i);let p=o||V(t),g=sn(t),u=g?f.dirname(f.dirname(g)):null;if(u&&u!==p){let l=ye(u),h=await Jt(u);return ne(l,u)||h==="go"?await Ct(u):ie(l,u)||h==="java"?await $e("init",u):oe(l,u)||h==="node"?await Pt(u):ae(l,u)||h==="python"?await bt(u,i):await d(["init"],{cwd:u})}if(p&&t===p){let l=await bo(p);if(l!==0)return l;let h=await St(p);if(h.length===0){let m="minimal";try{m=JSON.parse(await v.promises.readFile(f.join(p,".rapidkit","workspace.json"),"utf-8")).profile??"minimal";}catch{}return m==="go-only"?(console.log(c$1.green("\u2714 Go workspace ready")),console.log(c$1.gray(`
174
+ `),0):e==="rotate"?(console.log(c$1.green(`\u2705 Mirror rotate completed. Rotated files: ${g.details.rotatedFiles}.`)),0):e==="verify"?(console.log(c$1.green(`\u2705 Mirror verify completed. Verified artifacts: ${g.details.verifiedArtifacts}.`)),0):(console.log(c$1.green(`\u2705 Mirror sync completed. Synced artifacts: ${g.details.syncedArtifacts}.`)),0)}return console.log(c$1.yellow("Usage: rapidkit mirror <status|sync|verify|rotate> [--json]")),1}async function Vt(r){let e=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof e>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let t=process.cwd(),n=await dn(t,async()=>{let o=q(t),i=Ee("python",{runCommandInCwd:N,runCoreRapidkit:d});if(r.length>1){let l=f.resolve(t,r[1]),h=ye(l),m=await Jt(l);return ne(h,l)||m==="go"?await Ct(l):ie(h,l)||m==="java"?await $e("init",l):oe(h,l)||m==="node"?await Pt(l):ae(h,l)||m==="python"?await bt(l,i):await d(r,{cwd:t})}let s=ye(t),a=!!q(t)&&t===q(t);if(!a&&ne(s,t))return await Ct(t);let d$1=await Jt(t);if(!a&&(ie(s,t)||d$1==="java"))return await $e("init",t);if(!a&&(oe(s,t)||d$1==="node"))return await Pt(t);if(!a&&(ae(s,t)||d$1==="python"))return await bt(t,i);let p=o||q(t),g=sn(t),u=g?f.dirname(f.dirname(g)):null;if(u&&u!==p){let l=ye(u),h=await Jt(u);return ne(l,u)||h==="go"?await Ct(u):ie(l,u)||h==="java"?await $e("init",u):oe(l,u)||h==="node"?await Pt(u):ae(l,u)||h==="python"?await bt(u,i):await d(["init"],{cwd:u})}if(p&&t===p){let l=await bo(p);if(l!==0)return l;let h=await St(p);if(h.length===0){let m="minimal";try{m=JSON.parse(await v.promises.readFile(f.join(p,".rapidkit","workspace.json"),"utf-8")).profile??"minimal";}catch{}return m==="go-only"?(console.log(c$1.green("\u2714 Go workspace ready")),console.log(c$1.gray(`
175
175
  No projects yet \u2014 create one and then run init inside it:`)),console.log(c$1.white(" npx rapidkit create project gofiber.standard my-api")),console.log(c$1.white(" cd my-api && npx rapidkit init")),console.log(c$1.gray(`
176
176
  \u{1F4A1} Go dependencies are managed per-project (go.mod / go mod tidy).`))):m==="java-only"?(console.log(c$1.green("\u2714 Java workspace ready")),console.log(c$1.gray(`
177
177
  No projects yet \u2014 create one and then run init inside it:`)),console.log(c$1.white(" npx rapidkit create project springboot.standard my-service")),console.log(c$1.white(" cd my-service && npx rapidkit init")),console.log(c$1.gray(`
178
178
  \u{1F4A1} Java dependencies are managed per-project (Maven/Gradle).`))):(console.log(c$1.green("\u2714 Workspace ready")),console.log(c$1.gray(`
179
- No projects yet \u2014 create one to get started:`)),console.log(c$1.white(" npx rapidkit create project"))),0}for(let m of h){let w=ye(m);if(ne(w,m)){let k=await Ct(m);if(k!==0)return k}else if(ie(w,m)){let k=await $e("init",m);if(k!==0)return k}else {if(oe(w,m)){let y=await Pt(m);if(y!==0)return y;continue}if(ae(w,m)){let y=await bt(m,i);if(y!==0)return y;continue}let k=await d(["init"],{cwd:m});if(k!==0)return k}}return 0}if(!p){let l=await a$2(),{name:h}=Po(t),{createProject:m}=await import('./create-YIUV6RUX.js');return await m(h,{yes:true,userConfig:l}),0}return await d(r,{cwd:t})});return n.ok?n.value:n.code}finally{typeof e>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=e;}}async function Yr(r){let e=V(r);if(!e)return [];let t="warn";try{let d=await v.promises.readFile(f.join(e,".rapidkit","policies.yml"),"utf-8");(d.match(/^\s*enforcement_mode:\s*(warn|strict)\s*(?:#.*)?$/m)??d.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m))?.[1]==="strict"&&(t="strict");}catch{return []}if(t!=="strict")return [];let n=[],o=f.join(e,".rapidkit","toolchain.lock");if(!v.existsSync(o))return n.push("toolchain.lock is missing \u2014 run `rapidkit bootstrap` first (strict mode requires a reproducible toolchain)."),n;let i={};try{i=JSON.parse(await v.promises.readFile(o,"utf-8"));}catch{return n.push("toolchain.lock is invalid JSON \u2014 regenerate it with `rapidkit bootstrap` before running commands in strict mode."),n}let s=i.runtime??{},a=ye(r);ne(a,r)&&!s.go?.version?n.push("go.version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."):oe(a,r)&&!s.node?.version?n.push("node.version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."):ie(a,r)&&!s.java?.version?n.push("java.version is not pinned in toolchain.lock \u2014 run `rapidkit setup java` first."):ae(a,r)&&!s.python?.version&&n.push("python.version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");try{let p=JSON.parse(await v.promises.readFile(f.join(e,".rapidkit","workspace.json"),"utf-8")).profile??"";p==="python-only"&&(ne(a,r)||oe(a,r)||ie(a,r))?n.push('Workspace profile is "python-only" but this project is not Python.'):p==="node-only"&&(ne(a,r)||ae(a,r)||ie(a,r))?n.push('Workspace profile is "node-only" but this project is not Node.'):p==="go-only"&&(oe(a,r)||ae(a,r)||ie(a,r))?n.push('Workspace profile is "go-only" but this project is not Go.'):p==="java-only"&&(ae(a,r)||oe(a,r)||ne(a,r))&&n.push('Workspace profile is "java-only" but this project is not Java.');}catch{}return n}async function Eo(){let r=async y=>{if(!a()||!y.toLowerCase().endsWith(".cmd"))return false;try{let P=(await R__default.readFile(y,"utf8")).replace(/\r\n/g,`
179
+ No projects yet \u2014 create one to get started:`)),console.log(c$1.white(" npx rapidkit create project"))),0}for(let m of h){let w=ye(m);if(ne(w,m)){let k=await Ct(m);if(k!==0)return k}else if(ie(w,m)){let k=await $e("init",m);if(k!==0)return k}else {if(oe(w,m)){let y=await Pt(m);if(y!==0)return y;continue}if(ae(w,m)){let y=await bt(m,i);if(y!==0)return y;continue}let k=await d(["init"],{cwd:m});if(k!==0)return k}}return 0}if(!p){let l=await a$2(),{name:h}=Po(t),{createProject:m}=await import('./create-3V7O72CO.js');return await m(h,{yes:true,userConfig:l}),0}return await d(r,{cwd:t})});return n.ok?n.value:n.code}finally{typeof e>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=e;}}async function Yr(r){let e=q(r);if(!e)return [];let t="warn";try{let d=await v.promises.readFile(f.join(e,".rapidkit","policies.yml"),"utf-8");(d.match(/^\s*enforcement_mode:\s*(warn|strict)\s*(?:#.*)?$/m)??d.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m))?.[1]==="strict"&&(t="strict");}catch{return []}if(t!=="strict")return [];let n=[],o=f.join(e,".rapidkit","toolchain.lock");if(!v.existsSync(o))return n.push("toolchain.lock is missing \u2014 run `rapidkit bootstrap` first (strict mode requires a reproducible toolchain)."),n;let i={};try{i=JSON.parse(await v.promises.readFile(o,"utf-8"));}catch{return n.push("toolchain.lock is invalid JSON \u2014 regenerate it with `rapidkit bootstrap` before running commands in strict mode."),n}let s=i.runtime??{},a=ye(r);ne(a,r)&&!s.go?.version?n.push("go.version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."):oe(a,r)&&!s.node?.version?n.push("node.version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."):ie(a,r)&&!s.java?.version?n.push("java.version is not pinned in toolchain.lock \u2014 run `rapidkit setup java` first."):ae(a,r)&&!s.python?.version&&n.push("python.version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");try{let p=JSON.parse(await v.promises.readFile(f.join(e,".rapidkit","workspace.json"),"utf-8")).profile??"";p==="python-only"&&(ne(a,r)||oe(a,r)||ie(a,r))?n.push('Workspace profile is "python-only" but this project is not Python.'):p==="node-only"&&(ne(a,r)||ae(a,r)||ie(a,r))?n.push('Workspace profile is "node-only" but this project is not Node.'):p==="go-only"&&(oe(a,r)||ae(a,r)||ie(a,r))?n.push('Workspace profile is "go-only" but this project is not Go.'):p==="java-only"&&(ae(a,r)||oe(a,r)||ne(a,r))&&n.push('Workspace profile is "java-only" but this project is not Java.');}catch{}return n}async function Eo(){let r=async y=>{if(!a()||!y.toLowerCase().endsWith(".cmd"))return false;try{let P=(await R__default.readFile(y,"utf8")).replace(/\r\n/g,`
180
180
  `).toLowerCase(),_=P.includes("\\.rapidkit\\rapidkit"),A=P.includes("\\.rapidkit\\rapidkit.cmd")||P.includes("\\.rapidkit\\rapidkit.exe")||P.includes("\\.venv\\scripts\\rapidkit.exe");return _&&!A}catch{return false}},e=process.cwd(),t=process.argv.slice(2),n=t[0],o=n==="init",i$1=new Set(["dev","start","build","test"]),s=!n||n==="--help"||n==="-h"||n==="help",a$2=on(e),d$1=v.existsSync(f.join(e,".rapidkit","project.json")),p=ye(e),g=ne(p,e)||oe(p,e),u=!!n&&i$1.has(n)&&g;if(jt(t[0])||t[0]==="create"||t[0]==="init"&&a$2&&!d$1)return false;try{let y=n==="shell"&&t[1]==="activate",S=n==="create",P=await ir(e,{cwd:e,timeoutMs:1200});if(P.ok&&P.data?.isRapidkitProject&&P.data.engine==="python"){let _=S||jt(n);if(!s&&!y&&!_&&!o&&!u){if(n&&qr.includes(n)){let $=await Yr(e).catch(()=>[]);if($.length>0){process.stderr.write(c$1.red("\u274C Strict policy violations prevent running this command:")+`
181
181
  `);for(let K of $)process.stderr.write(c$1.red(` \u2022 ${K}`)+`
182
182
  `);process.exit(1);}}let A=await d(process.argv.slice(2),{cwd:e});process.exit(A);}}}catch{}let l=sn(e),h=a(),m=i(e),w=null;for(let y of m)if(await R__default.pathExists(y)){if(await r(y)){a$1.warn(`Skipping legacy/broken Windows launcher candidate: ${y}. Falling back to core bridge.`);continue}w=y;break}let k=n==="create";if(n==="init"&&a$2&&!d$1)return false;if(n&&qr.includes(n)){let y=await Yr(e);if(y.length>0){process.stderr.write(c$1.red("\u274C Strict policy violations prevent running this command:")+`
@@ -242,15 +242,15 @@ Use "rapidkit help <command>" for more information.
242
242
  `)),process.exit(1));let s=!!e$2.template;if(e$2.dryRun){console.log(c$1.cyan(`
243
243
  \u{1F50D} Dry-run mode - showing what would be created:
244
244
  `)),console.log(c$1.white("\u{1F4C2} Path:"),i),console.log(c$1.white("\u{1F4E6} Type:"),s?`Project (${e$2.template})`:"Workspace"),console.log();return}if(!e$2.yes&&!s?await _e.prompt([{type:"input",name:"author",message:"Author name:",default:process.env.USER||"RapidKit User"}]):e$2.yes&&console.log(c$1.gray(`Using default values (--yes flag)
245
- `)),s){let a=String(e$2.template||"").trim(),d$1=a.toLowerCase(),p=d$1==="fastapi"?"fastapi.standard":d$1==="nestjs"?"nestjs.standard":d$1==="spring"||d$1==="springboot"||d$1==="java"?"springboot.standard":d$1==="go"||d$1==="fiber"?"gofiber.standard":d$1==="gin"?"gogin.standard":a;if(_t(p)){let S=f.resolve(process.cwd(),r),{generateGoFiberKit:P}=await import('./gofiber-standard-JDPREQCP.js');await P(S,{project_name:r,module_path:r,skipGit:e$2.skipGit});return}if(Ze(p)){let S=f.resolve(process.cwd(),r),{generateGoGinKit:P}=await import('./gogin-standard-DCERHHVB.js');await P(S,{project_name:r,module_path:r,skipGit:e$2.skipGit});return}if(Xe(p)){let S=f.resolve(process.cwd(),r),{generateSpringBootKit:P}=await import('./springboot-standard-AGTOOTNT.js');await P(S,{project_name:r,artifact_id:r,skipGit:e$2.skipGit});return}if(!!!Ht(process.cwd())){let{registerWorkspaceAtPath:S}=await import('./create-YIUV6RUX.js');if(e$2.createWorkspace)await S(process.cwd(),{skipGit:e$2.skipGit,yes:e$2.yes,userConfig:t});else if(!e$2.noWorkspace)if(e$2.yes)await S(process.cwd(),{skipGit:e$2.skipGit,yes:true,userConfig:t});else {let{createWs:P}=await _e.prompt([{type:"confirm",name:"createWs",message:"This project will be created outside a RapidKit workspace. Create and register a workspace here?",default:true}]);P&&await S(process.cwd(),{skipGit:e$2.skipGit,yes:false,userConfig:t});}}let u=["create","project",p,r,"--output",process.cwd()];e$2.yes&&u.push("--yes");let l=V(process.cwd()),h=!!e$2.skipInstall,m=h||!!l;h&&u.push("--skip-essentials");let w=m?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0,k=await e$1(u,{cwd:process.cwd(),env:w});k!==0&&process.exit(k),l&&!e$2.skipInstall&&(console.log(c$1.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(c$1.white(" Next: cd <project-name> && npx rapidkit init")));let y=Ht(process.cwd());if(y){let S=f.dirname(y),P=f.join(S,".python-version"),_=f.join(i,".python-version");try{if(await R__default.pathExists(P)){let A=v.readFileSync(P,"utf-8");v.writeFileSync(_,A.trim()+`
245
+ `)),s){let a=String(e$2.template||"").trim(),d$1=a.toLowerCase(),p=d$1==="fastapi"?"fastapi.standard":d$1==="nestjs"?"nestjs.standard":d$1==="spring"||d$1==="springboot"||d$1==="java"?"springboot.standard":d$1==="go"||d$1==="fiber"?"gofiber.standard":d$1==="gin"?"gogin.standard":a;if(_t(p)){let S=f.resolve(process.cwd(),r),{generateGoFiberKit:P}=await import('./gofiber-standard-JDPREQCP.js');await P(S,{project_name:r,module_path:r,skipGit:e$2.skipGit});return}if(Ze(p)){let S=f.resolve(process.cwd(),r),{generateGoGinKit:P}=await import('./gogin-standard-DCERHHVB.js');await P(S,{project_name:r,module_path:r,skipGit:e$2.skipGit});return}if(Xe(p)){let S=f.resolve(process.cwd(),r),{generateSpringBootKit:P}=await import('./springboot-standard-AGTOOTNT.js');await P(S,{project_name:r,artifact_id:r,skipGit:e$2.skipGit});return}if(!!!Ht(process.cwd())){let{registerWorkspaceAtPath:S}=await import('./create-3V7O72CO.js');if(e$2.createWorkspace)await S(process.cwd(),{skipGit:e$2.skipGit,yes:e$2.yes,userConfig:t});else if(!e$2.noWorkspace)if(e$2.yes)await S(process.cwd(),{skipGit:e$2.skipGit,yes:true,userConfig:t});else {let{createWs:P}=await _e.prompt([{type:"confirm",name:"createWs",message:"This project will be created outside a RapidKit workspace. Create and register a workspace here?",default:true}]);P&&await S(process.cwd(),{skipGit:e$2.skipGit,yes:false,userConfig:t});}}let u=["create","project",p,r,"--output",process.cwd()];e$2.yes&&u.push("--yes");let l=q(process.cwd()),h=!!e$2.skipInstall,m=h||!!l;h&&u.push("--skip-essentials");let w=m?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0,k=await e$1(u,{cwd:process.cwd(),env:w});k!==0&&process.exit(k),l&&!e$2.skipInstall&&(console.log(c$1.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(c$1.white(" Next: cd <project-name> && npx rapidkit init")));let y=Ht(process.cwd());if(y){let S=f.dirname(y),P=f.join(S,".python-version"),_=f.join(i,".python-version");try{if(await R__default.pathExists(P)){let A=v.readFileSync(P,"utf-8");v.writeFileSync(_,A.trim()+`
246
246
  `),a$1.debug(`Synced Python version ${A.trim()} from workspace to project`);}}catch(A){a$1.debug("Could not sync Python version from workspace:",A);}}if(!e$2.skipInstall){let S=await d(["init",i],{cwd:process.cwd()});if(S!==0&&process.exit(S),y){let P=f.dirname(y),_=f.join(P,".python-version"),A=f.join(i,".python-version");try{if(await R__default.pathExists(_)){let $=v.readFileSync(_,"utf-8");v.writeFileSync(A,$.trim()+`
247
- `),a$1.debug(`Re-synced Python version ${$.trim()} after init`);}}catch($){a$1.debug("Could not re-sync Python version after init:",$);}}}}else {let{createProject:a}=await import('./create-YIUV6RUX.js');await a(r,{skipGit:e$2.skipGit,dryRun:e$2.dryRun,yes:e$2.yes,userConfig:o,installMethod:e$2.installMethod,profile:e$2.profile});}}catch(t){t instanceof e?(a$1.error(`
247
+ `),a$1.debug(`Re-synced Python version ${$.trim()} after init`);}}catch($){a$1.debug("Could not re-sync Python version after init:",$);}}}}else {let{createProject:a}=await import('./create-3V7O72CO.js');await a(r,{skipGit:e$2.skipGit,dryRun:e$2.dryRun,yes:e$2.yes,userConfig:o,installMethod:e$2.installMethod,profile:e$2.profile});}}catch(t){t instanceof e?(a$1.error(`
248
248
  \u274C ${t.message}`),t.details&&a$1.warn(`\u{1F4A1} ${t.details}`),a$1.debug("Error code:",t.code)):(a$1.error(`
249
- \u274C An unexpected error occurred:`),console.error(t)),process.exit(1);}finally{Me=null;}});Sr(he);cr(he);he.command("shell <action>").description("Shell helpers (activate virtualenv in current shell)").action(async r=>{r!=="activate"&&(console.log(c$1.red(`Unknown shell command: ${r}`)),process.exit(1));let e=process.cwd();function t(d){let p=d;for(;;){let g=f.join(p,".rapidkit","context.json");if(v.existsSync(g))return g;let u=f.dirname(p);if(u===p)break;p=u;}return null}let n=t(e);function o(d){let p=d;for(;;){let g=f.join(p,".venv"),u=f.join(p,".rapidkit","activate");if(v.existsSync(u)||v.existsSync(g))return {venv:g,activateFile:u};let l=f.dirname(p);if(l===p)break;p=l;}return null}let i=o(e);!n&&!i&&(console.log(c$1.yellow("No RapidKit project found in this directory")),process.exit(1));let s;i&&v.existsSync(i.activateFile)?s=i.activateFile:i&&v.existsSync(i.venv)?s=h(i.venv):(console.log(c$1.yellow("No virtual environment found")),process.exit(1));let a$1=a();console.log(a$1?`call "${s}"`:`. "${s}"`);});he.command("doctor [scope]").description("\u{1FA7A} Check RapidKit system health by default; use workspace for full workspace checks").option("--workspace","Check entire workspace (including all projects)").option("--json","Output results in JSON format (for CI/CD pipelines)").option("--fix","Automatically fix common issues (with confirmation)").action(async(r,e)=>{r&&r!=="workspace"&&(console.log(c$1.red(`Unknown doctor scope: ${r}`)),console.log(c$1.gray("Available: workspace")),console.log(c$1.gray("Usage: npx rapidkit doctor or npx rapidkit doctor workspace")),process.exit(1));let t=await fo({scope:r,workspaceFlag:e.workspace});t.detected&&!e.json&&(console.log(c$1.yellow("\u26A0\uFE0F Local launcher shadow detected for doctor workspace checks.")),t.candidatePath&&console.log(c$1.gray(` Candidate: ${t.candidatePath}`)),console.log(c$1.gray(" Running npm-wrapper doctor workflow directly as safe fallback to avoid ambiguous rapidkit binary resolution.")),console.log(c$1.gray(" If this happens in a shell call, run: npx --yes --package rapidkit rapidkit doctor workspace")));let{runDoctor:n}=await import('./doctor-JEBQTQQE.js');await n({...e,workspace:e.workspace||r==="workspace"});});he.command("workspace <action> [subaction] [key] [value]").description("Manage RapidKit workspaces (list, sync, policy)").action(async(r,e,t,n)=>{if(r==="list"){let{listWorkspaces:o}=await import('./workspace-VN3VF62I.js');await o();}else if(r==="sync"){let o=V(process.cwd());o||(console.log(c$1.red("\u274C Not inside a RapidKit workspace")),console.log(c$1.gray("\u{1F4A1} Run this command from within a workspace directory")),process.exit(1));let{syncWorkspaceProjects:i}=await import('./workspace-VN3VF62I.js');console.log(c$1.cyan(`\u{1F4C2} Scanning workspace: ${f.basename(o)}`)),await i(o);}else if(r==="policy"){let o=V(process.cwd());o||(console.log(c$1.red("\u274C Not inside a RapidKit workspace")),console.log(c$1.gray("\u{1F4A1} Run this command from within a workspace directory")),process.exit(1));let i=await So(o,e,t,n);i!==0&&process.exit(i);}else console.log(c$1.red(`Unknown workspace action: ${r}`)),console.log(c$1.gray("Available: list, sync, policy")),process.exit(1);});function pn(){let r=a()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";console.log(c$1.white(`Usage:
249
+ \u274C An unexpected error occurred:`),console.error(t)),process.exit(1);}finally{Me=null;}});Sr(he);cr(he);he.command("shell <action>").description("Shell helpers (activate virtualenv in current shell)").action(async r=>{r!=="activate"&&(console.log(c$1.red(`Unknown shell command: ${r}`)),process.exit(1));let e=process.cwd();function t(d){let p=d;for(;;){let g=f.join(p,".rapidkit","context.json");if(v.existsSync(g))return g;let u=f.dirname(p);if(u===p)break;p=u;}return null}let n=t(e);function o(d){let p=d;for(;;){let g=f.join(p,".venv"),u=f.join(p,".rapidkit","activate");if(v.existsSync(u)||v.existsSync(g))return {venv:g,activateFile:u};let l=f.dirname(p);if(l===p)break;p=l;}return null}let i=o(e);!n&&!i&&(console.log(c$1.yellow("No RapidKit project found in this directory")),process.exit(1));let s;i&&v.existsSync(i.activateFile)?s=i.activateFile:i&&v.existsSync(i.venv)?s=h(i.venv):(console.log(c$1.yellow("No virtual environment found")),process.exit(1));let a$1=a();console.log(a$1?`call "${s}"`:`. "${s}"`);});he.command("doctor [scope]").description("\u{1FA7A} Check RapidKit system health by default; use workspace for full workspace checks").option("--workspace","Check entire workspace (including all projects)").option("--json","Output results in JSON format (for CI/CD pipelines)").option("--fix","Automatically fix common issues (with confirmation)").action(async(r,e)=>{r&&r!=="workspace"&&(console.log(c$1.red(`Unknown doctor scope: ${r}`)),console.log(c$1.gray("Available: workspace")),console.log(c$1.gray("Usage: npx rapidkit doctor or npx rapidkit doctor workspace")),process.exit(1));let t=await fo({scope:r,workspaceFlag:e.workspace});t.detected&&!e.json&&(console.log(c$1.yellow("\u26A0\uFE0F Local launcher shadow detected for doctor workspace checks.")),t.candidatePath&&console.log(c$1.gray(` Candidate: ${t.candidatePath}`)),console.log(c$1.gray(" Running npm-wrapper doctor workflow directly as safe fallback to avoid ambiguous rapidkit binary resolution.")),console.log(c$1.gray(" If this happens in a shell call, run: npx --yes --package rapidkit rapidkit doctor workspace")));let{runDoctor:n}=await import('./doctor-JEBQTQQE.js');await n({...e,workspace:e.workspace||r==="workspace"});});he.command("workspace <action> [subaction] [key] [value]").description("Manage RapidKit workspaces (list, sync, policy, share)").option("--output <file>","Output file path for workspace share bundle").option("--include-paths","Include absolute paths in workspace share bundle").option("--no-doctor","Exclude doctor evidence in workspace share bundle").action(async function(r,e,t,n){let o=this.opts();if(r==="list"){let{listWorkspaces:i}=await import('./workspace-7JHX7L3E.js');await i();}else if(r==="sync"){let i=q(process.cwd());i||(console.log(c$1.red("\u274C Not inside a RapidKit workspace")),console.log(c$1.gray("\u{1F4A1} Run this command from within a workspace directory")),process.exit(1));let{syncWorkspaceProjects:s}=await import('./workspace-7JHX7L3E.js');console.log(c$1.cyan(`\u{1F4C2} Scanning workspace: ${f.basename(i)}`)),await s(i);}else if(r==="policy"){let i=q(process.cwd());i||(console.log(c$1.red("\u274C Not inside a RapidKit workspace")),console.log(c$1.gray("\u{1F4A1} Run this command from within a workspace directory")),process.exit(1));let s=await So(i,e,t,n);s!==0&&process.exit(s);}else if(r==="share"){let i=q(process.cwd());i||(console.log(c$1.red("\u274C Not inside a RapidKit workspace")),console.log(c$1.gray("\u{1F4A1} Run this command from within a workspace directory")),process.exit(1));let s=o.output||e,{createWorkspaceShareBundle:a}=await import('./workspace-7JHX7L3E.js'),d=await a(i,{outputPath:s,includePaths:o.includePaths===true,includeDoctorEvidence:o.doctor!==false});console.log(c$1.green(`\u2714 Workspace share bundle exported: ${d}`)),console.log(c$1.gray("Share this JSON with your team for reproducible workspace/project diagnostics."));}else console.log(c$1.red(`Unknown workspace action: ${r}`)),console.log(c$1.gray("Available: list, sync, policy, share")),process.exit(1);});function pn(){let r=a()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";console.log(c$1.white(`Usage:
250
250
  `)),console.log(c$1.cyan(` npx rapidkit <workspace-name> [options]
251
251
  `)),console.log(c$1.bold("Quick start \u2014 workspace workflow:")),console.log(c$1.cyan(" npx rapidkit my-workspace ")+c$1.gray("# Create workspace (interactive profile picker)")),console.log(c$1.cyan(" cd my-workspace")),console.log(c$1.cyan(" npx rapidkit bootstrap ")+c$1.gray("# Bootstrap all runtime toolchains")),console.log(c$1.cyan(" npx rapidkit create project ")+c$1.gray("# Interactive kit picker")),console.log(c$1.cyan(" cd my-api")),console.log(c$1.cyan(` ${r}
252
252
  `)),console.log(c$1.bold("Workspace profiles (asked during creation):")),console.log(c$1.gray(" minimal Foundation files only \u2014 fastest bootstrap (default)")),console.log(c$1.gray(" java-only Java runtime (Spring Boot services)")),console.log(c$1.gray(" python-only Python + Poetry (FastAPI, Django, ML)")),console.log(c$1.gray(" node-only Node.js runtime (NestJS, Express, Next.js)")),console.log(c$1.gray(" go-only Go runtime (Fiber, Gin, gRPC)")),console.log(c$1.gray(" polyglot Python + Node.js + Go + Java multi-runtime")),console.log(c$1.gray(` enterprise Polyglot + governance + Sigstore
253
- `)),console.log(c$1.bold("Workspace commands (inside a workspace):")),console.log(c$1.gray(" npx rapidkit bootstrap [--profile <p>] Re-bootstrap toolchains")),console.log(c$1.gray(" npx rapidkit workspace list List registered workspaces")),console.log(c$1.gray(" npx rapidkit workspace policy show Show effective workspace policies")),console.log(c$1.gray(" npx rapidkit workspace policy set <k> <v> Update workspace policy values")),console.log(c$1.gray(" npx rapidkit setup python|node|go|java [--warm-deps] Set up runtime (+ optional deps warm-up)")),console.log(c$1.gray(" npx rapidkit mirror [status|sync|verify|rotate] Registry mirror management")),console.log(c$1.gray(` npx rapidkit cache [status|clear|prune|repair] Package cache management
253
+ `)),console.log(c$1.bold("Workspace commands (inside a workspace):")),console.log(c$1.gray(" npx rapidkit bootstrap [--profile <p>] Re-bootstrap toolchains")),console.log(c$1.gray(" npx rapidkit workspace list List registered workspaces")),console.log(c$1.gray(" npx rapidkit workspace share [--output <file>] Export collaboration bundle")),console.log(c$1.gray(" npx rapidkit workspace policy show Show effective workspace policies")),console.log(c$1.gray(" npx rapidkit workspace policy set <k> <v> Update workspace policy values")),console.log(c$1.gray(" npx rapidkit setup python|node|go|java [--warm-deps] Set up runtime (+ optional deps warm-up)")),console.log(c$1.gray(" npx rapidkit mirror [status|sync|verify|rotate] Registry mirror management")),console.log(c$1.gray(` npx rapidkit cache [status|clear|prune|repair] Package cache management
254
254
  `)),console.log(c$1.bold("Options (workspace creation):")),console.log(c$1.gray(" -y, --yes Skip prompts and use defaults")),console.log(c$1.gray(" --author <name> Author/team name for workspace metadata")),console.log(c$1.gray(" --skip-git Skip git initialization")),console.log(c$1.gray(" --debug Enable debug logging")),console.log(c$1.gray(" --dry-run Show what would be created")),console.log(c$1.gray(" --create-workspace When creating a project outside a workspace: create and register a workspace in the current directory")),console.log(c$1.gray(" --no-workspace When creating a project outside a workspace: do not create a workspace")),console.log(c$1.gray(` --no-update-check Skip checking for updates
255
255
  `)),console.log(c$1.bold("Project commands (inside a project):")),console.log(c$1.gray(" npx rapidkit create project Scaffold a new project")),console.log(c$1.gray(" cd my-api Change directory to the new project")),console.log(c$1.gray(" npx rapidkit init Install project dependencies")),console.log(c$1.gray(" npx rapidkit dev Start dev server")),console.log(c$1.gray(" npx rapidkit build Build for production")),console.log(c$1.gray(` npx rapidkit test Run tests
256
256
  `)),console.log(c$1.bold("Flags clarification:")),console.log(c$1.gray(" --skip-install npm fast-path for lock/dependency steps")),console.log(c$1.gray(` --skip-essentials core flag for skipping essential module installation
@@ -262,5 +262,5 @@ Use "rapidkit help <command>" for more information.
262
262
  \u{1F680} Welcome to RapidKit NPM CLI!
263
263
  `)),pn(),process.exit(0)),i?he.parse():s?Vt(r).then(d=>process.exit(d)).catch(d=>{process.stderr.write(`RapidKit (npm) failed to run workspace init: ${d?.message??d}
264
264
  `),process.exit(1);}):Eo().then(async d$1=>{if(!d$1){let p=process.argv.slice(2);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] argv=${JSON.stringify(p)}
265
- `),Ur(p[0])){he.parse();return}if(p[0]==="create"){let u=await tn(p);process.exit(u);}if(p[0]==="init"){let u=await Vt(p);process.exit(u);}if(mo(p[0])){if(p[0]==="bootstrap"){let l=await Co(p);process.exit(l);}if(p[0]==="setup"){let l=await xo(p);process.exit(l);}if(p[0]==="cache"){let l=await jo(p);process.exit(l);}let u=await Ro(p);process.exit(u);}if(nn.includes(p[0])){let u=p[0],l=ye(process.cwd()),h=V(process.cwd());if(h){let w=f.join(h,".rapidkit","policies.yml");if(await R__default.pathExists(w))try{let k=await v.promises.readFile(w,"utf-8");if(((k.match(/^\s*enforcement_mode:\s*(warn|strict)\s*(?:#.*)?$/m)??k.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m))?.[1]??"warn")==="strict"){let P=f.join(h,".rapidkit","toolchain.lock"),_=[];if(!await R__default.pathExists(P))_.push("toolchain.lock is missing \u2014 run `rapidkit bootstrap` first (strict mode requires a reproducible toolchain).");else try{let K=JSON.parse(await v.promises.readFile(P,"utf-8")).runtime??{};ne(l,process.cwd())&&!K.go?.version&&_.push("Go runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."),oe(l,process.cwd())&&!K.node?.version&&_.push("Node runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."),ie(l,process.cwd())&&!K.java?.version&&_.push("Java runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup java` first."),ae(l,process.cwd())&&!K.python?.version&&_.push("Python runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");}catch{_.push("toolchain.lock is invalid JSON \u2014 regenerate it with `rapidkit bootstrap` before running commands in strict mode.");}let A=f.join(h,".rapidkit","workspace.json");if(await R__default.pathExists(A))try{let K=JSON.parse(await v.promises.readFile(A,"utf-8")).profile??"";K==="python-only"&&(ne(l,process.cwd())||oe(l,process.cwd())||ie(l,process.cwd()))&&_.push('Workspace profile is "python-only" but this project is not Python. Update the workspace profile or use a polyglot workspace.'),K==="node-only"&&(ne(l,process.cwd())||ae(l,process.cwd())||ie(l,process.cwd()))&&_.push('Workspace profile is "node-only" but this project is not Node. Update the workspace profile or use a polyglot workspace.'),K==="go-only"&&(ae(l,process.cwd())||oe(l,process.cwd())||ie(l,process.cwd()))&&_.push('Workspace profile is "go-only" but this project is not Go. Update the workspace profile or use a polyglot workspace.'),K==="java-only"&&(ae(l,process.cwd())||oe(l,process.cwd())||ne(l,process.cwd()))&&_.push('Workspace profile is "java-only" but this project is not Java. Update the workspace profile or use a polyglot workspace.');}catch{}if(_.length>0){console.log(c$1.red(`\u274C Strict policy violations block \`${u}\`:`));for(let $ of _)console.log(c$1.red(` \u2022 ${$}`));console.log(c$1.gray("\u{1F4A1} Fix violations or switch to warn mode: set mode: warn in .rapidkit/policies.yml")),process.exit(1);}}}catch{}}let m=await dn(process.cwd(),async()=>{if(ne(l,process.cwd())){let w=Ee("go",{runCommandInCwd:N,runCoreRapidkit:d}),k=u==="dev"?await w.runDev(process.cwd()):u==="test"?await w.runTest(process.cwd()):u==="build"?await w.runBuild(process.cwd()):await w.runStart(process.cwd());return k.message&&console.log(c$1.red(`\u274C ${k.message}`)),k.exitCode}if(ie(l,process.cwd()))return u==="dev"?await $e("dev",process.cwd()):u==="test"?await $e("test",process.cwd()):u==="build"?await $e("build",process.cwd()):await $e("start",process.cwd());if(oe(l,process.cwd()))return u==="dev"?await et("dev",process.cwd()):u==="test"?await et("test",process.cwd()):u==="build"?await et("build",process.cwd()):await et("start",process.cwd());if(ae(l,process.cwd())){let w=Ee("python",{runCommandInCwd:N,runCoreRapidkit:d});return u==="dev"?(await w.runDev(process.cwd())).exitCode:u==="test"?(await w.runTest(process.cwd())).exitCode:u==="build"?(await w.runBuild(process.cwd())).exitCode:(await w.runStart(process.cwd())).exitCode}return -1});m.ok||process.exit(m.code),m.value>=0&&process.exit(m.value);}if(p[0]==="add"||p[0]==="module"&&p[1]==="add"){let u=ye(process.cwd());if(u?.module_support===false){let l=u?.runtime==="java"?"Spring Boot":"Go";console.error(c$1.red(`\u274C RapidKit modules are not available for ${l} npm-level kits.`)),console.error(c$1.gray(" The module system requires Python and is currently only supported for FastAPI and NestJS projects.")),process.exit(1);}}let g=await Io(p);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] shouldForwardToCore=${g}
265
+ `),Ur(p[0])){he.parse();return}if(p[0]==="create"){let u=await tn(p);process.exit(u);}if(p[0]==="init"){let u=await Vt(p);process.exit(u);}if(mo(p[0])){if(p[0]==="bootstrap"){let l=await Co(p);process.exit(l);}if(p[0]==="setup"){let l=await xo(p);process.exit(l);}if(p[0]==="cache"){let l=await jo(p);process.exit(l);}let u=await Ro(p);process.exit(u);}if(nn.includes(p[0])){let u=p[0],l=ye(process.cwd()),h=q(process.cwd());if(h){let w=f.join(h,".rapidkit","policies.yml");if(await R__default.pathExists(w))try{let k=await v.promises.readFile(w,"utf-8");if(((k.match(/^\s*enforcement_mode:\s*(warn|strict)\s*(?:#.*)?$/m)??k.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m))?.[1]??"warn")==="strict"){let P=f.join(h,".rapidkit","toolchain.lock"),_=[];if(!await R__default.pathExists(P))_.push("toolchain.lock is missing \u2014 run `rapidkit bootstrap` first (strict mode requires a reproducible toolchain).");else try{let K=JSON.parse(await v.promises.readFile(P,"utf-8")).runtime??{};ne(l,process.cwd())&&!K.go?.version&&_.push("Go runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."),oe(l,process.cwd())&&!K.node?.version&&_.push("Node runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."),ie(l,process.cwd())&&!K.java?.version&&_.push("Java runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup java` first."),ae(l,process.cwd())&&!K.python?.version&&_.push("Python runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");}catch{_.push("toolchain.lock is invalid JSON \u2014 regenerate it with `rapidkit bootstrap` before running commands in strict mode.");}let A=f.join(h,".rapidkit","workspace.json");if(await R__default.pathExists(A))try{let K=JSON.parse(await v.promises.readFile(A,"utf-8")).profile??"";K==="python-only"&&(ne(l,process.cwd())||oe(l,process.cwd())||ie(l,process.cwd()))&&_.push('Workspace profile is "python-only" but this project is not Python. Update the workspace profile or use a polyglot workspace.'),K==="node-only"&&(ne(l,process.cwd())||ae(l,process.cwd())||ie(l,process.cwd()))&&_.push('Workspace profile is "node-only" but this project is not Node. Update the workspace profile or use a polyglot workspace.'),K==="go-only"&&(ae(l,process.cwd())||oe(l,process.cwd())||ie(l,process.cwd()))&&_.push('Workspace profile is "go-only" but this project is not Go. Update the workspace profile or use a polyglot workspace.'),K==="java-only"&&(ae(l,process.cwd())||oe(l,process.cwd())||ne(l,process.cwd()))&&_.push('Workspace profile is "java-only" but this project is not Java. Update the workspace profile or use a polyglot workspace.');}catch{}if(_.length>0){console.log(c$1.red(`\u274C Strict policy violations block \`${u}\`:`));for(let $ of _)console.log(c$1.red(` \u2022 ${$}`));console.log(c$1.gray("\u{1F4A1} Fix violations or switch to warn mode: set mode: warn in .rapidkit/policies.yml")),process.exit(1);}}}catch{}}let m=await dn(process.cwd(),async()=>{if(ne(l,process.cwd())){let w=Ee("go",{runCommandInCwd:N,runCoreRapidkit:d}),k=u==="dev"?await w.runDev(process.cwd()):u==="test"?await w.runTest(process.cwd()):u==="build"?await w.runBuild(process.cwd()):await w.runStart(process.cwd());return k.message&&console.log(c$1.red(`\u274C ${k.message}`)),k.exitCode}if(ie(l,process.cwd()))return u==="dev"?await $e("dev",process.cwd()):u==="test"?await $e("test",process.cwd()):u==="build"?await $e("build",process.cwd()):await $e("start",process.cwd());if(oe(l,process.cwd()))return u==="dev"?await et("dev",process.cwd()):u==="test"?await et("test",process.cwd()):u==="build"?await et("build",process.cwd()):await et("start",process.cwd());if(ae(l,process.cwd())){let w=Ee("python",{runCommandInCwd:N,runCoreRapidkit:d});return u==="dev"?(await w.runDev(process.cwd())).exitCode:u==="test"?(await w.runTest(process.cwd())).exitCode:u==="build"?(await w.runBuild(process.cwd())).exitCode:(await w.runStart(process.cwd())).exitCode}return -1});m.ok||process.exit(m.code),m.value>=0&&process.exit(m.value);}if(p[0]==="add"||p[0]==="module"&&p[1]==="add"){let u=ye(process.cwd());if(u?.module_support===false){let l=u?.runtime==="java"?"Spring Boot":"Go";console.error(c$1.red(`\u274C RapidKit modules are not available for ${l} npm-level kits.`)),console.error(c$1.gray(" The module system requires Python and is currently only supported for FastAPI and NestJS projects.")),process.exit(1);}}let g=await Io(p);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] shouldForwardToCore=${g}
266
266
  `),g){let u=await d(p,{cwd:process.cwd()});process.exit(u);}he.parse();}});}export{co as NPM_ONLY_TOP_LEVEL_COMMANDS,uo as WRAPPER_ORCHESTRATED_PROJECT_COMMANDS,fo as detectWindowsDoctorWorkspaceShadow,Co as handleBootstrapCommand,jo as handleCacheCommand,tn as handleCreateOrFallback,Vt as handleInitCommand,Ro as handleMirrorCommand,xo as handleSetupCommand,Io as shouldForwardToCore};
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rapidkit",
3
- "version": "0.26.0",
3
+ "version": "0.27.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": [
@@ -1,6 +1,6 @@
1
- import {j}from'./chunk-Z5LKRG57.js';import {b}from'./chunk-Q7ULIFQA.js';import {promises}from'fs';import l from'path';import i from'chalk';import _ from'ora';import {execa}from'execa';function w(e){let t=l.resolve(e);return process.platform==="win32"?t.toLowerCase():t}function L(e){let t=w(e.path),r=Array.isArray(e.projects)?e.projects:[],a=[],o=new Set;for(let c of r){if(!c||typeof c.name!="string"||typeof c.path!="string")continue;let n=w(c.path);o.has(n)||(o.add(n),a.push({name:c.name,path:n}));}return {name:e.name,path:t,mode:e.mode,projects:a}}function R(e){let t=[],r=new Set;for(let a of e.workspaces||[]){if(!a||typeof a.name!="string"||typeof a.path!="string")continue;let o=L(a);r.has(o.path)||(r.add(o.path),t.push(o));}return {workspaces:t}}async function I(e,t){try{let r=w(e),a=j(),o=l.join(a,"workspaces.json");await promises.mkdir(a,{recursive:true});let c={workspaces:[]};try{let s=await promises.readFile(o,"utf8"),d=JSON.parse(s);d&&Array.isArray(d.workspaces)&&(c=R(d));}catch{}c.workspaces.some(s=>s.path===r)||(c.workspaces.push({name:t,path:r,mode:"full",projects:[]}),await promises.writeFile(o,JSON.stringify(c,null,2)));}catch{console.warn(i.gray("Note: Could not register workspace in shared registry"));}}async function V(e,t=false){try{let r=w(e),a=j(),o=l.join(a,"workspaces.json"),c={workspaces:[]};try{let g=await promises.readFile(o,"utf8"),u=JSON.parse(g);u&&Array.isArray(u.workspaces)&&(c=R(u));}catch{t||console.log("\u26A0\uFE0F Workspace registry not found");return}let n=c.workspaces.find(g=>g.path===r);if(!n){t||console.log("\u26A0\uFE0F Workspace not registered in registry");return}Array.isArray(n.projects)||(n.projects=[]);let s=0,d=0,h=[e],m=new Set;for(;h.length>0;){let g=h.shift();if(!g||m.has(g))continue;m.add(g);let u=await promises.readdir(g,{withFileTypes:true});for(let $ of u){if(!$.isDirectory()||$.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes($.name))continue;let f=l.join(g,$.name),k=w(f),E=l.join(k,".rapidkit","context.json"),b=l.join(k,".rapidkit","project.json");try{let C=false;try{await promises.access(E),C=true;}catch{await promises.access(b),C=true;}if(C){let x=l.basename(k);n.projects.some(S=>S.path===k||S.name===x)?d++:(n.projects.push({name:x,path:k}),s++,t||console.log(`\u2714 Added: ${l.relative(e,k)}`));continue}}catch{}h.push(f);}}s>0?(await promises.writeFile(o,JSON.stringify(c,null,2)),t||console.log(`
2
- \u2705 Synced ${s} 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 H(e,t,r){try{let a=w(e),o=w(r),c=j(),n=l.join(c,"workspaces.json"),s={workspaces:[]};try{let m=await promises.readFile(n,"utf8"),g=JSON.parse(m);g&&Array.isArray(g.workspaces)&&(s=R(g));}catch{return}let d=s.workspaces.find(m=>m.path===a);if(!d)return;Array.isArray(d.projects)||(d.projects=[]),d.projects.some(m=>m.path===o||m.name===t)||(d.projects.push({name:t,path:o}),await promises.writeFile(n,JSON.stringify(s,null,2)));}catch{}}async function q(e,t){let r=_("Creating RapidKit workspace...").start();try{await promises.mkdir(e,{recursive:true}),await promises.mkdir(l.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(l.join(e,".rapidkit","config.json"),JSON.stringify(a,null,2));let{syncWorkspaceFoundationFiles:o}=await import('./create-YIUV6RUX.js');await o(e,{workspaceName:t.name,installMethod:"venv",writeMarker:true,writeGitignore:false,onlyIfMissing:true});let c=D();await promises.writeFile(l.join(e,"rapidkit"),c),await promises.chmod(l.join(e,"rapidkit"),493);let n=A();await promises.writeFile(l.join(e,"rapidkit.cmd"),n);let s=P(t.name);if(await promises.writeFile(l.join(e,"README.md"),s),await promises.writeFile(l.join(e,".gitignore"),`# RapidKit workspace
1
+ import {j as j$1}from'./chunk-Z5LKRG57.js';import {b as b$1}from'./chunk-Q7ULIFQA.js';import {promises}from'fs';import n from'path';import a from'chalk';import b from'ora';import {execa}from'execa';function j(e){let t=n.resolve(e);return process.platform==="win32"?t.toLowerCase():t}function I(e){let t=j(e.path),r=Array.isArray(e.projects)?e.projects:[],o=[],i=new Set;for(let s of r){if(!s||typeof s.name!="string"||typeof s.path!="string")continue;let c=j(s.path);i.has(c)||(i.add(c),o.push({name:s.name,path:c}));}return {name:e.name,path:t,mode:e.mode,projects:o}}function x(e){let t=[],r=new Set;for(let o of e.workspaces||[]){if(!o||typeof o.name!="string"||typeof o.path!="string")continue;let i=I(o);r.has(i.path)||(r.add(i.path),t.push(i));}return {workspaces:t}}async function A(e,t){try{let r=j(e),o=j$1(),i=n.join(o,"workspaces.json");await promises.mkdir(o,{recursive:true});let s={workspaces:[]};try{let p=await promises.readFile(i,"utf8"),d=JSON.parse(p);d&&Array.isArray(d.workspaces)&&(s=x(d));}catch{}s.workspaces.some(p=>p.path===r)||(s.workspaces.push({name:t,path:r,mode:"full",projects:[]}),await promises.writeFile(i,JSON.stringify(s,null,2)));}catch{console.warn(a.gray("Note: Could not register workspace in shared registry"));}}async function X(e,t=false){try{let r=j(e),o=j$1(),i=n.join(o,"workspaces.json"),s={workspaces:[]};try{let g=await promises.readFile(i,"utf8"),f=JSON.parse(g);f&&Array.isArray(f.workspaces)&&(s=x(f));}catch{t||console.log("\u26A0\uFE0F Workspace registry not found");return}let c=s.workspaces.find(g=>g.path===r);if(!c){t||console.log("\u26A0\uFE0F Workspace not registered in registry");return}Array.isArray(c.projects)||(c.projects=[]);let p=0,d=0,u=[e],m=new Set;for(;u.length>0;){let g=u.shift();if(!g||m.has(g))continue;m.add(g);let f=await promises.readdir(g,{withFileTypes:true});for(let y of f){if(!y.isDirectory()||y.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(y.name))continue;let k=n.join(g,y.name),h=j(k),v=n.join(h,".rapidkit","context.json"),E=n.join(h,".rapidkit","project.json");try{let _=false;try{await promises.access(v),_=true;}catch{await promises.access(E),_=true;}if(_){let $=n.basename(h);c.projects.some(R=>R.path===h||R.name===$)?d++:(c.projects.push({name:$,path:h}),p++,t||console.log(`\u2714 Added: ${n.relative(e,h)}`));continue}}catch{}u.push(k);}}p>0?(await promises.writeFile(i,JSON.stringify(s,null,2)),t||console.log(`
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 Z(e,t,r){try{let o=j(e),i=j(r),s=j$1(),c=n.join(s,"workspaces.json"),p={workspaces:[]};try{let m=await promises.readFile(c,"utf8"),g=JSON.parse(m);g&&Array.isArray(g.workspaces)&&(p=x(g));}catch{return}let d=p.workspaces.find(m=>m.path===o);if(!d)return;Array.isArray(d.projects)||(d.projects=[]),d.projects.some(m=>m.path===i||m.name===t)||(d.projects.push({name:t,path:i}),await promises.writeFile(c,JSON.stringify(p,null,2)));}catch{}}async function ee(e,t){let r=b("Creating RapidKit workspace...").start();try{await promises.mkdir(e,{recursive:true}),await promises.mkdir(n.join(e,".rapidkit"),{recursive:true});let o={workspace_name:t.name,author:t.author,rapidkit_version:b$1(),created_at:new Date().toISOString(),type:"workspace"};await promises.writeFile(n.join(e,".rapidkit","config.json"),JSON.stringify(o,null,2));let{syncWorkspaceFoundationFiles:i}=await import('./create-3V7O72CO.js');await i(e,{workspaceName:t.name,installMethod:"venv",writeMarker:true,writeGitignore:false,onlyIfMissing:true});let s=F();await promises.writeFile(n.join(e,"rapidkit"),s),await promises.chmod(n.join(e,"rapidkit"),493);let c=O();await promises.writeFile(n.join(e,"rapidkit.cmd"),c);let p=B(t.name);if(await promises.writeFile(n.join(e,"README.md"),p),await promises.writeFile(n.join(e,".gitignore"),`# RapidKit workspace
4
4
  .env
5
5
  .env.*
6
6
  !.env.example
@@ -15,10 +15,10 @@ Thumbs.db
15
15
 
16
16
  # Logs
17
17
  *.log
18
- `),await promises.writeFile(l.join(e,".rapidkit-workspace"),JSON.stringify({signature:"RAPIDKIT_WORKSPACE",createdBy:"rapidkit-npm",version:b(),createdAt:new Date().toISOString(),name:t.name},null,2)),await W(e),r.succeed("Workspace created!"),!t.skipGit){let h=_("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}),h.succeed("Git repository initialized");}catch{h.warn("Could not initialize git repository");}}await I(e,t.name),console.log(`
19
- ${i.green("\u2728 RapidKit workspace created successfully!")}
18
+ `),await promises.writeFile(n.join(e,".rapidkit-workspace"),JSON.stringify({signature:"RAPIDKIT_WORKSPACE",createdBy:"rapidkit-npm",version:b$1(),createdAt:new Date().toISOString(),name:t.name},null,2)),await T(e),r.succeed("Workspace created!"),!t.skipGit){let u=b("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 A(e,t.name),console.log(`
19
+ ${a.green("\u2728 RapidKit workspace created successfully!")}
20
20
 
21
- ${i.bold("\u{1F4C2} Workspace structure:")}
21
+ ${a.bold("\u{1F4C2} Workspace structure:")}
22
22
  ${e}/
23
23
  \u251C\u2500\u2500 rapidkit # Local CLI wrapper
24
24
  \u251C\u2500\u2500 rapidkit.cmd # Windows local CLI wrapper
@@ -30,29 +30,29 @@ ${e}/
30
30
  \u2502 \u2514\u2500\u2500 config.json # Legacy compatibility metadata
31
31
  \u2514\u2500\u2500 README.md
32
32
 
33
- ${i.bold("\u{1F680} Get started:")}
34
- ${i.cyan(`cd ${t.name}`)}
35
- ${i.cyan("npx rapidkit my-api --template fastapi")}
36
- ${i.cyan("cd my-api")}
37
- ${i.cyan("npx rapidkit init")}
38
- ${i.cyan("npx rapidkit dev")}
33
+ ${a.bold("\u{1F680} Get started:")}
34
+ ${a.cyan(`cd ${t.name}`)}
35
+ ${a.cyan("npx rapidkit my-api --template fastapi")}
36
+ ${a.cyan("cd my-api")}
37
+ ${a.cyan("npx rapidkit init")}
38
+ ${a.cyan("npx rapidkit dev")}
39
39
 
40
- ${i.bold("\u{1F4E6} Available templates:")}
40
+ ${a.bold("\u{1F4E6} Available templates:")}
41
41
  fastapi - FastAPI + Python
42
42
  nestjs - NestJS + TypeScript
43
43
  springboot - Spring Boot + Java
44
44
  gofiber - Go Fiber
45
45
  gogin - Go Gin
46
46
 
47
- ${i.bold("\u{1F4DA} Commands:")}
47
+ ${a.bold("\u{1F4DA} Commands:")}
48
48
  npx rapidkit <name> --template <type> Create a new project
49
49
  npx rapidkit init Install dependencies
50
50
  npx rapidkit dev Start dev server
51
51
  npx rapidkit help Show all commands
52
52
 
53
- ${i.gray("Alternative: ./rapidkit dev (Windows: .\\rapidkit.cmd dev), make dev")}
54
- ${i.gray("\u{1F4A1} Tip: Install globally (npm i -g rapidkit) to use without npx")}
55
- `);}catch(a){throw r.fail("Failed to create workspace"),a}}function D(){return `#!/usr/bin/env bash
53
+ ${a.gray("Alternative: ./rapidkit dev (Windows: .\\rapidkit.cmd dev), make dev")}
54
+ ${a.gray("\u{1F4A1} Tip: Install globally (npm i -g rapidkit) to use without npx")}
55
+ `);}catch(o){throw r.fail("Failed to create workspace"),o}}function F(){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$1()}"
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 A(){return `@echo off
415
+ `}function O(){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 P(e){return `# ${e}
435
+ `}function B(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 W(e){let{fileURLToPath:t}=await import('url'),r=t(import.meta.url),a=l.dirname(r),o=l.resolve(a,".."),c=l.join(o,"templates","kits"),n=l.join(e,".rapidkit","templates"),{default:s}=await import('fs-extra');await s.copy(c,n);let d=l.join(o,"templates","generator.js"),h=l.join(e,".rapidkit","generator.js");await s.copy(d,h);}async function Q(e,t){let r=t.template==="fastapi",a=r?"FastAPI":"NestJS",o=_(`Creating ${a} project...`).start();try{let{fileURLToPath:c}=await import('url'),n=c(import.meta.url),s=l.dirname(n),d=l.resolve(s,".."),h=r?"fastapi-standard":"nestjs-standard",m=l.join(d,"templates","kits",h);await promises.mkdir(e,{recursive:true});let g={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 N(m,e,g);let u=r?`# Python
483
+ `}async function T(e){let{fileURLToPath:t}=await import('url'),r=t(import.meta.url),o=n.dirname(r),i=n.resolve(o,".."),s=n.join(i,"templates","kits"),c=n.join(e,".rapidkit","templates"),{default:p}=await import('fs-extra');await p.copy(s,c);let d=n.join(i,"templates","generator.js"),u=n.join(e,".rapidkit","generator.js");await p.copy(d,u);}async function te(e,t){let r=t.template==="fastapi",o=r?"FastAPI":"NestJS",i=b(`Creating ${o} project...`).start();try{let{fileURLToPath:s}=await import('url'),c=s(import.meta.url),p=n.dirname(c),d=n.resolve(p,".."),u=r?"fastapi-standard":"nestjs-standard",m=n.join(d,"templates","kits",u);await promises.mkdir(e,{recursive:true});let g={project_name:r?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:b$1()};await W(m,e,g);let f=r?`# Python
484
484
  __pycache__/
485
485
  *.py[cod]
486
486
  *$py.class
@@ -548,10 +548,10 @@ Thumbs.db
548
548
 
549
549
  # Coverage
550
550
  coverage/
551
- `;if(await promises.writeFile(l.join(e,".gitignore"),u),o.succeed(`${a} project created!`),!t.skipGit){let f=_("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}),f.succeed("Git repository initialized");}catch{f.warn("Could not initialize git repository");}}if(!t.skipInstall&&!r){let f=t.package_manager||"npm",k=_(`Installing dependencies with ${f}...`).start();try{await execa(f,["install"],{cwd:e}),k.succeed("Dependencies installed");}catch{k.warn(`Could not install dependencies. Run '${f} install' manually.`);}}let $=l.basename(e);console.log(r?`
552
- ${i.green("\u2728 FastAPI project created successfully!")}
551
+ `;if(await promises.writeFile(n.join(e,".gitignore"),f),i.succeed(`${o} project created!`),!t.skipGit){let k=b("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}),k.succeed("Git repository initialized");}catch{k.warn("Could not initialize git repository");}}if(!t.skipInstall&&!r){let k=t.package_manager||"npm",h=b(`Installing dependencies with ${k}...`).start();try{await execa(k,["install"],{cwd:e}),h.succeed("Dependencies installed");}catch{h.warn(`Could not install dependencies. Run '${k} install' manually.`);}}let y=n.basename(e);console.log(r?`
552
+ ${a.green("\u2728 FastAPI project created successfully!")}
553
553
 
554
- ${i.bold("\u{1F4C2} Project structure:")}
554
+ ${a.bold("\u{1F4C2} Project structure:")}
555
555
  ${e}/
556
556
  \u251C\u2500\u2500 .rapidkit/ # RapidKit CLI module
557
557
  \u251C\u2500\u2500 src/
@@ -563,12 +563,12 @@ ${e}/
563
563
  \u251C\u2500\u2500 pyproject.toml # Poetry configuration
564
564
  \u2514\u2500\u2500 README.md
565
565
 
566
- ${i.bold("\u{1F680} Get started:")}
567
- ${i.cyan(`cd ${$}`)}
568
- ${i.cyan("npx rapidkit init")} ${i.gray("# Install dependencies")}
569
- ${i.cyan("npx rapidkit dev")} ${i.gray("# Start dev server")}
566
+ ${a.bold("\u{1F680} Get started:")}
567
+ ${a.cyan(`cd ${y}`)}
568
+ ${a.cyan("npx rapidkit init")} ${a.gray("# Install dependencies")}
569
+ ${a.cyan("npx rapidkit dev")} ${a.gray("# Start dev server")}
570
570
 
571
- ${i.bold("\u{1F4DA} Available commands:")}
571
+ ${a.bold("\u{1F4DA} Available commands:")}
572
572
  npx rapidkit init # Install dependencies (poetry install)
573
573
  npx rapidkit dev # Start dev server with hot reload
574
574
  npx rapidkit start # Start production server
@@ -576,12 +576,12 @@ ${i.bold("\u{1F4DA} Available commands:")}
576
576
  npx rapidkit lint # Lint code
577
577
  npx rapidkit format # Format code
578
578
 
579
- ${i.gray("Alternative: make dev, ./rapidkit dev, poetry run dev")}
580
- ${i.gray("\u{1F4A1} Tip: Install globally (npm i -g rapidkit) to use without npx")}
579
+ ${a.gray("Alternative: make dev, ./rapidkit dev, poetry run dev")}
580
+ ${a.gray("\u{1F4A1} Tip: Install globally (npm i -g rapidkit) to use without npx")}
581
581
  `:`
582
- ${i.green("\u2728 NestJS project created successfully!")}
582
+ ${a.green("\u2728 NestJS project created successfully!")}
583
583
 
584
- ${i.bold("\u{1F4C2} Project structure:")}
584
+ ${a.bold("\u{1F4C2} Project structure:")}
585
585
  ${e}/
586
586
  \u251C\u2500\u2500 .rapidkit/ # RapidKit CLI module
587
587
  \u251C\u2500\u2500 src/
@@ -593,13 +593,13 @@ ${e}/
593
593
  \u251C\u2500\u2500 package.json # Dependencies
594
594
  \u2514\u2500\u2500 README.md
595
595
 
596
- ${i.bold("\u{1F680} Get started:")}
597
- ${i.cyan(`cd ${$}`)}
598
- ${t.skipInstall?i.cyan("npx rapidkit init")+i.gray(" # npm install")+`
599
- `:""}${i.cyan("cp .env.example .env")}
600
- ${i.cyan("npx rapidkit dev")} ${i.gray("# Start dev server")}
596
+ ${a.bold("\u{1F680} Get started:")}
597
+ ${a.cyan(`cd ${y}`)}
598
+ ${t.skipInstall?a.cyan("npx rapidkit init")+a.gray(" # npm install")+`
599
+ `:""}${a.cyan("cp .env.example .env")}
600
+ ${a.cyan("npx rapidkit dev")} ${a.gray("# Start dev server")}
601
601
 
602
- ${i.bold("\u{1F4DA} Available commands:")}
602
+ ${a.bold("\u{1F4DA} Available commands:")}
603
603
  npx rapidkit init # Install dependencies
604
604
  npx rapidkit dev # Start dev server with hot reload
605
605
  npx rapidkit start # Start production server
@@ -608,22 +608,22 @@ ${i.bold("\u{1F4DA} Available commands:")}
608
608
  npx rapidkit lint # Lint code
609
609
  npx rapidkit format # Format code
610
610
 
611
- ${i.bold("\u{1F310} API endpoints:")}
611
+ ${a.bold("\u{1F310} API endpoints:")}
612
612
  http://localhost:8000/health # Health check
613
613
  http://localhost:8000/docs # Swagger docs
614
614
  http://localhost:8000/examples/notes # Example API
615
615
 
616
- ${i.gray("\u{1F4A1} Tip: Install globally (npm i -g rapidkit) to use without npx")}
617
- `);}catch(c){throw o.fail(`Failed to create ${a} project`),c}}async function N(e,t,r){let a=await promises.readdir(e,{withFileTypes:true});for(let o of a){let c=l.join(e,o.name),n=o.name.replace(/\.j2$/,""),s=l.join(t,n);if(o.isDirectory())await promises.mkdir(s,{recursive:true}),await N(c,s,r);else {let d=await promises.readFile(c,"utf-8");o.name.endsWith(".j2")&&(d=F(d,r)),await promises.writeFile(s,d),(n==="rapidkit"||n==="activate"||n.endsWith(".py")&&s.includes(".rapidkit"))&&await promises.chmod(s,493);}}}function F(e,t){let r=e;for(let[a,o]of Object.entries(t)){let c=new RegExp(`\\{\\{\\s*${a}\\s*\\}\\}`,"g");r=r.replace(c,String(o));let n=new RegExp(`\\{\\{\\s*${a}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\}\\}`,"g");r=r.replace(n,(h,m,g)=>String(o).replace(new RegExp(m,"g"),g));let s=new RegExp(`\\{\\{\\s*${a}\\s*\\|\\s*lower\\s*\\}\\}`,"g");r=r.replace(s,String(o).toLowerCase());let d=new RegExp(`\\{\\{\\s*${a}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\|\\s*lower\\s*\\}\\}`,"g");r=r.replace(d,(h,m,g)=>String(o).replace(new RegExp(m,"g"),g).toLowerCase());}return r}async function X(){let e=j(),t=l.join(e,"workspaces.json");if(!await promises.stat(t).catch(()=>null)){console.log(i.yellow(`
616
+ ${a.gray("\u{1F4A1} Tip: Install globally (npm i -g rapidkit) to use without npx")}
617
+ `);}catch(s){throw i.fail(`Failed to create ${o} project`),s}}async function W(e,t,r){let o=await promises.readdir(e,{withFileTypes:true});for(let i of o){let s=n.join(e,i.name),c=i.name.replace(/\.j2$/,""),p=n.join(t,c);if(i.isDirectory())await promises.mkdir(p,{recursive:true}),await W(s,p,r);else {let d=await promises.readFile(s,"utf-8");i.name.endsWith(".j2")&&(d=z(d,r)),await promises.writeFile(p,d),(c==="rapidkit"||c==="activate"||c.endsWith(".py")&&p.includes(".rapidkit"))&&await promises.chmod(p,493);}}}function z(e,t){let r=e;for(let[o,i]of Object.entries(t)){let s=new RegExp(`\\{\\{\\s*${o}\\s*\\}\\}`,"g");r=r.replace(s,String(i));let c=new RegExp(`\\{\\{\\s*${o}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\}\\}`,"g");r=r.replace(c,(u,m,g)=>String(i).replace(new RegExp(m,"g"),g));let p=new RegExp(`\\{\\{\\s*${o}\\s*\\|\\s*lower\\s*\\}\\}`,"g");r=r.replace(p,String(i).toLowerCase());let d=new RegExp(`\\{\\{\\s*${o}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\|\\s*lower\\s*\\}\\}`,"g");r=r.replace(d,(u,m,g)=>String(i).replace(new RegExp(m,"g"),g).toLowerCase());}return r}async function re(){let e=j$1(),t=n.join(e,"workspaces.json");if(!await promises.stat(t).catch(()=>null)){console.log(a.yellow(`
618
618
  \u26A0\uFE0F No workspaces registered yet.
619
- `)),console.log(i.gray(`Create a workspace with: npx rapidkit <workspace-name>
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(`
619
+ `)),console.log(a.gray(`Create a workspace with: npx rapidkit <workspace-name>
620
+ `));return}try{let r=await promises.readFile(t,"utf8"),o=JSON.parse(r);if(!o||typeof o!="object"||!Array.isArray(o.workspaces)){console.log(a.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 o=R(a),c=[],n=0;for(let m of o.workspaces)await promises.stat(m.path).catch(()=>null)?c.push(m):n+=1;let s={workspaces:c},d=JSON.stringify(a),h=JSON.stringify(s);if(d!==h&&await promises.writeFile(t,JSON.stringify(s,null,2)),!s.workspaces||s.workspaces.length===0){console.log(i.yellow(`
622
+ `)),await promises.writeFile(t,JSON.stringify({workspaces:[]},null,2));return}let i=x(o),s=[],c=0;for(let m of i.workspaces)await promises.stat(m.path).catch(()=>null)?s.push(m):c+=1;let p={workspaces:s},d=JSON.stringify(o),u=JSON.stringify(p);if(d!==u&&await promises.writeFile(t,JSON.stringify(p,null,2)),!p.workspaces||p.workspaces.length===0){console.log(a.yellow(`
623
623
  \u26A0\uFE0F No workspaces registered yet.
624
- `)),n>0&&console.log(i.gray(`Cleaned ${n} stale workspace entr${n===1?"y":"ies"}.
625
- `));return}console.log(i.bold(`
624
+ `)),c>0&&console.log(a.gray(`Cleaned ${c} stale workspace entr${c===1?"y":"ies"}.
625
+ `));return}console.log(a.bold(`
626
626
  \u{1F4E6} Registered RapidKit Workspaces:
627
- `));for(let m of s.workspaces)console.log(i.cyan(` ${m.name}`)),console.log(i.gray(` Path: ${m.path}`)),console.log(i.gray(` Projects: ${m.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: ${s.workspaces.length} workspace(s)
628
- `));}catch(r){console.error(i.red(`
629
- \u274C Failed to read workspace registry`)),console.error(i.gray(String(r)));}}export{Q as createProject,q as createWorkspace,X as listWorkspaces,H as registerProjectInWorkspace,I as registerWorkspace,V as syncWorkspaceProjects};
627
+ `));for(let m of p.workspaces)console.log(a.cyan(` ${m.name}`)),console.log(a.gray(` Path: ${m.path}`)),console.log(a.gray(` Projects: ${m.projects?.length||0}`)),console.log();c>0&&console.log(a.gray(`Cleaned ${c} stale workspace entr${c===1?"y":"ies"}.`)),console.log(a.gray(`Total: ${p.workspaces.length} workspace(s)
628
+ `));}catch(r){console.error(a.red(`
629
+ \u274C Failed to read workspace registry`)),console.error(a.gray(String(r)));}}async function P(e){try{let t=await promises.readFile(e,"utf8");return JSON.parse(t)}catch{return null}}async function D(e){try{return await promises.access(e),true}catch{return false}}async function U(e){let t=[],r=[e],o=new Set;for(;r.length>0;){let i=r.shift();if(!i||o.has(i))continue;o.add(i);let s=[];try{s=await promises.readdir(i,{withFileTypes:true});}catch{continue}for(let c of s){if(!c.isDirectory()||c.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(c.name))continue;let p=n.join(i,c.name),d=await D(n.join(p,".rapidkit","context.json")),u=await D(n.join(p,".rapidkit","project.json"));(d||u)&&t.push(p),r.push(p);}}return t.sort((i,s)=>i.localeCompare(s))}async function L(e){try{return (await promises.readdir(e,{withFileTypes:true})).filter(r=>r.isFile()&&r.name.toLowerCase().endsWith(".json")).map(r=>r.name).sort((r,o)=>r.localeCompare(o))}catch{return []}}async function ie(e,t){let r=t?.includePaths===true,o=t?.includeDoctorEvidence!==false,i=n.resolve(e),s=await P(n.join(i,".rapidkit","workspace.json")),c=typeof s?.workspace_name=="string"&&s.workspace_name.trim()||n.basename(i),p=typeof s?.profile=="string"?s.profile:void 0,d=typeof s?.rapidkit_version=="string"?s.rapidkit_version:void 0,u=await U(i),m=[];for(let h of u){let v=await P(n.join(h,".rapidkit","project.json")),E=n.relative(i,h)||".",_=n.join(h,".rapidkit","reports"),$={name:n.basename(h),relative_path:E,runtime:typeof v?.runtime=="string"?v.runtime:void 0,kit_name:typeof v?.kit_name=="string"?v.kit_name:void 0};if(r&&($.absolute_path=h),o){let R=await P(n.join(_,"doctor-last-run.json"));R&&($.doctor_report=R);}let N=await L(_);N.length>0&&($.reports=N),m.push($);}let g=n.join(i,".rapidkit","reports"),f=await L(g),y={schema_version:"1.0",generated_at:new Date().toISOString(),generated_by:"rapidkit-npm",workspace:{name:c,relative_root:".",profile:p,rapidkit_version:d,...r?{absolute_root:i}:{}},summary:{project_count:m.length,doctor_evidence_included:o},reports:{workspace:f},projects:m},k=t?.outputPath?n.resolve(t.outputPath):n.join(g,"share-bundle.json");return await promises.mkdir(n.dirname(k),{recursive:true}),await promises.writeFile(k,JSON.stringify(y,null,2),"utf8"),k}export{te as createProject,ee as createWorkspace,ie as createWorkspaceShareBundle,re as listWorkspaces,Z as registerProjectInWorkspace,A as registerWorkspace,X as syncWorkspaceProjects};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rapidkit",
3
- "version": "0.26.0",
3
+ "version": "0.27.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": [