rapidkit 0.25.7 → 0.26.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/dist/index.js CHANGED
@@ -1,168 +1,187 @@
1
1
  #!/usr/bin/env node
2
- import {e as e$1,d,c as c$1,h as h$1,a as a$4}from'./chunk-UOGFCKQ5.js';import {a as a$2,b as b$1,c,e,j}from'./chunk-ZAZJEYYT.js';import {a,h,i,c as c$2,d as d$1,b as b$2,f as f$1}from'./chunk-Z5LKRG57.js';import {b,a as a$3}from'./chunk-Q7ULIFQA.js';import {a as a$1}from'./chunk-VM2TOHNX.js';import {Command,Option}from'commander';import s from'chalk';import he from'inquirer';import f from'path';import {fileURLToPath}from'url';import {exec,spawn}from'child_process';import zo from'validate-npm-package-name';import*as x from'fs-extra';import x__default from'fs-extra';import w,{promises,createWriteStream}from'fs';import {execa}from'execa';import rr from'os';import {promisify}from'util';import kr from'ora';import {createVerify,createHash,createHmac}from'crypto';import bo from'http';import Po from'https';function vt(t){let e=zo(t);if(!e.validForNewPackages){let r=e.errors||[],n=e.warnings||[],i=[...r,...n];throw new j(t,`NPM validation failed: ${i.join(", ")}`)}if(!/^[a-z][a-z0-9_-]*$/.test(t))throw new j(t,"Must start with a lowercase letter and contain only lowercase letters, numbers, hyphens, and underscores");if(["test","tests","src","dist","build","lib","python","pip","poetry","node","npm","rapidkit","rapidkit"].includes(t.toLowerCase()))throw new j(t,`"${t}" is a reserved name. Please choose a different name.`);if(t.length<2)throw new j(t,"Name must be at least 2 characters long");if(t.length>214)throw new j(t,"Name must be less than 214 characters");return true}function Zo(){return d$1()}function Xo(t,e){return t==="py"?["-3",...e]:e}function er(t){return typeof t=="object"&&t!==null}async function tr(t,e,o,r=8e3){try{let n=await execa(t,e,{cwd:o,timeout:r,reject:false,stdio:"pipe"});return {ok:n.exitCode===0,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr}}catch(n){return {ok:false,exitCode:void 0,stdout:"",stderr:n instanceof Error?n.message:String(n)}}}async function or(t,e){let o=["-m","rapidkit",...t],r=Zo();for(let n of r){let i=await tr(n,Xo(n,o),e?.cwd,e?.timeoutMs);if(!i.ok)continue;let a=(i.stdout??"").trim();try{let c=JSON.parse(a);return er(c)?{ok:true,command:n,exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr,data:c}:{ok:false,command:n,exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr}}catch{return {ok:false,command:n,exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr}}}return {ok:false}}async function Ut(t,e){let o=await or(["project","detect","--path",t,"--json"],e);return !o.ok||!o.data||o.data.schema_version!==1?{ok:false,command:o.command,exitCode:o.exitCode,stdout:o.stdout,stderr:o.stderr}:o}var bt=f.join(rr.homedir(),".rapidkit"),et=f.join(bt,"config.json");function Te(){try{if(!w.existsSync(et))return {};let t=w.readFileSync(et,"utf-8");return JSON.parse(t)}catch{return {}}}function tt(t){let o={...Te(),...t};w.existsSync(bt)||w.mkdirSync(bt,{recursive:true}),w.writeFileSync(et,JSON.stringify(o,null,2),"utf-8");}function Fe(){return process.env.OPENAI_API_KEY||Te().openaiApiKey||null}function Pt(){return Te().aiEnabled!==false}function Ct(){return et}async function Jt(){return (await import('inquirer')).default}function Vt(t){let e=t.command("config").description("Configure RapidKit settings");e.command("set-api-key").description("Set OpenAI API key for AI features").option("--key <key>","API key (or enter interactively)").action(async o=>{let r=o.key;r?r.startsWith("sk-")||(console.log(s.red(`
2
+ import {e as e$1,d,c as c$2,h as h$1,a as a$4}from'./chunk-UOGFCKQ5.js';import {a as a$2,b as b$1,c,e,j}from'./chunk-ZAZJEYYT.js';import {a,h,i,c as c$3,d as d$1,b as b$2,f as f$1}from'./chunk-Z5LKRG57.js';import {b,a as a$3}from'./chunk-Q7ULIFQA.js';import {a as a$1}from'./chunk-VM2TOHNX.js';import {Command,Option}from'commander';import c$1 from'chalk';import _e from'inquirer';import f from'path';import {fileURLToPath}from'url';import {exec,spawn}from'child_process';import mn from'validate-npm-package-name';import*as R from'fs-extra';import R__default from'fs-extra';import v,{promises,createWriteStream}from'fs';import vn,{tmpdir}from'os';import {execa}from'execa';import {promisify}from'util';import Nn from'ora';import {createVerify,createHash,createHmac}from'crypto';import Or from'http';import Nr from'https';function Ge(r){let e=mn(r);if(!e.validForNewPackages){let n=e.errors||[],o=e.warnings||[],i=[...n,...o];throw new j(r,`NPM validation failed: ${i.join(", ")}`)}if(!/^[a-z][a-z0-9_-]*$/.test(r))throw new j(r,"Must start with a lowercase letter and contain only lowercase letters, numbers, hyphens, and underscores");if(["test","tests","src","dist","build","lib","python","pip","poetry","node","npm","rapidkit","rapidkit"].includes(r.toLowerCase()))throw new j(r,`"${r}" is a reserved name. Please choose a different name.`);if(r.length<2)throw new j(r,"Name must be at least 2 characters long");if(r.length>214)throw new j(r,"Name must be less than 214 characters");return true}function gn(){return d$1()}function yn(r,e){return r==="py"?["-3",...e]:e}function hn(r){return typeof r=="object"&&r!==null}async function wn(r,e,t,n=8e3){try{let o=await execa(r,e,{cwd:t,timeout:n,reject:false,stdio:"pipe"});return {ok:o.exitCode===0,exitCode:o.exitCode,stdout:o.stdout,stderr:o.stderr}}catch(o){return {ok:false,exitCode:void 0,stdout:"",stderr:o instanceof Error?o.message:String(o)}}}async function kn(r,e){let t=["-m","rapidkit",...r],n=gn();for(let o of n){let i=await wn(o,yn(o,t),e?.cwd,e?.timeoutMs);if(!i.ok)continue;let s=(i.stdout??"").trim();try{let a=JSON.parse(s);return hn(a)?{ok:true,command:o,exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr,data:a}:{ok:false,command:o,exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr}}catch{return {ok:false,command:o,exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr}}}return {ok:false}}async function ir(r,e){let t=await kn(["project","detect","--path",r,"--json"],e);return !t.ok||!t.data||t.data.schema_version!==1?{ok:false,command:t.command,exitCode:t.exitCode,stdout:t.stdout,stderr:t.stderr}:t}var At=f.join(vn.homedir(),".rapidkit"),at=f.join(At,"config.json");function Fe(){try{if(!v.existsSync(at))return {};let r=v.readFileSync(at,"utf-8");return JSON.parse(r)}catch{return {}}}function ct(r){let t={...Fe(),...r};v.existsSync(At)||v.mkdirSync(At,{recursive:true}),v.writeFileSync(at,JSON.stringify(t,null,2),"utf-8");}function Ye(){return process.env.OPENAI_API_KEY||Fe().openaiApiKey||null}function It(){return Fe().aiEnabled!==false}function Mt(){return at}async function ar(){return (await import('inquirer')).default}function cr(r){let e=r.command("config").description("Configure RapidKit settings");e.command("set-api-key").description("Set OpenAI API key for AI features").option("--key <key>","API key (or enter interactively)").action(async t=>{let n=t.key;n?n.startsWith("sk-")||(console.log(c$1.red(`
3
3
  \u274C Invalid API key format (should start with sk-)
4
- `)),process.exit(1)):r=(await(await Jt()).prompt([{type:"password",name:"apiKey",message:"Enter your OpenAI API key:",validate:a=>a?a.startsWith("sk-")?a.length<20?"API key seems too short":true:"Invalid API key format (should start with sk-)":"API key is required"}])).apiKey,tt({openaiApiKey:r}),console.log(s.green(`
4
+ `)),process.exit(1)):n=(await(await ar()).prompt([{type:"password",name:"apiKey",message:"Enter your OpenAI API key:",validate:s=>s?s.startsWith("sk-")?s.length<20?"API key seems too short":true:"Invalid API key format (should start with sk-)":"API key is required"}])).apiKey,ct({openaiApiKey:n}),console.log(c$1.green(`
5
5
  \u2705 OpenAI API key saved successfully!
6
- `)),console.log(s.gray(`Stored in: ${Ct()}`)),console.log(s.cyan(`
7
- \u{1F389} You can now use AI features:`)),console.log(s.white(' rapidkit ai recommend "I need user authentication"')),console.log(s.gray(`
8
- \u{1F4A1} To generate module embeddings (one-time):`)),console.log(s.white(" cd rapidkit-npm")),console.log(s.white(` npx tsx src/ai/generate-embeddings.ts
9
- `));}),e.command("show").description("Show current configuration").action(()=>{let o=Te();if(console.log(s.bold(`
6
+ `)),console.log(c$1.gray(`Stored in: ${Mt()}`)),console.log(c$1.cyan(`
7
+ \u{1F389} You can now use AI features:`)),console.log(c$1.white(' rapidkit ai recommend "I need user authentication"')),console.log(c$1.gray(`
8
+ \u{1F4A1} To generate module embeddings (one-time):`)),console.log(c$1.white(" cd rapidkit-npm")),console.log(c$1.white(` npx tsx src/ai/generate-embeddings.ts
9
+ `));}),e.command("show").description("Show current configuration").action(()=>{let t=Fe();if(console.log(c$1.bold(`
10
10
  \u2699\uFE0F RapidKit Configuration
11
- `)),o.openaiApiKey){let r=o.openaiApiKey.substring(0,8)+"..."+o.openaiApiKey.slice(-4);console.log(s.cyan("OpenAI API Key:"),s.white(r));}else console.log(s.cyan("OpenAI API Key:"),s.red("Not set")),console.log(s.gray(" Set with: rapidkit config set-api-key"));console.log(s.cyan("AI Features:"),o.aiEnabled!==false?s.green("Enabled"):s.red("Disabled")),console.log(s.gray(`
12
- \u{1F4C1} Config file: ${Ct()}
13
- `));}),e.command("remove-api-key").description("Remove stored OpenAI API key").action(async()=>{if(!Te().openaiApiKey){console.log(s.yellow(`
11
+ `)),t.openaiApiKey){let n=t.openaiApiKey.substring(0,8)+"..."+t.openaiApiKey.slice(-4);console.log(c$1.cyan("OpenAI API Key:"),c$1.white(n));}else console.log(c$1.cyan("OpenAI API Key:"),c$1.red("Not set")),console.log(c$1.gray(" Set with: rapidkit config set-api-key"));console.log(c$1.cyan("AI Features:"),t.aiEnabled!==false?c$1.green("Enabled"):c$1.red("Disabled")),console.log(c$1.gray(`
12
+ \u{1F4C1} Config file: ${Mt()}
13
+ `));}),e.command("remove-api-key").description("Remove stored OpenAI API key").action(async()=>{if(!Fe().openaiApiKey){console.log(c$1.yellow(`
14
14
  \u26A0\uFE0F No API key is currently stored
15
- `));return}(await(await Jt()).prompt([{type:"confirm",name:"confirm",message:"Are you sure you want to remove your OpenAI API key?",default:false}])).confirm?(tt({openaiApiKey:void 0}),console.log(s.green(`
15
+ `));return}(await(await ar()).prompt([{type:"confirm",name:"confirm",message:"Are you sure you want to remove your OpenAI API key?",default:false}])).confirm?(ct({openaiApiKey:void 0}),console.log(c$1.green(`
16
16
  \u2705 API key removed successfully
17
- `))):console.log(s.gray(`
17
+ `))):console.log(c$1.gray(`
18
18
  Cancelled
19
- `));}),e.command("ai <action>").description("Enable or disable AI features (enable|disable)").action(o=>{o!=="enable"&&o!=="disable"&&(console.log(s.red(`
20
- \u274C Invalid action: ${o}`)),console.log(s.gray(`Use: rapidkit config ai enable|disable
21
- `)),process.exit(1));let r=o==="enable";tt({aiEnabled:r}),console.log(s.green(`
22
- \u2705 AI features ${r?"enabled":"disabled"}
23
- `));});}var ot=null,rt=false,_t=null;async function nr(){return _t||(_t=(await import('openai')).default),_t}function Bt(){rt=true;}function Yt(t){let o=new Array(1536),r=0;for(let i=0;i<t.length;i++)r=(r<<5)-r+t.charCodeAt(i),r=r&r;for(let i=0;i<1536;i++)r=r*1664525+1013904223&4294967295,o[i]=r/4294967295*2-1;let n=Math.sqrt(o.reduce((i,a)=>i+a*a,0));return o.map(i=>i/n)}async function nt(t){let e=await nr();ot=new e({apiKey:t});}function zt(){if(!ot)throw new Error("OpenAI client not initialized. Call initOpenAI() first with your API key.");return ot}async function Qt(t){return rt?Yt(t):(await zt().embeddings.create({model:"text-embedding-3-small",input:t,encoding_format:"float"})).data[0].embedding}async function Zt(t){return rt?t.map(Yt):(await zt().embeddings.create({model:"text-embedding-3-small",input:t,encoding_format:"float"})).data.map(r=>r.embedding)}function Xt(){return ot!==null}function eo(){return rt}var ar=promisify(exec),oo=[{id:"authentication-core",name:"Authentication Core",category:"auth",description:"Complete authentication system with password hashing, JWT tokens, OAuth 2.0, and secure session management",longDescription:"Production-ready authentication with bcrypt password hashing, JWT access/refresh tokens, OAuth 2.0 providers (Google, GitHub, etc), rate limiting, and security best practices.",keywords:["auth","login","password","jwt","oauth","token","authentication","security","signin","signup"],framework:"both",dependencies:[],useCases:["User login and logout","Password reset flow","OAuth social login (Google, GitHub)","JWT authentication","Secure session management","Token refresh","Rate limiting"]},{id:"users-core",name:"Users Core",category:"auth",description:"User management system with profiles, roles, permissions, and user CRUD operations",longDescription:"Complete user management with user profiles, role-based access control (RBAC), permissions, user search, soft delete, and audit trails.",keywords:["user","profile","role","permission","rbac","management","admin","accounts"],framework:"both",dependencies:["authentication-core"],useCases:["User registration","User profile management","Role management (admin, user, etc)","Permission system","User administration dashboard","Soft delete users"]},{id:"session-management",name:"Session Management",category:"auth",description:"Secure session handling with Redis storage, session rotation, and device tracking",longDescription:"Advanced session management with Redis-backed storage, automatic session rotation, device fingerprinting, IP tracking, and session revocation.",keywords:["session","redis","cookie","storage","device","tracking"],framework:"both",dependencies:["authentication-core","redis-cache"],useCases:["User session management","Remember me functionality","Device tracking","Session security","Logout from all devices","Session expiration"]},{id:"db-postgres",name:"PostgreSQL",category:"database",description:"PostgreSQL integration with async SQLAlchemy, migrations, connection pooling, and query optimization",longDescription:"Production-ready PostgreSQL with async SQLAlchemy 2.0, Alembic migrations, connection pooling, query optimization, JSON support, and full-text search.",keywords:["postgres","postgresql","database","sql","sqlalchemy","migration","orm","relational"],framework:"both",dependencies:[],useCases:["Relational database","Complex SQL queries","Database transactions","Data integrity","Production-grade database","ACID compliance"]},{id:"db-mongodb",name:"MongoDB",category:"database",description:"MongoDB integration with Motor async driver, schema validation, and aggregation pipelines",longDescription:"Async MongoDB with Motor driver, Pydantic schema validation, aggregation pipelines, indexes, and Atlas integration.",keywords:["mongodb","mongo","nosql","document","database","motor"],framework:"both",dependencies:[],useCases:["Document storage","Flexible schema","Real-time data","JSON documents","Unstructured data","Analytics"]},{id:"stripe-payment",name:"Stripe Payment",category:"payment",description:"Stripe integration with payment intents, subscriptions, webhooks, and customer portal",longDescription:"Complete Stripe integration with Payment Intents API, subscription management, automatic webhooks, customer portal, refunds, and SCA compliance.",keywords:["stripe","payment","subscription","billing","checkout","webhook","credit card"],framework:"both",dependencies:[],useCases:["Accept credit card payments","Subscription billing","One-time payments","Checkout flow","Payment webhooks","Refunds and disputes"]},{id:"email",name:"Email",category:"communication",description:"Email sending with templates, SMTP/SendGrid/AWS SES support, and queue management",longDescription:"Production email system with Jinja2 templates, multiple providers (SMTP, SendGrid, AWS SES), queue management, retry logic, and bounce handling.",keywords:["email","mail","smtp","sendgrid","ses","template","notification"],framework:"both",dependencies:[],useCases:["Welcome emails","Password reset emails","Notifications","Marketing emails","Transactional emails","Email templates"]},{id:"sms",name:"SMS",category:"communication",description:"SMS sending with Twilio, verification codes, and delivery tracking",longDescription:"SMS integration with Twilio, verification codes, two-factor authentication, delivery tracking, and international support.",keywords:["sms","twilio","text","message","2fa","verification","otp"],framework:"both",dependencies:[],useCases:["2FA verification codes","SMS notifications","Phone verification","OTP generation","SMS alerts"]},{id:"redis-cache",name:"Redis Cache",category:"infrastructure",description:"Redis caching with decorators, TTL management, and cache invalidation patterns",longDescription:"Redis integration with async client, caching decorators, TTL management, cache invalidation, pub/sub, and rate limiting.",keywords:["redis","cache","memory","performance","speed","pubsub"],framework:"both",dependencies:[],useCases:["API response caching","Session storage","Rate limiting","Real-time features","Performance optimization","Pub/sub messaging"]},{id:"celery",name:"Celery",category:"infrastructure",description:"Background task processing with Celery, periodic tasks, and monitoring",longDescription:"Celery task queue with Redis/RabbitMQ backend, periodic tasks (cron), task monitoring, retry logic, and failure handling.",keywords:["celery","task","background","queue","async","worker","job","cron"],framework:"fastapi",dependencies:["redis-cache"],useCases:["Background email sending","Data processing","Report generation","Scheduled tasks","Long-running jobs"]},{id:"storage",name:"Storage",category:"infrastructure",description:"File storage with S3, local filesystem, and image processing",longDescription:"Unified storage interface for AWS S3, local files, image resizing, format conversion, CDN integration, and presigned URLs.",keywords:["storage","s3","file","upload","image","cdn","aws"],framework:"both",dependencies:[],useCases:["File uploads","Image storage","Document management","Profile pictures","Media files","CDN integration"]}],Oe=null,to=0,cr=300*1e3;function lr(t){return {id:t.name||t.id||t.module_id||"",name:t.display_name||t.name||"",category:dr(t.category||"infrastructure"),description:t.description||t.summary||"",longDescription:t.long_description||t.description||"",keywords:t.keywords||t.tags||[],framework:pr(t.framework),dependencies:t.dependencies||[],useCases:t.use_cases||t.useCases||[]}}function dr(t){return {auth:"auth",authentication:"auth",database:"database",payment:"payment",billing:"payment",communication:"communication",infrastructure:"infrastructure",security:"security",analytics:"analytics"}[t.toLowerCase()]||"infrastructure"}function pr(t){if(!t)return "both";if(typeof t=="string"){if(t.toLowerCase().includes("fastapi"))return "fastapi";if(t.toLowerCase().includes("nest"))return "nestjs"}return "both"}async function ur(){try{let{stdout:t}=await ar("rapidkit modules list --json-schema 1",{timeout:1e4,maxBuffer:10485760}),e=t.match(/\{[\s\S]*\}/),o=e?e[0]:t,r=JSON.parse(o),n=[];return Array.isArray(r)?n=r:r.modules&&Array.isArray(r.modules)?n=r.modules:r.data&&Array.isArray(r.data)&&(n=r.data),n.map(lr).filter(i=>i.id&&i.name)}catch(t){return t.code==="ENOENT"?console.warn("\u26A0\uFE0F RapidKit Python Core not found in PATH"):t.killed?console.warn("\u26A0\uFE0F Python Core command timed out"):console.warn("\u26A0\uFE0F Failed to fetch modules from Python Core:",t.message),console.warn(" Using fallback module catalog (11 modules)"),oo}}async function it(){let t=Date.now();return Oe&&t-to<cr||(Oe=await ur(),to=t,Oe.length===0&&(console.warn("\u26A0\uFE0F No modules found, using fallback catalog"),Oe=oo)),Oe}var fr=fileURLToPath(import.meta.url),no=f.dirname(fr),We=null;function gr(){if(We)return We;let t=[f.join(no,"../../data/modules-embeddings.json"),f.join(no,"../data/modules-embeddings.json"),f.join(process.cwd(),"data/modules-embeddings.json")],e=null;for(let n of t)if(w.existsSync(n)){e=n;break}if(!e)throw new Error("embeddings file not found");let o=w.readFileSync(e,"utf-8"),r=JSON.parse(o);return Array.isArray(r)?We={model:"mock-or-text-embedding-3-small",dimension:r[0]?.embedding?.length||1536,generated_at:new Date().toISOString(),modules:r}:We=r,We}function yr(t,e){if(t.length!==e.length)throw new Error("Vectors must have the same length");let o=0,r=0,n=0;for(let a=0;a<t.length;a++)o+=t[a]*e[a],r+=t[a]*t[a],n+=e[a]*e[a];let i=Math.sqrt(r)*Math.sqrt(n);return i===0?0:o/i}function hr(t,e){let o=e.toLowerCase(),r=t.keywords.filter(n=>o.includes(n)||n.includes(o));return r.length>0?`Matches: ${r.slice(0,3).join(", ")}`:`Relevant for: ${t.useCases[0]}`}async function io(t,e=5){let o=gr(),r=await it(),n=await Qt(t),i=o.modules.map(a=>{let c=r.find(d=>d.id===a.id);if(!c)return null;let m=yr(n,a.embedding);return {module:c,score:m,reason:hr(c,t)}}).filter(a=>a!==null);return i.sort((a,c)=>c.score-a.score),i.slice(0,e)}var vr=fileURLToPath(import.meta.url),so=f.dirname(vr);async function ao(){return (await import('inquirer')).default}function br(){return [f.join(so,"../../data/modules-embeddings.json"),f.join(so,"../data/modules-embeddings.json"),f.join(process.cwd(),"data/modules-embeddings.json")]}function co(){let t=br();for(let e of t)if(w.existsSync(e))try{let o=JSON.parse(w.readFileSync(e,"utf-8")),r=Array.isArray(o)?o:o.modules||[];return {exists:true,path:e,moduleCount:r.length,generatedAt:o.generated_at||null}}catch{continue}return {exists:false,path:null,moduleCount:0,generatedAt:null}}async function at(t=true,e){try{if(!Xt()&&!eo())return console.log(s.red(`
24
- \u274C OpenAI not initialized`)),console.log(s.yellow("Please set your API key:")),console.log(s.white(" rapidkit config set-api-key")),console.log(s.gray(` OR set: export OPENAI_API_KEY="sk-..."
25
- `)),false;console.log(s.blue(`
19
+ `));}),e.command("ai <action>").description("Enable or disable AI features (enable|disable)").action(t=>{t!=="enable"&&t!=="disable"&&(console.log(c$1.red(`
20
+ \u274C Invalid action: ${t}`)),console.log(c$1.gray(`Use: rapidkit config ai enable|disable
21
+ `)),process.exit(1));let n=t==="enable";ct({aiEnabled:n}),console.log(c$1.green(`
22
+ \u2705 AI features ${n?"enabled":"disabled"}
23
+ `));});}var lt=null,dt=false,$t=null;async function bn(){return $t||($t=(await import('openai')).default),$t}function lr(){dt=true;}function dr(r){let t=new Array(1536),n=0;for(let i=0;i<r.length;i++)n=(n<<5)-n+r.charCodeAt(i),n=n&n;for(let i=0;i<1536;i++)n=n*1664525+1013904223&4294967295,t[i]=n/4294967295*2-1;let o=Math.sqrt(t.reduce((i,s)=>i+s*s,0));return t.map(i=>i/o)}async function pt(r){let e=await bn();lt=new e({apiKey:r});}function pr(){if(!lt)throw new Error("OpenAI client not initialized. Call initOpenAI() first with your API key.");return lt}async function Tt(r){return dt?dr(r):(await pr().embeddings.create({model:"text-embedding-3-small",input:r,encoding_format:"float"})).data[0].embedding}async function ur(r){return dt?r.map(dr):(await pr().embeddings.create({model:"text-embedding-3-small",input:r,encoding_format:"float"})).data.map(n=>n.embedding)}function mr(){return lt!==null}function We(){return dt}var xn=promisify(exec);function Dt(r){return Array.isArray(r)?r.filter(e=>typeof e=="string"):[]}function _n(r){return !r||typeof r!="object"?{}:r}var Nt=[{id:"authentication-core",name:"Authentication Core",category:"auth",description:"Complete authentication system with password hashing, JWT tokens, OAuth 2.0, and secure session management",longDescription:"Production-ready authentication with bcrypt password hashing, JWT access/refresh tokens, OAuth 2.0 providers (Google, GitHub, etc), rate limiting, and security best practices.",keywords:["auth","login","password","jwt","oauth","token","authentication","security","signin","signup"],framework:"both",dependencies:[],useCases:["User login and logout","Password reset flow","OAuth social login (Google, GitHub)","JWT authentication","Secure session management","Token refresh","Rate limiting"]},{id:"users-core",name:"Users Core",category:"auth",description:"User management system with profiles, roles, permissions, and user CRUD operations",longDescription:"Complete user management with user profiles, role-based access control (RBAC), permissions, user search, soft delete, and audit trails.",keywords:["user","profile","role","permission","rbac","management","admin","accounts"],framework:"both",dependencies:["authentication-core"],useCases:["User registration","User profile management","Role management (admin, user, etc)","Permission system","User administration dashboard","Soft delete users"]},{id:"session-management",name:"Session Management",category:"auth",description:"Secure session handling with Redis storage, session rotation, and device tracking",longDescription:"Advanced session management with Redis-backed storage, automatic session rotation, device fingerprinting, IP tracking, and session revocation.",keywords:["session","redis","cookie","storage","device","tracking"],framework:"both",dependencies:["authentication-core","redis-cache"],useCases:["User session management","Remember me functionality","Device tracking","Session security","Logout from all devices","Session expiration"]},{id:"db-postgres",name:"PostgreSQL",category:"database",description:"PostgreSQL integration with async SQLAlchemy, migrations, connection pooling, and query optimization",longDescription:"Production-ready PostgreSQL with async SQLAlchemy 2.0, Alembic migrations, connection pooling, query optimization, JSON support, and full-text search.",keywords:["postgres","postgresql","database","sql","sqlalchemy","migration","orm","relational"],framework:"both",dependencies:[],useCases:["Relational database","Complex SQL queries","Database transactions","Data integrity","Production-grade database","ACID compliance"]},{id:"db-mongodb",name:"MongoDB",category:"database",description:"MongoDB integration with Motor async driver, schema validation, and aggregation pipelines",longDescription:"Async MongoDB with Motor driver, Pydantic schema validation, aggregation pipelines, indexes, and Atlas integration.",keywords:["mongodb","mongo","nosql","document","database","motor"],framework:"both",dependencies:[],useCases:["Document storage","Flexible schema","Real-time data","JSON documents","Unstructured data","Analytics"]},{id:"stripe-payment",name:"Stripe Payment",category:"payment",description:"Stripe integration with payment intents, subscriptions, webhooks, and customer portal",longDescription:"Complete Stripe integration with Payment Intents API, subscription management, automatic webhooks, customer portal, refunds, and SCA compliance.",keywords:["stripe","payment","subscription","billing","checkout","webhook","credit card"],framework:"both",dependencies:[],useCases:["Accept credit card payments","Subscription billing","One-time payments","Checkout flow","Payment webhooks","Refunds and disputes"]},{id:"email",name:"Email",category:"communication",description:"Email sending with templates, SMTP/SendGrid/AWS SES support, and queue management",longDescription:"Production email system with Jinja2 templates, multiple providers (SMTP, SendGrid, AWS SES), queue management, retry logic, and bounce handling.",keywords:["email","mail","smtp","sendgrid","ses","template","notification"],framework:"both",dependencies:[],useCases:["Welcome emails","Password reset emails","Notifications","Marketing emails","Transactional emails","Email templates"]},{id:"sms",name:"SMS",category:"communication",description:"SMS sending with Twilio, verification codes, and delivery tracking",longDescription:"SMS integration with Twilio, verification codes, two-factor authentication, delivery tracking, and international support.",keywords:["sms","twilio","text","message","2fa","verification","otp"],framework:"both",dependencies:[],useCases:["2FA verification codes","SMS notifications","Phone verification","OTP generation","SMS alerts"]},{id:"redis-cache",name:"Redis Cache",category:"infrastructure",description:"Redis caching with decorators, TTL management, and cache invalidation patterns",longDescription:"Redis integration with async client, caching decorators, TTL management, cache invalidation, pub/sub, and rate limiting.",keywords:["redis","cache","memory","performance","speed","pubsub"],framework:"both",dependencies:[],useCases:["API response caching","Session storage","Rate limiting","Real-time features","Performance optimization","Pub/sub messaging"]},{id:"celery",name:"Celery",category:"infrastructure",description:"Background task processing with Celery, periodic tasks, and monitoring",longDescription:"Celery task queue with Redis/RabbitMQ backend, periodic tasks (cron), task monitoring, retry logic, and failure handling.",keywords:["celery","task","background","queue","async","worker","job","cron"],framework:"fastapi",dependencies:["redis-cache"],useCases:["Background email sending","Data processing","Report generation","Scheduled tasks","Long-running jobs"]},{id:"storage",name:"Storage",category:"infrastructure",description:"File storage with S3, local filesystem, and image processing",longDescription:"Unified storage interface for AWS S3, local files, image resizing, format conversion, CDN integration, and presigned URLs.",keywords:["storage","s3","file","upload","image","cdn","aws"],framework:"both",dependencies:[],useCases:["File uploads","Image storage","Document management","Profile pictures","Media files","CDN integration"]}],Re=null,Ot=0,jn=300*1e3;function Sn(r){let e=_n(r);return {id:e.name||e.id||e.module_id||"",name:e.display_name||e.name||"",category:Rn(e.category||"infrastructure"),description:e.description||e.summary||"",longDescription:e.long_description||e.description||"",keywords:Dt(e.keywords??e.tags),framework:En(e.framework),dependencies:Dt(e.dependencies),useCases:Dt(e.use_cases??e.useCases)}}function Rn(r){return {auth:"auth",authentication:"auth",database:"database",payment:"payment",billing:"payment",communication:"communication",infrastructure:"infrastructure",security:"security",analytics:"analytics"}[r.toLowerCase()]||"infrastructure"}function En(r){if(!r)return "both";if(typeof r=="string"){if(r.toLowerCase().includes("fastapi"))return "fastapi";if(r.toLowerCase().includes("nest"))return "nestjs"}return "both"}async function An(){try{let{stdout:r}=await xn("rapidkit modules list --json-schema 1",{timeout:1e4,maxBuffer:10485760}),e=r.match(/\{[\s\S]*\}/),t=e?e[0]:r,n=JSON.parse(t),o=[];return Array.isArray(n)?o=n:n.modules&&Array.isArray(n.modules)?o=n.modules:n.data&&Array.isArray(n.data)&&(o=n.data),o.map(Sn).filter(i=>i.id&&i.name)}catch(r){let e=r;return e.code==="ENOENT"?console.warn("\u26A0\uFE0F RapidKit Python Core not found in PATH"):e.killed?console.warn("\u26A0\uFE0F Python Core command timed out"):console.warn("\u26A0\uFE0F Failed to fetch modules from Python Core:",e.message),console.warn(" Using fallback module catalog (11 modules)"),Nt}}async function ut(){let r=Date.now();return We()?(Re=Nt,Ot=r,Re):(Re&&r-Ot<jn||(Re=await An(),Ot=r,Re.length===0&&(console.warn("\u26A0\uFE0F No modules found, using fallback catalog"),Re=Nt)),Re)}var Mn=fileURLToPath(import.meta.url),gr=f.dirname(Mn),Je=null,yr=new Map;function $n(r){return [r.name,r.description,r.longDescription,...r.keywords,...r.useCases].filter(Boolean).join(" ")}async function Tn(r){let e=yr.get(r.id);if(e)return e;let t=await Tt($n(r));return yr.set(r.id,t),t}function Dn(){if(Je)return Je;let r=[f.join(gr,"../../data/modules-embeddings.json"),f.join(gr,"../data/modules-embeddings.json"),f.join(process.cwd(),"data/modules-embeddings.json")],e=null;for(let o of r)if(v.existsSync(o)){e=o;break}if(!e)throw new Error("embeddings file not found");let t=v.readFileSync(e,"utf-8"),n=JSON.parse(t);if(Array.isArray(n)?Je={model:"mock-or-text-embedding-3-small",dimension:n[0]?.embedding?.length||1536,generated_at:new Date().toISOString(),modules:n}:Je=n,!Je)throw new Error("failed to load embeddings data");return Je}function hr(r,e){if(r.length!==e.length)throw new Error("Vectors must have the same length");let t=0,n=0,o=0;for(let s=0;s<r.length;s++)t+=r[s]*e[s],n+=r[s]*r[s],o+=e[s]*e[s];let i=Math.sqrt(n)*Math.sqrt(o);return i===0?0:t/i}function wr(r,e){let t=e.toLowerCase(),n=r.keywords.filter(o=>t.includes(o)||o.includes(t));return n.length>0?`Matches: ${n.slice(0,3).join(", ")}`:`Relevant for: ${r.useCases[0]}`}async function kr(r,e=5){let t=await ut(),n=await Tt(r);if(We()){let s=await Promise.all(t.map(async a=>{let d=await Tn(a);return {module:a,score:hr(n,d),reason:wr(a,r)}}));return s.sort((a,d)=>d.score-a.score),s.slice(0,e)}let i=Dn().modules.map(s=>{let a=t.find(p=>p.id===s.id);if(!a)return null;let d=hr(n,s.embedding);return {module:a,score:d,reason:wr(a,r)}}).filter(s=>s!==null);return i.sort((s,a)=>a.score-s.score),i.slice(0,e)}var Kn=fileURLToPath(import.meta.url),vr=f.dirname(Kn);async function Pr(){return (await import('inquirer')).default}function br(r){return r instanceof Error?r.message:String(r)}function Ln(){return [f.join(vr,"../../data/modules-embeddings.json"),f.join(vr,"../data/modules-embeddings.json"),f.join(process.cwd(),"data/modules-embeddings.json")]}function Cr(){let r=Ln();for(let e of r)if(v.existsSync(e))try{let t=JSON.parse(v.readFileSync(e,"utf-8")),n=Array.isArray(t)?t:t.modules||[];return {exists:true,path:e,moduleCount:n.length,generatedAt:t.generated_at||null}}catch{continue}return {exists:false,path:null,moduleCount:0,generatedAt:null}}async function ft(r=true,e){try{if(!mr()&&!We())return console.log(c$1.red(`
24
+ \u274C OpenAI not initialized`)),console.log(c$1.yellow("Please set your API key:")),console.log(c$1.white(" rapidkit config set-api-key")),console.log(c$1.gray(` OR set: export OPENAI_API_KEY="sk-..."
25
+ `)),false;console.log(c$1.blue(`
26
26
  \u{1F916} Generating AI embeddings for RapidKit modules...
27
- `)),console.log(s.gray("\u{1F4E1} Fetching modules from RapidKit..."));let o=await it();console.log(s.green(`\u2713 Found ${o.length} modules
28
- `));let r=o.length*50/1e6*.02;if(console.log(s.cyan(`\u{1F4B0} Estimated cost: ~$${r.toFixed(3)}`)),console.log(s.gray(` (Based on ${o.length} modules at $0.02/1M tokens)
29
- `)),t){let a=await ao(),{confirm:c}=await a.prompt([{type:"confirm",name:"confirm",message:"Generate embeddings now?",default:true}]);if(!c)return console.log(s.yellow(`
27
+ `)),console.log(c$1.gray("\u{1F4E1} Fetching modules from RapidKit..."));let t=await ut();console.log(c$1.green(`\u2713 Found ${t.length} modules
28
+ `));let n=t.length*50/1e6*.02;if(console.log(c$1.cyan(`\u{1F4B0} Estimated cost: ~$${n.toFixed(3)}`)),console.log(c$1.gray(` (Based on ${t.length} modules at $0.02/1M tokens)
29
+ `)),r){let s=await Pr(),{confirm:a}=await s.prompt([{type:"confirm",name:"confirm",message:"Generate embeddings now?",default:true}]);if(!a)return console.log(c$1.yellow(`
30
30
  \u26A0\uFE0F Embeddings generation cancelled
31
- `)),false}let n=o.map(a=>`${a.name}. ${a.description}. ${a.longDescription}. Keywords: ${a.keywords.join(", ")}. Use cases: ${a.useCases.join(", ")}.`),i=kr(`Generating embeddings for ${o.length} modules...`).start();try{let a=await Zt(n);i.succeed(`Generated embeddings for ${o.length} modules`);let c={model:"text-embedding-3-small",dimension:a[0].length,generated_at:new Date().toISOString(),modules:o.map((l,u)=>({id:l.id,name:l.name,embedding:a[u]}))},m=e||f.join(process.cwd(),"data","modules-embeddings.json"),d=f.dirname(m);return w.existsSync(d)||w.mkdirSync(d,{recursive:true}),w.writeFileSync(m,JSON.stringify(c,null,2)),console.log(s.green(`
32
- \u2705 Embeddings generated successfully!`)),console.log(s.gray(`\u{1F4C1} Saved to: ${m}`)),console.log(s.gray(`\u{1F4CA} Size: ${o.length} modules, ${a[0].length} dimensions
33
- `)),true}catch(a){return i.fail("Failed to generate embeddings"),a.message?.includes("429")?(console.log(s.red(`
34
- \u274C OpenAI API quota exceeded`)),console.log(s.yellow(`Please check your billing: https://platform.openai.com/account/billing
35
- `))):a.message?.includes("401")?(console.log(s.red(`
36
- \u274C Invalid API key`)),console.log(s.yellow("Please set a valid API key:")),console.log(s.white(` rapidkit config set-api-key
37
- `))):console.log(s.red(`
38
- \u274C Error: ${a.message}
39
- `)),false}}catch(o){return console.log(s.red(`
40
- \u274C Failed to generate embeddings: ${o.message}
41
- `)),false}}async function lo(t=true){if(co().exists)return true;if(console.log(s.yellow(`
42
- \u26A0\uFE0F Module embeddings not found`)),console.log(s.gray(`AI recommendations require embeddings to be generated.
43
- `)),!t)return console.log(s.red("\u274C Cannot generate embeddings in non-interactive mode")),console.log(s.white(`Run: rapidkit ai generate-embeddings
44
- `)),false;let o=await ao(),{action:r}=await o.prompt([{type:"list",name:"action",message:"What would you like to do?",choices:[{name:"\u{1F680} Generate embeddings now (requires OpenAI API key)",value:"generate"},{name:"\u{1F4DD} Show me how to generate them manually",value:"manual"},{name:"\u274C Cancel",value:"cancel"}]}]);return r==="generate"?await at(true):(r==="manual"&&(console.log(s.cyan(`
31
+ `)),false}let o=t.map(s=>`${s.name}. ${s.description}. ${s.longDescription}. Keywords: ${s.keywords.join(", ")}. Use cases: ${s.useCases.join(", ")}.`),i=Nn(`Generating embeddings for ${t.length} modules...`).start();try{let s=await ur(o);i.succeed(`Generated embeddings for ${t.length} modules`);let a={model:"text-embedding-3-small",dimension:s[0].length,generated_at:new Date().toISOString(),modules:t.map((g,u)=>({id:g.id,name:g.name,embedding:s[u]}))},d=e||f.join(process.cwd(),"data","modules-embeddings.json"),p=f.dirname(d);return v.existsSync(p)||v.mkdirSync(p,{recursive:true}),v.writeFileSync(d,JSON.stringify(a,null,2)),console.log(c$1.green(`
32
+ \u2705 Embeddings generated successfully!`)),console.log(c$1.gray(`\u{1F4C1} Saved to: ${d}`)),console.log(c$1.gray(`\u{1F4CA} Size: ${t.length} modules, ${s[0].length} dimensions
33
+ `)),true}catch(s){i.fail("Failed to generate embeddings");let a=br(s);return a.includes("429")?(console.log(c$1.red(`
34
+ \u274C OpenAI API quota exceeded`)),console.log(c$1.yellow(`Please check your billing: https://platform.openai.com/account/billing
35
+ `))):a.includes("401")?(console.log(c$1.red(`
36
+ \u274C Invalid API key`)),console.log(c$1.yellow("Please set a valid API key:")),console.log(c$1.white(` rapidkit config set-api-key
37
+ `))):console.log(c$1.red(`
38
+ \u274C Error: ${a}
39
+ `)),false}}catch(t){return console.log(c$1.red(`
40
+ \u274C Failed to generate embeddings: ${br(t)}
41
+ `)),false}}async function xr(r=true){if(Cr().exists)return true;if(console.log(c$1.yellow(`
42
+ \u26A0\uFE0F Module embeddings not found`)),console.log(c$1.gray(`AI recommendations require embeddings to be generated.
43
+ `)),!r)return console.log(c$1.red("\u274C Cannot generate embeddings in non-interactive mode")),console.log(c$1.white(`Run: rapidkit ai generate-embeddings
44
+ `)),false;let t=await Pr(),{action:n}=await t.prompt([{type:"list",name:"action",message:"What would you like to do?",choices:[{name:"\u{1F680} Generate embeddings now (requires OpenAI API key)",value:"generate"},{name:"\u{1F4DD} Show me how to generate them manually",value:"manual"},{name:"\u274C Cancel",value:"cancel"}]}]);return n==="generate"?await ft(true):(n==="manual"&&(console.log(c$1.cyan(`
45
45
  \u{1F4DD} To generate embeddings manually:
46
- `)),console.log(s.white("1. Get OpenAI API key from: https://platform.openai.com/api-keys")),console.log(s.white("2. Set the API key:")),console.log(s.gray(" rapidkit config set-api-key")),console.log(s.gray(` OR: export OPENAI_API_KEY="sk-..."
47
- `)),console.log(s.white("3. Generate embeddings:")),console.log(s.gray(` rapidkit ai generate-embeddings
48
- `)),console.log(s.cyan(`\u{1F4B0} Cost: ~$0.50 one-time
49
- `))),false)}async function po(){let t=co();return t.exists?(console.log(s.blue(`
50
- \u{1F504} Updating embeddings...`)),console.log(s.gray(`Current: ${t.moduleCount} modules`)),console.log(s.gray(`Generated: ${t.generatedAt||"unknown"}
51
- `)),await at(true,t.path)):(console.log(s.yellow(`
52
- \u26A0\uFE0F No existing embeddings found`)),console.log(s.gray(`Use: rapidkit ai generate-embeddings
53
- `)),false)}async function uo(){return (await import('inquirer')).default}function mo(t){let e=t.command("ai").description("AI-powered features");e.command("recommend").description("Get AI-powered module recommendations").argument("[query]",'What do you want to build? (e.g., "user authentication with email")').option("-n, --number <count>","Number of recommendations","5").option("--json","Output as JSON").action(async(o,r)=>{try{Pt()||(console.log(s.yellow(`
54
- \u26A0\uFE0F AI features are disabled`)),console.log(s.gray(`Enable with: rapidkit config ai enable
55
- `)),process.exit(1));let n=Fe();n?await nt(n):(console.log(s.yellow(`
46
+ `)),console.log(c$1.white("1. Get OpenAI API key from: https://platform.openai.com/api-keys")),console.log(c$1.white("2. Set the API key:")),console.log(c$1.gray(" rapidkit config set-api-key")),console.log(c$1.gray(` OR: export OPENAI_API_KEY="sk-..."
47
+ `)),console.log(c$1.white("3. Generate embeddings:")),console.log(c$1.gray(` rapidkit ai generate-embeddings
48
+ `)),console.log(c$1.cyan(`\u{1F4B0} Cost: ~$0.50 one-time
49
+ `))),false)}async function _r(){let r=Cr();return r.exists?(console.log(c$1.blue(`
50
+ \u{1F504} Updating embeddings...`)),console.log(c$1.gray(`Current: ${r.moduleCount} modules`)),console.log(c$1.gray(`Generated: ${r.generatedAt||"unknown"}
51
+ `)),r.path?await ft(true,r.path):false):(console.log(c$1.yellow(`
52
+ \u26A0\uFE0F No existing embeddings found`)),console.log(c$1.gray(`Use: rapidkit ai generate-embeddings
53
+ `)),false)}async function jr(){return (await import('inquirer')).default}function Kt(r){if(r&&typeof r=="object"){let e=r;return {message:typeof e.message=="string"?e.message:String(r),code:typeof e.code=="string"?e.code:void 0}}return {message:String(r)}}function Sr(r){let e=r.command("ai").description("AI-powered features");e.command("recommend").description("Get AI-powered module recommendations").argument("[query]",'What do you want to build? (e.g., "user authentication with email")').option("-n, --number <count>","Number of recommendations","5").option("--json","Output as JSON").action(async(t,n)=>{try{It()||(console.log(c$1.yellow(`
54
+ \u26A0\uFE0F AI features are disabled`)),console.log(c$1.gray(`Enable with: rapidkit config ai enable
55
+ `)),process.exit(1));let o=Ye();o?await pt(o):(console.log(c$1.yellow(`
56
56
  \u26A0\uFE0F OpenAI API key not configured - using MOCK MODE for testing
57
- `)),console.log(s.gray("\u{1F4DD} Note: Mock embeddings provide approximate results for testing.")),console.log(s.gray(` For production, configure your OpenAI API key:
58
- `)),console.log(s.white(" 1. Get your key from: https://platform.openai.com/api-keys")),console.log(s.white(" 2. Configure it: rapidkit config set-api-key")),console.log(s.gray(` OR set: export OPENAI_API_KEY="sk-proj-..."
59
- `)),Bt());let i=o;i||(i=(await(await uo()).prompt([{type:"input",name:"query",message:"\u{1F916} What do you want to build?",validate:p=>p.length===0?"Please enter a description":p.length<3?"Please be more specific (at least 3 characters)":true}])).query),r.json||console.log(s.blue(`
57
+ `)),console.log(c$1.gray("\u{1F4DD} Note: Mock embeddings provide approximate results for testing.")),console.log(c$1.gray(` For production, configure your OpenAI API key:
58
+ `)),console.log(c$1.white(" 1. Get your key from: https://platform.openai.com/api-keys")),console.log(c$1.white(" 2. Configure it: rapidkit config set-api-key")),console.log(c$1.gray(` OR set: export OPENAI_API_KEY="sk-proj-..."
59
+ `)),lr());let i=t;i||(i=(await(await jr()).prompt([{type:"input",name:"query",message:"\u{1F916} What do you want to build?",validate:m=>m.length===0?"Please enter a description":m.length<3?"Please be more specific (at least 3 characters)":true}])).query),n.json||console.log(c$1.blue(`
60
60
  \u{1F916} Analyzing your request...
61
- `)),await lo(!r.json)||(console.log(s.yellow(`
61
+ `)),await xr(!n.json)||(console.log(c$1.yellow(`
62
62
  \u26A0\uFE0F Cannot proceed without embeddings
63
- `)),process.exit(1));let c=parseInt(r.number,10),m=await io(i,c);if(m.length===0||m[0].score<.3)if(console.log(s.yellow(`
63
+ `)),process.exit(1));let a=parseInt(n.number,10),d=await kr(i,a);if(d.length===0||d[0].score<.3)if(console.log(c$1.yellow(`
64
64
  \u26A0\uFE0F No matching modules found in RapidKit registry.
65
- `)),console.log(s.cyan(`\u{1F4A1} Options:
66
- `)),console.log(s.white("1. Create custom module:")),console.log(s.gray(" rapidkit modules scaffold <name> --category <category>")),console.log(s.gray(` Example: rapidkit modules scaffold blockchain-integration --category integrations
67
- `)),console.log(s.white("2. Search with different keywords")),console.log(s.gray(` Try more general terms (e.g., "storage" instead of "blockchain")
68
- `)),console.log(s.white("3. Request feature:")),console.log(s.gray(` https://github.com/getrapidkit/rapidkit/issues
69
- `)),m.length>0)console.log(s.yellow(`\u26A0\uFE0F Low confidence matches found:
70
- `));else return;if(r.json){console.log(JSON.stringify({query:i,recommendations:m},null,2));return}console.log(s.green.bold(`\u{1F4E6} Recommended Modules:
71
- `)),m.forEach((y,v)=>{let p=(y.score*100).toFixed(1),g=y.score>.8?" \u2B50":"";console.log(s.bold(`${v+1}. ${y.module.name}${g}`)),console.log(s.gray(` ${y.module.description}`)),console.log(s.cyan(` Match: ${p}%`)+s.gray(` - ${y.reason}`)),console.log(s.yellow(` Category: ${y.module.category}`)),y.module.dependencies.length>0&&console.log(s.magenta(` Requires: ${y.module.dependencies.join(", ")}`)),console.log();});let d=m.slice(0,3).map(y=>y.module.id);console.log(s.cyan("\u{1F4A1} Quick install (top 3):")),console.log(s.white(` rapidkit add module ${d.join(" ")}
72
- `));let l=await uo(),{shouldInstall:u}=await l.prompt([{type:"confirm",name:"shouldInstall",message:"Would you like to install these modules now?",default:false}]);if(u){let{selectedModules:y}=await l.prompt([{type:"checkbox",name:"selectedModules",message:"Select modules to install:",choices:m.map(v=>({name:`${v.module.name} - ${v.module.description}`,value:v.module.id,checked:v.score>.7}))}]);y.length>0?(console.log(s.blue(`
73
- \u{1F4E6} Installing ${y.length} modules...
74
- `)),console.log(s.gray(`Command: rapidkit add module ${y.join(" ")}`)),console.log(s.yellow(`
75
- \u26A0\uFE0F Note: Module installation not yet implemented`)),console.log(s.gray(`Coming soon in next version!
76
- `))):console.log(s.gray(`
65
+ `)),console.log(c$1.cyan(`\u{1F4A1} Options:
66
+ `)),console.log(c$1.white("1. Create custom module:")),console.log(c$1.gray(" rapidkit modules scaffold <name> --category <category>")),console.log(c$1.gray(` Example: rapidkit modules scaffold blockchain-integration --category integrations
67
+ `)),console.log(c$1.white("2. Search with different keywords")),console.log(c$1.gray(` Try more general terms (e.g., "storage" instead of "blockchain")
68
+ `)),console.log(c$1.white("3. Request feature:")),console.log(c$1.gray(` https://github.com/getrapidkit/rapidkit/issues
69
+ `)),d.length>0)console.log(c$1.yellow(`\u26A0\uFE0F Low confidence matches found:
70
+ `));else return;if(n.json){console.log(JSON.stringify({query:i,recommendations:d},null,2));return}console.log(c$1.green.bold(`\u{1F4E6} Recommended Modules:
71
+ `)),d.forEach((l,h)=>{let m=(l.score*100).toFixed(1),w=l.score>.8?" \u2B50":"";console.log(c$1.bold(`${h+1}. ${l.module.name}${w}`)),console.log(c$1.gray(` ${l.module.description}`)),console.log(c$1.cyan(` Match: ${m}%`)+c$1.gray(` - ${l.reason}`)),console.log(c$1.yellow(` Category: ${l.module.category}`)),l.module.dependencies.length>0&&console.log(c$1.magenta(` Requires: ${l.module.dependencies.join(", ")}`)),console.log();});let p=d.slice(0,3).map(l=>l.module.id);console.log(c$1.cyan("\u{1F4A1} Quick install (top 3):")),console.log(c$1.white(` rapidkit add module ${p.join(" ")}
72
+ `));let g=await jr(),{shouldInstall:u}=await g.prompt([{type:"confirm",name:"shouldInstall",message:"Would you like to install these modules now?",default:false}]);if(u){let{selectedModules:l}=await g.prompt([{type:"checkbox",name:"selectedModules",message:"Select modules to install:",choices:d.map(h=>({name:`${h.module.name} - ${h.module.description}`,value:h.module.id,checked:h.score>.7}))}]);l.length>0?(console.log(c$1.blue(`
73
+ \u{1F4E6} Installing ${l.length} modules...
74
+ `)),console.log(c$1.gray(`Command: rapidkit add module ${l.join(" ")}`)),console.log(c$1.yellow(`
75
+ \u26A0\uFE0F Note: Module installation not yet implemented`)),console.log(c$1.gray(`Coming soon in next version!
76
+ `))):console.log(c$1.gray(`
77
77
  No modules selected
78
- `));}}catch(n){a$1.error(`
79
- \u274C Error:`,n.message),n.code==="invalid_api_key"?(console.log(s.yellow(`
80
- \u{1F4A1} Your API key may be invalid or expired`)),console.log(s.cyan(` Update it: rapidkit config set-api-key
81
- `))):n.message.includes("embeddings file not found")&&(console.log(s.yellow(`
82
- \u{1F4A1} Module embeddings not generated yet`)),console.log(s.cyan(" Generate them (one-time):")),console.log(s.white(" cd rapidkit-npm")),console.log(s.white(' export OPENAI_API_KEY="sk-proj-..."')),console.log(s.white(` npx tsx src/ai/generate-embeddings.ts
83
- `))),process.exit(1);}}),e.command("info").description("Show AI features information").action(()=>{let o=Fe(),r=Pt();console.log(s.bold(`
78
+ `));}}catch(o){let i=Kt(o);a$1.error(`
79
+ \u274C Error:`,i.message),i.code==="invalid_api_key"?(console.log(c$1.yellow(`
80
+ \u{1F4A1} Your API key may be invalid or expired`)),console.log(c$1.cyan(` Update it: rapidkit config set-api-key
81
+ `))):i.message.includes("embeddings file not found")&&(console.log(c$1.yellow(`
82
+ \u{1F4A1} Module embeddings not generated yet`)),console.log(c$1.cyan(" Generate them (one-time):")),console.log(c$1.white(" cd rapidkit-npm")),console.log(c$1.white(' export OPENAI_API_KEY="sk-proj-..."')),console.log(c$1.white(` npx tsx src/ai/generate-embeddings.ts
83
+ `))),process.exit(1);}}),e.command("info").description("Show AI features information").action(()=>{let t=Ye(),n=It();console.log(c$1.bold(`
84
84
  \u{1F916} RapidKit AI Features
85
- `)),console.log(s.cyan("Status:"),r?s.green("Enabled"):s.red("Disabled")),console.log(s.cyan("API Key:"),o?s.green("Configured \u2713"):s.red("Not configured \u2717")),console.log(s.bold(`
85
+ `)),console.log(c$1.cyan("Status:"),n?c$1.green("Enabled"):c$1.red("Disabled")),console.log(c$1.cyan("API Key:"),t?c$1.green("Configured \u2713"):c$1.red("Not configured \u2717")),console.log(c$1.bold(`
86
86
  \u{1F4E6} Available Features:
87
- `)),console.log(s.white("\u2022 Module Recommender")+s.gray(" - AI-powered module suggestions")),console.log(s.gray(' Usage: rapidkit ai recommend "I need authentication"')),console.log(s.bold(`
87
+ `)),console.log(c$1.white("\u2022 Module Recommender")+c$1.gray(" - AI-powered module suggestions")),console.log(c$1.gray(' Usage: rapidkit ai recommend "I need authentication"')),console.log(c$1.bold(`
88
88
  \u{1F4B0} Pricing:
89
- `)),console.log(s.white("\u2022 Per query: ~$0.0002")+s.gray(" (practically free)")),console.log(s.white("\u2022 100 queries: ~$0.02")+s.gray(" (2 cents)")),console.log(s.white("\u2022 1000 queries: ~$0.20")+s.gray(" (20 cents)")),console.log(s.bold(`
89
+ `)),console.log(c$1.white("\u2022 Per query: ~$0.0002")+c$1.gray(" (practically free)")),console.log(c$1.white("\u2022 100 queries: ~$0.02")+c$1.gray(" (2 cents)")),console.log(c$1.white("\u2022 1000 queries: ~$0.20")+c$1.gray(" (20 cents)")),console.log(c$1.bold(`
90
90
  \u{1F680} Getting Started:
91
- `)),o?(console.log(s.green("\u2713 You're all set!")),console.log(s.white(' Try: rapidkit ai recommend "user authentication"'))):(console.log(s.white("1. Get OpenAI API key: https://platform.openai.com/api-keys")),console.log(s.white("2. Configure: rapidkit config set-api-key")),console.log(s.white('3. Try: rapidkit ai recommend "user authentication"'))),console.log();}),e.command("generate-embeddings").description("Generate AI embeddings for all modules (one-time setup)").option("--force","Force regeneration even if embeddings exist").action(async()=>{try{let o=Fe();o||(console.log(s.red(`
91
+ `)),t?(console.log(c$1.green("\u2713 You're all set!")),console.log(c$1.white(' Try: rapidkit ai recommend "user authentication"'))):(console.log(c$1.white("1. Get OpenAI API key: https://platform.openai.com/api-keys")),console.log(c$1.white("2. Configure: rapidkit config set-api-key")),console.log(c$1.white('3. Try: rapidkit ai recommend "user authentication"'))),console.log();}),e.command("generate-embeddings").description("Generate AI embeddings for all modules (one-time setup)").option("--force","Force regeneration even if embeddings exist").action(async()=>{try{let t=Ye();t||(console.log(c$1.red(`
92
92
  \u274C OpenAI API key not configured
93
- `)),console.log(s.cyan(`To generate embeddings, you need an OpenAI API key:
94
- `)),console.log(s.white("1. Get your key from: https://platform.openai.com/api-keys")),console.log(s.white("2. Configure it: rapidkit config set-api-key")),console.log(s.gray(`
95
- OR set environment variable:`)),console.log(s.white(` export OPENAI_API_KEY="sk-proj-..."
96
- `)),process.exit(1)),nt(o);let r=await at(true);r&&(console.log(s.green("\u2705 Ready to use AI recommendations!")),console.log(s.cyan(`Try: rapidkit ai recommend "authentication"
97
- `))),process.exit(r?0:1);}catch(o){a$1.error("Failed to generate embeddings:",o.message),process.exit(1);}}),e.command("update-embeddings").description("Update existing embeddings with latest modules").action(async()=>{try{let o=Fe();o||(console.log(s.red(`
93
+ `)),console.log(c$1.cyan(`To generate embeddings, you need an OpenAI API key:
94
+ `)),console.log(c$1.white("1. Get your key from: https://platform.openai.com/api-keys")),console.log(c$1.white("2. Configure it: rapidkit config set-api-key")),console.log(c$1.gray(`
95
+ OR set environment variable:`)),console.log(c$1.white(` export OPENAI_API_KEY="sk-proj-..."
96
+ `)),process.exit(1)),pt(t);let n=await ft(true);n&&(console.log(c$1.green("\u2705 Ready to use AI recommendations!")),console.log(c$1.cyan(`Try: rapidkit ai recommend "authentication"
97
+ `))),process.exit(n?0:1);}catch(t){let n=Kt(t);a$1.error("Failed to generate embeddings:",n.message),process.exit(1);}}),e.command("update-embeddings").description("Update existing embeddings with latest modules").action(async()=>{try{let t=Ye();t||(console.log(c$1.red(`
98
98
  \u274C OpenAI API key not configured
99
- `)),console.log(s.white(`Set your API key: rapidkit config set-api-key
100
- `)),process.exit(1)),nt(o);let r=await po();process.exit(r?0:1);}catch(o){a$1.error("Failed to update embeddings:",o.message),process.exit(1);}});}var ct=class{constructor(e){this.runCommand=e;}runtime="go";async run(e,o,r){return {exitCode:await this.runCommand(e,o,r)}}async ensureGoInstalled(e){return (await this.run("go",["version"],e)).exitCode===0?null:{exitCode:1,message:"Go toolchain is not installed or not available on PATH. Install Go from https://go.dev/dl/ and retry."}}findWorkspaceRoot(e){let o=e;for(;;){if(w.existsSync(f.join(o,".rapidkit-workspace")))return o;let r=f.dirname(o);if(r===o)break;o=r;}return null}resolveDependencyMode(e){let o=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(o==="shared-runtime-caches"||o==="shared-node-deps"||o==="isolated")return o;let r=this.findWorkspaceRoot(e);if(!r)return "isolated";let n=f.join(r,".rapidkit","policies.yml");if(!w.existsSync(n))return "isolated";try{let c=w.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(c==="shared-runtime-caches"||c==="shared-node-deps"||c==="isolated")return c}catch{}return "isolated"}withGoCacheEnv(e,o){let r=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=r==="shared-runtime-caches"?f.join(n||e,".rapidkit","cache","go"):f.join(e,".rapidkit","cache","go"),a=process.env.GOMODCACHE,c=process.env.GOCACHE;return process.env.GOMODCACHE=f.join(i,"mod"),process.env.GOCACHE=f.join(i,"build"),o().finally(()=>{typeof a>"u"?delete process.env.GOMODCACHE:process.env.GOMODCACHE=a,typeof c>"u"?delete process.env.GOCACHE:process.env.GOCACHE=c;})}async checkPrereqs(){return this.run("go",["version"],process.cwd())}async warmSetupCache(e){return this.withGoCacheEnv(e,async()=>{try{return process.env.GOMODCACHE&&w.mkdirSync(process.env.GOMODCACHE,{recursive:true}),process.env.GOCACHE&&w.mkdirSync(process.env.GOCACHE,{recursive:true}),{exitCode:0}}catch{return {exitCode:1,message:"Failed to prepare Go cache directories"}}})}async initProject(e){return this.withGoCacheEnv(e,async()=>{let o=await this.ensureGoInstalled(e);return o||this.run("go",["mod","tidy"],e)})}async runDev(e){return this.withGoCacheEnv(e,()=>(async()=>{let o=await this.ensureGoInstalled(e);if(o)return o;let r=f.join(e,"Makefile");return w.existsSync(r)?this.run("make",["run"],e):this.run("go",["run","./main.go"],e)})())}async runTest(e){return this.withGoCacheEnv(e,async()=>{let o=await this.ensureGoInstalled(e);return o||this.run("go",["test","./..."],e)})}async runBuild(e){return this.withGoCacheEnv(e,async()=>{let o=await this.ensureGoInstalled(e);return o||this.run("go",["build","./..."],e)})}async runStart(e){return this.withGoCacheEnv(e,async()=>{let r=(a()?[f.join(e,"server.exe"),f.join(e,"server")]:[f.join(e,"server")]).find(i=>w.existsSync(i));if(r)return this.run(r,[],e);let n=await this.ensureGoInstalled(e);return n||this.run("go",["run","./main.go"],e)})}async doctorHints(e){return ["Install Go from https://go.dev/dl/ if missing.","Run go mod tidy when dependencies are out of sync.","Use make run for hot-reload if Makefile exists."]}};var lt=class{constructor(e){this.runCommand=e;}runtime="node";async run(e,o,r){return {exitCode:await this.runCommand(e,o,r)}}findWorkspaceRoot(e){let o=e;for(;;){if(w.existsSync(f.join(o,".rapidkit-workspace")))return o;let r=f.dirname(o);if(r===o)break;o=r;}return null}resolveDependencyMode(e){let o=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(o==="shared-runtime-caches"||o==="shared-node-deps"||o==="isolated")return o;let r=this.findWorkspaceRoot(e);if(!r)return "isolated";let n=f.join(r,".rapidkit","policies.yml");if(!w.existsSync(n))return "isolated";try{let c=w.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(c==="shared-runtime-caches"||c==="shared-node-deps"||c==="isolated")return c}catch{}return "isolated"}withDependencyEnv(e,o,r){let n=this.resolveDependencyMode(e),i=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),a=n==="isolated"?f.join(e,".rapidkit","cache","node"):f.join(i||e,".rapidkit","cache","node"),c=process.env.npm_config_cache,m=process.env.npm_config_store_dir;return o==="pnpm"?(process.env.npm_config_store_dir=f.join(a,"pnpm-store"),process.env.npm_config_cache=f.join(a,"pnpm-cache")):o==="yarn"?process.env.npm_config_cache=f.join(a,"yarn-cache"):process.env.npm_config_cache=f.join(a,"npm-cache"),r().finally(()=>{typeof c>"u"?delete process.env.npm_config_cache:process.env.npm_config_cache=c,typeof m>"u"?delete process.env.npm_config_store_dir:process.env.npm_config_store_dir=m;})}detectPackageManager(e){return w.existsSync(f.join(e,"pnpm-lock.yaml"))?"pnpm":w.existsSync(f.join(e,"yarn.lock"))?"yarn":"npm"}scriptArgs(e,o){return e==="npm"?["run",o]:["run",o]}async checkPrereqs(){return this.run("node",["--version"],process.cwd())}async warmSetupCache(e){let o=this.detectPackageManager(e);return this.withDependencyEnv(e,o,async()=>{try{return process.env.npm_config_cache&&w.mkdirSync(process.env.npm_config_cache,{recursive:true}),o==="pnpm"&&process.env.npm_config_store_dir&&w.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 o=this.detectPackageManager(e),r=this.resolveDependencyMode(e),n=r==="shared-runtime-caches"||r==="shared-node-deps"?["install","--prefer-offline"]:["install"];return this.withDependencyEnv(e,o,()=>this.run(o,n,e))}async runDev(e){let o=this.detectPackageManager(e);return this.withDependencyEnv(e,o,()=>this.run(o,this.scriptArgs(o,"dev"),e))}async runTest(e){let o=this.detectPackageManager(e);return this.withDependencyEnv(e,o,()=>this.run(o,this.scriptArgs(o,"test"),e))}async runBuild(e){let o=this.detectPackageManager(e);return this.withDependencyEnv(e,o,()=>this.run(o,this.scriptArgs(o,"build"),e))}async runStart(e){let o=this.detectPackageManager(e);return this.withDependencyEnv(e,o,()=>this.run(o,this.scriptArgs(o,"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 dt=class{constructor(e){this.runCore=e;}runtime="python";async run(e,o){return {exitCode:await this.withPythonCacheEnv(o,()=>this.runCore(e,o))}}findWorkspaceRoot(e){let o=e;for(;;){if(w.existsSync(f.join(o,".rapidkit-workspace")))return o;let r=f.dirname(o);if(r===o)break;o=r;}return null}resolveDependencyMode(e){let o=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(o==="shared-runtime-caches"||o==="shared-node-deps"||o==="isolated")return o;let r=this.findWorkspaceRoot(e);if(!r)return "isolated";let n=f.join(r,".rapidkit","policies.yml");if(!w.existsSync(n))return "isolated";try{let c=w.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(c==="shared-runtime-caches"||c==="shared-node-deps"||c==="isolated")return c}catch{}return "isolated"}withPythonCacheEnv(e,o){let r=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=r==="shared-runtime-caches"?f.join(n||e,".rapidkit","cache","python"):f.join(e,".rapidkit","cache","python"),a=process.env.PIP_CACHE_DIR,c=process.env.POETRY_CACHE_DIR;return process.env.PIP_CACHE_DIR=f.join(i,"pip"),process.env.POETRY_CACHE_DIR=f.join(i,"poetry"),o().finally(()=>{typeof a>"u"?delete process.env.PIP_CACHE_DIR:process.env.PIP_CACHE_DIR=a,typeof c>"u"?delete process.env.POETRY_CACHE_DIR:process.env.POETRY_CACHE_DIR=c;})}async checkPrereqs(){let e=process.cwd(),o=await this.run(["doctor","check"],e);return o.exitCode===0?o: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 Pr(){let t={...process.env},e=t.PATH||"";if(e){let o=e.split(f.delimiter).filter(r=>!r.replace(/\\/g,"/").includes("/.pyenv/shims")).join(f.delimiter);t.PATH=o;}return t.PYENV_VERSION="system",t.POETRY_PYTHON=t.POETRY_PYTHON||c$2(),typeof t.RAPIDKIT_SKIP_LOCK_SYNC>"u"&&(t.RAPIDKIT_SKIP_LOCK_SYNC="1"),t}function Se(t,e){return t==="go"?new ct((o,r,n)=>e.runCommandInCwd(o,r,n)):t==="node"?new lt((o,r,n)=>e.runCommandInCwd(o,r,n)):new dt((o,r)=>e.runCoreRapidkit(o,{cwd:r,env:Pr()}))}var go=f.join(rr.homedir(),".rapidkit","cache"),yo=1440*60*1e3;function Rt(){let t=process.env.RAPIDKIT_CACHE_DIR?.trim();if(t)return t;let e=process.env.VITEST_WORKER_ID?.trim();return e?f.join(go,`vitest-${e}`):go}var ut=class t{static instance;memoryCache=new Map;constructor(){}static getInstance(){return t.instance||(t.instance=new t),t.instance}getCacheKey(e){return createHash("md5").update(e).digest("hex")}getCachePath(e){return f.join(Rt(),`${this.getCacheKey(e)}.json`)}async get(e,o="1.0"){let r=this.memoryCache.get(e);if(r&&r.version===o&&Date.now()-r.timestamp<yo)return a$1.debug(`Cache hit (memory): ${e}`),r.data;try{let n=this.getCachePath(e),i=await promises.readFile(n,"utf-8"),a=JSON.parse(i);if(a.version===o&&Date.now()-a.timestamp<yo)return a$1.debug(`Cache hit (disk): ${e}`),this.memoryCache.set(e,a),a.data;await promises.unlink(n).catch(()=>{});}catch{a$1.debug(`Cache miss: ${e}`);}return null}async set(e,o,r="1.0"){let n={data:o,timestamp:Date.now(),version:r};this.memoryCache.set(e,n);try{await promises.mkdir(Rt(),{recursive:true});let i=this.getCachePath(e);await promises.writeFile(i,JSON.stringify(n),"utf-8"),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 o=this.getCachePath(e);await promises.unlink(o),a$1.debug(`Cache invalidated: ${e}`);}catch{}}async clear(){this.memoryCache.clear();try{let e=Rt(),o=await promises.readdir(e);await Promise.all(o.map(r=>promises.unlink(f.join(e,r)))),a$1.debug("Cache cleared");}catch{}}};function ye(t){let e=t;for(;;){let o=f.join(e,".rapidkit","project.json");if(w.existsSync(o))try{return JSON.parse(w.readFileSync(o,"utf8"))}catch{return null}let r=f.dirname(e);if(r===e)break;e=r;}return null}function ne(t,e){let o=t?.runtime?.toLowerCase(),r=t?.kit_name?.toLowerCase(),n=w.existsSync(f.join(e,"go.mod"));return o==="go"||(r?.startsWith("gofiber")??false)||(r?.startsWith("gogin")??false)||n}function ie(t,e){let o=t?.runtime?.toLowerCase(),r=t?.kit_name?.toLowerCase(),n=w.existsSync(f.join(e,"package.json"));return o==="node"||o==="typescript"||(r?.startsWith("nestjs")??false)||n}function se(t,e){let o=t?.runtime?.toLowerCase(),r=t?.kit_name?.toLowerCase(),n=w.existsSync(f.join(e,"pyproject.toml")),i=w.existsSync(f.join(e,"requirements.txt"))||w.existsSync(f.join(e,"requirements.in"));return o==="python"||(r?.startsWith("fastapi")??false)||n||i}async function Er(t){let e=await promises.readFile(t);return createHash("sha256").update(e).digest("hex")}async function ho(t,e){await x.outputFile(t,`${JSON.stringify(e,null,2)}
101
- `,"utf-8");}function me(t,e){return f.isAbsolute(e)?e:f.join(t,e)}function Ar(t,e){if(t.target)return t.target;if(t.source)return f.basename(t.source);if(t.url)try{let o=new URL(t.url).pathname,r=f.basename(o);if(r&&r!=="/")return r}catch{}return `${e}.artifact`}async function Ir(t){let e=f.join(t,".rapidkit","trusted-sources.lock"),o=new Set(["localhost","127.0.0.1"]);if(!await x.pathExists(e))return o;try{let n=(await promises.readFile(e,"utf-8")).split(/\r?\n/).map(i=>i.trim()).filter(i=>i.length>0&&!i.startsWith("#"));for(let i of n)o.add(i.toLowerCase());}catch{}return o}async function jr(t,e,o){await x.ensureDir(f.dirname(e)),await new Promise((r,n)=>{let a=(t.startsWith("https://")?Po:bo).get(t,c=>{if(!c.statusCode||c.statusCode<200||c.statusCode>=300){n(new Error(`HTTP ${c.statusCode||"unknown"}`)),c.resume();return}let m=createWriteStream(e);c.pipe(m),m.on("finish",()=>{m.close(),r();}),m.on("error",d=>{n(d);});});a.setTimeout(o,()=>{a.destroy(new Error(`Request timeout after ${o}ms`));}),a.on("error",c=>{n(c);});});}async function $r(t,e,o,r,n){let i=new URL(t),a=JSON.stringify(e),c=i.protocol==="https:"?Po:bo;await new Promise((m,d)=>{let l=c.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(a),...r?{Authorization:`Bearer ${r}`}:{},...n||{}}},u=>{if(!u.statusCode||u.statusCode<200||u.statusCode>=300){d(new Error(`HTTP ${u.statusCode||"unknown"}`)),u.resume();return}u.resume(),m();});l.setTimeout(o,()=>{l.destroy(new Error(`Request timeout after ${o}ms`));}),l.on("error",u=>{d(u);}),l.write(a),l.end();});}function wo(t){return new Promise(e=>setTimeout(e,t))}async function Tr(t,e,o,r){let n=me(t,e||".rapidkit/reports/evidence-export-dead-letter.ndjson");return await x.ensureDir(f.dirname(n)),await promises.appendFile(n,`${JSON.stringify({timestamp:new Date().toISOString(),reason:r,payload:o})}
102
- `,"utf-8"),n}function Or(t,e){if(!e?.enabled)return {headers:{}};let o=process.env[e.hmacKeyEnv];if(!o)return {headers:{},error:`Evidence signing key env is missing: ${e.hmacKeyEnv}`};let r=(e.algorithm||"sha256").toLowerCase(),n=e.headerName||"x-rapidkit-evidence-signature",i=createHmac(r,o).update(JSON.stringify(t)).digest("hex");return {headers:{[n]:i,"x-rapidkit-evidence-signature-alg":r}}}async function Mr(t,e,o){let r=(o.algorithm||"sha256").toLowerCase(),n=me(t,o.publicKeyPath);if(!await x.pathExists(n))return {verified:false,algorithm:r,publicKeyPath:n,publicKeyFingerprint:"",signature:o.signature,message:`Public key not found: ${n}`};try{let i=await promises.readFile(n,"utf-8"),a=await promises.readFile(e),c=createVerify(r);c.update(a),c.end();let m=Buffer.from(o.signature,"base64"),d=c.verify(i,m),l=createHash("sha256").update(i).digest("hex");return {verified:d,algorithm:r,publicKeyPath:n,publicKeyFingerprint:l,signature:o.signature,message:d?"Attestation verified.":"Attestation signature verification failed."}}catch(i){return {verified:false,algorithm:r,publicKeyPath:n,publicKeyFingerprint:"",signature:o.signature,message:`Attestation verification error: ${i.message}`}}}async function Dr(t,e,o,r){let n=process.env.RAPIDKIT_SIGSTORE_MOCK;if(n==="success")return {verified:true,tlogVerified:r.requireTransparencyLog,message:"Sigstore verification passed (mock).",identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:o.bundlePath||null,certificatePath:o.certificatePath||null,signaturePath:o.signaturePath||null};if(n==="fail")return {verified:false,tlogVerified:false,message:"Sigstore verification failed (mock).",identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:o.bundlePath||null,certificatePath:o.certificatePath||null,signaturePath:o.signaturePath||null};let i=o.signaturePath?me(t,o.signaturePath):null;if(!i||!await x.pathExists(i))return {verified:false,tlogVerified:false,message:"Sigstore signaturePath is missing or not found.",identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:o.bundlePath||null,certificatePath:o.certificatePath||null,signaturePath:i};let a=["verify-blob",e,"--signature",i],c=o.certificatePath?me(t,o.certificatePath):null;c&&a.push("--certificate",c);let m=o.bundlePath?me(t,o.bundlePath):null;m&&a.push("--bundle",m);let d=o.keyPath?me(t,o.keyPath):null;d&&a.push("--key",d),o.identity&&a.push("--certificate-identity",o.identity),o.issuer&&a.push("--certificate-oidc-issuer",o.issuer),o.rekorUrl&&a.push("--rekor-url",o.rekorUrl),r.requireTransparencyLog||a.push("--insecure-ignore-tlog");try{let l=await execa("cosign",a,{reject:false});return l.exitCode===0?{verified:true,tlogVerified:r.requireTransparencyLog,message:"Sigstore verification passed.",identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:m,certificatePath:c,signaturePath:i}:{verified:false,tlogVerified:false,message:`Sigstore verification failed: ${l.stderr||l.stdout||"unknown error"}`,identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:m,certificatePath:c,signaturePath:i}}catch(l){return {verified:false,tlogVerified:false,message:`Sigstore verification error: ${l.message}`,identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:m,certificatePath:c,signaturePath:i}}}async function Nr(t,e){let o=e.algorithm||"sha256",r=me(t,e.policyPath),n=me(t,e.signaturePath),i=me(t,e.publicKeyPath);if(!await x.pathExists(r))return {verified:false,message:`Governance policy bundle not found: ${r}`,policies:null};if(!await x.pathExists(n))return {verified:false,message:`Governance policy signature not found: ${n}`,policies:null};if(!await x.pathExists(i))return {verified:false,message:`Governance policy public key not found: ${i}`,policies:null};try{let a=await promises.readFile(r,"utf-8"),c=(await promises.readFile(n,"utf-8")).trim(),m=await promises.readFile(i,"utf-8"),d=createVerify(o);return d.update(a),d.end(),d.verify(m,Buffer.from(c,"base64"))?{verified:true,message:"Governance policy bundle verified.",policies:JSON.parse(a).policies||{}}:{verified:false,message:"Governance policy bundle signature verification failed.",policies:null}}catch(a){return {verified:false,message:`Governance policy bundle verification error: ${a.message}`,policies:null}}}async function St(t,e){let o=[],r={syncedArtifacts:0,verifiedArtifacts:0,rotatedFiles:0,lockWritten:false,governanceBundleVerified:false,transparencyEvidenceWritten:false,transparencyEvidenceRecords:0,evidenceExported:false,evidenceExportTarget:null},n=f.join(t,".rapidkit"),i=f.join(n,"mirror-config.json"),a=f.join(n,"mirror.lock"),c=f.join(n,"mirror","artifacts"),m=f.join(n,"reports"),d=await Ir(t);if(!await x.pathExists(i))return o.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: .rapidkit/mirror-config.json not found."}),{checks:o,details:r};let l={};try{l=JSON.parse(await promises.readFile(i,"utf-8"));}catch{return o.push({id:"mirror.lifecycle.config",status:"failed",message:"Mirror lifecycle failed: invalid JSON in mirror-config.json."}),{checks:o,details:r}}if(!(e.forceRun===true||e.ciMode||e.offlineMode||l.mode==="offline-only"))return o.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: not in ci/offline mode."}),{checks:o,details:r};await x.ensureDir(c);let y=Math.max(0,l.prefetch?.retries??2),v=Math.max(0,l.prefetch?.backoffMs??250),p=Math.max(1e3,l.prefetch?.timeoutMs??15e3),g=l.security?.requireAttestation===true,A=l.security?.requireSigstore===true,P=l.security?.requireTransparencyLog===true,S=l.security?.requireSignedGovernance===true,b=l.security?.evidenceExport,_=(process.env.RAPIDKIT_ENV||l.security?.governance?.environment||"dev").toLowerCase(),M=l.security?.governance?.policies||{};if(l.security?.governanceBundle){let U=await Nr(t,l.security.governanceBundle);if(o.push({id:"governance.bundle.verify",status:U.verified?"passed":"failed",message:U.message}),U.verified&&U.policies)M=U.policies,r.governanceBundleVerified=true;else if(S)return {checks:o,details:r}}let T=M[_],I=P||T?.requireTransparencyLog===true,fe=[],Ne=Array.isArray(l.artifacts)?l.artifacts:[],le=[];for(let U=0;U<Ne.length;U+=1){let D=Ne[U],k=D.id||`artifact-${U+1}`,Q=D.source?me(t,D.source):null,Z=Ar(D,k),K=f.join(c,Z),B=false,ee={sourceType:"path",source:Q||D.url||"unknown",host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true};if(Q&&await x.pathExists(Q))await x.ensureDir(f.dirname(K)),await x.copyFile(Q,K),r.syncedArtifacts+=1,B=true,ee={sourceType:"path",source:Q,host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true},o.push({id:`mirror.sync.${k}`,status:"passed",message:`Mirrored artifact ${k} from source path.`});else if(D.url){let H="";try{H=new URL(D.url).hostname.toLowerCase();}catch{o.push({id:`mirror.prefetch.${k}`,status:"failed",message:`Invalid URL for ${k}: ${D.url}`});continue}if(!(process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||d.has(H))){o.push({id:`mirror.prefetch.trust.${k}`,status:"failed",message:`Untrusted mirror host for ${k}: ${H}. Add host to .rapidkit/trusted-sources.lock or set RAPIDKIT_TRUSTED_SOURCES=1.`});continue}if(e.offlineMode&&(await x.pathExists(K)?(B=true,ee={sourceType:"url",source:D.url,host:H,fetchedAt:new Date().toISOString(),attempts:0,trusted:true},o.push({id:`mirror.prefetch.${k}`,status:"passed",message:`Offline mode reused existing mirrored artifact ${k}.`})):o.push({id:`mirror.prefetch.${k}`,status:"failed",message:`Offline mode cannot prefetch remote artifact ${k} without an existing mirrored copy.`}),!B))continue;if(!B){let z=null,ve=0;for(let ke=1;ke<=y+1;ke+=1){ve=ke;try{await jr(D.url,K,p),r.syncedArtifacts+=1,B=true,ee={sourceType:"url",source:D.url,host:H,fetchedAt:new Date().toISOString(),attempts:ve,trusted:true},o.push({id:`mirror.prefetch.${k}`,status:"passed",message:ve>1?`Prefetched artifact ${k} from ${H} after ${ve} attempts.`:`Prefetched artifact ${k} from ${H}.`});break}catch(Ve){if(z=Ve,ke<=y){await wo(v*ke);continue}}}if(!B){o.push({id:`mirror.prefetch.${k}`,status:"failed",message:`Failed to prefetch ${k} after ${y+1} attempt(s): ${z?.message||"unknown error"}`});continue}}if(!B){o.push({id:`mirror.prefetch.${k}`,status:"failed",message:`Failed to prefetch ${k}.`});continue}}if(!B){D.required||e.offlineMode?o.push({id:`mirror.sync.${k}`,status:"failed",message:`Mirror source missing for ${k}${Q?`: ${Q}`:""}`}):o.push({id:`mirror.sync.${k}`,status:"skipped",message:`Mirror source not found for optional artifact ${k}.`});continue}let C=await Er(K);if(D.sha256&&D.sha256.toLowerCase()!==C.toLowerCase()){o.push({id:`mirror.verify.${k}`,status:"failed",message:`Checksum mismatch for ${k}.`});continue}r.verifiedArtifacts+=1,o.push({id:`mirror.verify.${k}`,status:"passed",message:`Checksum verified for ${k}.`});let R=D.attestation?await Mr(t,K,D.attestation):null;if(D.attestation){if(o.push({id:`mirror.attest.${k}`,status:R?.verified?"passed":"failed",message:R?.message||"Attestation verification failed."}),!R?.verified)continue}else if(g){o.push({id:`mirror.attest.${k}`,status:"failed",message:`Attestation is required but missing for ${k}.`});continue}else o.push({id:`mirror.attest.${k}`,status:"skipped",message:`No attestation provided for ${k}.`});let O=D.attestation?.sigstore,j=O?await Dr(t,K,O,{requireTransparencyLog:I}):null;if(O){if(o.push({id:`mirror.sigstore.${k}`,status:j?.verified?"passed":"failed",message:j?.message||"Sigstore verification failed."}),fe.push({artifactId:k,verified:!!j?.verified,tlogVerified:!!j?.tlogVerified,identity:j?.identity||null,issuer:j?.issuer||null,rekorUrl:j?.rekorUrl||null,timestamp:new Date().toISOString(),environment:_}),!j?.verified)continue}else if(A){o.push({id:`mirror.sigstore.${k}`,status:"failed",message:`Sigstore attestation is required but missing for ${k}.`});continue}else o.push({id:`mirror.sigstore.${k}`,status:"skipped",message:`No Sigstore attestation provided for ${k}.`});if(O&&j?.verified&&T){let H=T.allowedIdentities||[];if(H.length>0){let z=!!j.identity&&H.includes(j.identity);if(o.push({id:`mirror.sigstore.policy.identity.${k}`,status:z?"passed":"failed",message:z?`Sigstore identity policy passed for ${k} in ${_}.`:`Sigstore identity policy failed for ${k} in ${_}.`}),!z)continue}let de=T.allowedIssuers||[];if(de.length>0){let z=!!j.issuer&&de.includes(j.issuer);if(o.push({id:`mirror.sigstore.policy.issuer.${k}`,status:z?"passed":"failed",message:z?`Sigstore issuer policy passed for ${k} in ${_}.`:`Sigstore issuer policy failed for ${k} in ${_}.`}),!z)continue}let we=T.allowedRekorUrls||[];if(we.length>0){let z=!!j.rekorUrl&&we.includes(j.rekorUrl);if(o.push({id:`mirror.sigstore.policy.rekor.${k}`,status:z?"passed":"failed",message:z?`Sigstore Rekor policy passed for ${k} in ${_}.`:`Sigstore Rekor policy failed for ${k} in ${_}.`}),!z)continue}}else T&&o.push({id:`mirror.sigstore.policy.${k}`,status:"skipped",message:`Sigstore governance policy configured for ${_} but no verified Sigstore attestation for ${k}.`});let Y=await promises.stat(K);le.push({id:k,path:f.relative(t,K),sha256:C,size:Y.size,provenance:ee,attestation:{detached:{provided:!!D.attestation,verified:R?.verified||false,algorithm:R?.algorithm||null,publicKeyPath:R?.publicKeyPath||null,publicKeyFingerprint:R?.publicKeyFingerprint||null,signature:R?.signature||null,verifiedAt:R?.verified?new Date().toISOString():null},sigstore:{provided:!!O,verified:j?.verified||false,tlogVerified:j?.tlogVerified||false,identity:j?.identity||null,issuer:j?.issuer||null,rekorUrl:j?.rekorUrl||null,bundlePath:j?.bundlePath||null,certificatePath:j?.certificatePath||null,signaturePath:j?.signaturePath||null,verifiedAt:j?.verified?new Date().toISOString():null}}});}let ae=l.retention?.keepLast;if(typeof ae=="number"&&ae>0){let D=(await promises.readdir(c,{withFileTypes:true})).filter(k=>k.isFile()).map(k=>f.join(c,k.name));if(D.length>ae){let k=await Promise.all(D.map(async Z=>({filePath:Z,stat:await promises.stat(Z)})));k.sort((Z,K)=>K.stat.mtimeMs-Z.stat.mtimeMs);let Q=k.slice(ae);for(let Z of Q)await promises.unlink(Z.filePath),r.rotatedFiles+=1;}}o.push({id:"mirror.rotate",status:"passed",message:r.rotatedFiles>0?`Mirror retention rotation removed ${r.rotatedFiles} file(s).`:"Mirror retention rotation completed with no removals."});let je={schemaVersion:"1.0",generatedAt:new Date().toISOString(),mode:l.mode||null,environment:_,artifacts:le};if(await promises.writeFile(a,`${JSON.stringify(je,null,2)}
103
- `,"utf-8"),r.lockWritten=true,o.push({id:"mirror.lock.write",status:"passed",message:`Mirror lock updated at ${f.relative(t,a)}.`}),r.transparencyEvidenceRecords=fe.length,fe.length>0){let U={schemaVersion:"1.0",generatedAt:new Date().toISOString(),environment:_,records:fe},D=new Date().toISOString().replace(/[:.]/g,"-"),k=f.join(m,`transparency-evidence-${D}.json`),Q=f.join(m,"transparency-evidence.latest.json");if(await x.ensureDir(m),await ho(k,U),await ho(Q,U),r.transparencyEvidenceWritten=true,o.push({id:"sigstore.evidence.write",status:"passed",message:`Transparency evidence written to ${f.relative(t,Q)}.`}),b?.enabled){let Z=Math.max(1e3,b.timeoutMs??1e4);if(b.target==="file")if(!b.filePath)o.push({id:"sigstore.evidence.export.file",status:"failed",message:"Evidence export target=file requires security.evidenceExport.filePath."});else try{let K=me(t,b.filePath);await x.ensureDir(f.dirname(K)),await promises.appendFile(K,`${JSON.stringify(U)}
104
- `,"utf-8"),r.evidenceExported=true,r.evidenceExportTarget=K,o.push({id:"sigstore.evidence.export.file",status:"passed",message:`Transparency evidence exported to file sink ${K}.`});}catch(K){o.push({id:"sigstore.evidence.export.file",status:"failed",message:`Evidence file export failed: ${K.message}`});}else if(b.target==="http")if(!b.endpoint)o.push({id:"sigstore.evidence.export.http",status:"failed",message:"Evidence export target=http requires security.evidenceExport.endpoint."});else {let K=Math.max(0,b.retries??0),B=Math.max(0,b.backoffMs??500),ee=Or(U,b.signing);ee.error&&o.push({id:"sigstore.evidence.export.http",status:"failed",message:ee.error});try{let C=b.authTokenEnv?process.env[b.authTokenEnv]:void 0,R=false,O=null;for(let j=1;j<=K+1;j+=1)try{if(ee.error)throw new Error(ee.error);await $r(b.endpoint,U,Z,C,ee.headers),r.evidenceExported=true,r.evidenceExportTarget=b.endpoint,o.push({id:"sigstore.evidence.export.http",status:"passed",message:j>1?`Transparency evidence exported to HTTP endpoint ${b.endpoint} after ${j} attempts.`:`Transparency evidence exported to HTTP endpoint ${b.endpoint}.`}),R=true;break}catch(Y){O=Y,j<=K&&await wo(B*j);}if(!R)throw O||new Error("unknown evidence export error")}catch(C){let R=`Evidence HTTP export failed: ${C.message}`;o.push({id:"sigstore.evidence.export.http",status:"failed",message:R});try{let O=await Tr(t,b.deadLetterPath,U,R);o.push({id:"sigstore.evidence.export.deadletter",status:"passed",message:`Evidence export failure persisted to dead-letter sink ${O}.`});}catch(O){o.push({id:"sigstore.evidence.export.deadletter",status:"failed",message:`Evidence dead-letter write failed: ${O.message}`});}}}if(b.failOnError&&o.some(B=>B.status==="failed"&&(B.id==="sigstore.evidence.export.file"||B.id==="sigstore.evidence.export.http")))return {checks:o,details:r}}else o.push({id:"sigstore.evidence.export",status:"skipped",message:"Central evidence export not configured (security.evidenceExport.enabled=false)."});}else o.push({id:"sigstore.evidence.write",status:"skipped",message:"No Sigstore records available for transparency evidence output."}),o.push({id:"sigstore.evidence.export",status:"skipped",message:"Central evidence export skipped because no transparency evidence records exist."});return {checks:o,details:r}}function Et(t){if(!t||typeof t!="object")return null;let e=t.code;return e==="PYTHON_NOT_FOUND"||e==="BRIDGE_VENV_BOOTSTRAP_FAILED"?e:null}function Lr(t){let e=t.trim().toLowerCase();return e?e.startsWith("fastapi")?"fastapi":e.startsWith("nestjs")?"nestjs":null:null}function ht(t){let e=t.trim().toLowerCase();return e.startsWith("gofiber")||e==="go"||e==="go.standard"||e==="fiber"}function Ue(t){let e=t.trim().toLowerCase();return e.startsWith("gogin")||e==="gin"}function Je(t,e){let o=t.indexOf(e);if(o>=0&&o+1<t.length)return t[o+1];let r=t.find(n=>n.startsWith(`${e}=`));if(r)return r.slice(e.length+1)}function Ot(){return d$1()}function _o(){let t={...process.env},e=t.PATH||"";return e&&(t.PATH=e.split(f.delimiter).filter(o=>!o.replace(/\\/g,"/").includes("/.pyenv/shims")).join(f.delimiter)),t.PYENV_VERSION="system",t.POETRY_PYTHON||(t.POETRY_PYTHON=c$2()),t.RAPIDKIT_SKIP_LOCK_SYNC||(t.RAPIDKIT_SKIP_LOCK_SYNC="1"),t.POETRY_KEYRING_ENABLED||(t.POETRY_KEYRING_ENABLED="false"),t.PYTHON_KEYRING_BACKEND||(t.PYTHON_KEYRING_BACKEND="keyring.backends.null.Keyring"),t.POETRY_NO_INTERACTION||(t.POETRY_NO_INTERACTION="1"),t}function Fr(t){return f$1(f.join(t,".venv"))}async function Do(t,e){return await F(t,["--version"],e)===0}async function At(t){let e=f.join(t,"go.mod");if(await x__default.pathExists(e))return "go";let o=f.join(t,"package.json");if(await x__default.pathExists(o))return "node";let r=f.join(t,"pyproject.toml"),n=f.join(t,"requirements.txt"),i=f.join(t,"poetry.lock");return await x__default.pathExists(r)||await x__default.pathExists(n)||await x__default.pathExists(i)?"python":null}async function Wr(t){for(let e of Ot())if(await F(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function No(t){for(let e of Ot())if(await F(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function Gr(t){let e=f$1(f.join(t,".venv"));if(!await x__default.pathExists(e)){let i=await No(t);if(i!==0)return i}if(!await Do("poetry",t))return 0;let r=await F("poetry",["config","virtualenvs.in-project","true","--local"],t);if(r!==0)return r;let n=await F("poetry",["env","use",e],t);return n!==0?n:0}async function qr(t){let e=f$1(f.join(t,".venv"));if(!await x__default.pathExists(e)){let n=await No(t);if(n!==0)return n}await F(e,["-m","pip","install","--upgrade","pip","setuptools","wheel"],t);let o=f.join(t,"requirements.txt");if(await x__default.pathExists(o)&&await F(e,["-m","pip","install","-r","requirements.txt"],t)===0)return 0;let r=f.join(t,"pyproject.toml");return await x__default.pathExists(r)&&(await F(e,["-m","pip","install","-e","."],t)===0||await F(e,["-m","pip","install","."],t)===0)?0:1}async function mt(t,e){return await Gr(t)!==0&&console.log(s.yellow("\u26A0\uFE0F Could not fully configure Poetry local venv. Trying fallback installer...")),(await e.initProject(t)).exitCode===0&&await x__default.pathExists(f.join(t,".venv"))?0:(console.log(s.yellow("\u26A0\uFE0F Python init fallback: installing dependencies directly into project .venv")),await qr(t))}async function ft(t){let e=await He("init",t);if(e===0)return 0;let o=["npm","pnpm","yarn"];for(let r of o){if(!await Do(r,t))continue;if(await F(r,["install"],t)===0)return console.log(s.green(`\u2705 Node init fallback succeeded with ${r} install`)),0}return e}async function xo(t){if(t[0]!=="create"||t[1]!=="project")return 1;let e=t[2],o=t[3];if(!e||!o)return process.stderr.write(`Usage: rapidkit create project gofiber.standard <name> [--output <dir>]
105
- `),1;let r=Je(t,"--output")||process.cwd(),n=f.resolve(r,o),i=t.includes("--skip-git")||t.includes("--no-git");try{let{default:a}=await import('fs-extra');if(await a.ensureDir(f.dirname(n)),await a.pathExists(n))return process.stderr.write(`\u274C Directory "${n}" already exists
106
- `),1;await a.ensureDir(n);let{generateGoFiberKit:c}=await import('./gofiber-standard-JDPREQCP.js');await c(n,{project_name:o,module_path:o,skipGit:i});let m=q(process.cwd());if(m){let{syncWorkspaceProjects:d}=await import('./workspace-VXNLNKCM.js');await d(m,true);}return 0}catch(a){return process.stderr.write(`RapidKit Go/Fiber generator failed: ${a?.message??a}
107
- `),1}}async function Ro(t){if(t[0]!=="create"||t[1]!=="project")return 1;let e=t[2],o=t[3];if(!e||!o)return process.stderr.write(`Usage: rapidkit create project gogin.standard <name> [--output <dir>]
108
- `),1;let r=Je(t,"--output")||process.cwd(),n=f.resolve(r,o),i=t.includes("--skip-git")||t.includes("--no-git");try{let{default:a}=await import('fs-extra');if(await a.ensureDir(f.dirname(n)),await a.pathExists(n))return process.stderr.write(`\u274C Directory "${n}" already exists
109
- `),1;await a.ensureDir(n);let{generateGoGinKit:c}=await import('./gogin-standard-DCERHHVB.js');await c(n,{project_name:o,module_path:o,skipGit:i});let m=q(process.cwd());if(m){let{syncWorkspaceProjects:d}=await import('./workspace-VXNLNKCM.js');await d(m,true);}return 0}catch(a){return process.stderr.write(`RapidKit Go/Gin generator failed: ${a?.message??a}
110
- `),1}}async function It(t,e){if(t.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(t[0]!=="create")return 1;if(t[1]!=="project")return process.stderr.write(`RapidKit (npm) could not run the Python core engine for \`create\`.
99
+ `)),console.log(c$1.white(`Set your API key: rapidkit config set-api-key
100
+ `)),process.exit(1)),pt(t);let n=await _r();process.exit(n?0:1);}catch(t){let n=Kt(t);a$1.error("Failed to update embeddings:",n.message),process.exit(1);}});}var gt=class{constructor(e){this.runCommand=e;}runtime="go";async run(e,t,n){return {exitCode:await this.runCommand(e,t,n)}}async ensureGoInstalled(e){return (await this.run("go",["version"],e)).exitCode===0?null:{exitCode:1,message:"Go toolchain is not installed or not available on PATH. Install Go from https://go.dev/dl/ and retry."}}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"}withGoCacheEnv(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","go"):f.join(e,".rapidkit","cache","go"),s=process.env.GOMODCACHE,a=process.env.GOCACHE;return process.env.GOMODCACHE=f.join(i,"mod"),process.env.GOCACHE=f.join(i,"build"),t().finally(()=>{typeof s>"u"?delete process.env.GOMODCACHE:process.env.GOMODCACHE=s,typeof a>"u"?delete process.env.GOCACHE:process.env.GOCACHE=a;})}async checkPrereqs(){return this.run("go",["version"],process.cwd())}async warmSetupCache(e){return this.withGoCacheEnv(e,async()=>{try{return process.env.GOMODCACHE&&v.mkdirSync(process.env.GOMODCACHE,{recursive:true}),process.env.GOCACHE&&v.mkdirSync(process.env.GOCACHE,{recursive:true}),{exitCode:0}}catch{return {exitCode:1,message:"Failed to prepare Go cache directories"}}})}async initProject(e){return this.withGoCacheEnv(e,async()=>{let t=await this.ensureGoInstalled(e);return t||this.run("go",["mod","tidy"],e)})}async runDev(e){return this.withGoCacheEnv(e,()=>(async()=>{let t=await this.ensureGoInstalled(e);if(t)return t;let n=f.join(e,"Makefile");return v.existsSync(n)?this.run("make",["run"],e):this.run("go",["run","./main.go"],e)})())}async runTest(e){return this.withGoCacheEnv(e,async()=>{let t=await this.ensureGoInstalled(e);return t||this.run("go",["test","./..."],e)})}async runBuild(e){return this.withGoCacheEnv(e,async()=>{let t=await this.ensureGoInstalled(e);return t||this.run("go",["build","./..."],e)})}async runStart(e){return this.withGoCacheEnv(e,async()=>{let n=(a()?[f.join(e,"server.exe"),f.join(e,"server")]:[f.join(e,"server")]).find(i=>v.existsSync(i));if(n)return this.run(n,[],e);let o=await this.ensureGoInstalled(e);return o||this.run("go",["run","./main.go"],e)})}async doctorHints(e){return ["Install Go from https://go.dev/dl/ if missing.","Run go mod tidy when dependencies are out of sync.","Use make run for hot-reload if Makefile exists."]}};var yt=class{constructor(e){this.runCommand=e;}runtime="java";isExecutable(e){if(process.platform==="win32")return true;try{return (v.statSync(e).mode&73)!==0}catch{return false}}ensureWrapperExecutable(e){if(process.platform==="win32"||this.isExecutable(e))return true;try{return v.chmodSync(e,493),this.isExecutable(e)}catch{return false}}resolveJavaCommand(e){let t=process.env.JAVA_HOME?.trim();if(!t)return "java";let n=f.join(t,"bin",process.platform==="win32"?"java.exe":"java");return v.existsSync(n)?n:"java"}parseMajorJavaVersion(e){if(!e)return null;let n=e.trim().replace(/\"/g,"").split(".")[0],o=Number.parseInt(n,10);return Number.isFinite(o)?o:null}readRequiredJavaMajor(e){let t=f.join(e,"pom.xml");if(!v.existsSync(t))return 21;try{let o=v.readFileSync(t,"utf-8").match(/<java\.version>\s*([^<\s]+)\s*<\/java\.version>/i);return this.parseMajorJavaVersion(o?.[1])??21}catch{return 21}}async detectInstalledJavaMajor(e,t){try{let n=await execa(e,["-version"],{cwd:t,timeout:5e3,reject:false});if(n.exitCode!==0)return null;let o=`${n.stdout||""}
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
+ ${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
+ `,"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>]
107
+ `),1;try{Ge(t);}catch(s){let a=s instanceof Error?s.message:String(s);return process.stderr.write(`${a}
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}
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
+ `),1;try{Ge(t);}catch(s){let a=s instanceof Error?s.message:String(s);return process.stderr.write(`${a}
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}
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
+ `),1;try{Ge(t);}catch(m){let w=m instanceof Error?m.message:String(m);return process.stderr.write(`${w}
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
117
+ `),1;if(a&&!h(a.trim()))return process.stderr.write(`Invalid --spring-boot-version. Expected semantic version, e.g. 3.5.0
118
+ `),1;if(d&&!h(d.trim()))return process.stderr.write(`Invalid --springdoc-version. Expected semantic version, e.g. 2.8.9
119
+ `),1;if(p&&!/^[A-Za-z0-9_.-]+$/.test(p.trim()))return process.stderr.write(`Invalid --group-id. Use dot-separated Java package identifiers only.
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
+ `),1;if(l&&!/^\d+$/.test(l.trim()))return process.stderr.write(`Invalid --port. Expected numeric TCP port, e.g. 8080
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}
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\`.
111
125
  Reason: ${e}.
112
126
  Install Python 3.10+ to use the interactive wizard and full kit catalog.
113
- `),1;let n=t[2],i=t[3];if(!n||!i)return process.stderr.write(`Usage: rapidkit create project <kit> <name> [--output <dir>]
127
+ `),1;let o=r[2],i=r[3];if(!o||!i)return process.stderr.write(`Usage: rapidkit create project <kit> <name> [--output <dir>]
114
128
  Tip: offline fallback supports only fastapi* and nestjs* kits.
115
- `),1;let a=Lr(n);if(!a)return process.stderr.write(`RapidKit (npm) could not run the Python core engine to create this kit.
129
+ `),1;let s=no(o);if(!s)return process.stderr.write(`RapidKit (npm) could not run the Python core engine to create this kit.
116
130
  Reason: ${e}.
117
- Requested kit: ${n}
131
+ Requested kit: ${o}
118
132
  Offline fallback only supports: fastapi.standard, nestjs.standard (and their shorthands).
119
133
  Install Python 3.10+ to access all kits.
120
- `),1;let c=Je(t,"--output")||process.cwd(),m=f.resolve(c,i),d=t.includes("--skip-git")||t.includes("--no-git"),l=t.includes("--skip-install");try{if(await x__default.ensureDir(f.dirname(m)),await x__default.pathExists(m))return process.stderr.write(`\u274C Directory "${m}" already exists
121
- `),1;let u="pip",y=q(process.cwd());if(y)try{let{readWorkspaceMarker:p}=await import('./workspace-marker-IOPQ42A7.js'),g=await p(y);g?.metadata?.npm?.installMethod&&(u=g.metadata.npm.installMethod,a$1.debug(`Detected workspace engine: ${u}`));}catch(p){a$1.debug("Failed to read workspace marker",p);}else a$1.debug("No workspace found, using default engine: pip");await x__default.ensureDir(m);let{generateDemoKit:v}=await import('./demo-kit-63CFMCPD.js');if(await v(m,{project_name:i,template:a,kit_name:n,skipGit:d,skipInstall:l,engine:u}),y){let{syncWorkspaceProjects:p}=await import('./workspace-VXNLNKCM.js');await p(y,true);}return 0}catch(u){return process.stderr.write(`RapidKit (npm) offline fallback failed: ${u?.message??u}
122
- `),1}}async function Ko(t){let e$1=new Set(["--yes","-y","--skip-git","--skip-install","--debug","--dry-run","--no-update-check","--create-workspace","--no-workspace"]);if(t[0]==="create"&&(!t[1]||t[1].startsWith("-"))){let o=t.includes("--yes")||t.includes("-y"),r=t.slice(1),n;!process.stdin.isTTY||o?(n="workspace",process.stdin.isTTY&&console.log(s.gray("\u2139\uFE0F No subcommand provided for `create`; defaulting to `create workspace`."))):n=(await he.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",n,...r];return await Ko(i)}if(t[0]==="create"&&t[1]==="workspace")try{let o=t.includes("--yes")||t.includes("-y"),r=t.includes("--skip-git")||t.includes("--no-git"),n=t[2]&&!t[2].startsWith("-")?t[2]:void 0,i=Je(t,"--install-method"),a=i==="poetry"||i==="venv"||i==="pipx"?i:void 0,c=Je(t,"--profile"),m=c==="minimal"||c==="go-only"||c==="python-only"||c==="node-only"||c==="polyglot"||c==="enterprise"?c:void 0,d=n||(o?"my-workspace":(await he.prompt([{type:"input",name:"workspaceName",message:"Workspace name:",default:"my-workspace"}])).workspaceName);if(!d||!d.trim())return process.stderr.write(`Workspace name is required.
123
- `),1;try{vt(d);}catch(p){if(p instanceof e)return process.stderr.write(`${p.message}
124
- `),1;throw p}let l=f.resolve(process.cwd(),d);if(await x__default.pathExists(l))return process.stderr.write(`\u274C Directory "${d}" already exists
125
- `),1;let u=await a$2(),y=u.author||process.env.USER||"RapidKit User";if(!o){let p=await he.prompt([{type:"input",name:"author",message:"Author name:",default:y}]);p.author?.trim()&&(y=p.author.trim());}let{createProject:v}=await import('./create-27NVMJAR.js');return await v(d,{skipGit:r,yes:o,userConfig:{...u,author:y},installMethod:a,profile:m}),0}catch(o){return process.stderr.write(`RapidKit (npm) failed to create workspace: ${o?.message??o}
126
- `),1}try{if(t[0]==="create"&&t[1]==="project"){if(t.includes("--help")||t.includes("-h"))try{return await c$1(),await d(["create","project","--help"],{cwd:process.cwd()})}catch(p){return process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${p?.message??p}
127
- `),1}if(!t[2]||t[2].startsWith("-")){console.log(s.bold(`
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}
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
+ `),1;try{Ge(p);}catch(m){if(m instanceof e)return process.stderr.write(`${m.message}
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}
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
+ `),1}if(!r[2]||r[2].startsWith("-")){console.log(c$1.bold(`
128
142
  \u{1F680} RapidKit
129
- `));let{kitChoice:p}=await he.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:"go/fiber \u2014 Go Fiber Standard Kit",value:"gofiber.standard"},{name:"go/gin \u2014 Go Gin Standard Kit",value:"gogin.standard"}]}]);if(ht(p)||Ue(p)){let{projectName:A}=await he.prompt([{type:"input",name:"projectName",message:"Project name:",validate:S=>S.trim().length>0||"Project name is required"}]),P=t.slice(2).filter(S=>S.startsWith("-"));return Ue(p)?await Ro(["create","project",p,A.trim(),...P]):await xo(["create","project",p,A.trim(),...P])}let{projectName:g}=await he.prompt([{type:"input",name:"projectName",message:"Project name:",validate:A=>A.trim().length>0||"Project name is required"}]);t.splice(2,0,p,g.trim());}{let p=q(process.cwd()),g=(t[2]||"").toLowerCase();if(p&&g){let A=f.join(p,".rapidkit","workspace.json"),P=f.join(p,".rapidkit","policies.yml");try{let[S,b]=await Promise.all([x__default.pathExists(A).then(ae=>ae?w.promises.readFile(A,"utf-8"):"{}"),x__default.pathExists(P).then(ae=>ae?w.promises.readFile(P,"utf-8"):"")]),_=JSON.parse(S).profile,T=b.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]??"warn",I=ht(g)||Ue(g)||g.startsWith("go"),fe=["nestjs","react","vue","nextjs","next","vite","angular","svelte","express","koa","fastify"].some(ae=>g.includes(ae)),Ne=!I&&!fe,le=null;if(_==="python-only"&&!Ne?le=`Kit "${g}" is not a Python kit, but workspace profile is "python-only".`:_==="node-only"&&!fe?le=`Kit "${g}" is not a Node kit, but workspace profile is "node-only".`:_==="go-only"&&!I&&(le=`Kit "${g}" is not a Go kit, but workspace profile is "go-only".`),le){if(T==="strict")return console.log(s.red(`\u274C Profile violation (strict mode): ${le}`)),console.log(s.gray("\u{1F4A1} Change workspace profile or use --no-workspace to skip enforcement.")),1;console.log(s.yellow(`\u26A0\uFE0F Profile warning: ${le}`)),console.log(s.gray('\u{1F4A1} Consider using a "polyglot" workspace profile for multi-language projects.'));}}catch{}}}if(ht(t[2]||""))return await xo(t);if(Ue(t[2]||""))return await Ro(t);let r=t.includes("--create-workspace"),n=t.includes("--no-workspace"),i=t.includes("--yes")||t.includes("-y"),a=t.includes("--skip-git")||t.includes("--no-git");if(!!!$t(process.cwd())){let{registerWorkspaceAtPath:p}=await import('./create-27NVMJAR.js');if(r)await p(process.cwd(),{skipGit:a,yes:i,userConfig:await a$2()});else if(!n)if(i)await p(process.cwd(),{skipGit:a,yes:true,userConfig:await a$2()});else {let{createWs:g}=await he.prompt([{type:"confirm",name:"createWs",message:"This project will be created outside a RapidKit workspace. Create and register a workspace here?",default:true}]);g&&await p(process.cwd(),{skipGit:a,yes:false,userConfig:await a$2()});}}let d$1=[...t.filter(p=>{let g=p.split("=")[0];return !e$1.has(p)&&!e$1.has(g)})],l=q(process.cwd()),v=t.includes("--skip-install")||!!l?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0;try{await c$1();let p=await d(d$1,{cwd:process.cwd(),env:v});if(p===0&&l&&!t.includes("--skip-install")&&(console.log(s.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(s.white(" Next: cd <project-name> && npx rapidkit init"))),p===0){let g=l||q(process.cwd());if(g){try{let P=t[3];if(P){let S=t.indexOf("--output"),b=S>=0?t[S+1]:".",_=f.resolve(process.cwd(),b,P),M=f.join(g,".python-version"),T=f.join(_,".python-version");if(w.existsSync(M)&&w.existsSync(_)){let I=w.readFileSync(M,"utf-8");w.writeFileSync(T,I.trim()+`
130
- `),a$1.debug(`Synced Python version ${I.trim()} from workspace to ${P}`);}}}catch(P){a$1.debug("Could not sync Python version from workspace:",P);}let{syncWorkspaceProjects:A}=await import('./workspace-VXNLNKCM.js');await A(g,true);}}return p}catch(p){let g=Et(p);return g?await It(d$1,g):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${p?.message??p}
131
- `),1)}}if(t[0]==="create"&&t[1]!=="project")try{await c$1();let o=await d(t,{cwd:process.cwd()});if(o===0){let r=q(process.cwd());if(r){let{syncWorkspaceProjects:n}=await import('./workspace-VXNLNKCM.js');await n(r,true);}}return o}catch(o){let r=Et(o);return r?await It(t,r):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${o?.message??o}
132
- `),1)}return await c$1(),await d(t,{cwd:process.cwd()})}catch(o){let r=Et(o);return r?await It(t,r):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${o?.message??o}
133
- `),1)}}var So=["init","dev","start","build","test","docs","lint","format","create","help","--help","-h"],Ur=["doctor","workspace","bootstrap","setup","cache","mirror","ai","config","shell"],Hr=["doctor","workspace","ai","config","shell"],Jr=["bootstrap","setup","cache","mirror"],Lo=["lint","format","docs"],Vr=["init"],Fo=["build","dev","start","test"],Eo=[...Fo,...Lo];function wt(t){return !!t&&Ur.includes(t)}function Ao(t){return !!t&&Hr.includes(t)}function Br(t){return !!t&&Jr.includes(t)}function Wo(t){return w.existsSync(f.join(t,".rapidkit-workspace"))||w.existsSync(f.join(t,".rapidkit","workspace.json"))}function Go(t){let e=t;for(;;){let o=f.join(e,".rapidkit","context.json");if(w.existsSync(o))return o;let r=f.dirname(e);if(r===e)break;e=r;}return null}function $t(t){let e=t;for(;;){let o=f.join(e,".rapidkit-workspace");if(w.existsSync(o))return o;let r=f.dirname(e);if(r===e)break;e=r;}return null}function q(t){let e=t;for(;;){let o=f.join(e,".rapidkit-workspace");if(w.existsSync(o))return e;let r=f.dirname(e);if(r===e)break;e=r;}return null}async function Yr(t,e=process.cwd(),o=process.platform){if(!(t.workspaceFlag||t.scope==="workspace"))return {detected:false};let n=i(e,o);for(let i of n)if(await x__default.pathExists(i)){if(a(o)){let a=i.toLowerCase();if(a.endsWith("rapidkit.cmd")||a.endsWith("rapidkit.exe"))return {detected:true,candidatePath:i,reason:"Found workspace-local rapidkit launcher on Windows."}}else if(f.basename(i)==="rapidkit")return {detected:true,candidatePath:i,reason:"Found workspace-local rapidkit bash launcher on Linux/macOS."}}return {detected:false}}function zr(t){let e=t;for(;;){let o=f.join(e,".rapidkit-workspace"),r=f.join(e,".rapidkit","workspace.json");if(!w.existsSync(o)&&w.existsSync(r))return e;let n=f.dirname(e);if(n===e)break;e=n;}return null}var qo={enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true};function Qr(t){return t&&t.match(/^[\t ]*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]==="strict"?"strict":"warn"}function qe(t,e){let o=t.match(new RegExp(`^[\\t ]*${e}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return o?o[1]==="true":qo[e]}function Io(t){let e=t??"";return {mode:Qr(e),dependency_sharing_mode:Uo(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 jo(t,e,o){let r=`${e}: ${o}`,n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`^[\\t ]*${n}:\\s*.*$`,"m");if(i.test(t))return t.replace(i,r);let a=/^[\t ]*rules:\s*(?:#.*)?$/m;return a.test(t)?t.replace(a,`${r}
134
- rules:`):`${t.endsWith(`
135
- `)?t:`${t}
136
- `}${r}
137
- `}function Zr(t,e,o){let r=` ${e}: ${o?"true":"false"}`,n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`^[\\t ]+${n}:\\s*.*$`,"m");if(i.test(t))return t.replace(i,r);let a=/^[\t ]*rules:\s*(?:#.*)?$/m;return a.test(t)?t.replace(a,`rules:
138
- ${r}`):`${t.endsWith(`
139
- `)?t:`${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=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}
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}
148
+ rules:`):`${r.endsWith(`
149
+ `)?r:`${r}
150
+ `}${n}
151
+ `}function ho(r,e,t){let n=` ${e}: ${t?"true":"false"}`,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,`rules:
152
+ ${n}`):`${r.endsWith(`
153
+ `)?r:`${r}
140
154
  `}rules:
141
- ${r}
142
- `}function Xr(){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(`
143
- `)}async function $o(t){let e=f.join(t,".rapidkit","policies.yml");return await x__default.pathExists(e)?w.promises.readFile(e,"utf-8"):Xr()}async function en(t,e){let o=f.join(t,".rapidkit"),r=f.join(o,"policies.yml");await x__default.ensureDir(o);let n=e.endsWith(`
155
+ ${n}
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
+ `)}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(`
144
158
  `)?e:`${e}
145
- `;await w.promises.writeFile(r,n,"utf-8");}function tn(t){let e=t.trim().toLowerCase();return e==="true"||e==="1"||e==="on"?true:e==="false"||e==="0"||e==="off"?false:null}function Uo(t){if(!t)return "isolated";let o=t.match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();return o==="shared-runtime-caches"||o==="shared-node-deps"||o==="isolated"?o:"isolated"}function Ho(t){if(!t)return {mode:"isolated",status:"skipped",message:"No policies.yml found; dependency_sharing_mode defaults to isolated."};let e=t.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 o=e[1].toLowerCase();return o==="isolated"||o==="shared-runtime-caches"||o==="shared-node-deps"?{mode:o,status:"passed",message:`dependency_sharing_mode is valid: ${o}.`}:{mode:"isolated",status:"failed",message:`Invalid dependency_sharing_mode: ${o}. Use one of: isolated, shared-runtime-caches, shared-node-deps.`}}async function Jo(t,e){let o=q(t),r=o?f.join(o,".rapidkit","policies.yml"):null,n="isolated";if(r&&await x__default.pathExists(r))try{let c=await w.promises.readFile(r,"utf-8"),m=Ho(c);if(m.status==="failed")return console.log(s.red(`\u274C ${m.message}`)),{ok:false,code:1};n=m.mode;}catch{return console.log(s.red("\u274C Failed to read workspace policy file (.rapidkit/policies.yml).")),{ok:false,code:1}}let i=process.env.RAPIDKIT_DEP_SHARING_MODE,a=process.env.RAPIDKIT_WORKSPACE_PATH;process.env.RAPIDKIT_DEP_SHARING_MODE=n,o&&(process.env.RAPIDKIT_WORKSPACE_PATH=o);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 a>"u"?delete process.env.RAPIDKIT_WORKSPACE_PATH:process.env.RAPIDKIT_WORKSPACE_PATH=a;}}async function F(t,e,o){return await new Promise(r=>{let n=spawn(t,e,{stdio:"inherit",cwd:o,shell:b$2()});n.on("close",i=>r(i??1)),n.on("error",()=>r(1));})}async function De(t,e){await x__default.outputFile(t,`${JSON.stringify(e,null,2)}
146
- `,"utf-8");}async function on(t){let e=new Set(["go-only"]);try{let r=f.join(t,".rapidkit","workspace.json"),n=JSON.parse(await w.promises.readFile(r,"utf-8"));if(e.has(n.profile??""))return 0}catch{}let o="poetry";try{let{readWorkspaceMarker:r}=await import('./workspace-marker-IOPQ42A7.js'),i=(await r(t))?.metadata?.npm?.installMethod;(i==="poetry"||i==="venv"||i==="pipx"||i==="pip")&&(o=i);}catch{}if(o==="poetry"||o==="venv"){let r=f.join(t,"pyproject.toml"),n=false;try{n=(await w.promises.readFile(r,"utf-8")).includes("rapidkit-core");}catch{n=false;}let i=process.env.RAPIDKIT_DEV_PATH,a=i?await x__default.pathExists(i):false;if(n){let c=Fr(t);if(!await x__default.pathExists(c)){let l=await Wr(t);if(l!==0)return l}let d=await F(c,a&&i?["-m","pip","install",i,"--quiet","--disable-pip-version-check"]:["-m","pip","install","rapidkit-core","--quiet","--disable-pip-version-check"],t);if(d!==0)return d}else {let c=await F("poetry",["install","--no-root"],t);if(c!==0)return c;let m=await F("poetry",["add","rapidkit-core"],t);if(m!==0)return m}try{let{writeWorkspaceLauncher:c}=await import('./create-27NVMJAR.js');await c(t,"poetry");}catch{}return 0}return 0}async function Vo(t){let e=await w.promises.readdir(t,{withFileTypes:true}),o=[];for(let r of e){if(!r.isDirectory()||r.name.startsWith("."))continue;let n=f.join(t,r.name),i=f.join(n,".rapidkit","context.json"),a=f.join(n,".rapidkit","project.json");(await x__default.pathExists(i)||await x__default.pathExists(a))&&o.push(n);}return o}function rn(t){let e="my-workspace",o=1;for(;;){let r=o===1?e:`${e}-${o}`,n=f.join(t,r);if(!w.existsSync(n))return {name:r,targetPath:n};o+=1;}}async function gt(t){let o=await Se("go",{runCommandInCwd:F,runCoreRapidkit:d}).initProject(t);return o.message&&console.log(s.red(`\u274C ${o.message}`)),o.exitCode}async function He(t,e){let o=Se("node",{runCommandInCwd:F,runCoreRapidkit:d});return t==="init"?(await o.initProject(e)).exitCode:t==="dev"?(await o.runDev(e)).exitCode:t==="test"?(await o.runTest(e)).exitCode:t==="build"?(await o.runBuild(e)).exitCode:(await o.runStart(e)).exitCode}async function nn(t,e=Tt){let o=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof o>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let i=function(C){if(!C)return null;let R=C.trim().toLowerCase();return R==="minimal"||R==="go-only"||R==="python-only"||R==="node-only"||R==="polyglot"||R==="enterprise"?R:null},a=function(C){let j=C.match(/^\s*mode:\s*([a-zA-Z]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase()==="strict"?"strict":"warn",Y=(H,de)=>{let we=C.match(new RegExp(`^\\s*${H}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return we?we[1].toLowerCase()==="true":de};return {mode:j,dependency_sharing_mode:Uo(C),rules:{enforce_workspace_marker:Y("enforce_workspace_marker",true),enforce_toolchain_lock:Y("enforce_toolchain_lock",false),disallow_untrusted_tool_sources:Y("disallow_untrusted_tool_sources",false),enforce_compatibility_matrix:Y("enforce_compatibility_matrix",false),require_mirror_lock_for_offline:Y("require_mirror_lock_for_offline",true)}}};let c=["init"],m,d=false,l=false,u=false;for(let C=1;C<t.length;C+=1){let R=t[C];if(R==="--ci"){d=true;continue}if(R==="--offline"){l=true;continue}if(R==="--json"){u=true;continue}if(R==="--profile"){let O=t[C+1];if(!O||O.startsWith("-"))return console.log(s.yellow("Usage: rapidkit bootstrap [path] [--profile <minimal|go-only|python-only|node-only|polyglot|enterprise>] [--ci] [--offline] [--json]")),1;m=O,C+=1;continue}if(R.startsWith("--profile=")){m=R.slice(10);continue}c.push(R);}let y=i(m);if(m&&!y)return console.log(s.red(`Invalid profile: ${m}. Use one of: minimal, go-only, python-only, node-only, polyglot, enterprise.`)),1;let v=process.cwd(),p=q(v);p||(p=zr(v));let g=[],A=null,P=null;if(p)try{let C=f.join(p,".rapidkit","workspace.json"),R=await w.promises.readFile(C,"utf-8"),O=JSON.parse(R);P=i(O.profile);}catch{P=null;}let S=["minimal","python-only","node-only","go-only","polyglot","enterprise"],b={minimal:"minimal \u2014 Foundation files only (fastest bootstrap, mixed projects)","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 multi-runtime workspace",enterprise:"enterprise \u2014 Polyglot + governance + Sigstore verification"},_=y;if(!!p&&!y&&!d&&!u&&!!process.stdin.isTTY&&!!process.stdout.isTTY){let C=P||"minimal",{chosenProfile:R}=await he.prompt([{type:"rawlist",name:"chosenProfile",message:`Select workspace profile for bootstrap (current: ${C})`,choices:S.map(O=>({name:O===C?`${b[O]} \u2190 current`:b[O],value:O})),default:S.indexOf(C)}]);_=R;}let T=_||P||"minimal";if(p)try{let R=T==="python-only"||T==="polyglot"||T==="enterprise"?"poetry":"venv",O;try{let de=(await w.promises.readFile(f.join(p,".python-version"),"utf-8")).trim();de&&(O=de);}catch{}let{syncWorkspaceFoundationFiles:j}=await import('./create-27NVMJAR.js'),Y=await j(p,{workspaceName:f.basename(p),installMethod:R,pythonVersion:O,profile:T,writeMarker:true,writeGitignore:true,onlyIfMissing:true});g.push({id:"workspace.legacy.sync",status:Y.length>0?"passed":"skipped",message:Y.length>0?`Legacy workspace foundation synchronized: ${Y.join(", ")}`:"Workspace foundation files are already up to date."});}catch(C){g.push({id:"workspace.legacy.sync",status:"failed",message:`Failed to synchronize legacy workspace foundation files: ${C.message}`});}if(p&&_&&_!==P)try{let C=f.join(p,".rapidkit","workspace.json"),R=await w.promises.readFile(C,"utf-8"),O=JSON.parse(R);O.profile=_,await w.promises.writeFile(C,JSON.stringify(O,null,2)+`
147
- `,"utf-8");}catch{}let I={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}},fe=null;if(p)try{let C=await w.promises.readFile(f.join(p,".rapidkit","policies.yml"),"utf-8");fe=C,I=a(C);}catch{g.push({id:"policy.file",status:"skipped",message:"No workspace policy file found; using default bootstrap policy."});}else g.push({id:"workspace.detect",status:"skipped",message:"No workspace marker found; bootstrap runs in project/single-path mode."});if(p){let C=Ho(fe);I.dependency_sharing_mode=C.mode,g.push({id:"policy.schema.dependency_sharing_mode",status:C.status,message:C.message}),g.push({id:"policy.dependency_sharing_mode.effective",status:"passed",message:I.dependency_sharing_mode==="isolated"?"Effective dependency mode: isolated (default secure mode).":I.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 R=w.existsSync(f.join(p,".rapidkit-workspace"));g.push({id:"policy.enforce_workspace_marker",status:!I.rules.enforce_workspace_marker||R?"passed":"failed",message:!I.rules.enforce_workspace_marker||R?"Workspace marker policy satisfied.":"Workspace marker policy failed: .rapidkit-workspace is missing."});let O=w.existsSync(f.join(p,".rapidkit","toolchain.lock"));g.push({id:"policy.enforce_toolchain_lock",status:!I.rules.enforce_toolchain_lock||O?"passed":"failed",message:!I.rules.enforce_toolchain_lock||O?"Toolchain lock policy satisfied.":"Toolchain lock policy failed: .rapidkit/toolchain.lock is missing."});let j=process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||w.existsSync(f.join(p,".rapidkit","trusted-sources.lock"));g.push({id:"policy.disallow_untrusted_tool_sources",status:!I.rules.disallow_untrusted_tool_sources||j?"passed":"failed",message:!I.rules.disallow_untrusted_tool_sources||j?"Trusted tool sources policy satisfied.":"Trusted tool sources policy failed: set RAPIDKIT_TRUSTED_SOURCES=1 or provide .rapidkit/trusted-sources.lock."});let Y=f.join(p,".rapidkit","compatibility-matrix.json"),H=w.existsSync(Y),de=I.rules.enforce_compatibility_matrix;if(g.push({id:"policy.enforce_compatibility_matrix",status:!de||H?"passed":"failed",message:!de||H?"Compatibility matrix policy satisfied.":"Compatibility matrix policy failed: .rapidkit/compatibility-matrix.json is missing."}),H)try{let N=await w.promises.readFile(Y,"utf-8"),V=JSON.parse(N),Be=!!V&&typeof V=="object";g.push({id:"compatibility.matrix.parse",status:Be?"passed":"failed",message:Be?"Compatibility matrix parsed successfully.":"Compatibility matrix parse failed: invalid JSON object."});}catch{g.push({id:"compatibility.matrix.parse",status:"failed",message:"Compatibility matrix parse failed: invalid JSON."});}let we=f.join(p,".rapidkit","mirror-config.json"),z=f.join(p,".rapidkit","mirror.lock"),ve=w.existsSync(we),ke=w.existsSync(z),Ve={};if(ve)try{Ve=JSON.parse(await w.promises.readFile(we,"utf-8")),g.push({id:"mirror.config.parse",status:"passed",message:"Mirror configuration parsed successfully."});}catch{g.push({id:"mirror.config.parse",status:"failed",message:"Mirror configuration parse failed: invalid JSON in .rapidkit/mirror-config.json."});}let kt=await St(p,{ciMode:d,offlineMode:l});if(g.push(...kt.checks.map(N=>({id:N.id,status:N.status,message:N.message}))),A=kt.details,kt.details.lockWritten&&(ke=true),l){let N=process.env.RAPIDKIT_MIRROR_ENABLED==="1"||Ve.enabled===true;g.push({id:"offline.mirror.enabled",status:N?"passed":"failed",message:N?"Offline mode mirror is enabled.":'Offline mode requires mirror enablement (set RAPIDKIT_MIRROR_ENABLED=1 or .rapidkit/mirror-config.json {"enabled": true}).'});let V=I.rules.require_mirror_lock_for_offline;g.push({id:"offline.mirror.lock",status:!V||ke?"passed":"failed",message:!V||ke?"Offline mode mirror lock policy satisfied.":"Offline mode mirror lock policy failed: .rapidkit/mirror.lock is missing."});}else g.push({id:"offline.mirror.enabled",status:"skipped",message:"Offline mirror checks skipped (offline mode is disabled)."});let Yo=await Vo(p),te=new Set;for(let N of Yo){let V=ye(N);if(ne(V,N)){te.add("go");continue}if(ie(V,N)){te.add("node");continue}if(se(V,N)){te.add("python");continue}te.add("unknown");}if(T==="go-only"){let N=te.size===0||[...te].every(V=>V==="go");g.push({id:"profile.go-only",status:N?"passed":"failed",message:N?"go-only profile validated for discovered projects.":`go-only profile mismatch: detected runtimes [${[...te].join(", ")}].`});}else if(T==="python-only"){let N=te.size===0||[...te].every(V=>V==="python");g.push({id:"profile.python-only",status:N?"passed":"failed",message:N?"python-only profile validated for discovered projects.":`python-only profile mismatch: detected runtimes [${[...te].join(", ")}].`});}else if(T==="node-only"){let N=te.size===0||[...te].every(V=>V==="node");g.push({id:"profile.node-only",status:N?"passed":"failed",message:N?"node-only profile validated for discovered projects.":`node-only profile mismatch: detected runtimes [${[...te].join(", ")}].`});}else if(T==="minimal"){let N=[...te].filter(Be=>Be!=="unknown"),V=N.length<=1;g.push({id:"profile.minimal",status:V?"passed":"failed",message:V?"minimal profile is compatible with detected runtime mix.":`minimal profile mismatch: multiple runtimes detected [${N.join(", ")}].`});}else T==="enterprise"&&(g.push({id:"profile.enterprise.ci",status:d?"passed":"failed",message:d?"enterprise profile running with --ci.":"enterprise profile expects --ci for deterministic non-interactive mode."}),g.push({id:"profile.enterprise.compatibility-matrix",status:H?"passed":"failed",message:H?"enterprise profile has compatibility matrix.":"enterprise profile requires .rapidkit/compatibility-matrix.json."}),g.push({id:"profile.enterprise.mirror-config",status:ve?"passed":"failed",message:ve?"enterprise profile has mirror configuration.":"enterprise profile requires .rapidkit/mirror-config.json."}));}d&&(process.env.RAPIDKIT_BOOTSTRAP_CI="1"),l&&(process.env.RAPIDKIT_OFFLINE_MODE="1");let le=g.some(C=>C.id.startsWith("policy.schema.")&&C.status==="failed")||I.mode==="strict"&&g.some(C=>C.status==="failed"),ae=p||v,je=f.join(ae,".rapidkit","reports"),U=new Date().toISOString().replace(/[:.]/g,"-"),D=f.join(je,`bootstrap-compliance-${U}.json`),k=f.join(je,"bootstrap-compliance.latest.json"),Q={command:"bootstrap",timestamp:new Date().toISOString(),workspacePath:p,profile:T,options:{ci:d,offline:l,strict:I.mode==="strict"},policyMode:I.mode,policyRules:I.rules,mirrorLifecycle:A,checks:g};if(le){let C={...Q,result:"blocked",initExitCode:null};return await x__default.ensureDir(je),await De(D,C),await De(k,C),u?process.stdout.write(`${JSON.stringify(C,null,2)}
148
- `):(console.log(s.red("\u274C Bootstrap blocked by strict policy checks.")),console.log(s.gray(`Compliance report: ${D}`))),1}let Z=0;u||(Z=await e(c));let K=g.filter(C=>C.status==="failed").length,B=Z!==0?"failed":K>0?"ok_with_warnings":"ok",ee={...Q,result:B,initExitCode:Z};if(await x__default.ensureDir(je),await De(D,ee),await De(k,ee),u)process.stdout.write(`${JSON.stringify(ee,null,2)}
149
- `);else {let C=g.filter(R=>R.status==="failed").length;C>0&&console.log(s.yellow(`\u26A0\uFE0F Bootstrap completed with ${C} policy/profile warnings.`)),console.log(s.gray(`Compliance report: ${D}`));}return Z}finally{typeof o>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=o;}}async function sn(t){let e=(t[1]||"").toLowerCase(),o=t.includes("--warm-deps")||t.includes("--warm-dependencies");if(!e||!["python","node","go"].includes(e))return console.log(s.yellow("Usage: rapidkit setup <python|node|go> [--warm-deps]")),1;let r=async(d,l)=>{if(d==="node"){if(!w.existsSync(f.join(l,"package.json")))return {exitCode:0,message:"Node warm-up skipped: package.json not found in current directory."};let y=w.existsSync(f.join(l,"pnpm-lock.yaml")),v=w.existsSync(f.join(l,"yarn.lock"));return y?{exitCode:await F("pnpm",["install","--lockfile-only","--ignore-scripts"],l)}:v?{exitCode:await F("yarn",["install","--ignore-scripts"],l)}:{exitCode:await F("npm",["install","--package-lock-only","--ignore-scripts"],l)}}return d==="go"?w.existsSync(f.join(l,"go.mod"))?{exitCode:await F("go",["mod","download"],l)}:{exitCode:0,message:"Go warm-up skipped: go.mod not found in current directory."}:{exitCode:0,message:"Dependency warm-up currently applies to node/go runtimes."}},n=Se(e,{runCommandInCwd:F,runCoreRapidkit:(d$1,l)=>d(d$1,{...l,cwd:void 0})}),i=await n.checkPrereqs(),a=await n.doctorHints(process.cwd()),c=q(process.cwd()),m=c||process.cwd();if(i.exitCode===0){console.log(s.green(`\u2705 ${e} prerequisites look good.`));let d=["python","node","go"].filter(l=>l!==e).join("/");if(console.log(s.gray(` Scope: validated ${e} runtime only. ${d} checks are optional unless your workspace profile uses them.`)),e==="python"&&console.log(s.gray(" Note: Poetry is recommended, but venv/pipx-based flows are supported in workspace creation.")),n.warmSetupCache&&((await n.warmSetupCache(m)).exitCode===0?console.log(s.gray(` ${e} cache warm-up completed.`)):console.log(s.yellow(` ${e} cache warm-up skipped (non-fatal).`))),o){let l=await r(e,m),u=/skipped/i.test(l.message||"");l.message&&console.log(s.gray(` ${l.message}`)),l.exitCode===0&&!u?console.log(s.gray(` ${e} dependency warm-up completed (--warm-deps).`)):l.exitCode!==0&&console.log(s.yellow(` ${e} dependency warm-up failed (non-fatal).`));}if(c)try{let l=f.join(c,".rapidkit","toolchain.lock"),u={};try{u=JSON.parse(await w.promises.readFile(l,"utf-8"));}catch{}(!u.runtime||typeof u.runtime!="object")&&(u.runtime={});let y=u.runtime;if(e==="python"){let v=null;try{let{execa:p}=await import('execa');for(let g of Ot()){let P=await p(g,g==="py"?["-3","--version"]:["--version"],{cwd:c,stdio:"pipe",reject:false,timeout:3e3});if(P.exitCode===0){let b=(P.stdout||P.stderr||"").match(/Python\s+(\S+)/);if(v=b?b[1]:null,v)break}}}catch{}y.python={...y.python||{},version:v,last_setup:new Date().toISOString()};}else if(e==="node")y.node={...y.node||{},version:process.version,last_setup:new Date().toISOString()};else if(e==="go"){let v=null;try{let{execa:p}=await import('execa'),A=((await p("go",["version"],{cwd:c,stdio:"pipe"})).stdout||"").match(/go(\d+\.\d+(?:\.\d+)?)/i);v=A?A[1]:null;}catch{}y.go={...y.go||{},version:v,last_setup:new Date().toISOString()};}u.updated_at=new Date().toISOString(),await w.promises.writeFile(l,JSON.stringify(u,null,2)+`
150
- `,"utf-8"),console.log(s.gray(" toolchain.lock updated (.rapidkit/toolchain.lock)"));}catch{}}else console.log(s.red(`\u274C ${e} prerequisites check failed.`));if(a.length>0){console.log(s.gray(`
151
- Hints:`));for(let d of a)console.log(s.gray(`- ${d}`));}return i.exitCode}function an(t){let e={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};for(let o of t.split(`
152
- `)){let r=o.trim(),n=r.match(/^strategy:\s*(\S+)/);n&&(e.strategy=n[1].replace(/['"]]/g,""));let i=r.match(/^prune_on_bootstrap:\s*(true|false)/);i&&(e.prune_on_bootstrap=i[1]==="true");let a=r.match(/^self_heal:\s*(true|false)/);a&&(e.self_heal=a[1]==="true");let c=r.match(/^verify_integrity:\s*(true|false)/);c&&(e.verify_integrity=c[1]==="true");}return e}async function cn(t){let e=(t[1]||"status").toLowerCase(),o=ut.getInstance(),r=q(process.cwd()),n={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};if(r)try{let i=await w.promises.readFile(f.join(r,".rapidkit","cache-config.yml"),"utf-8");n=an(i);}catch{}return e==="status"?(console.log(s.cyan("RapidKit cache is enabled")),console.log(s.cyan("RapidKit cache status")),r?(console.log(s.gray(` Workspace: ${r}`)),console.log(s.gray(` Strategy: ${n.strategy}`)),console.log(s.gray(` Self-heal: ${n.self_heal}`)),console.log(s.gray(` Prune on bootstrap:${n.prune_on_bootstrap}`)),console.log(s.gray(` Verify integrity: ${n.verify_integrity}`))):console.log(s.gray(" (not inside a workspace \u2014 showing in-memory cache only)")),console.log(s.gray(" In-memory cache: enabled")),console.log(s.gray(" Use: rapidkit cache clear|prune|repair")),0):e==="clear"?(await o.clear(),console.log(s.green("Cache clear completed")),console.log(s.green("\u2705 Cache cleared (all entries removed).")),0):e==="prune"?(await o.clear(),console.log(s.green("\u2705 Cache pruned (stale entries removed).")),n.prune_on_bootstrap||console.log(s.gray(" Tip: set prune_on_bootstrap: true in .rapidkit/cache-config.yml to auto-prune on every bootstrap.")),0):e==="repair"?n.self_heal?(await o.clear(),console.log(s.green("\u2705 Cache repaired (self-heal applied, stale entries evicted).")),n.verify_integrity&&console.log(s.gray(" Integrity verification is enabled in cache-config.yml.")),0):(console.log(s.yellow("\u26A0\uFE0F self_heal is disabled in .rapidkit/cache-config.yml \u2014 skipping repair.")),0):(console.log(s.yellow("Usage: rapidkit cache <status|clear|prune|repair>")),1)}async function ln(t,e,o,r){let n=(e||"show").toLowerCase(),i=f.join(t,".rapidkit","policies.yml");if(n==="show"||n==="status"||n==="get"){let l=await $o(t),u=Io(l);return console.log(s.cyan(`Policy file: ${i}`)),console.log(s.gray(` mode: ${u.mode}`)),console.log(s.gray(` dependency_sharing_mode: ${u.dependency_sharing_mode}`)),console.log(s.gray(" rules:")),console.log(s.gray(` enforce_workspace_marker: ${u.rules.enforce_workspace_marker}`)),console.log(s.gray(` enforce_toolchain_lock: ${u.rules.enforce_toolchain_lock}`)),console.log(s.gray(` disallow_untrusted_tool_sources: ${u.rules.disallow_untrusted_tool_sources}`)),console.log(s.gray(` enforce_compatibility_matrix: ${u.rules.enforce_compatibility_matrix}`)),console.log(s.gray(` require_mirror_lock_for_offline: ${u.rules.require_mirror_lock_for_offline}`)),console.log(s.gray("Examples:")),console.log(s.gray(" npx rapidkit workspace policy set mode strict")),console.log(s.gray(" npx rapidkit workspace policy set dependency_sharing_mode shared-runtime-caches")),console.log(s.gray(" npx rapidkit workspace policy set rules.enforce_toolchain_lock true")),0}if(n!=="set")return console.log(s.red(`Unknown workspace policy action: ${e||""}`)),console.log(s.gray("Available: show, set")),1;if(!o||typeof r>"u")return console.log(s.yellow("Usage: rapidkit workspace policy set <key> <value>")),console.log(s.gray("Allowed keys:")),console.log(s.gray(" mode (warn|strict)")),console.log(s.gray(" dependency_sharing_mode (isolated|shared-runtime-caches|shared-node-deps)")),console.log(s.gray(" rules.enforce_workspace_marker (true|false)")),console.log(s.gray(" rules.enforce_toolchain_lock (true|false)")),console.log(s.gray(" rules.disallow_untrusted_tool_sources (true|false)")),console.log(s.gray(" rules.enforce_compatibility_matrix (true|false)")),console.log(s.gray(" rules.require_mirror_lock_for_offline (true|false)")),1;let a=o.trim(),m=await $o(t);if(a==="mode"){let l=r.trim().toLowerCase();if(l!=="warn"&&l!=="strict")return console.log(s.red("\u274C Invalid mode. Use: warn | strict")),1;m=jo(m,"mode",`${l} # "warn" or "strict"`);}else if(a==="dependency_sharing_mode"){let l=r.trim().toLowerCase();if(l!=="isolated"&&l!=="shared-runtime-caches"&&l!=="shared-node-deps")return console.log(s.red("\u274C Invalid dependency_sharing_mode. Use: isolated | shared-runtime-caches | shared-node-deps")),1;m=jo(m,"dependency_sharing_mode",`${l} # "isolated" or "shared-runtime-caches" or "shared-node-deps"`);}else if(a.startsWith("rules.")){let l=a.slice(6);if(!(l in qo))return console.log(s.red(`\u274C Unknown policy rule: ${l}`)),1;let u=tn(r);if(u===null)return console.log(s.red("\u274C Rule values must be boolean: true | false")),1;m=Zr(m,l,u);}else return console.log(s.red(`\u274C Unknown policy key: ${a}`)),1;await en(t,m);let d=Io(m);return console.log(s.green(`\u2705 Updated ${a} in .rapidkit/policies.yml`)),console.log(s.gray(` mode: ${d.mode}`)),console.log(s.gray(` dependency_sharing_mode: ${d.dependency_sharing_mode}`)),console.log(s.gray(" Tip: run `npx rapidkit workspace policy show` to inspect all values.")),0}async function dn(t){let e=(t[1]||"status").toLowerCase(),o=t.includes("--json"),r=q(process.cwd());if(!r)return console.log(s.red("\u274C Not inside a RapidKit workspace")),console.log(s.gray("\u{1F4A1} Run this command from within a workspace directory")),1;let n=f.join(r,".rapidkit"),i=f.join(n,"mirror-config.json"),a=f.join(n,"mirror.lock"),c=f.join(n,"mirror","artifacts"),m=f.join(n,"reports");async function d(l){let u=new Date().toISOString().replace(/[:.]/g,"-"),y=f.join(m,`mirror-ops-${u}.json`),v=f.join(m,"mirror-ops.latest.json");await x__default.ensureDir(m),await De(y,l),await De(v,l);}if(e==="status"){if(!await x__default.pathExists(i))try{let A={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 x__default.ensureDir(n),await w.promises.writeFile(i,JSON.stringify(A,null,2)+`
153
- `,"utf-8"),console.log(s.gray(" mirror-config.json created with defaults (.rapidkit/mirror-config.json)"));}catch{}let u=await x__default.pathExists(i),y=await x__default.pathExists(c),v=await x__default.pathExists(a),p=y?(await w.promises.readdir(c,{withFileTypes:true})).filter(A=>A.isFile()).length:0,g={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:r,mirror:{configExists:u,lockExists:v,artifactsCount:p}};return await d(g),o?(process.stdout.write(`${JSON.stringify(g,null,2)}
154
- `),0):(console.log(s.cyan("RapidKit mirror status")),console.log(s.gray(`Workspace: ${r}`)),console.log(s.gray(`Config: ${u?"present":"missing"} (${i})`)),console.log(s.gray(`Lock: ${v?"present":"missing"} (${a})`)),console.log(s.gray(`Artifacts: ${p}`)),0)}if(e==="sync"||e==="verify"||e==="rotate"){let l=await St(r,{ciMode:true,offlineMode:e==="verify",forceRun:true}),u=l.checks.filter(p=>p.status==="failed"),y=l.checks.some(p=>p.id.startsWith("mirror.verify.")&&p.status==="failed");if(e==="verify"&&y){let p={command:"mirror",action:e,result:"failed",timestamp:new Date().toISOString(),workspacePath:r,details:l.details,checks:l.checks};if(await d(p),o)return process.stdout.write(`${JSON.stringify(p,null,2)}
155
- `),1;console.log(s.red("\u274C Mirror verify failed."));for(let g of l.checks.filter(A=>A.id.startsWith("mirror.verify.")))console.log(s.gray(`- ${g.id}: ${g.message}`));return 1}if(u.length>0){let p={command:"mirror",action:e,result:"failed",timestamp:new Date().toISOString(),workspacePath:r,details:l.details,checks:l.checks};if(await d(p),o)return process.stdout.write(`${JSON.stringify(p,null,2)}
156
- `),1;console.log(s.yellow(`\u26A0\uFE0F Mirror ${e} completed with ${u.length} issue(s).`));for(let g of u)console.log(s.gray(`- ${g.id}: ${g.message}`));return 1}let v={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:r,details:l.details,checks:l.checks};return await d(v),o?(process.stdout.write(`${JSON.stringify(v,null,2)}
157
- `),0):e==="rotate"?(console.log(s.green(`\u2705 Mirror rotate completed. Rotated files: ${l.details.rotatedFiles}.`)),0):e==="verify"?(console.log(s.green(`\u2705 Mirror verify completed. Verified artifacts: ${l.details.verifiedArtifacts}.`)),0):(console.log(s.green(`\u2705 Mirror sync completed. Synced artifacts: ${l.details.syncedArtifacts}.`)),0)}return console.log(s.yellow("Usage: rapidkit mirror <status|sync|verify|rotate> [--json]")),1}async function Tt(t){let e=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof e>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let o=process.cwd(),r=await Jo(o,async()=>{let n=q(o),i=Se("python",{runCommandInCwd:F,runCoreRapidkit:d});if(t.length>1){let y=f.resolve(o,t[1]),v=ye(y),p=await At(y);return ne(v,y)||p==="go"?await gt(y):ie(v,y)||p==="node"?await ft(y):se(v,y)||p==="python"?await mt(y,i):await d(t,{cwd:o})}let a=ye(o),c=!!q(o)&&o===q(o);if(!c&&ne(a,o))return await gt(o);let m=await At(o);if(!c&&(ie(a,o)||m==="node"))return await ft(o);if(!c&&(se(a,o)||m==="python"))return await mt(o,i);let d$1=n||q(o),l=Go(o),u=l?f.dirname(f.dirname(l)):null;if(u&&u!==d$1){let y=ye(u),v=await At(u);return ne(y,u)||v==="go"?await gt(u):ie(y,u)||v==="node"?await ft(u):se(y,u)||v==="python"?await mt(u,i):await d(["init"],{cwd:u})}if(d$1&&o===d$1){let y=await on(d$1);if(y!==0)return y;let v=await Vo(d$1);if(v.length===0){let p="minimal";try{p=JSON.parse(await w.promises.readFile(f.join(d$1,".rapidkit","workspace.json"),"utf-8")).profile??"minimal";}catch{}return p==="go-only"?(console.log(s.green("\u2714 Go workspace ready")),console.log(s.gray(`
158
- No projects yet \u2014 create one and then run init inside it:`)),console.log(s.white(" npx rapidkit create project gofiber.standard my-api")),console.log(s.white(" cd my-api && npx rapidkit init")),console.log(s.gray(`
159
- \u{1F4A1} Go dependencies are managed per-project (go.mod / go mod tidy).`))):(console.log(s.green("\u2714 Workspace ready")),console.log(s.gray(`
160
- No projects yet \u2014 create one to get started:`)),console.log(s.white(" npx rapidkit create project"))),0}for(let p of v){let g=ye(p);if(ne(g,p)){let A=await gt(p);if(A!==0)return A}else {if(ie(g,p)){let P=await ft(p);if(P!==0)return P;continue}if(se(g,p)){let P=await mt(p,i);if(P!==0)return P;continue}let A=await d(["init"],{cwd:p});if(A!==0)return A}}return 0}if(!d$1){let y=await a$2(),{name:v}=rn(o),{createProject:p}=await import('./create-27NVMJAR.js');return await p(v,{yes:true,userConfig:y}),0}return await d(t,{cwd:o})});return r.ok?r.value:r.code}finally{typeof e>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=e;}}async function To(t){let e=q(t);if(!e)return [];let o="warn";try{(await w.promises.readFile(f.join(e,".rapidkit","policies.yml"),"utf-8")).match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]==="strict"&&(o="strict");}catch{return []}if(o!=="strict")return [];let r=[],n=f.join(e,".rapidkit","toolchain.lock");if(!w.existsSync(n))return r.push("toolchain.lock is missing \u2014 run `rapidkit bootstrap` first (strict mode requires a reproducible toolchain)."),r;let i={};try{i=JSON.parse(await w.promises.readFile(n,"utf-8"));}catch{return []}let a=i.runtime??{},c=ye(t);ne(c,t)&&!a.go?.version?r.push("go.version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."):ie(c,t)&&!a.node?.version?r.push("node.version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."):se(c,t)&&!a.python?.version&&r.push("python.version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");try{let d=JSON.parse(await w.promises.readFile(f.join(e,".rapidkit","workspace.json"),"utf-8")).profile??"";d==="python-only"&&(ne(c,t)||ie(c,t))?r.push('Workspace profile is "python-only" but this project is not Python.'):d==="node-only"&&(ne(c,t)||se(c,t))?r.push('Workspace profile is "node-only" but this project is not Node.'):d==="go-only"&&(ie(c,t)||se(c,t))&&r.push('Workspace profile is "go-only" but this project is not Go.');}catch{}return r}async function pn(){let t=async P=>{if(!a()||!P.toLowerCase().endsWith(".cmd"))return false;try{let b=(await x__default.readFile(P,"utf8")).replace(/\r\n/g,`
161
- `).toLowerCase(),_=b.includes("\\.rapidkit\\rapidkit"),M=b.includes("\\.rapidkit\\rapidkit.cmd")||b.includes("\\.rapidkit\\rapidkit.exe")||b.includes("\\.venv\\scripts\\rapidkit.exe");return _&&!M}catch{return false}},e=process.cwd(),o=process.argv.slice(2),r=o[0],n=r==="init",i$1=new Set(["dev","start","build","test"]),a$2=!r||r==="--help"||r==="-h"||r==="help",c=Wo(e),m=w.existsSync(f.join(e,".rapidkit","project.json")),d$1=ye(e),l=ne(d$1,e)||ie(d$1,e),u=!!r&&i$1.has(r)&&l;if(wt(o[0])||o[0]==="create"||o[0]==="init"&&c&&!m)return false;try{let P=r==="shell"&&o[1]==="activate",S=r==="create",b=await Ut(e,{cwd:e,timeoutMs:1200});if(b.ok&&b.data?.isRapidkitProject&&b.data.engine==="python"){let _=S||wt(r);if(!a$2&&!P&&!_&&!n&&!u){if(r&&Eo.includes(r)){let T=await To(e).catch(()=>[]);if(T.length>0){process.stderr.write(s.red("\u274C Strict policy violations prevent running this command:")+`
162
- `);for(let I of T)process.stderr.write(s.red(` \u2022 ${I}`)+`
163
- `);process.exit(1);}}let M=await d(process.argv.slice(2),{cwd:e});process.exit(M);}}}catch{}let y=Go(e),v=a(),p=i(e),g=null;for(let P of p)if(await x__default.pathExists(P)){if(await t(P)){a$1.warn(`Skipping legacy/broken Windows launcher candidate: ${P}. Falling back to core bridge.`);continue}g=P;break}let A=r==="create";if(r==="init"&&c&&!m)return false;if(r&&Eo.includes(r)){let P=await To(e);if(P.length>0){process.stderr.write(s.red("\u274C Strict policy violations prevent running this command:")+`
164
- `);for(let S of P)process.stderr.write(s.red(` \u2022 ${S}`)+`
165
- `);process.exit(1);}}if(g&&r&&So.includes(r)&&!A&&!n&&!u){a$1.debug(`Delegating to local CLI: ${g} ${o.join(" ")}`);let P=r==="init"?_o():process.env,S=spawn(g,o,{stdio:"inherit",cwd:e,shell:v,env:P});return S.on("close",b=>{process.exit(b??0);}),S.on("error",b=>{a$1.error(`Failed to run local rapidkit: ${b.message}`),process.exit(1);}),true}if(y&&await x__default.pathExists(y))try{if((await x__default.readJson(y)).engine==="pip"){let S=o[0],b=i(e),_=null;for(let M of b)if(await x__default.pathExists(M)){if(await t(M)){a$1.warn(`Skipping legacy/broken Windows launcher candidate: ${M}. Falling back to core bridge.`);continue}_=M;break}if(_&&S&&So.includes(S)&&S!=="init"&&!u){a$1.debug(`Delegating to local CLI (early detection): ${_} ${o.join(" ")}`);let M=S==="init"?_o():process.env,T=spawn(_,o,{stdio:"inherit",cwd:e,env:M});return T.on("close",I=>process.exit(I??0)),T.on("error",I=>{a$1.error(`Failed to run local rapidkit: ${I.message}`),process.exit(1);}),true}if(S==="shell"&&o[1]==="activate"){let M=a()?`# RapidKit: activation snippet (PowerShell)
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)}
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||""}
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
+ ${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
+ `,"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
+ 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)+`
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
+ `),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
+ `),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
+ `),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(`
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
+ \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
+ 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
+ \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,`
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
+ `);for(let K of $)process.stderr.write(c$1.red(` \u2022 ${K}`)+`
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:")+`
183
+ `);for(let S of y)process.stderr.write(c$1.red(` \u2022 ${S}`)+`
184
+ `);process.exit(1);}}if(w&&n&&Jr.includes(n)&&!k&&!o&&!u){a$1.debug(`Delegating to local CLI: ${w} ${t.join(" ")}`);let y=n==="init"?Lr():process.env,S=spawn(w,t,{stdio:"inherit",cwd:e,shell:h,env:y});return S.on("close",P=>{process.exit(P??0);}),S.on("error",P=>{a$1.error(`Failed to run local rapidkit: ${P.message}`),process.exit(1);}),true}if(l&&await R__default.pathExists(l))try{if((await R__default.readJson(l)).engine==="pip"){let S=t[0],P=i(e),_=null;for(let A of P)if(await R__default.pathExists(A)){if(await r(A)){a$1.warn(`Skipping legacy/broken Windows launcher candidate: ${A}. Falling back to core bridge.`);continue}_=A;break}if(_&&S&&Jr.includes(S)&&S!=="init"&&!u){a$1.debug(`Delegating to local CLI (early detection): ${_} ${t.join(" ")}`);let A=S==="init"?Lr():process.env,$=spawn(_,t,{stdio:"inherit",cwd:e,env:A});return $.on("close",K=>process.exit(K??0)),$.on("error",K=>{a$1.error(`Failed to run local rapidkit: ${K.message}`),process.exit(1);}),true}if(S==="shell"&&t[1]==="activate"){let A=a()?`# RapidKit: activation snippet (PowerShell)
166
185
  $venv = ".venv"
167
186
  if (Test-Path "$venv\\Scripts\\Activate.ps1") { . "$venv\\Scripts\\Activate.ps1" }
168
187
  $env:RAPIDKIT_PROJECT_ROOT = (Get-Location).Path
@@ -180,17 +199,17 @@ elif [ -f "$VENV/bin/activate.fish" ]; then
180
199
  fi
181
200
  export RAPIDKIT_PROJECT_ROOT="$(pwd)"
182
201
  export PATH="$(pwd)/.rapidkit:$(pwd):$PATH"
183
- `;console.log(s.green.bold(`
202
+ `;console.log(c$1.green.bold(`
184
203
  \u2705 Activation snippet \u2014 run the following to activate this project in your current shell:
185
- `)),console.log(M),console.log(s.gray(`
204
+ `)),console.log(A),console.log(c$1.gray(`
186
205
  \u{1F4A1} After activation you can run: rapidkit dev
187
- `)),process.exit(0);}if(!a$2&&!wt(S)&&S!=="init"&&!u){let M=await d(o,{cwd:e});process.exit(M);}}}catch{}return false}var Pe=null,yt=false,ce=new Command,un=process.env.RAPIDKIT_SHOW_LEGACY==="1"||process.env.RAPIDKIT_SHOW_LEGACY?.toLowerCase()==="true";async function mn(t){if(t.length===0)return false;let e=t[0],o=t[1];if(Vr.includes(e))return false;if(Lo.includes(e))return true;if(wt(e)||e==="shell"&&o==="activate")return false;if(t.includes("--tui"))return true;if(e==="--help"||e==="-h"||e==="help"||e==="--version"||e==="-V"||t.includes("--template")||t.includes("-t"))return false;let r=new Set(["--yes","-y","--skip-git","--skip-install","--debug","--dry-run","--no-update-check","--create-workspace","--no-workspace"]);if(t.some(i=>r.has(i)))return false;let n=await h$1();return n?n.has(e):!!(a$4.has(e)||t.length>1)}ce.name("rapidkit").description("Create RapidKit workspaces and projects").version(b());var fn=a()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";ce.addHelpText("beforeAll",`RapidKit NPM CLI
206
+ `)),process.exit(0);}if(!s&&!jt(S)&&S!=="init"&&!u){let A=await d(t,{cwd:e});process.exit(A);}}}catch{}return false}var Me=null,xt=false,he=new Command,Ao=process.env.RAPIDKIT_SHOW_LEGACY==="1"||process.env.RAPIDKIT_SHOW_LEGACY?.toLowerCase()==="true";async function Io(r){if(r.length===0)return false;let e=r[0],t=r[1];if(uo.includes(e))return false;if(rn.includes(e))return true;if(jt(e)||e==="shell"&&t==="activate")return false;if(r.includes("--tui"))return true;if(e==="--help"||e==="-h"||e==="help"||e==="--version"||e==="-V"||r.includes("--template")||r.includes("-t"))return false;let n=new Set(["--yes","-y","--skip-git","--skip-install","--debug","--dry-run","--no-update-check","--create-workspace","--no-workspace"]);if(r.some(i=>n.has(i)))return false;let o=await h$1();return o?o.has(e):!!(a$4.has(e)||r.length>1)}he.name("rapidkit").description("Create RapidKit workspaces and projects").version(b());var Mo=a()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";he.addHelpText("beforeAll",`RapidKit NPM CLI
188
207
 
189
208
  Create workspaces, scaffold projects, and manage your development toolchain.
190
- `);ce.addHelpText("afterAll",`
209
+ `);he.addHelpText("afterAll",`
191
210
  Workspace Setup Commands
192
- rapidkit bootstrap Bootstrap projects in workspace (--profile python-only|node-only|go-only|polyglot|enterprise)
193
- rapidkit setup <runtime> Set up runtime toolchain (runtime: python | node | go)
211
+ rapidkit bootstrap Bootstrap projects in workspace (--profile java-only|python-only|node-only|go-only|polyglot|enterprise)
212
+ rapidkit setup <runtime> Set up runtime toolchain (runtime: python | node | go | java)
194
213
  rapidkit workspace list List registered workspaces on this system
195
214
  rapidkit mirror Manage registry mirrors (mirror status --json | sync | verify | rotate)
196
215
  rapidkit cache Manage package cache (cache status | clear | prune | repair)
@@ -206,42 +225,42 @@ Quick start:
206
225
  npx rapidkit my-workspace # Create + bootstrap workspace
207
226
  cd my-workspace
208
227
  npx rapidkit create project # Interactive kit picker
209
- ${fn} # Install deps + run
228
+ ${Mo} # Install deps + run
210
229
 
211
230
  Notes:
212
231
  --skip-install (npm wrapper) enables fast-path for lock/dependency steps.
213
232
  It is different from core --skip-essentials (essential module installation).
214
233
 
215
234
  Use "rapidkit help <command>" for more information.
216
- `);ce.argument("[name]","Name of the workspace or project directory").addOption(new Option("-t, --template <template>","Legacy: create a project with template (fastapi, nestjs) instead of a workspace").hideHelp()).option("-y, --yes","Skip prompts and use defaults").option("--author <name>","Author/team name for workspace metadata").addOption(new Option("--skip-git","Skip git initialization").hideHelp()).addOption(new Option("--skip-install","Legacy: skip installing dependencies (template mode)").hideHelp()).option("--debug","Enable debug logging").addOption(new Option("--dry-run","Show what would be created without creating it").hideHelp()).addOption(new Option("--install-method <method>","Installation method: poetry, venv, or pipx").choices(["poetry","venv","pipx"]).hideHelp()).addOption(new Option("--profile <profile>","Workspace bootstrap profile: minimal, python-only, node-only, go-only, polyglot, enterprise").choices(["minimal","python-only","node-only","go-only","polyglot","enterprise"]).hideHelp()).addOption(new Option("--create-workspace","When creating a project outside a workspace: create and register a workspace in the current directory").hideHelp()).addOption(new Option("--no-workspace","When creating a project outside a workspace: do not create a workspace").hideHelp()).option("--no-update-check","Skip checking for updates").action(async(t,e$2)=>{try{e$2.debug&&(a$1.setDebug(true),a$1.debug("Debug mode enabled"));let o=await a$2();a$1.debug("User config loaded",o);let r=await b$1();a$1.debug("RapidKit config loaded",r);let n=c(o,r,{author:e$2.author,pythonVersion:void 0,skipGit:e$2.skipGit});a$1.debug("Merged config",n),e$2.updateCheck!==false&&await a$3(),console.log(s.blue.bold(`
235
+ `);he.argument("[name]","Name of the workspace or project directory").addOption(new Option("-t, --template <template>","Legacy: create a project with template (fastapi, nestjs, springboot, gofiber, gogin) instead of a workspace").hideHelp()).option("-y, --yes","Skip prompts and use defaults").option("--author <name>","Author/team name for workspace metadata").addOption(new Option("--skip-git","Skip git initialization").hideHelp()).addOption(new Option("--skip-install","Legacy: skip installing dependencies (template mode)").hideHelp()).option("--debug","Enable debug logging").addOption(new Option("--dry-run","Show what would be created without creating it").hideHelp()).addOption(new Option("--install-method <method>","Installation method: poetry, venv, or pipx").choices(["poetry","venv","pipx"]).hideHelp()).addOption(new Option("--profile <profile>","Workspace bootstrap profile: minimal, java-only, python-only, node-only, go-only, polyglot, enterprise").choices(["minimal","java-only","python-only","node-only","go-only","polyglot","enterprise"]).hideHelp()).addOption(new Option("--create-workspace","When creating a project outside a workspace: create and register a workspace in the current directory").hideHelp()).addOption(new Option("--no-workspace","When creating a project outside a workspace: do not create a workspace").hideHelp()).option("--no-update-check","Skip checking for updates").action(async(r,e$2)=>{try{e$2.debug&&(a$1.setDebug(true),a$1.debug("Debug mode enabled"));let t=await a$2();a$1.debug("User config loaded",t);let n=await b$1();a$1.debug("RapidKit config loaded",n);let o=c(t,n,{author:e$2.author,pythonVersion:void 0,skipGit:e$2.skipGit});a$1.debug("Merged config",o),e$2.updateCheck!==false&&await a$3(),console.log(c$1.blue.bold(`
217
236
  \u{1F680} Welcome to RapidKit NPM CLI!
218
- `)),t||(Bo(),process.exit(0));try{vt(t);}catch(c){throw c instanceof e&&(a$1.error(`
219
- \u274C ${c.message}`),c.details&&a$1.warn(`\u{1F4A1} ${c.details}
220
- `),process.exit(1)),c}let i=f.resolve(process.cwd(),t);Pe=i,await x__default.pathExists(i)&&(a$1.error(`
221
- \u274C Directory "${t}" already exists`),console.log(s.cyan(`
237
+ `)),r||(pn(),process.exit(0));try{Ge(r);}catch(a){throw a instanceof e&&(a$1.error(`
238
+ \u274C ${a.message}`),a.details&&a$1.warn(`\u{1F4A1} ${a.details}
239
+ `),process.exit(1)),a}let i=f.resolve(process.cwd(),r);Me=i,await R__default.pathExists(i)&&(a$1.error(`
240
+ \u274C Directory "${r}" already exists`),console.log(c$1.cyan(`
222
241
  \u{1F4A1} Choose a different name or delete the existing directory.
223
- `)),process.exit(1));let a=!!e$2.template;if(e$2.dryRun){console.log(s.cyan(`
242
+ `)),process.exit(1));let s=!!e$2.template;if(e$2.dryRun){console.log(c$1.cyan(`
224
243
  \u{1F50D} Dry-run mode - showing what would be created:
225
- `)),console.log(s.white("\u{1F4C2} Path:"),i),console.log(s.white("\u{1F4E6} Type:"),a?`Project (${e$2.template})`:"Workspace"),console.log();return}if(!e$2.yes&&!a?await he.prompt([{type:"input",name:"author",message:"Author name:",default:process.env.USER||"RapidKit User"}]):e$2.yes&&console.log(s.gray(`Using default values (--yes flag)
226
- `)),a){let c=String(e$2.template||"").trim(),m=c.toLowerCase(),d$1=m==="fastapi"?"fastapi.standard":m==="nestjs"?"nestjs.standard":m==="go"||m==="fiber"?"gofiber.standard":m==="gin"?"gogin.standard":c;if(ht(d$1)){let S=f.resolve(process.cwd(),t),{generateGoFiberKit:b}=await import('./gofiber-standard-JDPREQCP.js');await b(S,{project_name:t,module_path:t,skipGit:e$2.skipGit});return}if(Ue(d$1)){let S=f.resolve(process.cwd(),t),{generateGoGinKit:b}=await import('./gogin-standard-DCERHHVB.js');await b(S,{project_name:t,module_path:t,skipGit:e$2.skipGit});return}if(!!!$t(process.cwd())){let{registerWorkspaceAtPath:S}=await import('./create-27NVMJAR.js');if(e$2.createWorkspace)await S(process.cwd(),{skipGit:e$2.skipGit,yes:e$2.yes,userConfig:o});else if(!e$2.noWorkspace)if(e$2.yes)await S(process.cwd(),{skipGit:e$2.skipGit,yes:true,userConfig:o});else {let{createWs:b}=await he.prompt([{type:"confirm",name:"createWs",message:"This project will be created outside a RapidKit workspace. Create and register a workspace here?",default:true}]);b&&await S(process.cwd(),{skipGit:e$2.skipGit,yes:false,userConfig:o});}}let u=["create","project",d$1,t,"--output",process.cwd()];e$2.yes&&u.push("--yes");let y=q(process.cwd()),v=!!e$2.skipInstall,p=v||!!y;v&&u.push("--skip-essentials");let g=p?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0,A=await e$1(u,{cwd:process.cwd(),env:g});A!==0&&process.exit(A),y&&!e$2.skipInstall&&(console.log(s.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(s.white(" Next: cd <project-name> && npx rapidkit init")));let P=$t(process.cwd());if(P){let S=f.dirname(P),b=f.join(S,".python-version"),_=f.join(i,".python-version");try{if(await x__default.pathExists(b)){let M=w.readFileSync(b,"utf-8");w.writeFileSync(_,M.trim()+`
227
- `),a$1.debug(`Synced Python version ${M.trim()} from workspace to project`);}}catch(M){a$1.debug("Could not sync Python version from workspace:",M);}}if(!e$2.skipInstall){let S=await d(["init",i],{cwd:process.cwd()});if(S!==0&&process.exit(S),P){let b=f.dirname(P),_=f.join(b,".python-version"),M=f.join(i,".python-version");try{if(await x__default.pathExists(_)){let T=w.readFileSync(_,"utf-8");w.writeFileSync(M,T.trim()+`
228
- `),a$1.debug(`Re-synced Python version ${T.trim()} after init`);}}catch(T){a$1.debug("Could not re-sync Python version after init:",T);}}}}else {let{createProject:c}=await import('./create-27NVMJAR.js');await c(t,{skipGit:e$2.skipGit,dryRun:e$2.dryRun,yes:e$2.yes,userConfig:n,installMethod:e$2.installMethod,profile:e$2.profile});}}catch(o){o instanceof e?(a$1.error(`
229
- \u274C ${o.message}`),o.details&&a$1.warn(`\u{1F4A1} ${o.details}`),a$1.debug("Error code:",o.code)):(a$1.error(`
230
- \u274C An unexpected error occurred:`),console.error(o)),process.exit(1);}finally{Pe=null;}});mo(ce);Vt(ce);ce.command("shell <action>").description("Shell helpers (activate virtualenv in current shell)").action(async t=>{t!=="activate"&&(console.log(s.red(`Unknown shell command: ${t}`)),process.exit(1));let e=process.cwd();function o(m){let d=m;for(;;){let l=f.join(d,".rapidkit","context.json");if(w.existsSync(l))return l;let u=f.dirname(d);if(u===d)break;d=u;}return null}let r=o(e);function n(m){let d=m;for(;;){let l=f.join(d,".venv"),u=f.join(d,".rapidkit","activate");if(w.existsSync(u)||w.existsSync(l))return {venv:l,activateFile:u};let y=f.dirname(d);if(y===d)break;d=y;}return null}let i=n(e);!r&&!i&&(console.log(s.yellow("No RapidKit project found in this directory")),process.exit(1));let a$1;i&&w.existsSync(i.activateFile)?a$1=i.activateFile:i&&w.existsSync(i.venv)?a$1=h(i.venv):(console.log(s.yellow("No virtual environment found")),process.exit(1));let c=a();console.log(c?`call "${a$1}"`:`. "${a$1}"`);});ce.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(t,e)=>{t&&t!=="workspace"&&(console.log(s.red(`Unknown doctor scope: ${t}`)),console.log(s.gray("Available: workspace")),console.log(s.gray("Usage: npx rapidkit doctor or npx rapidkit doctor workspace")),process.exit(1));let o=await Yr({scope:t,workspaceFlag:e.workspace});o.detected&&!e.json&&(console.log(s.yellow("\u26A0\uFE0F Local launcher shadow detected for doctor workspace checks.")),o.candidatePath&&console.log(s.gray(` Candidate: ${o.candidatePath}`)),console.log(s.gray(" Running npm-wrapper doctor workflow directly as safe fallback to avoid ambiguous rapidkit binary resolution.")),console.log(s.gray(" If this happens in a shell call, run: npx --yes --package rapidkit rapidkit doctor workspace")));let{runDoctor:r}=await import('./doctor-P57TTWEP.js');await r({...e,workspace:e.workspace||t==="workspace"});});ce.command("workspace <action> [subaction] [key] [value]").description("Manage RapidKit workspaces (list, sync, policy)").action(async(t,e,o,r)=>{if(t==="list"){let{listWorkspaces:n}=await import('./workspace-VXNLNKCM.js');await n();}else if(t==="sync"){let n=q(process.cwd());n||(console.log(s.red("\u274C Not inside a RapidKit workspace")),console.log(s.gray("\u{1F4A1} Run this command from within a workspace directory")),process.exit(1));let{syncWorkspaceProjects:i}=await import('./workspace-VXNLNKCM.js');console.log(s.cyan(`\u{1F4C2} Scanning workspace: ${f.basename(n)}`)),await i(n);}else if(t==="policy"){let n=q(process.cwd());n||(console.log(s.red("\u274C Not inside a RapidKit workspace")),console.log(s.gray("\u{1F4A1} Run this command from within a workspace directory")),process.exit(1));let i=await ln(n,e,o,r);i!==0&&process.exit(i);}else console.log(s.red(`Unknown workspace action: ${t}`)),console.log(s.gray("Available: list, sync, policy")),process.exit(1);});function Bo(){let t=a()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";console.log(s.white(`Usage:
231
- `)),console.log(s.cyan(` npx rapidkit <workspace-name> [options]
232
- `)),console.log(s.bold("Quick start \u2014 workspace workflow:")),console.log(s.cyan(" npx rapidkit my-workspace ")+s.gray("# Create workspace (interactive profile picker)")),console.log(s.cyan(" cd my-workspace")),console.log(s.cyan(" npx rapidkit bootstrap ")+s.gray("# Bootstrap all runtime toolchains")),console.log(s.cyan(" npx rapidkit create project ")+s.gray("# Interactive kit picker")),console.log(s.cyan(" cd my-api")),console.log(s.cyan(` ${t}
233
- `)),console.log(s.bold("Workspace profiles (asked during creation):")),console.log(s.gray(" minimal Foundation files only \u2014 fastest bootstrap (default)")),console.log(s.gray(" python-only Python + Poetry (FastAPI, Django, ML)")),console.log(s.gray(" node-only Node.js runtime (NestJS, Express, Next.js)")),console.log(s.gray(" go-only Go runtime (Fiber, Gin, gRPC)")),console.log(s.gray(" polyglot Python + Node.js + Go multi-runtime")),console.log(s.gray(` enterprise Polyglot + governance + Sigstore
234
- `)),console.log(s.bold("Workspace commands (inside a workspace):")),console.log(s.gray(" npx rapidkit bootstrap [--profile <p>] Re-bootstrap toolchains")),console.log(s.gray(" npx rapidkit workspace list List registered workspaces")),console.log(s.gray(" npx rapidkit workspace policy show Show effective workspace policies")),console.log(s.gray(" npx rapidkit workspace policy set <k> <v> Update workspace policy values")),console.log(s.gray(" npx rapidkit setup python|node|go [--warm-deps] Set up runtime (+ optional deps warm-up)")),console.log(s.gray(" npx rapidkit mirror [status|sync|verify|rotate] Registry mirror management")),console.log(s.gray(` npx rapidkit cache [status|clear|prune|repair] Package cache management
235
- `)),console.log(s.bold("Options (workspace creation):")),console.log(s.gray(" -y, --yes Skip prompts and use defaults")),console.log(s.gray(" --author <name> Author/team name for workspace metadata")),console.log(s.gray(" --skip-git Skip git initialization")),console.log(s.gray(" --debug Enable debug logging")),console.log(s.gray(" --dry-run Show what would be created")),console.log(s.gray(" --create-workspace When creating a project outside a workspace: create and register a workspace in the current directory")),console.log(s.gray(" --no-workspace When creating a project outside a workspace: do not create a workspace")),console.log(s.gray(` --no-update-check Skip checking for updates
236
- `)),console.log(s.bold("Project commands (inside a project):")),console.log(s.gray(" npx rapidkit create project Scaffold a new project")),console.log(s.gray(" cd my-api Change directory to the new project")),console.log(s.gray(" npx rapidkit init Install project dependencies")),console.log(s.gray(" npx rapidkit dev Start dev server")),console.log(s.gray(" npx rapidkit build Build for production")),console.log(s.gray(` npx rapidkit test Run tests
237
- `)),console.log(s.bold("Flags clarification:")),console.log(s.gray(" --skip-install npm fast-path for lock/dependency steps")),console.log(s.gray(` --skip-essentials core flag for skipping essential module installation
238
- `)),un?(console.log(s.bold("Legacy (shown because RAPIDKIT_SHOW_LEGACY=1):")),console.log(s.gray(" npx rapidkit my-project --template fastapi")),console.log(s.gray(" npx rapidkit my-project --template nestjs")),console.log(s.gray(` --skip-install Fast-path lock/deps (legacy template mode) \u2014 not same as --skip-essentials
239
- `))):console.log(s.gray(`Tip: set RAPIDKIT_SHOW_LEGACY=1 to show legacy template flags in help.
240
- `));}var Oo="__rapidkit_signal_handlers_registered__",Mo=globalThis;Mo[Oo]||(Mo[Oo]=true,process.on("SIGINT",async()=>{if(!yt){if(yt=true,console.log(s.yellow(`
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()+`
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(`
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:
250
+ `)),console.log(c$1.cyan(` npx rapidkit <workspace-name> [options]
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
+ `)),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
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
+ `)),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
+ `)),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
257
+ `)),Ao?(console.log(c$1.bold("Legacy (shown because RAPIDKIT_SHOW_LEGACY=1):")),console.log(c$1.gray(" npx rapidkit my-project --template fastapi")),console.log(c$1.gray(" npx rapidkit my-project --template nestjs")),console.log(c$1.gray(" npx rapidkit my-project --template springboot")),console.log(c$1.gray(" npx rapidkit my-project --template gofiber")),console.log(c$1.gray(" npx rapidkit my-project --template gogin")),console.log(c$1.gray(` --skip-install Fast-path lock/deps (legacy template mode) \u2014 not same as --skip-essentials
258
+ `))):console.log(c$1.gray(`Tip: set RAPIDKIT_SHOW_LEGACY=1 to show legacy template flags in help.
259
+ `));}var zr="__rapidkit_signal_handlers_registered__",Qr=globalThis;Qr[zr]||(Qr[zr]=true,process.on("SIGINT",async()=>{if(!xt){if(xt=true,console.log(c$1.yellow(`
241
260
 
242
- \u26A0\uFE0F Interrupted by user`)),Pe&&await x__default.pathExists(Pe)){console.log(s.gray("Cleaning up partial installation..."));try{await x__default.remove(Pe),console.log(s.green("\u2713 Cleanup complete"));}catch(t){a$1.debug("Cleanup failed:",t);}}process.exit(130);}}),process.on("SIGTERM",async()=>{if(!yt){if(yt=true,a$1.debug("Received SIGTERM"),Pe&&await x__default.pathExists(Pe))try{await x__default.remove(Pe);}catch(t){a$1.debug("Cleanup failed:",t);}process.exit(143);}}));var gn=process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test",yn=(()=>{let t=process.argv[1];if(!t)return false;try{return w.realpathSync(t)===w.realpathSync(fileURLToPath(import.meta.url))}catch{return f.resolve(t)===f.resolve(fileURLToPath(import.meta.url))}})(),hn=!gn||yn;if(hn){let t=process.argv.slice(2),e=t[0],o=process.cwd(),r=Wo(o),n=w.existsSync(f.join(o,".rapidkit","project.json")),i=Ao(e),a=e==="init"&&r&&!n;(t.length===0||t.length===1&&(e==="--help"||e==="-h"||e==="help"))&&(console.log(s.blue.bold(`
261
+ \u26A0\uFE0F Interrupted by user`)),Me&&await R__default.pathExists(Me)){console.log(c$1.gray("Cleaning up partial installation..."));try{await R__default.remove(Me),console.log(c$1.green("\u2713 Cleanup complete"));}catch(r){a$1.debug("Cleanup failed:",r);}}process.exit(130);}}),process.on("SIGTERM",async()=>{if(!xt){if(xt=true,a$1.debug("Received SIGTERM"),Me&&await R__default.pathExists(Me))try{await R__default.remove(Me);}catch(r){a$1.debug("Cleanup failed:",r);}process.exit(143);}}));var $o=process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test",To=(()=>{let r=process.argv[1];if(!r)return false;try{return v.realpathSync(r)===v.realpathSync(fileURLToPath(import.meta.url))}catch{return f.resolve(r)===f.resolve(fileURLToPath(import.meta.url))}})(),Do=!$o||To;if(Do){let r=process.argv.slice(2),e=r[0],t=process.cwd(),n=on(t),o=v.existsSync(f.join(t,".rapidkit","project.json")),i=Ur(e),s=e==="init"&&n&&!o;(r.length===0||r.length===1&&(e==="--help"||e==="-h"||e==="help"))&&(console.log(c$1.blue.bold(`
243
262
  \u{1F680} Welcome to RapidKit NPM CLI!
244
- `)),Bo(),process.exit(0)),i?ce.parse():a?Tt(t).then(m=>process.exit(m)).catch(m=>{process.stderr.write(`RapidKit (npm) failed to run workspace init: ${m?.message??m}
245
- `),process.exit(1);}):pn().then(async m=>{if(!m){let d$1=process.argv.slice(2);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] argv=${JSON.stringify(d$1)}
246
- `),Ao(d$1[0])){ce.parse();return}if(d$1[0]==="create"){let u=await Ko(d$1);process.exit(u);}if(d$1[0]==="init"){let u=await Tt(d$1);process.exit(u);}if(Br(d$1[0])){if(d$1[0]==="bootstrap"){let y=await nn(d$1);process.exit(y);}if(d$1[0]==="setup"){let y=await sn(d$1);process.exit(y);}if(d$1[0]==="cache"){let y=await cn(d$1);process.exit(y);}let u=await dn(d$1);process.exit(u);}if(Fo.includes(d$1[0])){let u=d$1[0],y=ye(process.cwd()),v=q(process.cwd());if(v){let g=f.join(v,".rapidkit","policies.yml");if(await x__default.pathExists(g))try{let A=await w.promises.readFile(g,"utf-8");if(((A.match(/^\s*enforcement_mode:\s*(warn|strict)\s*(?:#.*)?$/m)??A.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m))?.[1]??"warn")==="strict"){let b=f.join(v,".rapidkit","toolchain.lock"),_=[];if(!await x__default.pathExists(b))_.push("toolchain.lock is missing \u2014 run `rapidkit bootstrap` first (strict mode requires a reproducible toolchain).");else try{let I=JSON.parse(await w.promises.readFile(b,"utf-8")).runtime??{};ne(y,process.cwd())&&!I.go?.version&&_.push("Go runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."),ie(y,process.cwd())&&!I.node?.version&&_.push("Node runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."),se(y,process.cwd())&&!I.python?.version&&_.push("Python runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");}catch{}let M=f.join(v,".rapidkit","workspace.json");if(await x__default.pathExists(M))try{let I=JSON.parse(await w.promises.readFile(M,"utf-8")).profile??"";I==="python-only"&&(ne(y,process.cwd())||ie(y,process.cwd()))&&_.push('Workspace profile is "python-only" but this project is not Python. Update the workspace profile or use a polyglot workspace.'),I==="node-only"&&(ne(y,process.cwd())||se(y,process.cwd()))&&_.push('Workspace profile is "node-only" but this project is not Node. Update the workspace profile or use a polyglot workspace.'),I==="go-only"&&(se(y,process.cwd())||ie(y,process.cwd()))&&_.push('Workspace profile is "go-only" but this project is not Go. Update the workspace profile or use a polyglot workspace.');}catch{}if(_.length>0){console.log(s.red(`\u274C Strict policy violations block \`${u}\`:`));for(let T of _)console.log(s.red(` \u2022 ${T}`));console.log(s.gray("\u{1F4A1} Fix violations or switch to warn mode: set mode: warn in .rapidkit/policies.yml")),process.exit(1);}}}catch{}}let p=await Jo(process.cwd(),async()=>{if(ne(y,process.cwd())){let g=Se("go",{runCommandInCwd:F,runCoreRapidkit:d}),A=u==="dev"?await g.runDev(process.cwd()):u==="test"?await g.runTest(process.cwd()):u==="build"?await g.runBuild(process.cwd()):await g.runStart(process.cwd());return A.message&&console.log(s.red(`\u274C ${A.message}`)),A.exitCode}if(ie(y,process.cwd()))return u==="dev"?await He("dev",process.cwd()):u==="test"?await He("test",process.cwd()):u==="build"?await He("build",process.cwd()):await He("start",process.cwd());if(se(y,process.cwd())){let g=Se("python",{runCommandInCwd:F,runCoreRapidkit:d});return u==="dev"?(await g.runDev(process.cwd())).exitCode:u==="test"?(await g.runTest(process.cwd())).exitCode:u==="build"?(await g.runBuild(process.cwd())).exitCode:(await g.runStart(process.cwd())).exitCode}return -1});p.ok||process.exit(p.code),p.value>=0&&process.exit(p.value);}if(d$1[0]==="add"||d$1[0]==="module"&&d$1[1]==="add"){let u=ye(process.cwd());(u?.runtime==="go"||u?.module_support===false)&&(console.error(s.red("\u274C RapidKit modules are not available for Go projects.")),console.error(s.gray(" The module system requires Python and is only supported for FastAPI and NestJS projects.")),process.exit(1));}let l=await mn(d$1);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] shouldForwardToCore=${l}
247
- `),l){let u=await d(d$1,{cwd:process.cwd()});process.exit(u);}ce.parse();}});}export{Ur as NPM_ONLY_TOP_LEVEL_COMMANDS,Vr as WRAPPER_ORCHESTRATED_PROJECT_COMMANDS,Yr as detectWindowsDoctorWorkspaceShadow,nn as handleBootstrapCommand,cn as handleCacheCommand,Ko as handleCreateOrFallback,Tt as handleInitCommand,dn as handleMirrorCommand,sn as handleSetupCommand,mn as shouldForwardToCore};
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
+ `),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}
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};