rapidkit 0.27.3 → 0.27.5

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,189 +1,189 @@
1
1
  #!/usr/bin/env node
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 as j$1}from'./chunk-ZAZJEYYT.js';import {a,h,i,f,b as b$2,c as c$3,d as d$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 Ee from'inquirer';import m from'path';import {fileURLToPath}from'url';import {exec,spawn}from'child_process';import bn from'validate-npm-package-name';import*as j from'fs-extra';import j__default from'fs-extra';import k,{promises,createWriteStream}from'fs';import Sn,{tmpdir}from'os';import {execa}from'execa';import {promisify}from'util';import Un from'ora';import {createVerify,createHash,createHmac}from'crypto';import qr from'http';import Ur from'https';function Je(r){let e=bn(r);if(!e.validForNewPackages){let n=e.errors||[],o=e.warnings||[],s=[...n,...o];throw new j$1(r,`NPM validation failed: ${s.join(", ")}`)}if(!/^[a-z][a-z0-9_-]*$/.test(r))throw new j$1(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$1(r,`"${r}" is a reserved name. Please choose a different name.`);if(r.length<2)throw new j$1(r,"Name must be at least 2 characters long");if(r.length>214)throw new j$1(r,"Name must be less than 214 characters");return true}function Cn(){return d$1()}function xn(r,e){return r==="py"?["-3",...e]:e}function _n(r){return typeof r=="object"&&r!==null}async function Rn(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 jn(r,e){let t=["-m","rapidkit",...r],n=Cn();for(let o of n){let s=await Rn(o,xn(o,t),e?.cwd,e?.timeoutMs);if(!s.ok)continue;let i=(s.stdout??"").trim();try{let a=JSON.parse(i);return _n(a)?{ok:true,command:o,exitCode:s.exitCode,stdout:s.stdout,stderr:s.stderr,data:a}:{ok:false,command:o,exitCode:s.exitCode,stdout:s.stdout,stderr:s.stderr}}catch{return {ok:false,command:o,exitCode:s.exitCode,stdout:s.stdout,stderr:s.stderr}}}return {ok:false}}async function ur(r,e){let t=await jn(["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 It=m.join(Sn.homedir(),".rapidkit"),pt=m.join(It,"config.json");function qe(){try{if(!k.existsSync(pt))return {};let r=k.readFileSync(pt,"utf-8");return JSON.parse(r)}catch{return {}}}function mt(r){let t={...qe(),...r};k.existsSync(It)||k.mkdirSync(It,{recursive:true}),k.writeFileSync(pt,JSON.stringify(t,null,2),"utf-8");}function Ze(){return process.env.OPENAI_API_KEY||qe().openaiApiKey||null}function Mt(){return qe().aiEnabled!==false}function $t(){return pt}async function mr(){return (await import('inquirer')).default}function fr(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(`
2
+ import {e as e$2,c as c$3}from'./chunk-TYC54P7X.js';import {f as f$1,e as e$1,d,i as i$1,a as a$4}from'./chunk-RWV2GNJJ.js';import {a as a$2,b as b$1,c,e,j}from'./chunk-ZAZJEYYT.js';import {b as b$2,d as d$1}from'./chunk-RV6HBTFC.js';import {c as c$4}from'./chunk-NFUXULIF.js';import {a,h,i,f as f$2,b as b$3,c as c$2,d as d$2}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*as f from'path';import f__default from'path';import {fileURLToPath}from'url';import {exec,spawn}from'child_process';import Lo from'validate-npm-package-name';import*as _ from'fs-extra';import ___default from'fs-extra';import k,{promises,createWriteStream}from'fs';import Vo,{tmpdir,homedir}from'os';import {execa}from'execa';import {promisify}from'util';import pn from'ora';import {createVerify,createHash,createHmac}from'crypto';import oo from'http';import no from'https';function qe(r){let e=Lo(r);if(!e.validForNewPackages){let o=e.errors||[],n=e.warnings||[],i=[...o,...n];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 Go(){return d$2()}function Jo(r,e){return r==="py"?["-3",...e]:e}function qo(r){return typeof r=="object"&&r!==null}async function Uo(r,e,t,o=8e3){try{let n=await execa(r,e,{cwd:t,timeout:o,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 Bo(r,e){let t=["-m","rapidkit",...r],o=Go();for(let n of o){let i=await Uo(n,Jo(n,t),e?.cwd,e?.timeoutMs);if(!i.ok)continue;let s=(i.stdout??"").trim();try{let a=JSON.parse(s);return qo(a)?{ok:true,command:n,exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr,data:a}:{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 Pr(r,e){let t=await Bo(["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 Nt=f__default.join(Vo.homedir(),".rapidkit"),yt=f__default.join(Nt,"config.json");function Ue(){try{if(!k.existsSync(yt))return {};let r=k.readFileSync(yt,"utf-8");return JSON.parse(r)}catch{return {}}}function ht(r){let t={...Ue(),...r};k.existsSync(Nt)||k.mkdirSync(Nt,{recursive:true}),k.writeFileSync(yt,JSON.stringify(t,null,2),"utf-8");}function et(){return process.env.OPENAI_API_KEY||Ue().openaiApiKey||null}function Kt(){return Ue().aiEnabled!==false}function Ft(){return yt}async function xr(){return (await import('inquirer')).default}function jr(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 o=t.key;o?o.startsWith("sk-")||(console.log(c$1.red(`
3
3
  \u274C Invalid API key format (should start with sk-)
4
- `)),process.exit(1)):n=(await(await mr()).prompt([{type:"password",name:"apiKey",message:"Enter your OpenAI API key:",validate:i=>i?i.startsWith("sk-")?i.length<20?"API key seems too short":true:"Invalid API key format (should start with sk-)":"API key is required"}])).apiKey,mt({openaiApiKey:n}),console.log(c$1.green(`
4
+ `)),process.exit(1)):o=(await(await xr()).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,ht({openaiApiKey:o}),console.log(c$1.green(`
5
5
  \u2705 OpenAI API key saved successfully!
6
- `)),console.log(c$1.gray(`Stored in: ${$t()}`)),console.log(c$1.cyan(`
6
+ `)),console.log(c$1.gray(`Stored in: ${Ft()}`)),console.log(c$1.cyan(`
7
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
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=qe();if(console.log(c$1.bold(`
9
+ `));}),e.command("show").description("Show current configuration").action(()=>{let t=Ue();if(console.log(c$1.bold(`
10
10
  \u2699\uFE0F RapidKit Configuration
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: ${$t()}
13
- `));}),e.command("remove-api-key").description("Remove stored OpenAI API key").action(async()=>{if(!qe().openaiApiKey){console.log(c$1.yellow(`
11
+ `)),t.openaiApiKey){let o=t.openaiApiKey.substring(0,8)+"..."+t.openaiApiKey.slice(-4);console.log(c$1.cyan("OpenAI API Key:"),c$1.white(o));}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: ${Ft()}
13
+ `));}),e.command("remove-api-key").description("Remove stored OpenAI API key").action(async()=>{if(!Ue().openaiApiKey){console.log(c$1.yellow(`
14
14
  \u26A0\uFE0F No API key is currently stored
15
- `));return}(await(await mr()).prompt([{type:"confirm",name:"confirm",message:"Are you sure you want to remove your OpenAI API key?",default:false}])).confirm?(mt({openaiApiKey:void 0}),console.log(c$1.green(`
15
+ `));return}(await(await xr()).prompt([{type:"confirm",name:"confirm",message:"Are you sure you want to remove your OpenAI API key?",default:false}])).confirm?(ht({openaiApiKey:void 0}),console.log(c$1.green(`
16
16
  \u2705 API key removed successfully
17
17
  `))):console.log(c$1.gray(`
18
18
  Cancelled
19
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
20
  \u274C Invalid action: ${t}`)),console.log(c$1.gray(`Use: rapidkit config ai enable|disable
21
- `)),process.exit(1));let n=t==="enable";mt({aiEnabled:n}),console.log(c$1.green(`
22
- \u2705 AI features ${n?"enabled":"disabled"}
23
- `));});}var ft=null,gt=false,Ot=null;async function En(){return Ot||(Ot=(await import('openai')).default),Ot}function gr(){gt=true;}function yr(r){let t=new Array(1536),n=0;for(let s=0;s<r.length;s++)n=(n<<5)-n+r.charCodeAt(s),n=n&n;for(let s=0;s<1536;s++)n=n*1664525+1013904223&4294967295,t[s]=n/4294967295*2-1;let o=Math.sqrt(t.reduce((s,i)=>s+i*i,0));return t.map(s=>s/o)}async function yt(r){let e=await En();ft=new e({apiKey:r});}function hr(){if(!ft)throw new Error("OpenAI client not initialized. Call initOpenAI() first with your API key.");return ft}async function Dt(r){return gt?yr(r):(await hr().embeddings.create({model:"text-embedding-3-small",input:r,encoding_format:"float"})).data[0].embedding}async function wr(r){return gt?r.map(yr):(await hr().embeddings.create({model:"text-embedding-3-small",input:r,encoding_format:"float"})).data.map(n=>n.embedding)}function kr(){return ft!==null}function Ue(){return gt}var Mn=promisify(exec);function Tt(r){return Array.isArray(r)?r.filter(e=>typeof e=="string"):[]}function $n(r){return !r||typeof r!="object"?{}:r}var Kt=[{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"]}],Ie=null,Nt=0,On=300*1e3;function Dn(r){let e=$n(r),t=e.slug||e.name||e.id||e.module_id||"",n=Tt(e.keywords??e.tags);return {id:t,name:e.display_name||e.name||"",category:Tn(e.category||"infrastructure"),description:e.description||e.summary||"",longDescription:e.long_description||e.description||"",keywords:n.map(o=>o.toLowerCase()),framework:Nn(e.framework),dependencies:Tt(e.dependencies),useCases:Tt(e.use_cases??e.useCases)}}function Tn(r){return {auth:"auth",authentication:"auth",database:"database",payment:"payment",billing:"payment",communication:"communication",infrastructure:"infrastructure",security:"security",analytics:"analytics"}[r.toLowerCase()]||"infrastructure"}function Nn(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 Kn(){try{let{stdout:r}=await Mn("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(Dn).filter(s=>s.id&&s.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)"),Kt}}async function ht(){let r=Date.now();return Ue()?(Ie=Kt,Nt=r,Ie):(Ie&&r-Nt<On||(Ie=await Kn(),Nt=r,Ie.length===0&&(console.warn("\u26A0\uFE0F No modules found, using fallback catalog"),Ie=Kt)),Ie)}var Gn=fileURLToPath(import.meta.url),br=m.dirname(Gn),Ve=null,Pr=new Map;function Fn(r){return [r.name,r.description,r.longDescription,...r.keywords,...r.useCases].filter(Boolean).join(" ")}async function Wn(r){let e=Pr.get(r.id);if(e)return e;let t=await Dt(Fn(r));return Pr.set(r.id,t),t}function Jn(){if(Ve)return Ve;let r=[m.join(br,"../../data/modules-embeddings.json"),m.join(br,"../data/modules-embeddings.json"),m.join(process.cwd(),"data/modules-embeddings.json")],e=null;for(let o of r)if(k.existsSync(o)){e=o;break}if(!e)throw new Error("embeddings file not found");let t=k.readFileSync(e,"utf-8"),n=JSON.parse(t);if(Array.isArray(n)?Ve={model:"mock-or-text-embedding-3-small",dimension:n[0]?.embedding?.length||1536,generated_at:new Date().toISOString(),modules:n}:Ve=n,!Ve)throw new Error("failed to load embeddings data");return Ve}function Cr(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 i=0;i<r.length;i++)t+=r[i]*e[i],n+=r[i]*r[i],o+=e[i]*e[i];let s=Math.sqrt(n)*Math.sqrt(o);return s===0?0:t/s}function xr(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 _r(r,e=5){let t=await ht(),n=await Dt(r);if(Ue()){let i=await Promise.all(t.map(async a=>{let l=await Wn(a);return {module:a,score:Cr(n,l),reason:xr(a,r)}}));return i.sort((a,l)=>l.score-a.score),i.slice(0,e)}let s=Jn().modules.map(i=>{let a=t.find(d=>d.id===i.id);if(!a)return null;let l=Cr(n,i.embedding);return {module:a,score:l,reason:xr(a,r)}}).filter(i=>i!==null);return s.sort((i,a)=>a.score-i.score),s.slice(0,e)}var Vn=fileURLToPath(import.meta.url),Rr=m.dirname(Vn);async function Sr(){return (await import('inquirer')).default}function jr(r){return r instanceof Error?r.message:String(r)}function Hn(){return [m.join(Rr,"../../data/modules-embeddings.json"),m.join(Rr,"../data/modules-embeddings.json"),m.join(process.cwd(),"data/modules-embeddings.json")]}function Er(){let r=Hn();for(let e of r)if(k.existsSync(e))try{let t=JSON.parse(k.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 kt(r=true,e){try{if(!kr()&&!Ue())return console.log(c$1.red(`
21
+ `)),process.exit(1));let o=t==="enable";ht({aiEnabled:o}),console.log(c$1.green(`
22
+ \u2705 AI features ${o?"enabled":"disabled"}
23
+ `));});}var wt=null,kt=false,Lt=null;async function Ho(){return Lt||(Lt=(await import('openai')).default),Lt}function Rr(){kt=true;}function _r(r){let t=new Array(1536),o=0;for(let i=0;i<r.length;i++)o=(o<<5)-o+r.charCodeAt(i),o=o&o;for(let i=0;i<1536;i++)o=o*1664525+1013904223&4294967295,t[i]=o/4294967295*2-1;let n=Math.sqrt(t.reduce((i,s)=>i+s*s,0));return t.map(i=>i/n)}async function vt(r){let e=await Ho();wt=new e({apiKey:r});}function Sr(){if(!wt)throw new Error("OpenAI client not initialized. Call initOpenAI() first with your API key.");return wt}async function Wt(r){return kt?_r(r):(await Sr().embeddings.create({model:"text-embedding-3-small",input:r,encoding_format:"float"})).data[0].embedding}async function Er(r){return kt?r.map(_r):(await Sr().embeddings.create({model:"text-embedding-3-small",input:r,encoding_format:"float"})).data.map(o=>o.embedding)}function Ir(){return wt!==null}function Be(){return kt}var Qo=promisify(exec);function Gt(r){return Array.isArray(r)?r.filter(e=>typeof e=="string"):[]}function Zo(r){return !r||typeof r!="object"?{}:r}var qt=[{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"]}],Ee=null,Jt=0,Xo=300*1e3;function en(r){let e=Zo(r),t=e.slug||e.name||e.id||e.module_id||"",o=Gt(e.keywords??e.tags);return {id:t,name:e.display_name||e.name||"",category:tn(e.category||"infrastructure"),description:e.description||e.summary||"",longDescription:e.long_description||e.description||"",keywords:o.map(n=>n.toLowerCase()),framework:rn(e.framework),dependencies:Gt(e.dependencies),useCases:Gt(e.use_cases??e.useCases)}}function tn(r){return {auth:"auth",authentication:"auth",database:"database",payment:"payment",billing:"payment",communication:"communication",infrastructure:"infrastructure",security:"security",analytics:"analytics"}[r.toLowerCase()]||"infrastructure"}function rn(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 on(){try{let{stdout:r}=await Qo("rapidkit modules list --json-schema 1",{timeout:1e4,maxBuffer:10485760}),e=r.match(/\{[\s\S]*\}/),t=e?e[0]:r,o=JSON.parse(t),n=[];return Array.isArray(o)?n=o:o.modules&&Array.isArray(o.modules)?n=o.modules:o.data&&Array.isArray(o.data)&&(n=o.data),n.map(en).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)"),qt}}async function bt(){let r=Date.now();return Be()?(Ee=qt,Jt=r,Ee):(Ee&&r-Jt<Xo||(Ee=await on(),Jt=r,Ee.length===0&&(console.warn("\u26A0\uFE0F No modules found, using fallback catalog"),Ee=qt)),Ee)}var sn=fileURLToPath(import.meta.url),$r=f__default.dirname(sn),Ve=null,Mr=new Map;function an(r){return [r.name,r.description,r.longDescription,...r.keywords,...r.useCases].filter(Boolean).join(" ")}async function cn(r){let e=Mr.get(r.id);if(e)return e;let t=await Wt(an(r));return Mr.set(r.id,t),t}function ln(){if(Ve)return Ve;let r=[f__default.join($r,"../../data/modules-embeddings.json"),f__default.join($r,"../data/modules-embeddings.json"),f__default.join(process.cwd(),"data/modules-embeddings.json")],e=null;for(let n of r)if(k.existsSync(n)){e=n;break}if(!e)throw new Error("embeddings file not found");let t=k.readFileSync(e,"utf-8"),o=JSON.parse(t);if(Array.isArray(o)?Ve={model:"mock-or-text-embedding-3-small",dimension:o[0]?.embedding?.length||1536,generated_at:new Date().toISOString(),modules:o}:Ve=o,!Ve)throw new Error("failed to load embeddings data");return Ve}function Or(r,e){if(r.length!==e.length)throw new Error("Vectors must have the same length");let t=0,o=0,n=0;for(let s=0;s<r.length;s++)t+=r[s]*e[s],o+=r[s]*r[s],n+=e[s]*e[s];let i=Math.sqrt(o)*Math.sqrt(n);return i===0?0:t/i}function Dr(r,e){let t=e.toLowerCase(),o=r.keywords.filter(n=>t.includes(n)||n.includes(t));return o.length>0?`Matches: ${o.slice(0,3).join(", ")}`:`Relevant for: ${r.useCases[0]}`}async function Tr(r,e=5){let t=await bt(),o=await Wt(r);if(Be()){let s=await Promise.all(t.map(async a=>{let l=await cn(a);return {module:a,score:Or(o,l),reason:Dr(a,r)}}));return s.sort((a,l)=>l.score-a.score),s.slice(0,e)}let i=ln().modules.map(s=>{let a=t.find(u=>u.id===s.id);if(!a)return null;let l=Or(o,s.embedding);return {module:a,score:l,reason:Dr(a,r)}}).filter(s=>s!==null);return i.sort((s,a)=>a.score-s.score),i.slice(0,e)}var un=fileURLToPath(import.meta.url),Nr=f__default.dirname(un);async function Fr(){return (await import('inquirer')).default}function Kr(r){return r instanceof Error?r.message:String(r)}function mn(){return [f__default.join(Nr,"../../data/modules-embeddings.json"),f__default.join(Nr,"../data/modules-embeddings.json"),f__default.join(process.cwd(),"data/modules-embeddings.json")]}function Lr(){let r=mn();for(let e of r)if(k.existsSync(e))try{let t=JSON.parse(k.readFileSync(e,"utf-8")),o=Array.isArray(t)?t:t.modules||[];return {exists:true,path:e,moduleCount:o.length,generatedAt:t.generated_at||null}}catch{continue}return {exists:false,path:null,moduleCount:0,generatedAt:null}}async function Ct(r=true,e){try{if(!Ir()&&!Be())return console.log(c$1.red(`
24
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
25
  `)),false;console.log(c$1.blue(`
26
26
  \u{1F916} Generating AI embeddings for RapidKit modules...
27
- `)),console.log(c$1.gray("\u{1F4E1} Fetching modules from RapidKit..."));let t=await ht();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 i=await Sr(),{confirm:a}=await i.prompt([{type:"confirm",name:"confirm",message:"Generate embeddings now?",default:true}]);if(!a)return console.log(c$1.yellow(`
27
+ `)),console.log(c$1.gray("\u{1F4E1} Fetching modules from RapidKit..."));let t=await bt();console.log(c$1.green(`\u2713 Found ${t.length} modules
28
+ `));let o=t.length*50/1e6*.02;if(console.log(c$1.cyan(`\u{1F4B0} Estimated cost: ~$${o.toFixed(3)}`)),console.log(c$1.gray(` (Based on ${t.length} modules at $0.02/1M tokens)
29
+ `)),r){let s=await Fr(),{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 o=t.map(i=>`${i.name}. ${i.description}. ${i.longDescription}. Keywords: ${i.keywords.join(", ")}. Use cases: ${i.useCases.join(", ")}.`),s=Un(`Generating embeddings for ${t.length} modules...`).start();try{let i=await wr(o);s.succeed(`Generated embeddings for ${t.length} modules`);let a={model:"text-embedding-3-small",dimension:i[0].length,generated_at:new Date().toISOString(),modules:t.map((f,p)=>({id:f.id,name:f.name,embedding:i[p]}))},l=e||m.join(process.cwd(),"data","modules-embeddings.json"),d=m.dirname(l);return k.existsSync(d)||k.mkdirSync(d,{recursive:true}),k.writeFileSync(l,JSON.stringify(a,null,2)),console.log(c$1.green(`
32
- \u2705 Embeddings generated successfully!`)),console.log(c$1.gray(`\u{1F4C1} Saved to: ${l}`)),console.log(c$1.gray(`\u{1F4CA} Size: ${t.length} modules, ${i[0].length} dimensions
33
- `)),true}catch(i){s.fail("Failed to generate embeddings");let a=jr(i);return a.includes("429")?(console.log(c$1.red(`
31
+ `)),false}let n=t.map(s=>`${s.name}. ${s.description}. ${s.longDescription}. Keywords: ${s.keywords.join(", ")}. Use cases: ${s.useCases.join(", ")}.`),i=pn(`Generating embeddings for ${t.length} modules...`).start();try{let s=await Er(n);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((m,d)=>({id:m.id,name:m.name,embedding:s[d]}))},l=e||f__default.join(process.cwd(),"data","modules-embeddings.json"),u=f__default.dirname(l);return k.existsSync(u)||k.mkdirSync(u,{recursive:true}),k.writeFileSync(l,JSON.stringify(a,null,2)),console.log(c$1.green(`
32
+ \u2705 Embeddings generated successfully!`)),console.log(c$1.gray(`\u{1F4C1} Saved to: ${l}`)),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=Kr(s);return a.includes("429")?(console.log(c$1.red(`
34
34
  \u274C OpenAI API quota exceeded`)),console.log(c$1.yellow(`Please check your billing: https://platform.openai.com/account/billing
35
35
  `))):a.includes("401")?(console.log(c$1.red(`
36
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
37
  `))):console.log(c$1.red(`
38
38
  \u274C Error: ${a}
39
39
  `)),false}}catch(t){return console.log(c$1.red(`
40
- \u274C Failed to generate embeddings: ${jr(t)}
41
- `)),false}}async function Ar(r=true){if(Er().exists)return true;if(console.log(c$1.yellow(`
40
+ \u274C Failed to generate embeddings: ${Kr(t)}
41
+ `)),false}}async function Wr(r=true){if(Lr().exists)return true;if(console.log(c$1.yellow(`
42
42
  \u26A0\uFE0F Module embeddings not found`)),console.log(c$1.gray(`AI recommendations require embeddings to be generated.
43
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 Sr(),{action:n}=await t.prompt([{type:"list",name:"action",message:"What would you like to do?",choices:[{name:"\u{1F680} Generate embeddings now (OpenAI key for production, or mock mode for testing)",value:"generate"},{name:"\u{1F4DD} Show me how to generate them manually",value:"manual"},{name:"\u274C Cancel",value:"cancel"}]}]);return n==="generate"?await kt(true):(n==="manual"&&(console.log(c$1.cyan(`
44
+ `)),false;let t=await Fr(),{action:o}=await t.prompt([{type:"list",name:"action",message:"What would you like to do?",choices:[{name:"\u{1F680} Generate embeddings now (OpenAI key for production, or mock mode for testing)",value:"generate"},{name:"\u{1F4DD} Show me how to generate them manually",value:"manual"},{name:"\u274C Cancel",value:"cancel"}]}]);return o==="generate"?await Ct(true):(o==="manual"&&(console.log(c$1.cyan(`
45
45
  \u{1F4DD} To generate embeddings manually:
46
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
47
  `)),console.log(c$1.white("3. Generate embeddings:")),console.log(c$1.gray(` rapidkit ai generate-embeddings
48
48
  `)),console.log(c$1.cyan(`\u{1F4B0} Cost: ~$0.50 one-time
49
- `))),false)}async function Ir(){let r=Er();return r.exists?(console.log(c$1.blue(`
49
+ `))),false)}async function Gr(){let r=Lr();return r.exists?(console.log(c$1.blue(`
50
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 kt(true,r.path):false):(console.log(c$1.yellow(`
51
+ `)),r.path?await Ct(true,r.path):false):(console.log(c$1.yellow(`
52
52
  \u26A0\uFE0F No existing embeddings found`)),console.log(c$1.gray(`Use: rapidkit ai generate-embeddings
53
- `)),false)}function pe(r){let e=r;for(;;){let t=m.join(e,".rapidkit","project.json");if(k.existsSync(t))try{return JSON.parse(k.readFileSync(t,"utf8"))}catch{return null}let n=m.dirname(e);if(n===e)break;e=n;}return null}function re(r,e){let t=r?.runtime?.toLowerCase(),n=r?.kit_name?.toLowerCase(),o=k.existsSync(m.join(e,"go.mod"));return t==="go"||(n?.startsWith("gofiber")??false)||(n?.startsWith("gogin")??false)||o}function ne(r,e){let t=r?.runtime?.toLowerCase(),n=r?.kit_name?.toLowerCase(),o=k.existsSync(m.join(e,"package.json"));return t==="node"||t==="typescript"||(n?.startsWith("nestjs")??false)||o}function oe(r,e){let t=r?.runtime?.toLowerCase(),n=r?.kit_name?.toLowerCase(),o=k.existsSync(m.join(e,"pom.xml")),s=k.existsSync(m.join(e,"build.gradle"))||k.existsSync(m.join(e,"build.gradle.kts"));return t==="java"||t==="spring"||(n?.startsWith("springboot")??false)||o||s}function ae(r,e){let t=r?.runtime?.toLowerCase(),n=r?.kit_name?.toLowerCase(),o=k.existsSync(m.join(e,"pyproject.toml")),s=k.existsSync(m.join(e,"requirements.txt"))||k.existsSync(m.join(e,"requirements.in"));return t==="python"||(n?.startsWith("fastapi")??false)||o||s}async function Mr(){return (await import('inquirer')).default}function Lt(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 $r(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{Mt()||(console.log(c$1.yellow(`
53
+ `)),false)}function xt(r,e){let t=c$3({runtime:typeof r?.runtime=="string"?r.runtime:void 0,framework:typeof r?.framework=="string"?r.framework:void 0,kitName:typeof r?.kit_name=="string"?r.kit_name:typeof r?.kit=="string"?r.kit:void 0});return t.runtime!=="unknown"?t.runtime:e$2(e,r).runtime}function ue(r){let e=r;for(;;){let t=f__default.join(e,".rapidkit","project.json");if(k.existsSync(t))try{return JSON.parse(k.readFileSync(t,"utf8"))}catch{return null}let o=f__default.dirname(e);if(o===e)break;e=o;}return null}function ne(r,e){return xt(r,e)==="go"}function ie(r,e){return xt(r,e)==="node"}function se(r,e){return xt(r,e)==="java"}function le(r,e){return xt(r,e)==="python"}async function Ur(){return (await import('inquirer')).default}function Ut(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 Br(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,o)=>{try{Kt()||(console.log(c$1.yellow(`
54
54
  \u26A0\uFE0F AI features are disabled`)),console.log(c$1.gray(`Enable with: rapidkit config ai enable
55
- `)),process.exit(1));let o=Ze();o?await yt(o):(console.log(c$1.yellow(`
55
+ `)),process.exit(1));let n=et();n?await vt(n):(console.log(c$1.yellow(`
56
56
  \u26A0\uFE0F OpenAI API key not configured - using MOCK MODE for testing
57
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
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
- `)),gr());let s=t;s||(s=(await(await Mr()).prompt([{type:"input",name:"query",message:"\u{1F916} What do you want to build?",validate:g=>g.length===0?"Please enter a description":g.length<3?"Please be more specific (at least 3 characters)":true}])).query),n.json||console.log(c$1.blue(`
59
+ `)),Rr());let i=t;i||(i=(await(await Ur()).prompt([{type:"input",name:"query",message:"\u{1F916} What do you want to build?",validate:g=>g.length===0?"Please enter a description":g.length<3?"Please be more specific (at least 3 characters)":true}])).query),o.json||console.log(c$1.blue(`
60
60
  \u{1F916} Analyzing your request...
61
- `)),await Ar(!n.json)||(console.log(c$1.yellow(`
61
+ `)),await Wr(!o.json)||(console.log(c$1.yellow(`
62
62
  \u26A0\uFE0F Cannot proceed without embeddings
63
- `)),process.exit(1));let a=parseInt(n.number,10),l=await _r(s,a);if(l.length===0||l[0].score<.3)if(console.log(c$1.yellow(`
63
+ `)),process.exit(1));let a=parseInt(o.number,10),l=await Tr(i,a);if(l.length===0||l[0].score<.3)if(console.log(c$1.yellow(`
64
64
  \u26A0\uFE0F No matching modules found in RapidKit registry.
65
65
  `)),console.log(c$1.cyan(`\u{1F4A1} Options:
66
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
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
68
  `)),console.log(c$1.white("3. Request feature:")),console.log(c$1.gray(` https://github.com/getrapidkit/rapidkit/issues
69
69
  `)),l.length>0)console.log(c$1.yellow(`\u26A0\uFE0F Low confidence matches found:
70
- `));else return;if(n.json){console.log(JSON.stringify({query:s,recommendations:l},null,2));return}console.log(c$1.green.bold(`\u{1F4E6} Recommended Modules:
71
- `)),l.forEach((u,y)=>{let g=(u.score*100).toFixed(1),h=u.score>.8?" \u2B50":"";console.log(c$1.bold(`${y+1}. ${u.module.name}${h}`)),console.log(c$1.gray(` ${u.module.description}`)),console.log(c$1.cyan(` Match: ${g}%`)+c$1.gray(` - ${u.reason}`)),console.log(c$1.yellow(` Category: ${u.module.category}`)),u.module.dependencies.length>0&&console.log(c$1.magenta(` Requires: ${u.module.dependencies.join(", ")}`)),console.log();});let d=l.slice(0,3).map(u=>u.module.id);console.log(c$1.cyan("\u{1F4A1} Quick install (top 3):")),console.log(c$1.white(` rapidkit add module ${d.join(" ")}
72
- `));let f=await Mr(),{shouldInstall:p}=await f.prompt([{type:"confirm",name:"shouldInstall",message:"Would you like to install these modules now?",default:false}]);if(p){let{selectedModules:u}=await f.prompt([{type:"checkbox",name:"selectedModules",message:"Select modules to install:",choices:l.map(y=>({name:`${y.module.name} - ${y.module.description}`,value:y.module.id,checked:y.score>.7}))}]);if(u.length>0){console.log(c$1.blue(`
73
- \u{1F4E6} Installing ${u.length} modules...
74
- `)),console.log(c$1.gray(`Command: rapidkit add module ${u.join(" ")}`));let y=pe(process.cwd());if(y?.module_support===false){let h=y?.runtime==="java"?"Spring Boot":"Go";console.log(c$1.red(`
70
+ `));else return;if(o.json){console.log(JSON.stringify({query:i,recommendations:l},null,2));return}console.log(c$1.green.bold(`\u{1F4E6} Recommended Modules:
71
+ `)),l.forEach((p,y)=>{let g=(p.score*100).toFixed(1),h=p.score>.8?" \u2B50":"";console.log(c$1.bold(`${y+1}. ${p.module.name}${h}`)),console.log(c$1.gray(` ${p.module.description}`)),console.log(c$1.cyan(` Match: ${g}%`)+c$1.gray(` - ${p.reason}`)),console.log(c$1.yellow(` Category: ${p.module.category}`)),p.module.dependencies.length>0&&console.log(c$1.magenta(` Requires: ${p.module.dependencies.join(", ")}`)),console.log();});let u=l.slice(0,3).map(p=>p.module.id);console.log(c$1.cyan("\u{1F4A1} Quick install (top 3):")),console.log(c$1.white(` rapidkit add module ${u.join(" ")}
72
+ `));let m=await Ur(),{shouldInstall:d}=await m.prompt([{type:"confirm",name:"shouldInstall",message:"Would you like to install these modules now?",default:false}]);if(d){let{selectedModules:p}=await m.prompt([{type:"checkbox",name:"selectedModules",message:"Select modules to install:",choices:l.map(y=>({name:`${y.module.name} - ${y.module.description}`,value:y.module.id,checked:y.score>.7}))}]);if(p.length>0){console.log(c$1.blue(`
73
+ \u{1F4E6} Installing ${p.length} modules...
74
+ `)),console.log(c$1.gray(`Command: rapidkit add module ${p.join(" ")}`));let y=ue(process.cwd());if(y?.module_support===false){let h=y?.runtime==="java"?"Spring Boot":"Go";console.log(c$1.red(`
75
75
  \u274C RapidKit modules are not available for ${h} npm-level kits.`)),console.log(c$1.gray(` The module system requires Python and is currently only supported for FastAPI and NestJS projects.
76
- `));return}let g=await e$1(["add","module",...u],{cwd:process.cwd()});console.log(g===0?c$1.green(`
76
+ `));return}let g=await f$1(["add","module",...p],{cwd:process.cwd()});console.log(g===0?c$1.green(`
77
77
  \u2705 Selected modules installed successfully
78
78
  `):c$1.red(`
79
79
  \u274C Module installation failed (exit code: ${g})
80
80
  `));}else console.log(c$1.gray(`
81
81
  No modules selected
82
- `));}}catch(o){let s=Lt(o);a$1.error(`
83
- \u274C Error:`,s.message),s.code==="invalid_api_key"?(console.log(c$1.yellow(`
82
+ `));}}catch(n){let i=Ut(n);a$1.error(`
83
+ \u274C Error:`,i.message),i.code==="invalid_api_key"?(console.log(c$1.yellow(`
84
84
  \u{1F4A1} Your API key may be invalid or expired`)),console.log(c$1.cyan(` Update it: rapidkit config set-api-key
85
- `))):s.message.includes("embeddings file not found")&&(console.log(c$1.yellow(`
85
+ `))):i.message.includes("embeddings file not found")&&(console.log(c$1.yellow(`
86
86
  \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
87
- `))),process.exit(1);}}),e.command("info").description("Show AI features information").action(()=>{let t=Ze(),n=Mt();console.log(c$1.bold(`
87
+ `))),process.exit(1);}}),e.command("info").description("Show AI features information").action(()=>{let t=et(),o=Kt();console.log(c$1.bold(`
88
88
  \u{1F916} RapidKit AI Features
89
- `)),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(`
89
+ `)),console.log(c$1.cyan("Status:"),o?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(`
90
90
  \u{1F4E6} Available Features:
91
91
  `)),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(`
92
92
  \u{1F4B0} Pricing:
93
93
  `)),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(`
94
94
  \u{1F680} Getting Started:
95
- `)),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=Ze();t||(console.log(c$1.red(`
95
+ `)),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=et();t||(console.log(c$1.red(`
96
96
  \u274C OpenAI API key not configured
97
97
  `)),console.log(c$1.cyan(`To generate embeddings, you need an OpenAI API key:
98
98
  `)),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(`
99
99
  OR set environment variable:`)),console.log(c$1.white(` export OPENAI_API_KEY="sk-proj-..."
100
- `)),process.exit(1)),yt(t);let n=await kt(true);n&&(console.log(c$1.green("\u2705 Ready to use AI recommendations!")),console.log(c$1.cyan(`Try: rapidkit ai recommend "authentication"
101
- `))),process.exit(n?0:1);}catch(t){let n=Lt(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=Ze();t||(console.log(c$1.red(`
100
+ `)),process.exit(1)),vt(t);let o=await Ct(true);o&&(console.log(c$1.green("\u2705 Ready to use AI recommendations!")),console.log(c$1.cyan(`Try: rapidkit ai recommend "authentication"
101
+ `))),process.exit(o?0:1);}catch(t){let o=Ut(t);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 t=et();t||(console.log(c$1.red(`
102
102
  \u274C OpenAI API key not configured
103
103
  `)),console.log(c$1.white(`Set your API key: rapidkit config set-api-key
104
- `)),process.exit(1)),yt(t);let n=await Ir();process.exit(n?0:1);}catch(t){let n=Lt(t);a$1.error("Failed to update embeddings:",n.message),process.exit(1);}});}var vt=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(k.existsSync(m.join(t,".rapidkit-workspace")))return t;let n=m.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=m.join(n,".rapidkit","policies.yml");if(!k.existsSync(o))return "isolated";try{let a=k.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),s=n==="shared-runtime-caches"?m.join(o||e,".rapidkit","cache","go"):m.join(e,".rapidkit","cache","go"),i=process.env.GOMODCACHE,a=process.env.GOCACHE;return process.env.GOMODCACHE=m.join(s,"mod"),process.env.GOCACHE=m.join(s,"build"),t().finally(()=>{typeof i>"u"?delete process.env.GOMODCACHE:process.env.GOMODCACHE=i,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&&k.mkdirSync(process.env.GOMODCACHE,{recursive:true}),process.env.GOCACHE&&k.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=m.join(e,"Makefile");return k.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()?[m.join(e,"server.exe"),m.join(e,"server")]:[m.join(e,"server")]).find(s=>k.existsSync(s));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 bt=class{constructor(e){this.runCommand=e;}runtime="java";isExecutable(e){if(process.platform==="win32")return true;try{return (k.statSync(e).mode&73)!==0}catch{return false}}ensureWrapperExecutable(e){if(process.platform==="win32"||this.isExecutable(e))return true;try{return k.chmodSync(e,493),this.isExecutable(e)}catch{return false}}resolveJavaCommand(e){let t=process.env.JAVA_HOME?.trim();if(!t)return "java";let n=m.join(t,"bin",process.platform==="win32"?"java.exe":"java");return k.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=m.join(e,"pom.xml");if(!k.existsSync(t))return 21;try{let o=k.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||""}
105
- ${n.stderr||""}`,s=o.match(/version\s+"([^"]+)"/i);if(s?.[1])return this.parseMajorJavaVersion(s[1]);let i=o.match(/(?:openjdk|java)\s+(\d+(?:[._]\d+)?)/i);return i?.[1]?this.parseMajorJavaVersion(i[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||""}
106
- ${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=k.existsSync(m.join(e,"pom.xml")),n=k.existsSync(m.join(e,"mvnw"))||k.existsSync(m.join(e,"mvnw.cmd")),o=k.existsSync(m.join(e,"build.gradle"))||k.existsSync(m.join(e,"build.gradle.kts"))||k.existsSync(m.join(e,"settings.gradle"))||k.existsSync(m.join(e,"settings.gradle.kts")),s=k.existsSync(m.join(e,"gradlew"))||k.existsSync(m.join(e,"gradlew.bat"));return {hasMavenProject:t||n,hasMavenWrapper:n,hasGradleProject:o||s,hasGradleWrapper:s}}findWorkspaceRoot(e){let t=e;for(;;){if(k.existsSync(m.join(t,".rapidkit-workspace")))return t;let n=m.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=m.join(n,".rapidkit","policies.yml");if(!k.existsSync(o))return "isolated";try{let a=k.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=m.join(e,"mvnw.cmd");if(process.platform==="win32"&&k.existsSync(t))return {command:t,baseArgs:[]};let n=m.join(e,"mvnw");return k.existsSync(n)?this.ensureWrapperExecutable(n)?{command:n,baseArgs:[]}:{command:"sh",baseArgs:[n]}:{command:"mvn",baseArgs:[]}}gradleCommand(e){let t=m.join(e,"gradlew.bat");if(process.platform==="win32"&&k.existsSync(t))return {command:t,baseArgs:[]};let n=m.join(e,"gradlew");return k.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 s=o.shift();if(!s||n.has(s))continue;n.add(s);let i=[];try{i=k.readdirSync(s,{withFileTypes:true});}catch{continue}for(let a of i){if(!a.isDirectory()||a.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(a.name))continue;let l=m.join(s,a.name),d=this.inspectJavaProject(l);(d.hasMavenProject||d.hasGradleProject)&&t.push(l),o.push(l);}}return t}withJavaCacheEnv(e,t){let n=this.resolveDependencyMode(e),o=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),s=n==="shared-runtime-caches"?m.join(o||e,".rapidkit","cache","java","m2"):m.join(e,".rapidkit","cache","java","m2"),i=n==="shared-runtime-caches"?m.join(o||e,".rapidkit","cache","java","gradle"):m.join(e,".rapidkit","cache","java","gradle"),a=process.env.MAVEN_OPTS,l=process.env.GRADLE_USER_HOME,d=`-Dmaven.repo.local=${s}`;return process.env.MAVEN_OPTS=a?`${a} ${d}`:d,process.env.GRADLE_USER_HOME=i,t().finally(()=>{typeof a>"u"?delete process.env.MAVEN_OPTS:process.env.MAVEN_OPTS=a,typeof l>"u"?delete process.env.GRADLE_USER_HOME:process.env.GRADLE_USER_HOME=l;})}async runBuildTool(e,t,n=true){return this.withJavaCacheEnv(e,async()=>{try{let{command:o,baseArgs:s}=this.buildToolCommand(e),i=await this.runCommand(o,[...s,...t],e);if(i===0||!n)return {exitCode:i};let a=k.existsSync(m.join(e,"pom.xml")),l=k.existsSync(m.join(e,"build.gradle"))||k.existsSync(m.join(e,"build.gradle.kts"));return {exitCode:i,message:a||l?"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=[m.join(e,"target"),m.join(e,"build","libs")];for(let n of t){if(!k.existsSync(n))continue;let s=k.readdirSync(n).filter(i=>i.toLowerCase().endsWith(".jar")).find(i=>!i.toLowerCase().endsWith("-sources.jar")&&!i.toLowerCase().endsWith("-javadoc.jar")&&!i.toLowerCase().endsWith("-plain.jar"));if(s)return m.join(n,s)}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),l=await this.detectInstalledJavaMajor(t,e);if(l!==null&&l<a)return {exitCode:1,message:`Detected Java ${l}, but project requires Java ${a}+.`};let d=m.join(process.env.JAVA_HOME||"","release");if(process.env.JAVA_HOME&&k.existsSync(d))try{let p=k.readFileSync(d,"utf-8").match(/^JAVA_VERSION="([^"]+)"/m),u=this.parseMajorJavaVersion(p?.[1]);if(u!==null&&u<a)return {exitCode:1,message:`Detected JAVA_HOME version ${u}, but project requires Java ${a}+.`}}catch{}}if(this.isMavenProject(e)||this.isGradleProject(e)){let a=this.detectBuildTool(e),l=a==="gradle"?["--version"]:["-version"],d=await this.runBuildTool(e,l);return d.exitCode!==0?d:a==="maven"&&!this.inspectJavaProject(e).hasMavenWrapper?this.checkSystemMavenVersion(e):d}let o=this.findWorkspaceRoot(e);if(o&&o===e){let a=this.discoverWorkspaceJavaProjects(o);if(a.length>0){let l=a.reduce((p,u)=>Math.max(p,this.readRequiredJavaMajor(u)),0);if(l>0){let p=await this.detectInstalledJavaMajor(t,e);if(p!==null&&p<l){let u=a.filter(y=>this.readRequiredJavaMajor(y)>p).map(y=>m.relative(e,y)).join(", ");return {exitCode:1,message:`Detected Java ${p}, but workspace project(s) [${u}] require Java ${l}+.`}}}let d=false,f=false;for(let p of a){let u=this.inspectJavaProject(p);u.hasMavenProject&&!u.hasMavenWrapper&&(d=true),u.hasGradleProject&&!u.hasGradleWrapper&&(f=true);}if(d){let p=await this.withJavaCacheEnv(e,async()=>this.runCommand("mvn",["-version"],e));if(p!==0)return {exitCode:p,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 u=await this.checkSystemMavenVersion(e);if(u.exitCode!==0)return u}if(f){let p=await this.withJavaCacheEnv(e,async()=>this.runCommand("gradle",["--version"],e));if(p!==0)return {exitCode:p,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 s=await this.withJavaCacheEnv(e,async()=>this.runCommand("mvn",["-version"],e));if(s===0){let a=await this.checkSystemMavenVersion(e);return a.exitCode!==0?a:{exitCode:0}}let i=await this.withJavaCacheEnv(e,async()=>this.runCommand("gradle",["--version"],e));return i===0?{exitCode:0}:{exitCode:s||i||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&&k.mkdirSync(t,{recursive:true}),process.env.GRADLE_USER_HOME&&k.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 Pt=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(k.existsSync(m.join(t,".rapidkit-workspace")))return t;let n=m.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=m.join(n,".rapidkit","policies.yml");if(!k.existsSync(o))return "isolated";try{let a=k.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),s=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=o==="isolated"?m.join(e,".rapidkit","cache","node"):m.join(s||e,".rapidkit","cache","node"),a=process.env.npm_config_cache,l=process.env.npm_config_store_dir;return t==="pnpm"?(process.env.npm_config_store_dir=m.join(i,"pnpm-store"),process.env.npm_config_cache=m.join(i,"pnpm-cache")):t==="yarn"?process.env.npm_config_cache=m.join(i,"yarn-cache"):process.env.npm_config_cache=m.join(i,"npm-cache"),n().finally(()=>{typeof a>"u"?delete process.env.npm_config_cache:process.env.npm_config_cache=a,typeof l>"u"?delete process.env.npm_config_store_dir:process.env.npm_config_store_dir=l;})}detectPackageManager(e){return k.existsSync(m.join(e,"pnpm-lock.yaml"))?"pnpm":k.existsSync(m.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&&k.mkdirSync(process.env.npm_config_cache,{recursive:true}),t==="pnpm"&&process.env.npm_config_store_dir&&k.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 Ct=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(k.existsSync(m.join(t,".rapidkit-workspace")))return t;let n=m.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=m.join(n,".rapidkit","policies.yml");if(!k.existsSync(o))return "isolated";try{let a=k.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),s=n==="shared-runtime-caches"?m.join(o||e,".rapidkit","cache","python"):m.join(e,".rapidkit","cache","python"),i=process.env.PIP_CACHE_DIR,a=process.env.POETRY_CACHE_DIR;return process.env.PIP_CACHE_DIR=m.join(s,"pip"),process.env.POETRY_CACHE_DIR=m.join(s,"poetry"),t().finally(()=>{typeof i>"u"?delete process.env.PIP_CACHE_DIR:process.env.PIP_CACHE_DIR=i,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 Bn(){let r={...process.env},e=r.PATH||"";if(e){let t=e.split(m.delimiter).filter(n=>!n.replace(/\\/g,"/").includes("/.pyenv/shims")).join(m.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 Me(r,e){return r==="go"?new vt((t,n,o)=>e.runCommandInCwd(t,n,o)):r==="node"?new Pt((t,n,o)=>e.runCommandInCwd(t,n,o)):r==="java"?new bt((t,n,o)=>e.runCommandInCwd(t,n,o)):new Ct((t,n)=>e.runCoreRapidkit(t,{cwd:n,env:Bn()}))}var Tr=m.join(Sn.homedir(),".rapidkit","cache"),Nr=1440*60*1e3;function Ft(){let r=process.env.RAPIDKIT_CACHE_DIR?.trim();if(r)return r;let e=process.env.VITEST_WORKER_ID?.trim();return e?m.join(Tr,`vitest-${e}`):Tr}var _t=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 m.join(Ft(),`${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<Nr)return a$1.debug(`Cache hit (memory): ${e}`),n.data;try{let o=this.getCachePath(e),s=await promises.readFile(o,"utf-8"),i=JSON.parse(s);if(i.version===t&&Date.now()-i.timestamp<Nr)return a$1.debug(`Cache hit (disk): ${e}`),this.memoryCache.set(e,i),i.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(Ft(),{recursive:true});let s=this.getCachePath(e),i=this.getTempCachePath(s);await promises.writeFile(i,JSON.stringify(o),"utf-8"),await promises.rename(i,s),a$1.debug(`Cache set: ${e}`);}catch(s){a$1.debug(`Cache write failed: ${e}`,s);}}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=Ft(),t=await promises.readdir(e);await Promise.all(t.map(n=>promises.unlink(m.join(e,n)))),a$1.debug("Cache cleared");}catch{}}};function Qn(r){let e=r;for(;;){if(k.existsSync(m.join(e,".rapidkit-workspace"))||k.existsSync(m.join(e,".rapidkit","workspace.json")))return e;let t=m.dirname(e);if(t===e)break;e=t;}return null}function Zn(r){let e=pe(r);return re(e,r)?"go":oe(e,r)?"java":ne(e,r)?"node":ae(e,r)?"python":"unknown"}function Xn(r,e){if(!k.existsSync(r))return null;let t=k.readdirSync(r).filter(n=>n.endsWith(".json")&&e.some(o=>o.test(n))).map(n=>m.join(r,n));return t.length===0?null:(t.sort((n,o)=>k.statSync(o).mtimeMs-k.statSync(n).mtimeMs),t[0])}function et(r){return r&&typeof r=="object"&&!Array.isArray(r)?r:{}}function eo(r,e){let t=m.join(r,".rapidkit","toolchain.lock");if(!k.existsSync(t))return {gate:"env",status:"fail",summary:"toolchain.lock is missing",details:["Run rapidkit bootstrap to pin runtime versions and generate a reproducible toolchain."],evidencePath:t};try{let n=JSON.parse(k.readFileSync(t,"utf-8")),o=et(n.runtime),i=["python","node","go","java"].filter(a=>{let l=et(o[a]);return typeof l.version=="string"&&l.version.trim().length>0});if(i.length===0)return {gate:"env",status:"fail",summary:"No runtime versions are pinned in toolchain.lock",details:["Pin at least one runtime version via rapidkit setup <runtime> and re-run bootstrap."],evidencePath:t};if(e!=="unknown"){let a=et(o[e]);if(typeof a.version!="string"||a.version.trim().length===0)return {gate:"env",status:"fail",summary:`Project runtime (${e}) is not pinned in toolchain.lock`,details:[`Run rapidkit setup ${e} and rapidkit bootstrap to lock ${e} for this workspace.`],evidencePath:t}}return {gate:"env",status:"pass",summary:`Pinned runtimes: ${i.join(", ")}`,details:[],evidencePath:t}}catch{return {gate:"env",status:"fail",summary:"toolchain.lock is invalid JSON",details:["Regenerate lockfile with rapidkit bootstrap."],evidencePath:t}}}function to(r){let e=m.join(r,".rapidkit","reports","doctor-last-run.json");if(!k.existsSync(e))return {payload:null,path:e};try{return {payload:JSON.parse(k.readFileSync(e,"utf-8")),path:e}}catch{return {payload:null,path:e}}}function ro(r){let e=to(r);if(!e.payload)return {gate:{gate:"doctor",status:"fail",summary:"Doctor evidence is missing",details:["Run rapidkit doctor workspace --json before release readiness checks."],evidencePath:e.path},payload:null};let t=et(e.payload.summary),n=Number(t.totalIssues??0);return t.hasSystemErrors?{gate:{gate:"doctor",status:"fail",summary:"Doctor reported system errors",details:["Resolve system-level doctor errors before proceeding."],evidencePath:e.path},payload:e.payload}:n>0?{gate:{gate:"doctor",status:"warn",summary:`Doctor found ${n} issue(s)`,details:["Run rapidkit doctor workspace --fix and re-run readiness checks."],evidencePath:e.path},payload:e.payload}:{gate:{gate:"doctor",status:"pass",summary:"Doctor checks passed without issues",details:[],evidencePath:e.path},payload:e.payload}}function no(r){let e=m.join(r,".rapidkit","reports"),t=Xn(e,[/verify-pack-contract/i,/^verify.*\.json$/i]);if(!t)return {gate:"verify",status:"fail",summary:"Verify-pack contract evidence is missing",details:["Export verify-pack contract JSON from extension/CI before release readiness checks."],evidencePath:m.join(e,"*verify-pack-contract*.json")};try{let n=JSON.parse(k.readFileSync(t,"utf-8")),o=String(n.status??"").toLowerCase(),s=et(n.summary),i=Number(s.failedChecks??0);return o==="fail"||i>0?{gate:"verify",status:"fail",summary:"Verify-pack contract reports failed checks",details:["Fix failed verify checks and regenerate verify-pack contract evidence."],evidencePath:t}:o==="pass"?{gate:"verify",status:"pass",summary:"Verify-pack contract passed",details:[],evidencePath:t}:{gate:"verify",status:"warn",summary:"Verify-pack contract status is not explicit",details:["Ensure contract status is pass/fail and keep schema aligned with v1 contract."],evidencePath:t}}catch{return {gate:"verify",status:"fail",summary:"Verify-pack contract is invalid JSON",details:["Regenerate verify-pack contract artifact."],evidencePath:t}}}function oo(r,e){let t=m.join(e,".rapidkit","reports","doctor-last-run.json");if(!r)return {gate:"dependency",status:"warn",summary:"Dependency risk check skipped (doctor evidence missing)",details:["Run rapidkit doctor workspace --json to include dependency findings."],evidencePath:t};let n=Array.isArray(r.projects)?r.projects:[],o=n.reduce((i,a)=>{let l=Number(a.vulnerabilities??0);return Number.isFinite(l)?i+Math.max(0,l):i},0),s=n.filter(i=>i.depsInstalled===false).length;return o>0?{gate:"dependency",status:"fail",summary:`${o} dependency vulnerability(ies) reported`,details:["Resolve vulnerabilities (npm/pip/go audit pipelines) before release."],evidencePath:t}:s>0?{gate:"dependency",status:"warn",summary:`${s} project(s) report missing dependencies`,details:["Run project init/bootstrap and regenerate doctor evidence."],evidencePath:t}:{gate:"dependency",status:"pass",summary:"No dependency vulnerabilities reported",details:[],evidencePath:t}}function io(r){return r.some(e=>e.status==="fail")?"fail":r.some(e=>e.status==="warn")?"warn":"pass"}async function so(r,e){let t=m.join(r,".rapidkit","reports","release-readiness-last-run.json");return await j__default.ensureDir(m.dirname(t)),await j__default.writeJSON(t,e,{spaces:2}),t}async function Wt(r={}){let e=m.resolve(r.startPath??process.cwd()),t=Qn(e)??e,n=Zn(e),o=eo(t,n),s=ro(t),i=no(t),a=oo(s.payload,t),l=[o,s.gate,i,a],d=io(l),f={schemaVersion:"v1",generatedAt:new Date().toISOString(),workspacePath:t,projectPath:e,action:r.action,overallStatus:d,blocking:d==="fail",blockingReasons:l.filter(p=>p.status==="fail").map(p=>`${p.gate}: ${p.summary}`),gates:l};return r.writeReport!==false&&(f.evidencePath=await so(t,f)),f}function ao(r){return r==="pass"?c$1.green("PASS"):r==="warn"?c$1.yellow("WARN"):c$1.red("FAIL")}function co(r){return r==="pass"?c$1.green("PASS"):r==="warn"?c$1.yellow("WARN"):c$1.red("FAIL")}async function Lr(r){let e=await Wt({writeReport:true});if(r.json)console.log(JSON.stringify(e,null,2));else {console.log(c$1.bold.cyan(`
104
+ `)),process.exit(1)),vt(t);let o=await Gr();process.exit(o?0:1);}catch(t){let o=Ut(t);a$1.error("Failed to update embeddings:",o.message),process.exit(1);}});}var jt=class{constructor(e){this.runCommand=e;}runtime="go";async run(e,t,o){return {exitCode:await this.runCommand(e,t,o)}}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(k.existsSync(f__default.join(t,".rapidkit-workspace")))return t;let o=f__default.dirname(t);if(o===t)break;t=o;}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 o=this.findWorkspaceRoot(e);if(!o)return "isolated";let n=f__default.join(o,".rapidkit","policies.yml");if(!k.existsSync(n))return "isolated";try{let a=k.readFileSync(n,"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 o=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=o==="shared-runtime-caches"?f__default.join(n||e,".rapidkit","cache","go"):f__default.join(e,".rapidkit","cache","go"),s=process.env.GOMODCACHE,a=process.env.GOCACHE;return process.env.GOMODCACHE=f__default.join(i,"mod"),process.env.GOCACHE=f__default.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&&k.mkdirSync(process.env.GOMODCACHE,{recursive:true}),process.env.GOCACHE&&k.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 o=f__default.join(e,"Makefile");return k.existsSync(o)?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 o=(a()?[f__default.join(e,"server.exe"),f__default.join(e,"server")]:[f__default.join(e,"server")]).find(i=>k.existsSync(i));if(o)return this.run(o,[],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 Rt=class{constructor(e){this.runCommand=e;}runtime="java";isExecutable(e){if(process.platform==="win32")return true;try{return (k.statSync(e).mode&73)!==0}catch{return false}}ensureWrapperExecutable(e){if(process.platform==="win32"||this.isExecutable(e))return true;try{return k.chmodSync(e,493),this.isExecutable(e)}catch{return false}}resolveJavaCommand(e){let t=process.env.JAVA_HOME?.trim();if(!t)return "java";let o=f__default.join(t,"bin",process.platform==="win32"?"java.exe":"java");return k.existsSync(o)?o:"java"}parseMajorJavaVersion(e){if(!e)return null;let o=e.trim().replace(/\"/g,"").split(".")[0],n=Number.parseInt(o,10);return Number.isFinite(n)?n:null}readRequiredJavaMajor(e){let t=f__default.join(e,"pom.xml");if(!k.existsSync(t))return 21;try{let n=k.readFileSync(t,"utf-8").match(/<java\.version>\s*([^<\s]+)\s*<\/java\.version>/i);return this.parseMajorJavaVersion(n?.[1])??21}catch{return 21}}async detectInstalledJavaMajor(e,t){try{let o=await execa(e,["-version"],{cwd:t,timeout:5e3,reject:false});if(o.exitCode!==0)return null;let n=`${o.stdout||""}
105
+ ${o.stderr||""}`,i=n.match(/version\s+"([^"]+)"/i);if(i?.[1])return this.parseMajorJavaVersion(i[1]);let s=n.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 o=0;o<3;o+=1){if(e[o]>t[o])return true;if(e[o]<t[o])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 o=this.parseMavenVersion(`${t.stdout||""}
106
+ ${t.stderr||""}`);return o?this.isMavenVersionAtLeast(o,[3,9,0])?{exitCode:0}:{exitCode:1,message:`Maven ${o.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=k.existsSync(f__default.join(e,"pom.xml")),o=k.existsSync(f__default.join(e,"mvnw"))||k.existsSync(f__default.join(e,"mvnw.cmd")),n=k.existsSync(f__default.join(e,"build.gradle"))||k.existsSync(f__default.join(e,"build.gradle.kts"))||k.existsSync(f__default.join(e,"settings.gradle"))||k.existsSync(f__default.join(e,"settings.gradle.kts")),i=k.existsSync(f__default.join(e,"gradlew"))||k.existsSync(f__default.join(e,"gradlew.bat"));return {hasMavenProject:t||o,hasMavenWrapper:o,hasGradleProject:n||i,hasGradleWrapper:i}}findWorkspaceRoot(e){let t=e;for(;;){if(k.existsSync(f__default.join(t,".rapidkit-workspace")))return t;let o=f__default.dirname(t);if(o===t)break;t=o;}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 o=this.findWorkspaceRoot(e);if(!o)return "isolated";let n=f__default.join(o,".rapidkit","policies.yml");if(!k.existsSync(n))return "isolated";try{let a=k.readFileSync(n,"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__default.join(e,"mvnw.cmd");if(process.platform==="win32"&&k.existsSync(t))return {command:t,baseArgs:[]};let o=f__default.join(e,"mvnw");return k.existsSync(o)?this.ensureWrapperExecutable(o)?{command:o,baseArgs:[]}:{command:"sh",baseArgs:[o]}:{command:"mvn",baseArgs:[]}}gradleCommand(e){let t=f__default.join(e,"gradlew.bat");if(process.platform==="win32"&&k.existsSync(t))return {command:t,baseArgs:[]};let o=f__default.join(e,"gradlew");return k.existsSync(o)?this.ensureWrapperExecutable(o)?{command:o,baseArgs:[]}:{command:"sh",baseArgs:[o]}:{command:"gradle",baseArgs:[]}}isGradleProject(e){return this.inspectJavaProject(e).hasGradleProject}isMavenProject(e){return this.inspectJavaProject(e).hasMavenProject}discoverWorkspaceJavaProjects(e){let t=[],o=new Set,n=[e];for(;n.length>0;){let i=n.shift();if(!i||o.has(i))continue;o.add(i);let s=[];try{s=k.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 l=f__default.join(i,a.name),u=this.inspectJavaProject(l);(u.hasMavenProject||u.hasGradleProject)&&t.push(l),n.push(l);}}return t}withJavaCacheEnv(e,t){let o=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=o==="shared-runtime-caches"?f__default.join(n||e,".rapidkit","cache","java","m2"):f__default.join(e,".rapidkit","cache","java","m2"),s=o==="shared-runtime-caches"?f__default.join(n||e,".rapidkit","cache","java","gradle"):f__default.join(e,".rapidkit","cache","java","gradle"),a=process.env.MAVEN_OPTS,l=process.env.GRADLE_USER_HOME,u=`-Dmaven.repo.local=${i}`;return process.env.MAVEN_OPTS=a?`${a} ${u}`:u,process.env.GRADLE_USER_HOME=s,t().finally(()=>{typeof a>"u"?delete process.env.MAVEN_OPTS:process.env.MAVEN_OPTS=a,typeof l>"u"?delete process.env.GRADLE_USER_HOME:process.env.GRADLE_USER_HOME=l;})}async runBuildTool(e,t,o=true){return this.withJavaCacheEnv(e,async()=>{try{let{command:n,baseArgs:i}=this.buildToolCommand(e),s=await this.runCommand(n,[...i,...t],e);if(s===0||!o)return {exitCode:s};let a=k.existsSync(f__default.join(e,"pom.xml")),l=k.existsSync(f__default.join(e,"build.gradle"))||k.existsSync(f__default.join(e,"build.gradle.kts"));return {exitCode:s,message:a||l?"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(n){return {exitCode:1,message:`Java command execution failed: ${n instanceof Error?n.message:String(n)}. Verify pom.xml/build.gradle integrity and wrapper permissions.`}}})}resolveJarPath(e){let t=[f__default.join(e,"target"),f__default.join(e,"build","libs")];for(let o of t){if(!k.existsSync(o))continue;let i=k.readdirSync(o).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__default.join(o,i)}return null}commandArgsFor(e,t){if(e==="gradle"){let o=this.shouldUseGradleNoDaemon()?["--no-daemon"]:[];return t==="init"?[...o,"dependencies"]:t==="dev"?[...o,"bootRun"]:t==="test"?[...o,"test"]:[...o,"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),o=await this.runCommand(t,["-version"],e);if(o!==0)return {exitCode:o,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),l=await this.detectInstalledJavaMajor(t,e);if(l!==null&&l<a)return {exitCode:1,message:`Detected Java ${l}, but project requires Java ${a}+.`};let u=f__default.join(process.env.JAVA_HOME||"","release");if(process.env.JAVA_HOME&&k.existsSync(u))try{let d=k.readFileSync(u,"utf-8").match(/^JAVA_VERSION="([^"]+)"/m),p=this.parseMajorJavaVersion(d?.[1]);if(p!==null&&p<a)return {exitCode:1,message:`Detected JAVA_HOME version ${p}, but project requires Java ${a}+.`}}catch{}}if(this.isMavenProject(e)||this.isGradleProject(e)){let a=this.detectBuildTool(e),l=a==="gradle"?["--version"]:["-version"],u=await this.runBuildTool(e,l);return u.exitCode!==0?u:a==="maven"&&!this.inspectJavaProject(e).hasMavenWrapper?this.checkSystemMavenVersion(e):u}let n=this.findWorkspaceRoot(e);if(n&&n===e){let a=this.discoverWorkspaceJavaProjects(n);if(a.length>0){let l=a.reduce((d,p)=>Math.max(d,this.readRequiredJavaMajor(p)),0);if(l>0){let d=await this.detectInstalledJavaMajor(t,e);if(d!==null&&d<l){let p=a.filter(y=>this.readRequiredJavaMajor(y)>d).map(y=>f__default.relative(e,y)).join(", ");return {exitCode:1,message:`Detected Java ${d}, but workspace project(s) [${p}] require Java ${l}+.`}}}let u=false,m=false;for(let d of a){let p=this.inspectJavaProject(d);p.hasMavenProject&&!p.hasMavenWrapper&&(u=true),p.hasGradleProject&&!p.hasGradleWrapper&&(m=true);}if(u){let d=await this.withJavaCacheEnv(e,async()=>this.runCommand("mvn",["-version"],e));if(d!==0)return {exitCode:d,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 p=await this.checkSystemMavenVersion(e);if(p.exitCode!==0)return p}if(m){let d=await this.withJavaCacheEnv(e,async()=>this.runCommand("gradle",["--version"],e));if(d!==0)return {exitCode:d,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&&k.mkdirSync(t,{recursive:true}),process.env.GRADLE_USER_HOME&&k.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 o=await this.runBuild(e);if(o.exitCode!==0)return o;let n=this.resolveJarPath(e);return n?{exitCode:await this.runCommand(this.resolveJavaCommand(e),["-jar",n],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 _t=class{constructor(e){this.runCommand=e;}runtime="node";async run(e,t,o){return {exitCode:await this.runCommand(e,t,o)}}findWorkspaceRoot(e){let t=e;for(;;){if(k.existsSync(f__default.join(t,".rapidkit-workspace")))return t;let o=f__default.dirname(t);if(o===t)break;t=o;}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 o=this.findWorkspaceRoot(e);if(!o)return "isolated";let n=f__default.join(o,".rapidkit","policies.yml");if(!k.existsSync(n))return "isolated";try{let a=k.readFileSync(n,"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,o){let n=this.resolveDependencyMode(e),i=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),s=n==="isolated"?f__default.join(e,".rapidkit","cache","node"):f__default.join(i||e,".rapidkit","cache","node"),a=process.env.npm_config_cache,l=process.env.npm_config_store_dir;return t==="pnpm"?(process.env.npm_config_store_dir=f__default.join(s,"pnpm-store"),process.env.npm_config_cache=f__default.join(s,"pnpm-cache")):t==="yarn"?process.env.npm_config_cache=f__default.join(s,"yarn-cache"):process.env.npm_config_cache=f__default.join(s,"npm-cache"),o().finally(()=>{typeof a>"u"?delete process.env.npm_config_cache:process.env.npm_config_cache=a,typeof l>"u"?delete process.env.npm_config_store_dir:process.env.npm_config_store_dir=l;})}detectPackageManager(e){return k.existsSync(f__default.join(e,"pnpm-lock.yaml"))?"pnpm":k.existsSync(f__default.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&&k.mkdirSync(process.env.npm_config_cache,{recursive:true}),t==="pnpm"&&process.env.npm_config_store_dir&&k.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),o=this.resolveDependencyMode(e),n=o==="shared-runtime-caches"||o==="shared-node-deps"?["install","--prefer-offline"]:["install"];return this.withDependencyEnv(e,t,()=>this.run(t,n,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 St=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(k.existsSync(f__default.join(t,".rapidkit-workspace")))return t;let o=f__default.dirname(t);if(o===t)break;t=o;}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 o=this.findWorkspaceRoot(e);if(!o)return "isolated";let n=f__default.join(o,".rapidkit","policies.yml");if(!k.existsSync(n))return "isolated";try{let a=k.readFileSync(n,"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 o=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=o==="shared-runtime-caches"?f__default.join(n||e,".rapidkit","cache","python"):f__default.join(e,".rapidkit","cache","python"),s=process.env.PIP_CACHE_DIR,a=process.env.POETRY_CACHE_DIR;return process.env.PIP_CACHE_DIR=f__default.join(i,"pip"),process.env.POETRY_CACHE_DIR=f__default.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 fn(){let r={...process.env},e=r.PATH||"";if(e){let t=e.split(f__default.delimiter).filter(o=>!o.replace(/\\/g,"/").includes("/.pyenv/shims")).join(f__default.delimiter);r.PATH=t;}return r.PYENV_VERSION="system",r.POETRY_PYTHON=r.POETRY_PYTHON||c$2(),typeof r.RAPIDKIT_SKIP_LOCK_SYNC>"u"&&(r.RAPIDKIT_SKIP_LOCK_SYNC="1"),r}function Ie(r,e){return r==="go"?new jt((t,o,n)=>e.runCommandInCwd(t,o,n)):r==="node"?new _t((t,o,n)=>e.runCommandInCwd(t,o,n)):r==="java"?new Rt((t,o,n)=>e.runCommandInCwd(t,o,n)):new St((t,o)=>e.runCoreRapidkit(t,{cwd:o,env:fn()}))}var Yr=f__default.join(Vo.homedir(),".rapidkit","cache"),zr=1440*60*1e3;function Vt(){let r=process.env.RAPIDKIT_CACHE_DIR?.trim();if(r)return r;let e=process.env.VITEST_WORKER_ID?.trim();return e?f__default.join(Yr,`vitest-${e}`):Yr}var It=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__default.join(Vt(),`${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 o=this.memoryCache.get(e);if(o&&o.version===t&&Date.now()-o.timestamp<zr)return a$1.debug(`Cache hit (memory): ${e}`),o.data;try{let n=this.getCachePath(e),i=await promises.readFile(n,"utf-8"),s=JSON.parse(i);if(s.version===t&&Date.now()-s.timestamp<zr)return a$1.debug(`Cache hit (disk): ${e}`),this.memoryCache.set(e,s),s.data;await promises.unlink(n).catch(()=>{});}catch{a$1.debug(`Cache miss: ${e}`);}return null}async set(e,t,o="1.0"){let n={data:t,timestamp:Date.now(),version:o};this.memoryCache.set(e,n);try{await promises.mkdir(Vt(),{recursive:true});let i=this.getCachePath(e),s=this.getTempCachePath(i);await promises.writeFile(s,JSON.stringify(n),"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=Vt(),t=await promises.readdir(e);await Promise.all(t.map(o=>promises.unlink(f__default.join(e,o)))),a$1.debug("Cache cleared");}catch{}}};function hn(r){let e=r;for(;;){if(k.existsSync(f__default.join(e,".rapidkit-workspace"))||k.existsSync(f__default.join(e,".rapidkit","workspace.json")))return e;let t=f__default.dirname(e);if(t===e)break;e=t;}return null}function wn(r){let e=ue(r);return ne(e,r)?"go":se(e,r)?"java":ie(e,r)?"node":le(e,r)?"python":"unknown"}function kn(r,e){if(!k.existsSync(r))return null;let t=k.readdirSync(r).filter(o=>o.endsWith(".json")&&e.some(n=>n.test(o))).map(o=>f__default.join(r,o));return t.length===0?null:(t.sort((o,n)=>k.statSync(n).mtimeMs-k.statSync(o).mtimeMs),t[0])}function rt(r){return r&&typeof r=="object"&&!Array.isArray(r)?r:{}}function vn(r,e){let t=f__default.join(r,".rapidkit","toolchain.lock");if(!k.existsSync(t))return {gate:"env",status:"fail",summary:"toolchain.lock is missing",details:["Run rapidkit bootstrap to pin runtime versions and generate a reproducible toolchain."],evidencePath:t};try{let o=JSON.parse(k.readFileSync(t,"utf-8")),n=rt(o.runtime),s=["python","node","go","java"].filter(a=>{let l=rt(n[a]);return typeof l.version=="string"&&l.version.trim().length>0});if(s.length===0)return {gate:"env",status:"fail",summary:"No runtime versions are pinned in toolchain.lock",details:["Pin at least one runtime version via rapidkit setup <runtime> and re-run bootstrap."],evidencePath:t};if(e!=="unknown"){let a=rt(n[e]);if(typeof a.version!="string"||a.version.trim().length===0)return {gate:"env",status:"fail",summary:`Project runtime (${e}) is not pinned in toolchain.lock`,details:[`Run rapidkit setup ${e} and rapidkit bootstrap to lock ${e} for this workspace.`],evidencePath:t}}return {gate:"env",status:"pass",summary:`Pinned runtimes: ${s.join(", ")}`,details:[],evidencePath:t}}catch{return {gate:"env",status:"fail",summary:"toolchain.lock is invalid JSON",details:["Regenerate lockfile with rapidkit bootstrap."],evidencePath:t}}}function bn(r){let e=f__default.join(r,".rapidkit","reports","doctor-last-run.json");if(!k.existsSync(e))return {payload:null,path:e};try{let t=JSON.parse(k.readFileSync(e,"utf-8"));return c$4(t,"workspace")?{payload:t,path:e}:{payload:null,path:e}}catch{return {payload:null,path:e}}}function Pn(r){let e=bn(r);if(!e.payload)return {gate:{gate:"doctor",status:"fail",summary:"Doctor evidence is missing",details:["Run rapidkit doctor workspace --json before release readiness checks."],evidencePath:e.path},payload:null};let t=rt(e.payload.summary),o=Number(t.totalIssues??0);return t.hasSystemErrors?{gate:{gate:"doctor",status:"fail",summary:"Doctor reported system errors",details:["Resolve system-level doctor errors before proceeding."],evidencePath:e.path},payload:e.payload}:o>0?{gate:{gate:"doctor",status:"warn",summary:`Doctor found ${o} issue(s)`,details:["Run rapidkit doctor workspace --fix and re-run readiness checks."],evidencePath:e.path},payload:e.payload}:{gate:{gate:"doctor",status:"pass",summary:"Doctor checks passed without issues",details:[],evidencePath:e.path},payload:e.payload}}function Cn(r){let e=f__default.join(r,".rapidkit","reports"),t=kn(e,[/verify-pack-contract/i,/^verify.*\.json$/i]);if(!t)return {gate:"verify",status:"fail",summary:"Verify-pack contract evidence is missing",details:["Export verify-pack contract JSON from extension/CI before release readiness checks."],evidencePath:f__default.join(e,"*verify-pack-contract*.json")};try{let o=JSON.parse(k.readFileSync(t,"utf-8")),n=String(o.status??"").toLowerCase(),i=rt(o.summary),s=Number(i.failedChecks??0);return n==="fail"||s>0?{gate:"verify",status:"fail",summary:"Verify-pack contract reports failed checks",details:["Fix failed verify checks and regenerate verify-pack contract evidence."],evidencePath:t}:n==="pass"?{gate:"verify",status:"pass",summary:"Verify-pack contract passed",details:[],evidencePath:t}:{gate:"verify",status:"warn",summary:"Verify-pack contract status is not explicit",details:["Ensure contract status is pass/fail and keep schema aligned with v1 contract."],evidencePath:t}}catch{return {gate:"verify",status:"fail",summary:"Verify-pack contract is invalid JSON",details:["Regenerate verify-pack contract artifact."],evidencePath:t}}}function xn(r,e){let t=f__default.join(e,".rapidkit","reports","doctor-last-run.json");if(!r)return {gate:"dependency",status:"warn",summary:"Dependency risk check skipped (doctor evidence missing)",details:["Run rapidkit doctor workspace --json to include dependency findings."],evidencePath:t};let o=Array.isArray(r.projects)?r.projects:[],n=o.reduce((s,a)=>{let l=Number(a.vulnerabilities??0);return Number.isFinite(l)?s+Math.max(0,l):s},0),i=o.filter(s=>s.depsInstalled===false).length;return n>0?{gate:"dependency",status:"fail",summary:`${n} dependency vulnerability(ies) reported`,details:["Resolve vulnerabilities (npm/pip/go audit pipelines) before release."],evidencePath:t}:i>0?{gate:"dependency",status:"warn",summary:`${i} project(s) report missing dependencies`,details:["Run project init/bootstrap and regenerate doctor evidence."],evidencePath:t}:{gate:"dependency",status:"pass",summary:"No dependency vulnerabilities reported",details:[],evidencePath:t}}function jn(r){return r.some(e=>e.status==="fail")?"fail":r.some(e=>e.status==="warn")?"warn":"pass"}async function Rn(r,e){let t=f__default.join(r,".rapidkit","reports","release-readiness-last-run.json");return await ___default.ensureDir(f__default.dirname(t)),await ___default.writeJSON(t,e,{spaces:2}),t}async function Ht(r={}){let e=f__default.resolve(r.startPath??process.cwd()),t=hn(e)??e,o=wn(e),n=vn(t,o),i=Pn(t),s=Cn(t),a=xn(i.payload,t),l=[n,i.gate,s,a],u=jn(l),m={schemaVersion:"v1",generatedAt:new Date().toISOString(),workspacePath:t,projectPath:e,action:r.action,overallStatus:u,blocking:u==="fail",blockingReasons:l.filter(d=>d.status==="fail").map(d=>`${d.gate}: ${d.summary}`),gates:l};return r.writeReport!==false&&(m.evidencePath=await Rn(t,m)),m}function _n(r){return r==="pass"?c$1.green("PASS"):r==="warn"?c$1.yellow("WARN"):c$1.red("FAIL")}function Sn(r){return r==="pass"?c$1.green("PASS"):r==="warn"?c$1.yellow("WARN"):c$1.red("FAIL")}async function Zr(r){let e=await Ht({writeReport:true});if(r.json)console.log(JSON.stringify(e,null,2));else {console.log(c$1.bold.cyan(`
107
107
  \u{1F6A6} RapidKit Release Readiness
108
- `)),console.log(c$1.bold(`Workspace: ${c$1.cyan(m.basename(e.workspacePath))}`)),console.log(c$1.gray(`Path: ${e.workspacePath}`)),console.log(`Overall: ${co(e.overallStatus)}`);for(let t of e.gates){console.log(` - ${t.gate}: ${ao(t.status)} ${t.summary}`);for(let n of t.details)console.log(c$1.gray(` ${n}`));t.evidencePath&&console.log(c$1.gray(` evidence: ${t.evidencePath}`));}e.evidencePath&&console.log(c$1.gray(`
109
- Evidence saved: ${e.evidencePath}`));}r.strict&&e.overallStatus!=="pass"&&process.exit(1);}async function mo(r){let e=await promises.readFile(r);return createHash("sha256").update(e).digest("hex")}async function Gr(r,e){await j.outputFile(r,`${JSON.stringify(e,null,2)}
110
- `,"utf-8");}function xe(r,e){return m.isAbsolute(e)?e:m.join(r,e)}function fo(r,e){if(r.target)return r.target;if(r.source)return m.basename(r.source);if(r.url)try{let t=new URL(r.url).pathname,n=m.basename(t);if(n&&n!=="/")return n}catch{}return `${e}.artifact`}async function go(r){let e=m.join(r,".rapidkit","trusted-sources.lock"),t=new Set(["localhost","127.0.0.1"]);if(!await j.pathExists(e))return t;try{let o=(await promises.readFile(e,"utf-8")).split(/\r?\n/).map(s=>s.trim()).filter(s=>s.length>0&&!s.startsWith("#"));for(let s of o)t.add(s.toLowerCase());}catch{}return t}async function yo(r,e,t){await j.ensureDir(m.dirname(e)),await new Promise((n,o)=>{let i=(r.startsWith("https://")?Ur:qr).get(r,a=>{if(!a.statusCode||a.statusCode<200||a.statusCode>=300){o(new Error(`HTTP ${a.statusCode||"unknown"}`)),a.resume();return}let l=createWriteStream(e);a.pipe(l),l.on("finish",()=>{l.close(),n();}),l.on("error",d=>{o(d);});});i.setTimeout(t,()=>{i.destroy(new Error(`Request timeout after ${t}ms`));}),i.on("error",a=>{o(a);});});}async function ho(r,e,t,n,o){let s=new URL(r),i=JSON.stringify(e),a=s.protocol==="https:"?Ur:qr;await new Promise((l,d)=>{let f=a.request({method:"POST",hostname:s.hostname,port:s.port||(s.protocol==="https:"?443:80),path:`${s.pathname}${s.search}`,headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(i),...n?{Authorization:`Bearer ${n}`}:{},...o||{}}},p=>{if(!p.statusCode||p.statusCode<200||p.statusCode>=300){d(new Error(`HTTP ${p.statusCode||"unknown"}`)),p.resume();return}p.resume(),l();});f.setTimeout(t,()=>{f.destroy(new Error(`Request timeout after ${t}ms`));}),f.on("error",p=>{d(p);}),f.write(i),f.end();});}function Fr(r){return new Promise(e=>setTimeout(e,r))}async function wo(r,e,t,n){let o=xe(r,e||".rapidkit/reports/evidence-export-dead-letter.ndjson");return await j.ensureDir(m.dirname(o)),await promises.appendFile(o,`${JSON.stringify({timestamp:new Date().toISOString(),reason:n,payload:t})}
111
- `,"utf-8"),o}function ko(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",s=createHmac(n,t).update(JSON.stringify(r)).digest("hex");return {headers:{[o]:s,"x-rapidkit-evidence-signature-alg":n}}}async function vo(r,e,t){let n=(t.algorithm||"sha256").toLowerCase(),o=xe(r,t.publicKeyPath);if(!await j.pathExists(o))return {verified:false,algorithm:n,publicKeyPath:o,publicKeyFingerprint:"",signature:t.signature,message:`Public key not found: ${o}`};try{let s=await promises.readFile(o,"utf-8"),i=await promises.readFile(e),a=createVerify(n);a.update(i),a.end();let l=Buffer.from(t.signature,"base64"),d=a.verify(s,l),f=createHash("sha256").update(s).digest("hex");return {verified:d,algorithm:n,publicKeyPath:o,publicKeyFingerprint:f,signature:t.signature,message:d?"Attestation verified.":"Attestation signature verification failed."}}catch(s){return {verified:false,algorithm:n,publicKeyPath:o,publicKeyFingerprint:"",signature:t.signature,message:`Attestation verification error: ${s.message}`}}}async function bo(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 s=t.signaturePath?xe(r,t.signaturePath):null;if(!s||!await j.pathExists(s))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:s};let i=["verify-blob",e,"--signature",s],a=t.certificatePath?xe(r,t.certificatePath):null;a&&i.push("--certificate",a);let l=t.bundlePath?xe(r,t.bundlePath):null;l&&i.push("--bundle",l);let d=t.keyPath?xe(r,t.keyPath):null;d&&i.push("--key",d),t.identity&&i.push("--certificate-identity",t.identity),t.issuer&&i.push("--certificate-oidc-issuer",t.issuer),t.rekorUrl&&i.push("--rekor-url",t.rekorUrl),n.requireTransparencyLog||i.push("--insecure-ignore-tlog");try{let f=await execa("cosign",i,{reject:false});return f.exitCode===0?{verified:true,tlogVerified:n.requireTransparencyLog,message:"Sigstore verification passed.",identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:l,certificatePath:a,signaturePath:s}:{verified:false,tlogVerified:false,message:`Sigstore verification failed: ${f.stderr||f.stdout||"unknown error"}`,identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:l,certificatePath:a,signaturePath:s}}catch(f){return {verified:false,tlogVerified:false,message:`Sigstore verification error: ${f.message}`,identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:l,certificatePath:a,signaturePath:s}}}async function Po(r,e){let t=e.algorithm||"sha256",n=xe(r,e.policyPath),o=xe(r,e.signaturePath),s=xe(r,e.publicKeyPath);if(!await j.pathExists(n))return {verified:false,message:`Governance policy bundle not found: ${n}`,policies:null};if(!await j.pathExists(o))return {verified:false,message:`Governance policy signature not found: ${o}`,policies:null};if(!await j.pathExists(s))return {verified:false,message:`Governance policy public key not found: ${s}`,policies:null};try{let i=await promises.readFile(n,"utf-8"),a=(await promises.readFile(o,"utf-8")).trim(),l=await promises.readFile(s,"utf-8"),d=createVerify(t);return d.update(i),d.end(),d.verify(l,Buffer.from(a,"base64"))?{verified:true,message:"Governance policy bundle verified.",policies:JSON.parse(i).policies||{}}:{verified:false,message:"Governance policy bundle signature verification failed.",policies:null}}catch(i){return {verified:false,message:`Governance policy bundle verification error: ${i.message}`,policies:null}}}async function Jt(r,e){let t=[],n={syncedArtifacts:0,verifiedArtifacts:0,rotatedFiles:0,lockWritten:false,governanceBundleVerified:false,transparencyEvidenceWritten:false,transparencyEvidenceRecords:0,evidenceExported:false,evidenceExportTarget:null},o=m.join(r,".rapidkit"),s=m.join(o,"mirror-config.json"),i=m.join(o,"mirror.lock"),a=m.join(o,"mirror","artifacts"),l=m.join(o,"reports"),d=await go(r);if(!await j.pathExists(s))return t.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: .rapidkit/mirror-config.json not found."}),{checks:t,details:n};let f={};try{f=JSON.parse(await promises.readFile(s,"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||f.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 j.ensureDir(a);let u=Math.max(0,f.prefetch?.retries??2),y=Math.max(0,f.prefetch?.backoffMs??250),g=Math.max(1e3,f.prefetch?.timeoutMs??15e3),h=f.security?.requireAttestation===true,b=f.security?.requireSigstore===true,w=f.security?.requireTransparencyLog===true,C=f.security?.requireSignedGovernance===true,P=f.security?.evidenceExport,S=(process.env.RAPIDKIT_ENV||f.security?.governance?.environment||"dev").toLowerCase(),A=f.security?.governance?.policies||{};if(f.security?.governanceBundle){let U=await Po(r,f.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(C)return {checks:t,details:n}}let $=A[S],N=w||$?.requireTransparencyLog===true,G=[],K=Array.isArray(f.artifacts)?f.artifacts:[],Q=[];for(let U=0;U<K.length;U+=1){let M=K[U],x=M.id||`artifact-${U+1}`,q=M.source?xe(r,M.source):null,fe=fo(M,x),F=m.join(a,fe),Z=false,ke={sourceType:"path",source:q||M.url||"unknown",host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true};if(q&&await j.pathExists(q))await j.ensureDir(m.dirname(F)),await j.copyFile(q,F),n.syncedArtifacts+=1,Z=true,ke={sourceType:"path",source:q,host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true},t.push({id:`mirror.sync.${x}`,status:"passed",message:`Mirrored artifact ${x} from source path.`});else if(M.url){let se="";try{se=new URL(M.url).hostname.toLowerCase();}catch{t.push({id:`mirror.prefetch.${x}`,status:"failed",message:`Invalid URL for ${x}: ${M.url}`});continue}if(!(process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||d.has(se))){t.push({id:`mirror.prefetch.trust.${x}`,status:"failed",message:`Untrusted mirror host for ${x}: ${se}. Add host to .rapidkit/trusted-sources.lock or set RAPIDKIT_TRUSTED_SOURCES=1.`});continue}if(e.offlineMode&&(await j.pathExists(F)?(Z=true,ke={sourceType:"url",source:M.url,host:se,fetchedAt:new Date().toISOString(),attempts:0,trusted:true},t.push({id:`mirror.prefetch.${x}`,status:"passed",message:`Offline mode reused existing mirrored artifact ${x}.`})):t.push({id:`mirror.prefetch.${x}`,status:"failed",message:`Offline mode cannot prefetch remote artifact ${x} without an existing mirrored copy.`}),!Z))continue;if(!Z){let V=null,_e=0;for(let Te=1;Te<=u+1;Te+=1){_e=Te;try{await yo(M.url,F,g),n.syncedArtifacts+=1,Z=true,ke={sourceType:"url",source:M.url,host:se,fetchedAt:new Date().toISOString(),attempts:_e,trusted:true},t.push({id:`mirror.prefetch.${x}`,status:"passed",message:_e>1?`Prefetched artifact ${x} from ${se} after ${_e} attempts.`:`Prefetched artifact ${x} from ${se}.`});break}catch(Ye){if(V=Ye,Te<=u){await Fr(y*Te);continue}}}if(!Z){t.push({id:`mirror.prefetch.${x}`,status:"failed",message:`Failed to prefetch ${x} after ${u+1} attempt(s): ${V?.message||"unknown error"}`});continue}}if(!Z){t.push({id:`mirror.prefetch.${x}`,status:"failed",message:`Failed to prefetch ${x}.`});continue}}if(!Z){M.required||e.offlineMode?t.push({id:`mirror.sync.${x}`,status:"failed",message:`Mirror source missing for ${x}${q?`: ${q}`:""}`}):t.push({id:`mirror.sync.${x}`,status:"skipped",message:`Mirror source not found for optional artifact ${x}.`});continue}let Ae=await mo(F);if(M.sha256&&M.sha256.toLowerCase()!==Ae.toLowerCase()){t.push({id:`mirror.verify.${x}`,status:"failed",message:`Checksum mismatch for ${x}.`});continue}n.verifiedArtifacts+=1,t.push({id:`mirror.verify.${x}`,status:"passed",message:`Checksum verified for ${x}.`});let X=M.attestation?await vo(r,F,M.attestation):null;if(M.attestation){if(t.push({id:`mirror.attest.${x}`,status:X?.verified?"passed":"failed",message:X?.message||"Attestation verification failed."}),!X?.verified)continue}else if(h){t.push({id:`mirror.attest.${x}`,status:"failed",message:`Attestation is required but missing for ${x}.`});continue}else t.push({id:`mirror.attest.${x}`,status:"skipped",message:`No attestation provided for ${x}.`});let R=M.attestation?.sigstore,_=R?await bo(r,F,R,{requireTransparencyLog:N}):null;if(R){if(t.push({id:`mirror.sigstore.${x}`,status:_?.verified?"passed":"failed",message:_?.message||"Sigstore verification failed."}),G.push({artifactId:x,verified:!!_?.verified,tlogVerified:!!_?.tlogVerified,identity:_?.identity||null,issuer:_?.issuer||null,rekorUrl:_?.rekorUrl||null,timestamp:new Date().toISOString(),environment:S}),!_?.verified)continue}else if(b){t.push({id:`mirror.sigstore.${x}`,status:"failed",message:`Sigstore attestation is required but missing for ${x}.`});continue}else t.push({id:`mirror.sigstore.${x}`,status:"skipped",message:`No Sigstore attestation provided for ${x}.`});if(R&&_?.verified&&$){let se=$.allowedIdentities||[];if(se.length>0){let V=!!_.identity&&se.includes(_.identity);if(t.push({id:`mirror.sigstore.policy.identity.${x}`,status:V?"passed":"failed",message:V?`Sigstore identity policy passed for ${x} in ${S}.`:`Sigstore identity policy failed for ${x} in ${S}.`}),!V)continue}let ce=$.allowedIssuers||[];if(ce.length>0){let V=!!_.issuer&&ce.includes(_.issuer);if(t.push({id:`mirror.sigstore.policy.issuer.${x}`,status:V?"passed":"failed",message:V?`Sigstore issuer policy passed for ${x} in ${S}.`:`Sigstore issuer policy failed for ${x} in ${S}.`}),!V)continue}let ve=$.allowedRekorUrls||[];if(ve.length>0){let V=!!_.rekorUrl&&ve.includes(_.rekorUrl);if(t.push({id:`mirror.sigstore.policy.rekor.${x}`,status:V?"passed":"failed",message:V?`Sigstore Rekor policy passed for ${x} in ${S}.`:`Sigstore Rekor policy failed for ${x} in ${S}.`}),!V)continue}}else $&&t.push({id:`mirror.sigstore.policy.${x}`,status:"skipped",message:`Sigstore governance policy configured for ${S} but no verified Sigstore attestation for ${x}.`});let W=await promises.stat(F);Q.push({id:x,path:m.relative(r,F),sha256:Ae,size:W.size,provenance:ke,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:!!R,verified:_?.verified||false,tlogVerified:_?.tlogVerified||false,identity:_?.identity||null,issuer:_?.issuer||null,rekorUrl:_?.rekorUrl||null,bundlePath:_?.bundlePath||null,certificatePath:_?.certificatePath||null,signaturePath:_?.signaturePath||null,verifiedAt:_?.verified?new Date().toISOString():null}}});}let ie=f.retention?.keepLast;if(typeof ie=="number"&&ie>0){let M=(await promises.readdir(a,{withFileTypes:true})).filter(x=>x.isFile()).map(x=>m.join(a,x.name));if(M.length>ie){let x=await Promise.all(M.map(async fe=>({filePath:fe,stat:await promises.stat(fe)})));x.sort((fe,F)=>F.stat.mtimeMs-fe.stat.mtimeMs);let q=x.slice(ie);for(let fe of q)await promises.unlink(fe.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 ue={schemaVersion:"1.0",generatedAt:new Date().toISOString(),mode:f.mode||null,environment:S,artifacts:Q};if(await promises.writeFile(i,`${JSON.stringify(ue,null,2)}
112
- `,"utf-8"),n.lockWritten=true,t.push({id:"mirror.lock.write",status:"passed",message:`Mirror lock updated at ${m.relative(r,i)}.`}),n.transparencyEvidenceRecords=G.length,G.length>0){let U={schemaVersion:"1.0",generatedAt:new Date().toISOString(),environment:S,records:G},M=new Date().toISOString().replace(/[:.]/g,"-"),x=m.join(l,`transparency-evidence-${M}.json`),q=m.join(l,"transparency-evidence.latest.json");if(await j.ensureDir(l),await Gr(x,U),await Gr(q,U),n.transparencyEvidenceWritten=true,t.push({id:"sigstore.evidence.write",status:"passed",message:`Transparency evidence written to ${m.relative(r,q)}.`}),P?.enabled){let fe=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 F=xe(r,P.filePath);await j.ensureDir(m.dirname(F)),await promises.appendFile(F,`${JSON.stringify(U)}
113
- `,"utf-8"),n.evidenceExported=true,n.evidenceExportTarget=F,t.push({id:"sigstore.evidence.export.file",status:"passed",message:`Transparency evidence exported to file sink ${F}.`});}catch(F){t.push({id:"sigstore.evidence.export.file",status:"failed",message:`Evidence file export failed: ${F.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 F=Math.max(0,P.retries??0),Z=Math.max(0,P.backoffMs??500),ke=ko(U,P.signing);ke.error&&t.push({id:"sigstore.evidence.export.http",status:"failed",message:ke.error});try{let Ae=P.authTokenEnv?process.env[P.authTokenEnv]:void 0,X=false,R=null;for(let _=1;_<=F+1;_+=1)try{if(ke.error)throw new Error(ke.error);await ho(P.endpoint,U,fe,Ae,ke.headers),n.evidenceExported=true,n.evidenceExportTarget=P.endpoint,t.push({id:"sigstore.evidence.export.http",status:"passed",message:_>1?`Transparency evidence exported to HTTP endpoint ${P.endpoint} after ${_} attempts.`:`Transparency evidence exported to HTTP endpoint ${P.endpoint}.`}),X=true;break}catch(W){R=W,_<=F&&await Fr(Z*_);}if(!X)throw R||new Error("unknown evidence export error")}catch(Ae){let X=`Evidence HTTP export failed: ${Ae.message}`;t.push({id:"sigstore.evidence.export.http",status:"failed",message:X});try{let R=await wo(r,P.deadLetterPath,U,X);t.push({id:"sigstore.evidence.export.deadletter",status:"passed",message:`Evidence export failure persisted to dead-letter sink ${R}.`});}catch(R){t.push({id:"sigstore.evidence.export.deadletter",status:"failed",message:`Evidence dead-letter write failed: ${R.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 qt(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 xo(r){let e=r.trim().toLowerCase();return e?e.startsWith("fastapi")?"fastapi":e.startsWith("nestjs")?"nestjs":null:null}function jt(r){let e=r.trim().toLowerCase();return e.startsWith("gofiber")||e==="go"||e==="go.standard"||e==="fiber"}function rt(r){let e=r.trim().toLowerCase();return e.startsWith("gogin")||e==="gin"}function nt(r){let e=r.trim().toLowerCase();return e.startsWith("springboot")||e==="spring"||e==="springboot"||e==="java"}function he(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 er(){return d$1()}function Hr(){let r={...process.env},e=r.PATH||"";return e&&(r.PATH=e.split(m.delimiter).filter(t=>!t.replace(/\\/g,"/").includes("/.pyenv/shims")).join(m.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 _o(r){return f(m.join(r,".venv"))}async function cn(r,e){return await L(r,["--version"],e)===0}async function Ut(r){let e=m.join(r,"go.mod");if(await j__default.pathExists(e))return "go";let t=m.join(r,"pom.xml"),n=m.join(r,"build.gradle"),o=m.join(r,"build.gradle.kts");if(await j__default.pathExists(t)||await j__default.pathExists(n)||await j__default.pathExists(o))return "java";let s=m.join(r,"package.json");if(await j__default.pathExists(s))return "node";let i=m.join(r,"pyproject.toml"),a=m.join(r,"requirements.txt"),l=m.join(r,"poetry.lock");return await j__default.pathExists(i)||await j__default.pathExists(a)||await j__default.pathExists(l)?"python":null}async function Ro(r){for(let e of er())if(await L(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],r)===0)return 0;return 1}async function ln(r){for(let e of er())if(await L(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],r)===0)return 0;return 1}async function jo(r){let e=f(m.join(r,".venv"));if(!await j__default.pathExists(e)){let s=await ln(r);if(s!==0)return s}if(!await cn("poetry",r))return 0;let n=await L("poetry",["config","virtualenvs.in-project","true","--local"],r);if(n!==0)return n;let o=await L("poetry",["env","use",e],r);return o!==0?o:0}async function So(r){let e=f(m.join(r,".venv"));if(!await j__default.pathExists(e)){let o=await ln(r);if(o!==0)return o}await L(e,["-m","pip","install","--upgrade","pip","setuptools","wheel"],r);let t=m.join(r,"requirements.txt");if(await j__default.pathExists(t)&&await L(e,["-m","pip","install","-r","requirements.txt"],r)===0)return 0;let n=m.join(r,"pyproject.toml");return await j__default.pathExists(n)&&(await L(e,["-m","pip","install","-e","."],r)===0||await L(e,["-m","pip","install","."],r)===0)?0:1}async function Vt(r,e){return await jo(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 j__default.pathExists(m.join(r,".venv"))?0:(console.log(c$1.yellow("\u26A0\uFE0F Python init fallback: installing dependencies directly into project .venv")),await So(r))}async function Ht(r){let e=await ot("init",r);if(e===0)return 0;let t=["npm","pnpm","yarn"];for(let n of t){if(!await cn(n,r))continue;if(await L(n,["install"],r)===0)return console.log(c$1.green(`\u2705 Node init fallback succeeded with ${n} install`)),0}return e}async function Br(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>]
114
- `),1;try{Je(t);}catch(i){let a=i instanceof Error?i.message:String(i);return process.stderr.write(`${a}
115
- `),1}let n=he(r,"--output")||process.cwd(),o=m.resolve(n,t),s=r.includes("--skip-git")||r.includes("--no-git");try{let{default:i}=await import('fs-extra');if(await i.ensureDir(m.dirname(o)),await i.pathExists(o))return process.stderr.write(`\u274C Directory "${o}" already exists
116
- `),1;await i.ensureDir(o);let{generateGoFiberKit:a}=await import('./gofiber-standard-JDPREQCP.js');await a(o,{project_name:t,module_path:t,skipGit:s});let l=z(process.cwd());if(l){let{syncWorkspaceProjects:d}=await import('./workspace-7JHX7L3E.js');await d(l,true);}return 0}catch(i){return process.stderr.write(`RapidKit Go/Fiber generator failed: ${i?.message??i}
117
- `),1}}async function Yr(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>]
118
- `),1;try{Je(t);}catch(i){let a=i instanceof Error?i.message:String(i);return process.stderr.write(`${a}
119
- `),1}let n=he(r,"--output")||process.cwd(),o=m.resolve(n,t),s=r.includes("--skip-git")||r.includes("--no-git");try{let{default:i}=await import('fs-extra');if(await i.ensureDir(m.dirname(o)),await i.pathExists(o))return process.stderr.write(`\u274C Directory "${o}" already exists
120
- `),1;await i.ensureDir(o);let{generateGoGinKit:a}=await import('./gogin-standard-DCERHHVB.js');await a(o,{project_name:t,module_path:t,skipGit:s});let l=z(process.cwd());if(l){let{syncWorkspaceProjects:d}=await import('./workspace-7JHX7L3E.js');await d(l,true);}return 0}catch(i){return process.stderr.write(`RapidKit Go/Gin generator failed: ${i?.message??i}
121
- `),1}}async function zr(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>]
122
- `),1;try{Je(t);}catch(g){let h=g instanceof Error?g.message:String(g);return process.stderr.write(`${h}
123
- `),1}let n=he(r,"--output")||process.cwd(),o=m.resolve(n,t),s=r.includes("--skip-git")||r.includes("--no-git"),i=he(r,"--java-version"),a=he(r,"--spring-boot-version"),l=he(r,"--springdoc-version"),d=he(r,"--group-id"),f=he(r,"--package-name"),p=he(r,"--description"),u=he(r,"--port"),y=g=>/^\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?$/.test(g);if(i&&!/^\d+$/.test(i.trim()))return process.stderr.write(`Invalid --java-version. Expected major version number, e.g. 21
108
+ `)),console.log(c$1.bold(`Workspace: ${c$1.cyan(f__default.basename(e.workspacePath))}`)),console.log(c$1.gray(`Path: ${e.workspacePath}`)),console.log(`Overall: ${Sn(e.overallStatus)}`);for(let t of e.gates){console.log(` - ${t.gate}: ${_n(t.status)} ${t.summary}`);for(let o of t.details)console.log(c$1.gray(` ${o}`));t.evidencePath&&console.log(c$1.gray(` evidence: ${t.evidencePath}`));}e.evidencePath&&console.log(c$1.gray(`
109
+ Evidence saved: ${e.evidencePath}`));}r.strict&&e.overallStatus!=="pass"&&process.exit(1);}async function $n(r){let e=await promises.readFile(r);return createHash("sha256").update(e).digest("hex")}async function Xr(r,e){await _.outputFile(r,`${JSON.stringify(e,null,2)}
110
+ `,"utf-8");}function xe(r,e){return f__default.isAbsolute(e)?e:f__default.join(r,e)}function Mn(r,e){if(r.target)return r.target;if(r.source)return f__default.basename(r.source);if(r.url)try{let t=new URL(r.url).pathname,o=f__default.basename(t);if(o&&o!=="/")return o}catch{}return `${e}.artifact`}async function On(r){let e=f__default.join(r,".rapidkit","trusted-sources.lock"),t=new Set(["localhost","127.0.0.1"]);if(!await _.pathExists(e))return t;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)t.add(i.toLowerCase());}catch{}return t}async function Dn(r,e,t){await _.ensureDir(f__default.dirname(e)),await new Promise((o,n)=>{let s=(r.startsWith("https://")?no:oo).get(r,a=>{if(!a.statusCode||a.statusCode<200||a.statusCode>=300){n(new Error(`HTTP ${a.statusCode||"unknown"}`)),a.resume();return}let l=createWriteStream(e);a.pipe(l),l.on("finish",()=>{l.close(),o();}),l.on("error",u=>{n(u);});});s.setTimeout(t,()=>{s.destroy(new Error(`Request timeout after ${t}ms`));}),s.on("error",a=>{n(a);});});}async function Tn(r,e,t,o,n){let i=new URL(r),s=JSON.stringify(e),a=i.protocol==="https:"?no:oo;await new Promise((l,u)=>{let m=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),...o?{Authorization:`Bearer ${o}`}:{},...n||{}}},d=>{if(!d.statusCode||d.statusCode<200||d.statusCode>=300){u(new Error(`HTTP ${d.statusCode||"unknown"}`)),d.resume();return}d.resume(),l();});m.setTimeout(t,()=>{m.destroy(new Error(`Request timeout after ${t}ms`));}),m.on("error",d=>{u(d);}),m.write(s),m.end();});}function eo(r){return new Promise(e=>setTimeout(e,r))}async function Nn(r,e,t,o){let n=xe(r,e||".rapidkit/reports/evidence-export-dead-letter.ndjson");return await _.ensureDir(f__default.dirname(n)),await promises.appendFile(n,`${JSON.stringify({timestamp:new Date().toISOString(),reason:o,payload:t})}
111
+ `,"utf-8"),n}function Kn(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 o=(e.algorithm||"sha256").toLowerCase(),n=e.headerName||"x-rapidkit-evidence-signature",i=createHmac(o,t).update(JSON.stringify(r)).digest("hex");return {headers:{[n]:i,"x-rapidkit-evidence-signature-alg":o}}}async function Fn(r,e,t){let o=(t.algorithm||"sha256").toLowerCase(),n=xe(r,t.publicKeyPath);if(!await _.pathExists(n))return {verified:false,algorithm:o,publicKeyPath:n,publicKeyFingerprint:"",signature:t.signature,message:`Public key not found: ${n}`};try{let i=await promises.readFile(n,"utf-8"),s=await promises.readFile(e),a=createVerify(o);a.update(s),a.end();let l=Buffer.from(t.signature,"base64"),u=a.verify(i,l),m=createHash("sha256").update(i).digest("hex");return {verified:u,algorithm:o,publicKeyPath:n,publicKeyFingerprint:m,signature:t.signature,message:u?"Attestation verified.":"Attestation signature verification failed."}}catch(i){return {verified:false,algorithm:o,publicKeyPath:n,publicKeyFingerprint:"",signature:t.signature,message:`Attestation verification error: ${i.message}`}}}async function Ln(r,e,t,o){let n=process.env.RAPIDKIT_SIGSTORE_MOCK;if(n==="success")return {verified:true,tlogVerified:o.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(n==="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?xe(r,t.signaturePath):null;if(!i||!await _.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?xe(r,t.certificatePath):null;a&&s.push("--certificate",a);let l=t.bundlePath?xe(r,t.bundlePath):null;l&&s.push("--bundle",l);let u=t.keyPath?xe(r,t.keyPath):null;u&&s.push("--key",u),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),o.requireTransparencyLog||s.push("--insecure-ignore-tlog");try{let m=await execa("cosign",s,{reject:false});return m.exitCode===0?{verified:true,tlogVerified:o.requireTransparencyLog,message:"Sigstore verification passed.",identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:l,certificatePath:a,signaturePath:i}:{verified:false,tlogVerified:false,message:`Sigstore verification failed: ${m.stderr||m.stdout||"unknown error"}`,identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:l,certificatePath:a,signaturePath:i}}catch(m){return {verified:false,tlogVerified:false,message:`Sigstore verification error: ${m.message}`,identity:t.identity||null,issuer:t.issuer||null,rekorUrl:t.rekorUrl||null,bundlePath:l,certificatePath:a,signaturePath:i}}}async function Wn(r,e){let t=e.algorithm||"sha256",o=xe(r,e.policyPath),n=xe(r,e.signaturePath),i=xe(r,e.publicKeyPath);if(!await _.pathExists(o))return {verified:false,message:`Governance policy bundle not found: ${o}`,policies:null};if(!await _.pathExists(n))return {verified:false,message:`Governance policy signature not found: ${n}`,policies:null};if(!await _.pathExists(i))return {verified:false,message:`Governance policy public key not found: ${i}`,policies:null};try{let s=await promises.readFile(o,"utf-8"),a=(await promises.readFile(n,"utf-8")).trim(),l=await promises.readFile(i,"utf-8"),u=createVerify(t);return u.update(s),u.end(),u.verify(l,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 Yt(r,e){let t=[],o={syncedArtifacts:0,verifiedArtifacts:0,rotatedFiles:0,lockWritten:false,governanceBundleVerified:false,transparencyEvidenceWritten:false,transparencyEvidenceRecords:0,evidenceExported:false,evidenceExportTarget:null},n=f__default.join(r,".rapidkit"),i=f__default.join(n,"mirror-config.json"),s=f__default.join(n,"mirror.lock"),a=f__default.join(n,"mirror","artifacts"),l=f__default.join(n,"reports"),u=await On(r);if(!await _.pathExists(i))return t.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: .rapidkit/mirror-config.json not found."}),{checks:t,details:o};let m={};try{m=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:o}}if(!(e.forceRun===true||e.ciMode||e.offlineMode||m.mode==="offline-only"))return t.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: not in ci/offline mode."}),{checks:t,details:o};await _.ensureDir(a);let p=Math.max(0,m.prefetch?.retries??2),y=Math.max(0,m.prefetch?.backoffMs??250),g=Math.max(1e3,m.prefetch?.timeoutMs??15e3),h=m.security?.requireAttestation===true,b=m.security?.requireSigstore===true,w=m.security?.requireTransparencyLog===true,C=m.security?.requireSignedGovernance===true,P=m.security?.evidenceExport,S=(process.env.RAPIDKIT_ENV||m.security?.governance?.environment||"dev").toLowerCase(),I=m.security?.governance?.policies||{};if(m.security?.governanceBundle){let U=await Wn(r,m.security.governanceBundle);if(t.push({id:"governance.bundle.verify",status:U.verified?"passed":"failed",message:U.message}),U.verified&&U.policies)I=U.policies,o.governanceBundleVerified=true;else if(C)return {checks:t,details:o}}let M=I[S],N=w||M?.requireTransparencyLog===true,L=[],K=Array.isArray(m.artifacts)?m.artifacts:[],Q=[];for(let U=0;U<K.length;U+=1){let $=K[U],x=$.id||`artifact-${U+1}`,q=$.source?xe(r,$.source):null,ge=Mn($,x),W=f__default.join(a,ge),Z=false,ke={sourceType:"path",source:q||$.url||"unknown",host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true};if(q&&await _.pathExists(q))await _.ensureDir(f__default.dirname(W)),await _.copyFile(q,W),o.syncedArtifacts+=1,Z=true,ke={sourceType:"path",source:q,host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true},t.push({id:`mirror.sync.${x}`,status:"passed",message:`Mirrored artifact ${x} from source path.`});else if($.url){let ce="";try{ce=new URL($.url).hostname.toLowerCase();}catch{t.push({id:`mirror.prefetch.${x}`,status:"failed",message:`Invalid URL for ${x}: ${$.url}`});continue}if(!(process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||u.has(ce))){t.push({id:`mirror.prefetch.trust.${x}`,status:"failed",message:`Untrusted mirror host for ${x}: ${ce}. Add host to .rapidkit/trusted-sources.lock or set RAPIDKIT_TRUSTED_SOURCES=1.`});continue}if(e.offlineMode&&(await _.pathExists(W)?(Z=true,ke={sourceType:"url",source:$.url,host:ce,fetchedAt:new Date().toISOString(),attempts:0,trusted:true},t.push({id:`mirror.prefetch.${x}`,status:"passed",message:`Offline mode reused existing mirrored artifact ${x}.`})):t.push({id:`mirror.prefetch.${x}`,status:"failed",message:`Offline mode cannot prefetch remote artifact ${x} without an existing mirrored copy.`}),!Z))continue;if(!Z){let B=null,je=0;for(let Te=1;Te<=p+1;Te+=1){je=Te;try{await Dn($.url,W,g),o.syncedArtifacts+=1,Z=true,ke={sourceType:"url",source:$.url,host:ce,fetchedAt:new Date().toISOString(),attempts:je,trusted:true},t.push({id:`mirror.prefetch.${x}`,status:"passed",message:je>1?`Prefetched artifact ${x} from ${ce} after ${je} attempts.`:`Prefetched artifact ${x} from ${ce}.`});break}catch(Qe){if(B=Qe,Te<=p){await eo(y*Te);continue}}}if(!Z){t.push({id:`mirror.prefetch.${x}`,status:"failed",message:`Failed to prefetch ${x} after ${p+1} attempt(s): ${B?.message||"unknown error"}`});continue}}if(!Z){t.push({id:`mirror.prefetch.${x}`,status:"failed",message:`Failed to prefetch ${x}.`});continue}}if(!Z){$.required||e.offlineMode?t.push({id:`mirror.sync.${x}`,status:"failed",message:`Mirror source missing for ${x}${q?`: ${q}`:""}`}):t.push({id:`mirror.sync.${x}`,status:"skipped",message:`Mirror source not found for optional artifact ${x}.`});continue}let Se=await $n(W);if($.sha256&&$.sha256.toLowerCase()!==Se.toLowerCase()){t.push({id:`mirror.verify.${x}`,status:"failed",message:`Checksum mismatch for ${x}.`});continue}o.verifiedArtifacts+=1,t.push({id:`mirror.verify.${x}`,status:"passed",message:`Checksum verified for ${x}.`});let X=$.attestation?await Fn(r,W,$.attestation):null;if($.attestation){if(t.push({id:`mirror.attest.${x}`,status:X?.verified?"passed":"failed",message:X?.message||"Attestation verification failed."}),!X?.verified)continue}else if(h){t.push({id:`mirror.attest.${x}`,status:"failed",message:`Attestation is required but missing for ${x}.`});continue}else t.push({id:`mirror.attest.${x}`,status:"skipped",message:`No attestation provided for ${x}.`});let R=$.attestation?.sigstore,j=R?await Ln(r,W,R,{requireTransparencyLog:N}):null;if(R){if(t.push({id:`mirror.sigstore.${x}`,status:j?.verified?"passed":"failed",message:j?.message||"Sigstore verification failed."}),L.push({artifactId:x,verified:!!j?.verified,tlogVerified:!!j?.tlogVerified,identity:j?.identity||null,issuer:j?.issuer||null,rekorUrl:j?.rekorUrl||null,timestamp:new Date().toISOString(),environment:S}),!j?.verified)continue}else if(b){t.push({id:`mirror.sigstore.${x}`,status:"failed",message:`Sigstore attestation is required but missing for ${x}.`});continue}else t.push({id:`mirror.sigstore.${x}`,status:"skipped",message:`No Sigstore attestation provided for ${x}.`});if(R&&j?.verified&&M){let ce=M.allowedIdentities||[];if(ce.length>0){let B=!!j.identity&&ce.includes(j.identity);if(t.push({id:`mirror.sigstore.policy.identity.${x}`,status:B?"passed":"failed",message:B?`Sigstore identity policy passed for ${x} in ${S}.`:`Sigstore identity policy failed for ${x} in ${S}.`}),!B)continue}let de=M.allowedIssuers||[];if(de.length>0){let B=!!j.issuer&&de.includes(j.issuer);if(t.push({id:`mirror.sigstore.policy.issuer.${x}`,status:B?"passed":"failed",message:B?`Sigstore issuer policy passed for ${x} in ${S}.`:`Sigstore issuer policy failed for ${x} in ${S}.`}),!B)continue}let ve=M.allowedRekorUrls||[];if(ve.length>0){let B=!!j.rekorUrl&&ve.includes(j.rekorUrl);if(t.push({id:`mirror.sigstore.policy.rekor.${x}`,status:B?"passed":"failed",message:B?`Sigstore Rekor policy passed for ${x} in ${S}.`:`Sigstore Rekor policy failed for ${x} in ${S}.`}),!B)continue}}else M&&t.push({id:`mirror.sigstore.policy.${x}`,status:"skipped",message:`Sigstore governance policy configured for ${S} but no verified Sigstore attestation for ${x}.`});let G=await promises.stat(W);Q.push({id:x,path:f__default.relative(r,W),sha256:Se,size:G.size,provenance:ke,attestation:{detached:{provided:!!$.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:!!R,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=m.retention?.keepLast;if(typeof ae=="number"&&ae>0){let $=(await promises.readdir(a,{withFileTypes:true})).filter(x=>x.isFile()).map(x=>f__default.join(a,x.name));if($.length>ae){let x=await Promise.all($.map(async ge=>({filePath:ge,stat:await promises.stat(ge)})));x.sort((ge,W)=>W.stat.mtimeMs-ge.stat.mtimeMs);let q=x.slice(ae);for(let ge of q)await promises.unlink(ge.filePath),o.rotatedFiles+=1;}}t.push({id:"mirror.rotate",status:"passed",message:o.rotatedFiles>0?`Mirror retention rotation removed ${o.rotatedFiles} file(s).`:"Mirror retention rotation completed with no removals."});let pe={schemaVersion:"1.0",generatedAt:new Date().toISOString(),mode:m.mode||null,environment:S,artifacts:Q};if(await promises.writeFile(s,`${JSON.stringify(pe,null,2)}
112
+ `,"utf-8"),o.lockWritten=true,t.push({id:"mirror.lock.write",status:"passed",message:`Mirror lock updated at ${f__default.relative(r,s)}.`}),o.transparencyEvidenceRecords=L.length,L.length>0){let U={schemaVersion:"1.0",generatedAt:new Date().toISOString(),environment:S,records:L},$=new Date().toISOString().replace(/[:.]/g,"-"),x=f__default.join(l,`transparency-evidence-${$}.json`),q=f__default.join(l,"transparency-evidence.latest.json");if(await _.ensureDir(l),await Xr(x,U),await Xr(q,U),o.transparencyEvidenceWritten=true,t.push({id:"sigstore.evidence.write",status:"passed",message:`Transparency evidence written to ${f__default.relative(r,q)}.`}),P?.enabled){let ge=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 W=xe(r,P.filePath);await _.ensureDir(f__default.dirname(W)),await promises.appendFile(W,`${JSON.stringify(U)}
113
+ `,"utf-8"),o.evidenceExported=true,o.evidenceExportTarget=W,t.push({id:"sigstore.evidence.export.file",status:"passed",message:`Transparency evidence exported to file sink ${W}.`});}catch(W){t.push({id:"sigstore.evidence.export.file",status:"failed",message:`Evidence file export failed: ${W.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 W=Math.max(0,P.retries??0),Z=Math.max(0,P.backoffMs??500),ke=Kn(U,P.signing);ke.error&&t.push({id:"sigstore.evidence.export.http",status:"failed",message:ke.error});try{let Se=P.authTokenEnv?process.env[P.authTokenEnv]:void 0,X=false,R=null;for(let j=1;j<=W+1;j+=1)try{if(ke.error)throw new Error(ke.error);await Tn(P.endpoint,U,ge,Se,ke.headers),o.evidenceExported=true,o.evidenceExportTarget=P.endpoint,t.push({id:"sigstore.evidence.export.http",status:"passed",message:j>1?`Transparency evidence exported to HTTP endpoint ${P.endpoint} after ${j} attempts.`:`Transparency evidence exported to HTTP endpoint ${P.endpoint}.`}),X=true;break}catch(G){R=G,j<=W&&await eo(Z*j);}if(!X)throw R||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 R=await Nn(r,P.deadLetterPath,U,X);t.push({id:"sigstore.evidence.export.deadletter",status:"passed",message:`Evidence export failure persisted to dead-letter sink ${R}.`});}catch(R){t.push({id:"sigstore.evidence.export.deadletter",status:"failed",message:`Evidence dead-letter write failed: ${R.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:o}}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:o}}function zt(r){return f.join(r,".rapidkit","imported-projects.json")}async function io(r){let e=zt(r);if(!await ___default.pathExists(e))return [];try{let t=await ___default.readJSON(e);return (Array.isArray(t?.projects)?t.projects:[]).filter(n=>{if(!n||typeof n!="object")return false;let i=n;return typeof i.name=="string"&&typeof i.path=="string"&&typeof i.stack=="string"&&typeof i.confidence=="string"&&typeof i.importedAt=="string"})}catch{return []}}async function so(r,e){if(e.length===0)return;let t=await io(r),o=new Map;for(let a of t)o.set(a.path,a);for(let a of e)o.set(a.path,a);let n=Array.from(o.values()).sort((a,l)=>a.name.localeCompare(l.name)).map(a=>({...a})),i={version:1,updatedAt:new Date().toISOString(),projects:n},s=zt(r);await ___default.ensureDir(f.dirname(s)),await ___default.writeJSON(s,i,{spaces:2});}async function ao(r,e){if(e.length===0)return;let t=await io(r),o=new Set(e.map(a=>f.resolve(a))),n=t.filter(a=>!o.has(f.resolve(a.path))),i={version:1,updatedAt:new Date().toISOString(),projects:n},s=zt(r);await ___default.ensureDir(f.dirname(s)),await ___default.writeJSON(s,i,{spaces:2});}function co(r){return r.trim().toLowerCase().replace(/\.git$/i,"").replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,64)}function Jn(r){let e=r.trim();if(!e)return "imported-project";let t=e.replace(/\\/g,"/").replace(/\/+$/,"").split("/"),o=t[t.length-1]||e,n=o.split(":"),i=(n[n.length-1]||o).replace(/\.git$/i,"");return co(i)||"imported-project"}function Qt(r){let e=r.trim();return e.includes("://")||e.startsWith("git@")}function qn(r){return Qt(r)?"git-url":"local-folder"}async function Un(r,e){let t=co(e)||"imported-project",o=0;for(;;){let n=o===0?t:o===1?`${t}-imported`:`${t}-imported-${o}`,i=f__default.join(r,n);if(!await ___default.pathExists(i))return i;o+=1;}}function Bn(r,e){let t=f__default.resolve(r),o=f__default.resolve(e);if(o===t||o.startsWith(`${t}${f__default.sep}`))throw new Error("Import source must be outside the current workspace root.")}async function Vn(r,e){let t={name:e.name,path:e.path,stack:e.stack,confidence:e.confidence,source:e.source,importedAt:new Date().toISOString()};await so(r,[t]);}async function lo(r){await ___default.pathExists(r)&&await ___default.remove(r);}async function po(r,e){await lo(e),await ao(r,[e]);}async function uo(r){let e=f__default.resolve(r.workspacePath),t=r.source.trim(),o=r.sourceType??qn(t),n=r.name??(o==="git-url"?Jn(t):f__default.basename(t)),i=await Un(e,n),s=false;try{if(o==="local-folder"){let u=f__default.resolve(t),m=await ___default.stat(u).catch(()=>null);if(!m||!m.isDirectory())throw new Error("Import source is not a directory.");Bn(e,u),await ___default.copy(u,i,{overwrite:false,errorOnExist:true});}else await execa("git",["clone","--depth","1",t,i],{timeout:12e4});s=true;let a=e$2(i),l={name:f__default.basename(i),path:i,stack:a.importStack,confidence:a.confidence,source:o};return await Vn(e,l),l}catch(a){if(s)try{await lo(i);}catch(l){let u=a instanceof Error?a.message:String(a),m=l instanceof Error?l.message:String(l);throw new Error(`Import failed: ${u}. Rollback also failed: ${m}`)}throw a}}function Zt(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 zn(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 it(r){let e=r.trim().toLowerCase();return e.startsWith("gogin")||e==="gin"}function st(r){let e=r.trim().toLowerCase();return e.startsWith("springboot")||e==="spring"||e==="springboot"||e==="java"}function we(r,e){let t=r.indexOf(e);if(t>=0&&t+1<r.length)return r[t+1];let o=r.find(n=>n.startsWith(`${e}=`));if(o)return o.slice(e.length+1)}function cr(){return d$2()}function fo(){let r={...process.env},e=r.PATH||"";return e&&(r.PATH=e.split(f__default.delimiter).filter(t=>!t.replace(/\\/g,"/").includes("/.pyenv/shims")).join(f__default.delimiter)),r.PYENV_VERSION="system",r.POETRY_PYTHON||(r.POETRY_PYTHON=c$2()),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 Qn(r){return f$2(f__default.join(r,".venv"))}async function So(r,e){return await F(r,["--version"],e)===0}async function Xt(r){let e=f__default.join(r,"go.mod");if(await ___default.pathExists(e))return "go";let t=f__default.join(r,"pom.xml"),o=f__default.join(r,"build.gradle"),n=f__default.join(r,"build.gradle.kts");if(await ___default.pathExists(t)||await ___default.pathExists(o)||await ___default.pathExists(n))return "java";let i=f__default.join(r,"package.json");if(await ___default.pathExists(i))return "node";let s=f__default.join(r,"pyproject.toml"),a=f__default.join(r,"requirements.txt"),l=f__default.join(r,"poetry.lock");return await ___default.pathExists(s)||await ___default.pathExists(a)||await ___default.pathExists(l)?"python":null}async function Zn(r){for(let e of cr())if(await F(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],r)===0)return 0;return 1}async function Eo(r){for(let e of cr())if(await F(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],r)===0)return 0;return 1}async function Xn(r){let e=f$2(f__default.join(r,".venv"));if(!await ___default.pathExists(e)){let i=await Eo(r);if(i!==0)return i}if(!await So("poetry",r))return 0;let o=await F("poetry",["config","virtualenvs.in-project","true","--local"],r);if(o!==0)return o;let n=await F("poetry",["env","use",e],r);return n!==0?n:0}async function ei(r){let e=f$2(f__default.join(r,".venv"));if(!await ___default.pathExists(e)){let n=await Eo(r);if(n!==0)return n}await F(e,["-m","pip","install","--upgrade","pip","setuptools","wheel"],r);let t=f__default.join(r,"requirements.txt");if(await ___default.pathExists(t)&&await F(e,["-m","pip","install","-r","requirements.txt"],r)===0)return 0;let o=f__default.join(r,"pyproject.toml");return await ___default.pathExists(o)&&(await F(e,["-m","pip","install","-e","."],r)===0||await F(e,["-m","pip","install","."],r)===0)?0:1}async function er(r,e){return await Xn(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 ___default.pathExists(f__default.join(r,".venv"))?0:(console.log(c$1.yellow("\u26A0\uFE0F Python init fallback: installing dependencies directly into project .venv")),await ei(r))}async function tr(r){let e=await at("init",r);if(e===0)return 0;let t=["npm","pnpm","yarn"];for(let o of t){if(!await So(o,r))continue;if(await F(o,["install"],r)===0)return console.log(c$1.green(`\u2705 Node init fallback succeeded with ${o} install`)),0}return e}async function go(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>]
114
+ `),1;try{qe(t);}catch(s){let a=s instanceof Error?s.message:String(s);return process.stderr.write(`${a}
115
+ `),1}let o=we(r,"--output")||process.cwd(),n=f__default.resolve(o,t),i=r.includes("--skip-git")||r.includes("--no-git");try{let{default:s}=await import('fs-extra');if(await s.ensureDir(f__default.dirname(n)),await s.pathExists(n))return process.stderr.write(`\u274C Directory "${n}" already exists
116
+ `),1;await s.ensureDir(n);let{generateGoFiberKit:a}=await import('./gofiber-standard-JDPREQCP.js');await a(n,{project_name:t,module_path:t,skipGit:i});let l=V(process.cwd());if(l){let{syncWorkspaceProjects:u}=await import('./workspace-776YW7I6.js');await u(l,true);}return 0}catch(s){return process.stderr.write(`RapidKit Go/Fiber generator failed: ${s?.message??s}
117
+ `),1}}async function yo(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>]
118
+ `),1;try{qe(t);}catch(s){let a=s instanceof Error?s.message:String(s);return process.stderr.write(`${a}
119
+ `),1}let o=we(r,"--output")||process.cwd(),n=f__default.resolve(o,t),i=r.includes("--skip-git")||r.includes("--no-git");try{let{default:s}=await import('fs-extra');if(await s.ensureDir(f__default.dirname(n)),await s.pathExists(n))return process.stderr.write(`\u274C Directory "${n}" already exists
120
+ `),1;await s.ensureDir(n);let{generateGoGinKit:a}=await import('./gogin-standard-DCERHHVB.js');await a(n,{project_name:t,module_path:t,skipGit:i});let l=V(process.cwd());if(l){let{syncWorkspaceProjects:u}=await import('./workspace-776YW7I6.js');await u(l,true);}return 0}catch(s){return process.stderr.write(`RapidKit Go/Gin generator failed: ${s?.message??s}
121
+ `),1}}async function ho(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>]
122
+ `),1;try{qe(t);}catch(g){let h=g instanceof Error?g.message:String(g);return process.stderr.write(`${h}
123
+ `),1}let o=we(r,"--output")||process.cwd(),n=f__default.resolve(o,t),i=r.includes("--skip-git")||r.includes("--no-git"),s=we(r,"--java-version"),a=we(r,"--spring-boot-version"),l=we(r,"--springdoc-version"),u=we(r,"--group-id"),m=we(r,"--package-name"),d=we(r,"--description"),p=we(r,"--port"),y=g=>/^\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?$/.test(g);if(s&&!/^\d+$/.test(s.trim()))return process.stderr.write(`Invalid --java-version. Expected major version number, e.g. 21
124
124
  `),1;if(a&&!y(a.trim()))return process.stderr.write(`Invalid --spring-boot-version. Expected semantic version, e.g. 3.5.0
125
125
  `),1;if(l&&!y(l.trim()))return process.stderr.write(`Invalid --springdoc-version. Expected semantic version, e.g. 2.8.9
126
- `),1;if(d&&!/^[A-Za-z0-9_.-]+$/.test(d.trim()))return process.stderr.write(`Invalid --group-id. Use dot-separated Java package identifiers only.
127
- `),1;if(f&&!/^[A-Za-z0-9_.-]+$/.test(f.trim()))return process.stderr.write(`Invalid --package-name. Use dot-separated Java package identifiers only.
128
- `),1;if(u&&!/^\d+$/.test(u.trim()))return process.stderr.write(`Invalid --port. Expected numeric TCP port, e.g. 8080
129
- `),1;try{let{default:g}=await import('fs-extra');if(await g.ensureDir(m.dirname(o)),await g.pathExists(o))return process.stderr.write(`\u274C Directory "${o}" already exists
130
- `),1;await g.ensureDir(o);let{generateSpringBootKit:h}=await import('./springboot-standard-AGTOOTNT.js');await h(o,{project_name:t,artifact_id:t,java_version:i?.trim(),spring_boot_version:a?.trim(),springdoc_version:l?.trim(),group_id:d?.trim(),package_name:f?.trim(),description:p?.trim(),port:u?.trim(),skipGit:s});let b=z(process.cwd());if(b){let{syncWorkspaceProjects:w}=await import('./workspace-7JHX7L3E.js');await w(b,true);}return 0}catch(g){return process.stderr.write(`RapidKit Spring Boot generator failed: ${g?.message??g}
131
- `),1}}async function Bt(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\`.
126
+ `),1;if(u&&!/^[A-Za-z0-9_.-]+$/.test(u.trim()))return process.stderr.write(`Invalid --group-id. Use dot-separated Java package identifiers only.
127
+ `),1;if(m&&!/^[A-Za-z0-9_.-]+$/.test(m.trim()))return process.stderr.write(`Invalid --package-name. Use dot-separated Java package identifiers only.
128
+ `),1;if(p&&!/^\d+$/.test(p.trim()))return process.stderr.write(`Invalid --port. Expected numeric TCP port, e.g. 8080
129
+ `),1;try{let{default:g}=await import('fs-extra');if(await g.ensureDir(f__default.dirname(n)),await g.pathExists(n))return process.stderr.write(`\u274C Directory "${n}" already exists
130
+ `),1;await g.ensureDir(n);let{generateSpringBootKit:h}=await import('./springboot-standard-AGTOOTNT.js');await h(n,{project_name:t,artifact_id:t,java_version:s?.trim(),spring_boot_version:a?.trim(),springdoc_version:l?.trim(),group_id:u?.trim(),package_name:m?.trim(),description:d?.trim(),port:p?.trim(),skipGit:i});let b=V(process.cwd());if(b){let{syncWorkspaceProjects:w}=await import('./workspace-776YW7I6.js');await w(b,true);}return 0}catch(g){return process.stderr.write(`RapidKit Spring Boot generator failed: ${g?.message??g}
131
+ `),1}}async function rr(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\`.
132
132
  Reason: ${e}.
133
133
  Install Python 3.10+ to use the interactive wizard and full kit catalog.
134
- `),1;let o=r[2],s=r[3];if(!o||!s)return process.stderr.write(`Usage: rapidkit create project <kit> <name> [--output <dir>]
134
+ `),1;let n=r[2],i=r[3];if(!n||!i)return process.stderr.write(`Usage: rapidkit create project <kit> <name> [--output <dir>]
135
135
  Tip: offline fallback supports only fastapi* and nestjs* kits.
136
- `),1;let i=xo(o);if(!i)return process.stderr.write(`RapidKit (npm) could not run the Python core engine to create this kit.
136
+ `),1;let s=zn(n);if(!s)return process.stderr.write(`RapidKit (npm) could not run the Python core engine to create this kit.
137
137
  Reason: ${e}.
138
- Requested kit: ${o}
138
+ Requested kit: ${n}
139
139
  Offline fallback only supports: fastapi.standard, nestjs.standard (and their shorthands).
140
140
  Install Python 3.10+ to access all kits.
141
- `),1;let a=he(r,"--output")||process.cwd(),l=m.resolve(a,s),d=r.includes("--skip-git")||r.includes("--no-git"),f=r.includes("--skip-install");try{if(await j__default.ensureDir(m.dirname(l)),await j__default.pathExists(l))return process.stderr.write(`\u274C Directory "${l}" already exists
142
- `),1;let p="pip",u=z(process.cwd());if(u)try{let{readWorkspaceMarker:g}=await import('./workspace-marker-IOPQ42A7.js'),h=await g(u);h?.metadata?.npm?.installMethod&&(p=h.metadata.npm.installMethod,a$1.debug(`Detected workspace engine: ${p}`));}catch(g){a$1.debug("Failed to read workspace marker",g);}else a$1.debug("No workspace found, using default engine: pip");await j__default.ensureDir(l);let{generateDemoKit:y}=await import('./demo-kit-HMJZ3A3M.js');if(await y(l,{project_name:s,template:i,kit_name:o,skipGit:d,skipInstall:f,engine:p}),u){let{syncWorkspaceProjects:g}=await import('./workspace-7JHX7L3E.js');await g(u,true);}return 0}catch(p){return process.stderr.write(`RapidKit (npm) offline fallback failed: ${p?.message??p}
143
- `),1}}async function dn(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 Ee.prompt([{type:"rawlist",name:"createTarget",message:"What do you want to create?",choices:[{name:"workspace",value:"workspace"},{name:"project",value:"project"}]}])).createTarget;let s=["create",o,...n];return await dn(s)}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,s=he(r,"--install-method"),i=s==="poetry"||s==="venv"||s==="pipx"?s:void 0,a=he(r,"--profile"),l=a==="minimal"||a==="java-only"||a==="go-only"||a==="python-only"||a==="node-only"||a==="polyglot"||a==="enterprise"?a:void 0,d=o||(t?"my-workspace":(await Ee.prompt([{type:"input",name:"workspaceName",message:"Workspace name:",default:"my-workspace"}])).workspaceName);if(!d||!d.trim())return process.stderr.write(`Workspace name is required.
144
- `),1;try{Je(d);}catch(g){if(g instanceof e)return process.stderr.write(`${g.message}
145
- `),1;throw g}let f=m.resolve(process.cwd(),d);if(await j__default.pathExists(f))return process.stderr.write(`\u274C Directory "${d}" already exists
146
- `),1;let p=await a$2(),u=p.author||process.env.USER||"RapidKit User";if(!t){let g=await Ee.prompt([{type:"input",name:"author",message:"Author name:",default:u}]);g.author?.trim()&&(u=g.author.trim());}let{createProject:y}=await import('./create-3V7O72CO.js');return await y(d,{skipGit:n,yes:t,userConfig:{...p,author:u},installMethod:i,profile:l}),0}catch(t){return process.stderr.write(`RapidKit (npm) failed to create workspace: ${t?.message??t}
147
- `),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(g){return process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${g?.message??g}
141
+ `),1;let a=we(r,"--output")||process.cwd(),l=f__default.resolve(a,i),u=r.includes("--skip-git")||r.includes("--no-git"),m=r.includes("--skip-install");try{if(await ___default.ensureDir(f__default.dirname(l)),await ___default.pathExists(l))return process.stderr.write(`\u274C Directory "${l}" already exists
142
+ `),1;let d="pip",p=V(process.cwd());if(p)try{let{readWorkspaceMarker:g}=await import('./workspace-marker-IOPQ42A7.js'),h=await g(p);h?.metadata?.npm?.installMethod&&(d=h.metadata.npm.installMethod,a$1.debug(`Detected workspace engine: ${d}`));}catch(g){a$1.debug("Failed to read workspace marker",g);}else a$1.debug("No workspace found, using default engine: pip");await ___default.ensureDir(l);let{generateDemoKit:y}=await import('./demo-kit-HMJZ3A3M.js');if(await y(l,{project_name:i,template:s,kit_name:n,skipGit:u,skipInstall:m,engine:d}),p){let{syncWorkspaceProjects:g}=await import('./workspace-776YW7I6.js');await g(p,true);}return 0}catch(d){return process.stderr.write(`RapidKit (npm) offline fallback failed: ${d?.message??d}
143
+ `),1}}async function Io(r){let e$2=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"),o=r.slice(1),n;!process.stdin.isTTY||t?(n="workspace",process.stdin.isTTY&&console.log(c$1.gray("\u2139\uFE0F No subcommand provided for `create`; defaulting to `create workspace`."))):n=(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",n,...o];return await Io(i)}if(r[0]==="create"&&r[1]==="workspace")try{let t=r.includes("--yes")||r.includes("-y"),o=r.includes("--skip-git")||r.includes("--no-git"),n=r.includes("--dry-run"),i=r[2]&&!r[2].startsWith("-")?r[2]:void 0,s=we(r,"--install-method"),a=s==="poetry"||s==="venv"||s==="pipx"?s:void 0,l=we(r,"--profile"),u=l==="minimal"||l==="java-only"||l==="go-only"||l==="python-only"||l==="node-only"||l==="polyglot"||l==="enterprise"?l:void 0,m=i||(t?"my-workspace":(await _e.prompt([{type:"input",name:"workspaceName",message:"Workspace name:",default:"my-workspace"}])).workspaceName);if(!m||!m.trim())return process.stderr.write(`Workspace name is required.
144
+ `),1;try{qe(m);}catch(h){if(h instanceof e)return process.stderr.write(`${h.message}
145
+ `),1;throw h}let d=f__default.resolve(process.cwd(),m);if(!n&&await ___default.pathExists(d))return process.stderr.write(`\u274C Directory "${m}" already exists
146
+ `),1;let p=await a$2(),y=p.author||process.env.USER||"RapidKit User";if(!t){let h=await _e.prompt([{type:"input",name:"author",message:"Author name:",default:y}]);h.author?.trim()&&(y=h.author.trim());}let{createProject:g}=await import('./create-4NQKTQ3C.js');return await g(m,{skipGit:o,yes:t,dryRun:n,userConfig:{...p,author:y},installMethod:a,profile:u}),0}catch(t){return process.stderr.write(`RapidKit (npm) failed to create workspace: ${t?.message??t}
147
+ `),1}try{if(r[0]==="create"&&r[1]==="project"){if(r.includes("--help")||r.includes("-h"))try{return await d(),await e$1(["create","project","--help"],{cwd:process.cwd()})}catch(g){return process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${g?.message??g}
148
148
  `),1}if(!r[2]||r[2].startsWith("-")){console.log(c$1.bold(`
149
149
  \u{1F680} RapidKit
150
- `));let{kitChoice:g}=await Ee.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(jt(g)||rt(g)||nt(g)){let{projectName:b}=await Ee.prompt([{type:"input",name:"projectName",message:"Project name:",validate:C=>C.trim().length>0||"Project name is required"}]),w=r.slice(2).filter(C=>C.startsWith("-"));return rt(g)?await Yr(["create","project",g,b.trim(),...w]):nt(g)?await zr(["create","project",g,b.trim(),...w]):await Br(["create","project",g,b.trim(),...w])}let{projectName:h}=await Ee.prompt([{type:"input",name:"projectName",message:"Project name:",validate:b=>b.trim().length>0||"Project name is required"}]);r.splice(2,0,g,h.trim());}{let g=z(process.cwd()),h=(r[2]||"").toLowerCase();if(g&&h){let b=m.join(g,".rapidkit","workspace.json"),w=m.join(g,".rapidkit","policies.yml");try{let[C,P]=await Promise.all([j__default.pathExists(b).then(ue=>ue?k.promises.readFile(b,"utf-8"):"{}"),j__default.pathExists(w).then(ue=>ue?k.promises.readFile(w,"utf-8"):"")]),S=JSON.parse(C).profile,$=P.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]??"warn",N=jt(h)||rt(h)||h.startsWith("go"),G=nt(h)||h.includes("spring"),K=["nestjs","react","vue","nextjs","next","vite","angular","svelte","express","koa","fastify"].some(ue=>h.includes(ue)),Q=!N&&!K&&!G,ie=null;if(S==="python-only"&&!Q?ie=`Kit "${h}" is not a Python kit, but workspace profile is "python-only".`:S==="node-only"&&!K?ie=`Kit "${h}" is not a Node kit, but workspace profile is "node-only".`:S==="go-only"&&!N?ie=`Kit "${h}" is not a Go kit, but workspace profile is "go-only".`:S==="java-only"&&!G&&(ie=`Kit "${h}" is not a Java kit, but workspace profile is "java-only".`),ie){if($==="strict")return console.log(c$1.red(`\u274C Profile violation (strict mode): ${ie}`)),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: ${ie}`)),console.log(c$1.gray('\u{1F4A1} Consider using a "polyglot" workspace profile for multi-language projects.'));}}catch{}}}if(jt(r[2]||""))return await Br(r);if(rt(r[2]||""))return await Yr(r);if(nt(r[2]||""))return await zr(r);let n=r.includes("--create-workspace"),o=r.includes("--no-workspace"),s=r.includes("--yes")||r.includes("-y"),i=r.includes("--skip-git")||r.includes("--no-git");if(!!!Qt(process.cwd())){let{registerWorkspaceAtPath:g}=await import('./create-3V7O72CO.js');if(n)await g(process.cwd(),{skipGit:i,yes:s,userConfig:await a$2()});else if(!o)if(s)await g(process.cwd(),{skipGit:i,yes:true,userConfig:await a$2()});else {let{createWs:h}=await Ee.prompt([{type:"confirm",name:"createWs",message:"This project will be created outside a RapidKit workspace. Create and register a workspace here?",default:true}]);h&&await g(process.cwd(),{skipGit:i,yes:false,userConfig:await a$2()});}}let d$1=[...r.filter(g=>{let h=g.split("=")[0];return !e$1.has(g)&&!e$1.has(h)})],f=z(process.cwd()),y=r.includes("--skip-install")||!!f?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0;try{await c$2();let g=await d(d$1,{cwd:process.cwd(),env:y});if(g===0&&f&&!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"))),g===0){let h=f||z(process.cwd());if(h){try{let w=r[3];if(w){let C=r.indexOf("--output"),P=C>=0?r[C+1]:".",S=m.resolve(process.cwd(),P,w),A=m.join(h,".python-version"),$=m.join(S,".python-version");if(k.existsSync(A)&&k.existsSync(S)){let N=k.readFileSync(A,"utf-8");k.writeFileSync($,N.trim()+`
151
- `),a$1.debug(`Synced Python version ${N.trim()} from workspace to ${w}`);}}}catch(w){a$1.debug("Could not sync Python version from workspace:",w);}let{syncWorkspaceProjects:b}=await import('./workspace-7JHX7L3E.js');await b(h,true);}}return g}catch(g){let h=qt(g);return h?await Bt(d$1,h):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${g?.message??g}
152
- `),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=z(process.cwd());if(n){let{syncWorkspaceProjects:o}=await import('./workspace-7JHX7L3E.js');await o(n,true);}}return t}catch(t){let n=qt(t);return n?await Bt(r,n):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${t?.message??t}
153
- `),1)}return await c$2(),await d(r,{cwd:process.cwd()})}catch(t){let n=qt(t);return n?await Bt(r,n):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${t?.message??t}
154
- `),1)}}var Qr=["init","dev","start","build","test","docs","lint","format","create","help","--help","-h"],Eo=["readiness","doctor","workspace","bootstrap","setup","cache","mirror","ai","config","shell"],Ao=["readiness","doctor","workspace","ai","config","shell"],Io=["bootstrap","setup","cache","mirror"],un=["lint","format","docs"],Mo=["init"],pn=["build","dev","start","test"],Zr=[...pn,...un];function St(r){return !!r&&Eo.includes(r)}function Xr(r){return !!r&&Ao.includes(r)}function $o(r){return !!r&&Io.includes(r)}function mn(r){return k.existsSync(m.join(r,".rapidkit-workspace"))||k.existsSync(m.join(r,".rapidkit","workspace.json"))}function fn(r){let e=r;for(;;){let t=m.join(e,".rapidkit","context.json");if(k.existsSync(t))return t;let n=m.dirname(e);if(n===e)break;e=n;}return null}function Qt(r){let e=r,t=m.resolve(tmpdir());for(;;){let n=m.join(e,".rapidkit-workspace");if(k.existsSync(n)&&m.resolve(e)!==t)return n;let o=m.dirname(e);if(o===e)break;e=o;}return null}function z(r){let e=r,t=m.resolve(tmpdir());for(;;){let n=m.join(e,".rapidkit-workspace");if(k.existsSync(n)&&m.resolve(e)!==t)return e;let o=m.dirname(e);if(o===e)break;e=o;}return null}async function Oo(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 s of o){if(!await j__default.pathExists(s))continue;let i=s.toLowerCase();if(i.endsWith("rapidkit.cmd")||i.endsWith("rapidkit.exe"))return {detected:true,candidatePath:s,reason:"Found workspace-local rapidkit launcher on Windows."}}return {detected:false}}function Do(r){let e=r;for(;;){let t=m.join(e,".rapidkit-workspace"),n=m.join(e,".rapidkit","workspace.json");if(!k.existsSync(t)&&k.existsSync(n))return e;let o=m.dirname(e);if(o===e)break;e=o;}return null}var gn={enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true};function To(r){return r&&r.match(/^[\t ]*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]==="strict"?"strict":"warn"}function tt(r,e){let t=r.match(new RegExp(`^[\\t ]*${e}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return t?t[1]==="true":gn[e]}function en(r){let e=r??"";return {mode:To(e),dependency_sharing_mode:yn(e),rules:{enforce_workspace_marker:tt(e,"enforce_workspace_marker"),enforce_toolchain_lock:tt(e,"enforce_toolchain_lock"),disallow_untrusted_tool_sources:tt(e,"disallow_untrusted_tool_sources"),enforce_compatibility_matrix:tt(e,"enforce_compatibility_matrix"),require_mirror_lock_for_offline:tt(e,"require_mirror_lock_for_offline")}}}function tn(r,e,t){let n=`${e}: ${t}`,o=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),s=new RegExp(`^[\\t ]*${o}:\\s*.*$`,"m");if(s.test(r))return r.replace(s,n);let i=/^[\t ]*rules:\s*(?:#.*)?$/m;return i.test(r)?r.replace(i,`${n}
150
+ `));let{kitChoice:g}=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(g)||it(g)||st(g)){let{projectName:b}=await _e.prompt([{type:"input",name:"projectName",message:"Project name:",validate:C=>C.trim().length>0||"Project name is required"}]),w=r.slice(2).filter(C=>C.startsWith("-"));return it(g)?await yo(["create","project",g,b.trim(),...w]):st(g)?await ho(["create","project",g,b.trim(),...w]):await go(["create","project",g,b.trim(),...w])}let{projectName:h}=await _e.prompt([{type:"input",name:"projectName",message:"Project name:",validate:b=>b.trim().length>0||"Project name is required"}]);r.splice(2,0,g,h.trim());}{let g=V(process.cwd()),h=(r[2]||"").toLowerCase();if(g&&h){let b=f__default.join(g,".rapidkit","workspace.json"),w=f__default.join(g,".rapidkit","policies.yml");try{let[C,P]=await Promise.all([___default.pathExists(b).then(pe=>pe?k.promises.readFile(b,"utf-8"):"{}"),___default.pathExists(w).then(pe=>pe?k.promises.readFile(w,"utf-8"):"")]),S=JSON.parse(C).profile,M=P.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]??"warn",N=$t(h)||it(h)||h.startsWith("go"),L=st(h)||h.includes("spring"),K=["nestjs","react","vue","nextjs","next","vite","angular","svelte","express","koa","fastify"].some(pe=>h.includes(pe)),Q=!N&&!K&&!L,ae=null;if(S==="python-only"&&!Q?ae=`Kit "${h}" is not a Python kit, but workspace profile is "python-only".`:S==="node-only"&&!K?ae=`Kit "${h}" is not a Node kit, but workspace profile is "node-only".`:S==="go-only"&&!N?ae=`Kit "${h}" is not a Go kit, but workspace profile is "go-only".`:S==="java-only"&&!L&&(ae=`Kit "${h}" is not a Java kit, but workspace profile is "java-only".`),ae){if(M==="strict")return console.log(c$1.red(`\u274C Profile violation (strict mode): ${ae}`)),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: ${ae}`)),console.log(c$1.gray('\u{1F4A1} Consider using a "polyglot" workspace profile for multi-language projects.'));}}catch{}}}if($t(r[2]||""))return await go(r);if(it(r[2]||""))return await yo(r);if(st(r[2]||""))return await ho(r);let o=r.includes("--create-workspace"),n=r.includes("--no-workspace"),i=r.includes("--yes")||r.includes("-y"),s=r.includes("--skip-git")||r.includes("--no-git");if(!!!ir(process.cwd())){let{registerWorkspaceAtPath:g}=await import('./create-4NQKTQ3C.js');if(o)await g(process.cwd(),{skipGit:s,yes:i,userConfig:await a$2()});else if(!n)if(i)await g(process.cwd(),{skipGit:s,yes:true,userConfig:await a$2()});else {let{createWs:h}=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}]);h&&await g(process.cwd(),{skipGit:s,yes:false,userConfig:await a$2()});}}let u=[...r.filter(g=>{let h=g.split("=")[0];return !e$2.has(g)&&!e$2.has(h)})],m=V(process.cwd()),y=r.includes("--skip-install")||!!m?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0;try{await d();let g=await e$1(u,{cwd:process.cwd(),env:y});if(g===0&&m&&!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"))),g===0){let h=m||V(process.cwd());if(h){try{let w=r[3];if(w){let C=r.indexOf("--output"),P=C>=0?r[C+1]:".",S=f__default.resolve(process.cwd(),P,w),I=f__default.join(h,".python-version"),M=f__default.join(S,".python-version");if(k.existsSync(I)&&k.existsSync(S)){let N=k.readFileSync(I,"utf-8");k.writeFileSync(M,N.trim()+`
151
+ `),a$1.debug(`Synced Python version ${N.trim()} from workspace to ${w}`);}}}catch(w){a$1.debug("Could not sync Python version from workspace:",w);}let{syncWorkspaceProjects:b}=await import('./workspace-776YW7I6.js');await b(h,true);}}return g}catch(g){let h=Zt(g);return h?await rr(u,h):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${g?.message??g}
152
+ `),1)}}if(r[0]==="create"&&r[1]!=="project")try{await d();let t=await e$1(r,{cwd:process.cwd()});if(t===0){let o=V(process.cwd());if(o){let{syncWorkspaceProjects:n}=await import('./workspace-776YW7I6.js');await n(o,true);}}return t}catch(t){let o=Zt(t);return o?await rr(r,o):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${t?.message??t}
153
+ `),1)}return await d(),await e$1(r,{cwd:process.cwd()})}catch(t){let o=Zt(t);return o?await rr(r,o):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${t?.message??t}
154
+ `),1)}}var wo=["init","dev","start","build","test","docs","lint","format","create","help","--help","-h"],ti=["readiness","doctor","import","workspace","bootstrap","setup","cache","mirror","ai","config","shell"],ri=["readiness","doctor","import","workspace","ai","config","shell"],oi=["bootstrap","setup","cache","mirror"],Ao=["lint","format","docs"],ni=["init"],$o=["build","dev","start","test"],ko=[...$o,...Ao];function Mt(r){return !!r&&ti.includes(r)}function vo(r){return !!r&&ri.includes(r)}function ii(r){return !!r&&oi.includes(r)}function ze(r){return k.existsSync(f__default.join(r,".rapidkit-workspace"))||k.existsSync(f__default.join(r,".rapidkit","workspace.json"))}function Mo(r){let e=r;for(;;){let t=f__default.join(e,".rapidkit","context.json");if(k.existsSync(t))return t;let o=f__default.dirname(e);if(o===e)break;e=o;}return null}function ir(r){let e=r,t=f__default.resolve(tmpdir());for(;;){let o=f__default.join(e,".rapidkit-workspace");if(k.existsSync(o)&&f__default.resolve(e)!==t)return o;let n=f__default.dirname(e);if(n===e)break;e=n;}return null}function V(r){let e=r,t=f__default.resolve(tmpdir());for(;;){let o=f__default.join(e,".rapidkit-workspace");if(k.existsSync(o)&&f__default.resolve(e)!==t)return e;let n=f__default.dirname(e);if(n===e)break;e=n;}return null}async function si(r,e=process.cwd(),t=process.platform){if(!(r.workspaceFlag||r.scope==="workspace")||!a(t))return {detected:false};let n=i(e,t);for(let i of n){if(!await ___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 ai(r){let e=r;for(;;){let t=f__default.join(e,".rapidkit-workspace"),o=f__default.join(e,".rapidkit","workspace.json");if(!k.existsSync(t)&&k.existsSync(o))return e;let n=f__default.dirname(e);if(n===e)break;e=n;}return null}var Oo={enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true};function ci(r){return r&&r.match(/^[\t ]*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]==="strict"?"strict":"warn"}function nt(r,e){let t=r.match(new RegExp(`^[\\t ]*${e}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return t?t[1]==="true":Oo[e]}function bo(r){let e=r??"";return {mode:ci(e),dependency_sharing_mode:Do(e),rules:{enforce_workspace_marker:nt(e,"enforce_workspace_marker"),enforce_toolchain_lock:nt(e,"enforce_toolchain_lock"),disallow_untrusted_tool_sources:nt(e,"disallow_untrusted_tool_sources"),enforce_compatibility_matrix:nt(e,"enforce_compatibility_matrix"),require_mirror_lock_for_offline:nt(e,"require_mirror_lock_for_offline")}}}function Po(r,e,t){let o=`${e}: ${t}`,n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`^[\\t ]*${n}:\\s*.*$`,"m");if(i.test(r))return r.replace(i,o);let s=/^[\t ]*rules:\s*(?:#.*)?$/m;return s.test(r)?r.replace(s,`${o}
155
155
  rules:`):`${r.endsWith(`
156
156
  `)?r:`${r}
157
- `}${n}
158
- `}function No(r,e,t){let n=` ${e}: ${t?"true":"false"}`,o=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),s=new RegExp(`^[\\t ]+${o}:\\s*.*$`,"m");if(s.test(r))return r.replace(s,n);let i=/^[\t ]*rules:\s*(?:#.*)?$/m;return i.test(r)?r.replace(i,`rules:
159
- ${n}`):`${r.endsWith(`
157
+ `}${o}
158
+ `}function li(r,e,t){let o=` ${e}: ${t?"true":"false"}`,n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`^[\\t ]+${n}:\\s*.*$`,"m");if(i.test(r))return r.replace(i,o);let s=/^[\t ]*rules:\s*(?:#.*)?$/m;return s.test(r)?r.replace(s,`rules:
159
+ ${o}`):`${r.endsWith(`
160
160
  `)?r:`${r}
161
161
  `}rules:
162
- ${n}
163
- `}function Ko(){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(`
164
- `)}async function rn(r){let e=m.join(r,".rapidkit","policies.yml");return await j__default.pathExists(e)?k.promises.readFile(e,"utf-8"):Ko()}async function Lo(r,e){let t=m.join(r,".rapidkit"),n=m.join(t,"policies.yml");await j__default.ensureDir(t);let o=e.endsWith(`
162
+ ${o}
163
+ `}function di(){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(`
164
+ `)}async function Co(r){let e=f__default.join(r,".rapidkit","policies.yml");return await ___default.pathExists(e)?k.promises.readFile(e,"utf-8"):di()}async function pi(r,e){let t=f__default.join(r,".rapidkit"),o=f__default.join(t,"policies.yml");await ___default.ensureDir(t);let n=e.endsWith(`
165
165
  `)?e:`${e}
166
- `;await k.promises.writeFile(n,o,"utf-8");}function Go(r){let e=r.trim().toLowerCase();return e==="true"||e==="1"||e==="on"?true:e==="false"||e==="0"||e==="off"?false:null}function yn(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 hn(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 wn(r,e){let t=z(r),n=t?m.join(t,".rapidkit","policies.yml"):null,o="isolated";if(n&&await j__default.pathExists(n))try{let a=await k.promises.readFile(n,"utf-8"),l=hn(a);if(l.status==="failed")return console.log(c$1.red(`\u274C ${l.message}`)),{ok:false,code:1};o=l.mode;}catch{return console.log(c$1.red("\u274C Failed to read workspace policy file (.rapidkit/policies.yml).")),{ok:false,code:1}}let s=process.env.RAPIDKIT_DEP_SHARING_MODE,i=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 s>"u"?delete process.env.RAPIDKIT_DEP_SHARING_MODE:process.env.RAPIDKIT_DEP_SHARING_MODE=s,typeof i>"u"?delete process.env.RAPIDKIT_WORKSPACE_PATH:process.env.RAPIDKIT_WORKSPACE_PATH=i;}}async function L(r,e,t){return await new Promise(n=>{let o=spawn(r,e,{stdio:"inherit",cwd:t,shell:b$2()});o.on("close",s=>n(s??1)),o.on("error",()=>n(1));})}async function Be(r,e){await j__default.outputFile(r,`${JSON.stringify(e,null,2)}
167
- `,"utf-8");}async function Zt(r){let e=new Set(["python-only","polyglot","enterprise"]),t="minimal";try{let s=m.join(r,".rapidkit","workspace.json");t=JSON.parse(await k.promises.readFile(s,"utf-8")).profile??"minimal";}catch{t="minimal";}if(!await(async()=>{if(e.has(t))return true;let s=await tr(r);if(s.length===0)return false;for(let i of s){let a=pe(i),l=a?.module_support;if(!(re(a,i)||oe(a,i))&&l!==false)return ae(a,i)||ne(a,i),true}return false})())return 0;let o="poetry";try{let{readWorkspaceMarker:s}=await import('./workspace-marker-IOPQ42A7.js'),a=(await s(r))?.metadata?.npm?.installMethod;(a==="poetry"||a==="venv"||a==="pipx"||a==="pip")&&(o=a);}catch{}if(o==="poetry"||o==="venv"){let s=m.join(r,"pyproject.toml"),i=false;try{i=(await k.promises.readFile(s,"utf-8")).includes("rapidkit-core");}catch{i=false;}let a=process.env.RAPIDKIT_DEV_PATH,l=a?await j__default.pathExists(a):false;if(i){let d=_o(r);if(!await j__default.pathExists(d)){let u=await Ro(r);if(u!==0)return u}let p=await L(d,l&&a?["-m","pip","install",a,"--quiet","--disable-pip-version-check"]:["-m","pip","install","rapidkit-core","--quiet","--disable-pip-version-check"],r);if(p!==0)return p}else {let d=await L("poetry",["install","--no-root"],r);if(d!==0)return d;let f=await L("poetry",["add","rapidkit-core"],r);if(f!==0)return f}try{let{writeWorkspaceLauncher:d}=await import('./create-3V7O72CO.js');await d(r,o==="venv"?"venv":"poetry");}catch{}return 0}return 0}async function tr(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 s=[];try{s=await k.promises.readdir(o,{withFileTypes:true});}catch{continue}for(let i of s){if(!i.isDirectory()||i.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(i.name))continue;let a=m.join(o,i.name),l=m.join(a,".rapidkit","context.json"),d=m.join(a,".rapidkit","project.json");if(await j__default.pathExists(l)||await j__default.pathExists(d)){e.push(a);continue}n.push(a);}}return e}function Fo(r){let e="my-workspace",t=1;for(;;){let n=t===1?e:`${e}-${t}`,o=m.join(r,n);if(!k.existsSync(o))return {name:n,targetPath:o};t+=1;}}async function Yt(r){let t=await Me("go",{runCommandInCwd:L,runCoreRapidkit:d}).initProject(r);return t.message&&console.log(c$1.red(`\u274C ${t.message}`)),t.exitCode}async function ot(r,e){let t=Me("node",{runCommandInCwd:L,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 Fe(r,e){let t=Me("java",{runCommandInCwd:L,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 Wo(r,e=Xt){let t=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof t>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let s=function(R){if(!R)return null;let _=R.trim().toLowerCase();return _==="minimal"||_==="java-only"||_==="go-only"||_==="python-only"||_==="node-only"||_==="polyglot"||_==="enterprise"?_:null},i=function(R){let se=R.match(/^\s*mode:\s*([a-zA-Z]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase()==="strict"?"strict":"warn",ce=(ve,V)=>{let _e=R.match(new RegExp(`^\\s*${ve}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return _e?_e[1].toLowerCase()==="true":V};return {mode:se,dependency_sharing_mode:yn(R),rules:{enforce_workspace_marker:ce("enforce_workspace_marker",true),enforce_toolchain_lock:ce("enforce_toolchain_lock",false),disallow_untrusted_tool_sources:ce("disallow_untrusted_tool_sources",false),enforce_compatibility_matrix:ce("enforce_compatibility_matrix",false),require_mirror_lock_for_offline:ce("require_mirror_lock_for_offline",true)}}};let a=["init"],l,d=false,f=false,p=false;for(let R=1;R<r.length;R+=1){let _=r[R];if(_==="--ci"){d=true;continue}if(_==="--offline"){f=true;continue}if(_==="--json"){p=true;continue}if(_==="--profile"){let W=r[R+1];if(!W||W.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;l=W,R+=1;continue}if(_.startsWith("--profile=")){l=_.slice(10);continue}a.push(_);}let u=s(l);if(l&&!u)return console.log(c$1.red(`Invalid profile: ${l}. Use one of: minimal, java-only, go-only, python-only, node-only, polyglot, enterprise.`)),1;let y=process.cwd(),g=m.join(y,".rapidkit-workspace"),h=m.join(y,".rapidkit","workspace.json"),b;!k.existsSync(g)&&k.existsSync(h)?b=y:(b=z(y),b||(b=Do(y)));let w=[],C=null,P=null;if(b)try{let R=m.join(b,".rapidkit","workspace.json"),_=await k.promises.readFile(R,"utf-8"),W=JSON.parse(_);P=s(W.profile);}catch{P=null;}let S=["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"},$=u;if(!!b&&!u&&!d&&!p&&!!process.stdin.isTTY&&!!process.stdout.isTTY){let R=P||"minimal",{chosenProfile:_}=await Ee.prompt([{type:"rawlist",name:"chosenProfile",message:`Select workspace profile for bootstrap (current: ${R})`,choices:S.map(W=>({name:W===R?`${A[W]} \u2190 current`:A[W],value:W})),default:S.indexOf(R)}]);$=_;}let G=$||P||"minimal";if(b)try{let _=G==="python-only"||G==="polyglot"||G==="enterprise"?"poetry":"venv",W;try{let V=(await k.promises.readFile(m.join(b,".python-version"),"utf-8")).trim();V&&(W=V);}catch{}let{syncWorkspaceFoundationFiles:se}=await import('./create-3V7O72CO.js'),ce=await se(b,{workspaceName:m.basename(b),installMethod:_,pythonVersion:W,profile:G,writeMarker:true,writeGitignore:true,onlyIfMissing:true});w.push({id:"workspace.legacy.sync",status:ce.length>0?"passed":"skipped",message:ce.length>0?`Legacy workspace foundation synchronized: ${ce.join(", ")}`:"Workspace foundation files are already up to date."});}catch(R){w.push({id:"workspace.legacy.sync",status:"failed",message:`Failed to synchronize legacy workspace foundation files: ${R.message}`});}if(b&&$&&$!==P)try{let R=m.join(b,".rapidkit","workspace.json"),_=await k.promises.readFile(R,"utf-8"),W=JSON.parse(_);W.profile=$,await k.promises.writeFile(R,JSON.stringify(W,null,2)+`
168
- `,"utf-8");}catch{}let K={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}},Q=null;if(b)try{let R=await k.promises.readFile(m.join(b,".rapidkit","policies.yml"),"utf-8");Q=R,K=i(R);}catch{w.push({id:"policy.file",status:"skipped",message:"No workspace policy file found; using default bootstrap policy."});}else w.push({id:"workspace.detect",status:"skipped",message:"No workspace marker found; bootstrap runs in project/single-path mode."});if(b){let R=hn(Q);K.dependency_sharing_mode=R.mode,w.push({id:"policy.schema.dependency_sharing_mode",status:R.status,message:R.message}),w.push({id:"policy.dependency_sharing_mode.effective",status:"passed",message:K.dependency_sharing_mode==="isolated"?"Effective dependency mode: isolated (default secure mode).":K.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 _=k.existsSync(m.join(b,".rapidkit-workspace"));w.push({id:"policy.enforce_workspace_marker",status:!K.rules.enforce_workspace_marker||_?"passed":"failed",message:!K.rules.enforce_workspace_marker||_?"Workspace marker policy satisfied.":"Workspace marker policy failed: .rapidkit-workspace is missing."});let W=k.existsSync(m.join(b,".rapidkit","toolchain.lock"));w.push({id:"policy.enforce_toolchain_lock",status:!K.rules.enforce_toolchain_lock||W?"passed":"failed",message:!K.rules.enforce_toolchain_lock||W?"Toolchain lock policy satisfied.":"Toolchain lock policy failed: .rapidkit/toolchain.lock is missing."});let se=process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||k.existsSync(m.join(b,".rapidkit","trusted-sources.lock"));w.push({id:"policy.disallow_untrusted_tool_sources",status:!K.rules.disallow_untrusted_tool_sources||se?"passed":"failed",message:!K.rules.disallow_untrusted_tool_sources||se?"Trusted tool sources policy satisfied.":"Trusted tool sources policy failed: set RAPIDKIT_TRUSTED_SOURCES=1 or provide .rapidkit/trusted-sources.lock."});let ce=m.join(b,".rapidkit","compatibility-matrix.json"),ve=k.existsSync(ce),V=K.rules.enforce_compatibility_matrix;if(w.push({id:"policy.enforce_compatibility_matrix",status:!V||ve?"passed":"failed",message:!V||ve?"Compatibility matrix policy satisfied.":"Compatibility matrix policy failed: .rapidkit/compatibility-matrix.json is missing."}),ve)try{let T=await k.promises.readFile(ce,"utf-8"),H=JSON.parse(T),it=!!H&&typeof H=="object";w.push({id:"compatibility.matrix.parse",status:it?"passed":"failed",message:it?"Compatibility matrix parsed successfully.":"Compatibility matrix parse failed: invalid JSON object."});}catch{w.push({id:"compatibility.matrix.parse",status:"failed",message:"Compatibility matrix parse failed: invalid JSON."});}let _e=m.join(b,".rapidkit","mirror-config.json"),Te=m.join(b,".rapidkit","mirror.lock"),Ye=k.existsSync(_e),Et=k.existsSync(Te),rr={};if(Ye)try{rr=JSON.parse(await k.promises.readFile(_e,"utf-8")),w.push({id:"mirror.config.parse",status:"passed",message:"Mirror configuration parsed successfully."});}catch{w.push({id:"mirror.config.parse",status:"failed",message:"Mirror configuration parse failed: invalid JSON in .rapidkit/mirror-config.json."});}let At=await Jt(b,{ciMode:d,offlineMode:f});if(w.push(...At.checks.map(T=>({id:T.id,status:T.status,message:T.message}))),C=At.details,At.details.lockWritten&&(Et=true),f){let T=process.env.RAPIDKIT_MIRROR_ENABLED==="1"||rr.enabled===true;w.push({id:"offline.mirror.enabled",status:T?"passed":"failed",message:T?"Offline mode mirror is enabled.":'Offline mode requires mirror enablement (set RAPIDKIT_MIRROR_ENABLED=1 or .rapidkit/mirror-config.json {"enabled": true}).'});let H=K.rules.require_mirror_lock_for_offline;w.push({id:"offline.mirror.lock",status:!H||Et?"passed":"failed",message:!H||Et?"Offline mode mirror lock policy satisfied.":"Offline mode mirror lock policy failed: .rapidkit/mirror.lock is missing."});}else w.push({id:"offline.mirror.enabled",status:"skipped",message:"Offline mirror checks skipped (offline mode is disabled)."});let vn=await tr(b),te=new Set;for(let T of vn){let H=pe(T);if(re(H,T)){te.add("go");continue}if(oe(H,T)){te.add("java");continue}if(ne(H,T)){te.add("node");continue}if(ae(H,T)){te.add("python");continue}te.add("unknown");}if(G==="go-only"){let T=te.size===0||[...te].every(H=>H==="go");w.push({id:"profile.go-only",status:T?"passed":"failed",message:T?"go-only profile validated for discovered projects.":`go-only profile mismatch: detected runtimes [${[...te].join(", ")}].`});}else if(G==="java-only"){let T=te.size===0||[...te].every(H=>H==="java");w.push({id:"profile.java-only",status:T?"passed":"failed",message:T?"java-only profile validated for discovered projects.":`java-only profile mismatch: detected runtimes [${[...te].join(", ")}].`});}else if(G==="python-only"){let T=te.size===0||[...te].every(H=>H==="python");w.push({id:"profile.python-only",status:T?"passed":"failed",message:T?"python-only profile validated for discovered projects.":`python-only profile mismatch: detected runtimes [${[...te].join(", ")}].`});}else if(G==="node-only"){let T=te.size===0||[...te].every(H=>H==="node");w.push({id:"profile.node-only",status:T?"passed":"failed",message:T?"node-only profile validated for discovered projects.":`node-only profile mismatch: detected runtimes [${[...te].join(", ")}].`});}else if(G==="minimal"){let T=[...te].filter(it=>it!=="unknown"),H=T.length<=1;w.push({id:"profile.minimal",status:H?"passed":"failed",message:H?"minimal profile is compatible with detected runtime mix.":`minimal profile mismatch: multiple runtimes detected [${T.join(", ")}].`});}else G==="enterprise"&&(w.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."}),w.push({id:"profile.enterprise.compatibility-matrix",status:ve?"passed":"failed",message:ve?"enterprise profile has compatibility matrix.":"enterprise profile requires .rapidkit/compatibility-matrix.json."}),w.push({id:"profile.enterprise.mirror-config",status:Ye?"passed":"failed",message:Ye?"enterprise profile has mirror configuration.":"enterprise profile requires .rapidkit/mirror-config.json."}));}d&&(process.env.RAPIDKIT_BOOTSTRAP_CI="1"),f&&(process.env.RAPIDKIT_OFFLINE_MODE="1");let ue=w.some(R=>R.id.startsWith("policy.schema.")&&R.status==="failed")||K.mode==="strict"&&w.some(R=>R.status==="failed"),U=b||y,M=m.join(U,".rapidkit","reports"),x=new Date().toISOString().replace(/[:.]/g,"-"),q=m.join(M,`bootstrap-compliance-${x}.json`),fe=m.join(M,"bootstrap-compliance.latest.json"),F={command:"bootstrap",timestamp:new Date().toISOString(),workspacePath:b,profile:G,options:{ci:d,offline:f,strict:K.mode==="strict"},policyMode:K.mode,policyRules:K.rules,mirrorLifecycle:C,checks:w};if(ue){let R={...F,result:"blocked",initExitCode:null};return await j__default.ensureDir(M),await Be(q,R),await Be(fe,R),p?process.stdout.write(`${JSON.stringify(R,null,2)}
169
- `):(console.log(c$1.red("\u274C Bootstrap blocked by strict policy checks.")),console.log(c$1.gray(`Compliance report: ${q}`))),1}let Z=0;p||(Z=await e(a));let ke=w.filter(R=>R.status==="failed").length,Ae=Z!==0?"failed":ke>0?"ok_with_warnings":"ok",X={...F,result:Ae,initExitCode:Z};if(await j__default.ensureDir(M),await Be(q,X),await Be(fe,X),p)process.stdout.write(`${JSON.stringify(X,null,2)}
170
- `);else {let R=w.filter(_=>_.status==="failed").length;R>0&&console.log(c$1.yellow(`\u26A0\uFE0F Bootstrap completed with ${R} policy/profile warnings.`)),console.log(c$1.gray(`Compliance report: ${q}`));}return Z}finally{typeof t>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=t;}}async function Jo(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(p,u)=>{if(p==="node"){if(!k.existsSync(m.join(u,"package.json")))return {exitCode:0,message:"Node warm-up skipped: package.json not found in current directory."};let g=k.existsSync(m.join(u,"pnpm-lock.yaml")),h=k.existsSync(m.join(u,"yarn.lock"));return g?{exitCode:await L("pnpm",["install","--lockfile-only","--ignore-scripts"],u)}:h?{exitCode:await L("yarn",["install","--ignore-scripts"],u)}:{exitCode:await L("npm",["install","--package-lock-only","--ignore-scripts"],u)}}if(p==="go")return k.existsSync(m.join(u,"go.mod"))?{exitCode:await L("go",["mod","download"],u)}:{exitCode:0,message:"Go warm-up skipped: go.mod not found in current directory."};if(p==="java"){let y=k.existsSync(m.join(u,"pom.xml")),g=k.existsSync(m.join(u,"build.gradle"))||k.existsSync(m.join(u,"build.gradle.kts")),h=m.join(u,process.platform==="win32"?"gradlew.bat":"gradlew"),b=k.existsSync(h);return !y&&!g?{exitCode:0,message:"Java warm-up skipped: pom.xml or build.gradle not found in current directory."}:y?{exitCode:await L("mvn",["-B","-q","-DskipTests","dependency:go-offline"],u)}:{exitCode:await L(b?h:"gradle",["--no-daemon","dependencies"],u)}}return {exitCode:0,message:"Dependency warm-up currently applies to node/go/java runtimes."}},o=Me(e,{runCommandInCwd:L,runCoreRapidkit:(p,u)=>d(p,{...u,cwd:void 0})}),s=await o.checkPrereqs(),i=await o.doctorHints(process.cwd()),a=z(process.cwd()),l=a||process.cwd(),d$1=null,f=async()=>e!=="java"||!a?[]:d$1||(d$1=(await tr(a)).filter(u=>{let y=pe(u);return oe(y,u)}),d$1);if(s.exitCode===0){console.log(c$1.green(`\u2705 ${e} prerequisites look good.`));let p=["python","node","go","java"].filter(u=>u!==e).join("/");if(console.log(c$1.gray(` Scope: validated ${e} runtime only. ${p} 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(l)).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 u=await f();if(u.length>0){let y=0,g=0,h=0;for(let b of u){let w=await n("java",b),C=/skipped/i.test(w.message||""),P=m.relative(a,b)||m.basename(b);w.message&&console.log(c$1.gray(` [${P}] ${w.message}`)),w.exitCode===0&&!C?y+=1:w.exitCode===0&&C?h+=1:g+=1;}y>0&&console.log(c$1.gray(` java dependency warm-up completed for ${y} project(s) (--warm-deps).`)),g>0&&console.log(c$1.yellow(` java dependency warm-up failed for ${g} project(s) (non-fatal).`)),y===0&&g===0&&h>0&&console.log(c$1.gray(" java dependency warm-up skipped for discovered workspace projects."));}else {let y=await n("java",l),g=/skipped/i.test(y.message||"");y.message&&console.log(c$1.gray(` ${y.message}`)),y.exitCode===0&&!g?console.log(c$1.gray(` ${e} dependency warm-up completed (--warm-deps).`)):y.exitCode!==0&&console.log(c$1.yellow(` ${e} dependency warm-up failed (non-fatal).`));}}else {let u=await n(e,l),y=/skipped/i.test(u.message||"");u.message&&console.log(c$1.gray(` ${u.message}`)),u.exitCode===0&&!y?console.log(c$1.gray(` ${e} dependency warm-up completed (--warm-deps).`)):u.exitCode!==0&&console.log(c$1.yellow(` ${e} dependency warm-up failed (non-fatal).`));}if(a)try{let u=m.join(a,".rapidkit","toolchain.lock"),y={};try{y=JSON.parse(await k.promises.readFile(u,"utf-8"));}catch{}(!y.runtime||typeof y.runtime!="object")&&(y.runtime={});let g=y.runtime;if(e==="python"){let h=null;try{let{execa:b}=await import('execa');for(let w of er()){let P=await b(w,w==="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(h=A?A[1]:null,h)break}}}catch{}g.python={...g.python||{},version:h,last_setup:new Date().toISOString()};}else if(e==="node")g.node={...g.node||{},version:process.version,last_setup:new Date().toISOString()};else if(e==="go"){let h=null;try{let{execa:b}=await import('execa'),C=((await b("go",["version"],{cwd:a,stdio:"pipe"})).stdout||"").match(/go(\d+\.\d+(?:\.\d+)?)/i);h=C?C[1]:null;}catch{}g.go={...g.go||{},version:h,last_setup:new Date().toISOString()};}else if(e==="java"){let h=null,b=null,w=null,C=await f(),S=k.existsSync(m.join(l,"pom.xml"))||k.existsSync(m.join(l,"build.gradle"))||k.existsSync(m.join(l,"build.gradle.kts"))?l:C[0]||l;try{let{execa:A}=await import('execa'),$=await A("java",["-version"],{cwd:a,stdio:"pipe",reject:false,timeout:3e3}),G=`${$.stdout||""}
171
- ${$.stderr||""}`.match(/version\s+"([^"]+)"/i);h=G?G[1]:null;let K=k.existsSync(m.join(S,"pom.xml")),Q=k.existsSync(m.join(S,"build.gradle"))||k.existsSync(m.join(S,"build.gradle.kts"));if(K){b="maven";let ie=(()=>{let x=m.join(S,"mvnw.cmd");if(process.platform==="win32"&&k.existsSync(x))return x;let q=m.join(S,"mvnw");return k.existsSync(q)?q:"mvn"})(),ue=await A(ie,["-version"],{cwd:S,stdio:"pipe",reject:false,timeout:3e3}),M=`${ue.stdout||""}
172
- ${ue.stderr||""}`.match(/Apache Maven\s+(\S+)/i);w=M?M[1]:null;}else if(Q){b="gradle";let ie=(()=>{let x=m.join(S,"gradlew.bat");if(process.platform==="win32"&&k.existsSync(x))return x;let q=m.join(S,"gradlew");return k.existsSync(q)?q:"gradle"})(),ue=await A(ie,["--version"],{cwd:S,stdio:"pipe",reject:false,timeout:3e3}),M=`${ue.stdout||""}
173
- ${ue.stderr||""}`.match(/Gradle\s+(\S+)/i);w=M?M[1]:null;}}catch{}g.java={...g.java||{},version:h,build_tool:b,build_tool_version:w,last_setup:new Date().toISOString()};}y.updated_at=new Date().toISOString(),await k.promises.writeFile(u,JSON.stringify(y,null,2)+`
174
- `,"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(i.length>0){console.log(c$1.gray(`
175
- Hints:`));for(let p of i)console.log(c$1.gray(`- ${p}`));}return s.exitCode}function qo(r){let e={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};for(let t of r.split(`
176
- `)){let n=t.trim(),o=n.match(/^strategy:\s*(\S+)/);o&&(e.strategy=o[1].replace(/['"]]/g,""));let s=n.match(/^prune_on_bootstrap:\s*(true|false)/);s&&(e.prune_on_bootstrap=s[1]==="true");let i=n.match(/^self_heal:\s*(true|false)/);i&&(e.self_heal=i[1]==="true");let a=n.match(/^verify_integrity:\s*(true|false)/);a&&(e.verify_integrity=a[1]==="true");}return e}async function Uo(r){let e=(r[1]||"status").toLowerCase(),t=_t.getInstance(),n=z(process.cwd()),o={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};if(n)try{let s=await k.promises.readFile(m.join(n,".rapidkit","cache-config.yml"),"utf-8");o=qo(s);}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 Vo(r,e,t,n){let o=(e||"show").toLowerCase(),s=m.join(r,".rapidkit","policies.yml");if(o==="show"||o==="status"||o==="get"){let f=await rn(r),p=en(f);return console.log(c$1.cyan(`Policy file: ${s}`)),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(" rules:")),console.log(c$1.gray(` enforce_workspace_marker: ${p.rules.enforce_workspace_marker}`)),console.log(c$1.gray(` enforce_toolchain_lock: ${p.rules.enforce_toolchain_lock}`)),console.log(c$1.gray(` disallow_untrusted_tool_sources: ${p.rules.disallow_untrusted_tool_sources}`)),console.log(c$1.gray(` enforce_compatibility_matrix: ${p.rules.enforce_compatibility_matrix}`)),console.log(c$1.gray(` require_mirror_lock_for_offline: ${p.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 i=t.trim(),l=await rn(r);if(i==="mode"){let f=n.trim().toLowerCase();if(f!=="warn"&&f!=="strict")return console.log(c$1.red("\u274C Invalid mode. Use: warn | strict")),1;l=tn(l,"mode",`${f} # "warn" or "strict"`);}else if(i==="dependency_sharing_mode"){let f=n.trim().toLowerCase();if(f!=="isolated"&&f!=="shared-runtime-caches"&&f!=="shared-node-deps")return console.log(c$1.red("\u274C Invalid dependency_sharing_mode. Use: isolated | shared-runtime-caches | shared-node-deps")),1;l=tn(l,"dependency_sharing_mode",`${f} # "isolated" or "shared-runtime-caches" or "shared-node-deps"`);}else if(i.startsWith("rules.")){let f=i.slice(6);if(!(f in gn))return console.log(c$1.red(`\u274C Unknown policy rule: ${f}`)),1;let p=Go(n);if(p===null)return console.log(c$1.red("\u274C Rule values must be boolean: true | false")),1;l=No(l,f,p);}else return console.log(c$1.red(`\u274C Unknown policy key: ${i}`)),1;await Lo(r,l);let d=en(l);return console.log(c$1.green(`\u2705 Updated ${i} in .rapidkit/policies.yml`)),console.log(c$1.gray(` mode: ${d.mode}`)),console.log(c$1.gray(` dependency_sharing_mode: ${d.dependency_sharing_mode}`)),console.log(c$1.gray(" Tip: run `npx rapidkit workspace policy show` to inspect all values.")),0}async function Ho(r){let e=(r[1]||"status").toLowerCase(),t=r.includes("--json"),n=z(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=m.join(n,".rapidkit"),s=m.join(o,"mirror-config.json"),i=m.join(o,"mirror.lock"),a=m.join(o,"mirror","artifacts"),l=m.join(o,"reports");async function d(f){let p=new Date().toISOString().replace(/[:.]/g,"-"),u=m.join(l,`mirror-ops-${p}.json`),y=m.join(l,"mirror-ops.latest.json");await j__default.ensureDir(l),await Be(u,f),await Be(y,f);}if(e==="status"){if(!await j__default.pathExists(s))try{let b={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 j__default.ensureDir(o),await k.promises.writeFile(s,JSON.stringify(b,null,2)+`
177
- `,"utf-8"),console.log(c$1.gray(" mirror-config.json created with defaults (.rapidkit/mirror-config.json)"));}catch{}let p=await j__default.pathExists(s),u=await j__default.pathExists(a),y=await j__default.pathExists(i),g=u?(await k.promises.readdir(a,{withFileTypes:true})).filter(b=>b.isFile()).length:0,h={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:n,mirror:{configExists:p,lockExists:y,artifactsCount:g}};return await d(h),t?(process.stdout.write(`${JSON.stringify(h,null,2)}
178
- `),0):(console.log(c$1.cyan("RapidKit mirror status")),console.log(c$1.gray(`Workspace: ${n}`)),console.log(c$1.gray(`Config: ${p?"present":"missing"} (${s})`)),console.log(c$1.gray(`Lock: ${y?"present":"missing"} (${i})`)),console.log(c$1.gray(`Artifacts: ${g}`)),0)}if(e==="sync"||e==="verify"||e==="rotate"){let f=await Jt(n,{ciMode:true,offlineMode:e==="verify",forceRun:true}),p=f.checks.filter(g=>g.status==="failed"),u=f.checks.some(g=>g.id.startsWith("mirror.verify.")&&g.status==="failed");if(e==="verify"&&u){let g={command:"mirror",action:e,result:"failed",timestamp:new Date().toISOString(),workspacePath:n,details:f.details,checks:f.checks};if(await d(g),t)return process.stdout.write(`${JSON.stringify(g,null,2)}
179
- `),1;console.log(c$1.red("\u274C Mirror verify failed."));for(let h of f.checks.filter(b=>b.id.startsWith("mirror.verify.")))console.log(c$1.gray(`- ${h.id}: ${h.message}`));return 1}if(p.length>0){let g={command:"mirror",action:e,result:"failed",timestamp:new Date().toISOString(),workspacePath:n,details:f.details,checks:f.checks};if(await d(g),t)return process.stdout.write(`${JSON.stringify(g,null,2)}
180
- `),1;console.log(c$1.yellow(`\u26A0\uFE0F Mirror ${e} completed with ${p.length} issue(s).`));for(let h of p)console.log(c$1.gray(`- ${h.id}: ${h.message}`));return 1}let y={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:n,details:f.details,checks:f.checks};return await d(y),t?(process.stdout.write(`${JSON.stringify(y,null,2)}
181
- `),0):e==="rotate"?(console.log(c$1.green(`\u2705 Mirror rotate completed. Rotated files: ${f.details.rotatedFiles}.`)),0):e==="verify"?(console.log(c$1.green(`\u2705 Mirror verify completed. Verified artifacts: ${f.details.verifiedArtifacts}.`)),0):(console.log(c$1.green(`\u2705 Mirror sync completed. Synced artifacts: ${f.details.syncedArtifacts}.`)),0)}return console.log(c$1.yellow("Usage: rapidkit mirror <status|sync|verify|rotate> [--json]")),1}async function Xt(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 wn(t,async()=>{let o=z(t),s=Me("python",{runCommandInCwd:L,runCoreRapidkit:d}),i=r.slice(1).filter(y=>!y.startsWith("-"));if(i.length>0){let y=m.resolve(t,i[0]),g=pe(y),h=await Ut(y);return re(g,y)||h==="go"?await Yt(y):oe(g,y)||h==="java"?await Fe("init",y):ne(g,y)||h==="node"?await Ht(y):ae(g,y)||h==="python"?await Vt(y,s):await d(r,{cwd:t})}let a=pe(t),l=!!z(t)&&t===z(t);if(!l&&re(a,t))return await Yt(t);let d$1=await Ut(t);if(!l&&(oe(a,t)||d$1==="java"))return await Fe("init",t);if(!l&&(ne(a,t)||d$1==="node"))return await Ht(t);if(!l&&(ae(a,t)||d$1==="python"))return await Vt(t,s);let f=o||z(t),p=fn(t),u=p?m.dirname(m.dirname(p)):null;if(u&&u!==f){let y=pe(u),g=await Ut(u);return re(y,u)||g==="go"?await Yt(u):oe(y,u)||g==="java"?await Fe("init",u):ne(y,u)||g==="node"?await Ht(u):ae(y,u)||g==="python"?await Vt(u,s):await d(["init"],{cwd:u})}if(f&&t===f){console.log(c$1.yellow("\u26A0\uFE0F Running `npx rapidkit init` at workspace root.")),console.log(c$1.gray(" Root `init`, `workspace init`, and `workspace run init` now share the same full-init flow:\n workspace-profile dependencies first, then project dependency initialization.\n"));let y=await Zt(f);if(y!==0)return y;let{runWorkspaceStage:g}=await import('./workspace-run-3HRMQT7D.js');return (await g({workspacePath:f,stage:"init",affected:false,blastRadius:false,parallel:false,continueOnError:false,strict:false,json:false,enforceGates:false})).summary.exitCode}if(!f){let y=await a$2(),{name:g}=Fo(t),{createProject:h}=await import('./create-3V7O72CO.js');return await h(g,{yes:true,userConfig:y}),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 nn(r){let e=z(r);if(!e)return [];let t="warn";try{let l=await k.promises.readFile(m.join(e,".rapidkit","policies.yml"),"utf-8");(l.match(/^\s*enforcement_mode:\s*(warn|strict)\s*(?:#.*)?$/m)??l.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m))?.[1]==="strict"&&(t="strict");}catch{return []}if(t!=="strict")return [];let n=[],o=m.join(e,".rapidkit","toolchain.lock");if(!k.existsSync(o))return n.push("toolchain.lock is missing \u2014 run `rapidkit bootstrap` first (strict mode requires a reproducible toolchain)."),n;let s={};try{s=JSON.parse(await k.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 i=s.runtime??{},a=pe(r);re(a,r)&&!i.go?.version?n.push("go.version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."):ne(a,r)&&!i.node?.version?n.push("node.version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."):oe(a,r)&&!i.java?.version?n.push("java.version is not pinned in toolchain.lock \u2014 run `rapidkit setup java` first."):ae(a,r)&&!i.python?.version&&n.push("python.version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");try{let d=JSON.parse(await k.promises.readFile(m.join(e,".rapidkit","workspace.json"),"utf-8")).profile??"";d==="python-only"&&(re(a,r)||ne(a,r)||oe(a,r))?n.push('Workspace profile is "python-only" but this project is not Python.'):d==="node-only"&&(re(a,r)||ae(a,r)||oe(a,r))?n.push('Workspace profile is "node-only" but this project is not Node.'):d==="go-only"&&(ne(a,r)||ae(a,r)||oe(a,r))?n.push('Workspace profile is "go-only" but this project is not Go.'):d==="java-only"&&(ae(a,r)||ne(a,r)||re(a,r))&&n.push('Workspace profile is "java-only" but this project is not Java.');}catch{}return n}async function Bo(){let r=async w=>{if(!a()||!w.toLowerCase().endsWith(".cmd"))return false;try{let P=(await j__default.readFile(w,"utf8")).replace(/\r\n/g,`
182
- `).toLowerCase(),S=P.includes("\\.rapidkit\\rapidkit"),A=P.includes("\\.rapidkit\\rapidkit.cmd")||P.includes("\\.rapidkit\\rapidkit.exe")||P.includes("\\.venv\\scripts\\rapidkit.exe");return S&&!A}catch{return false}},e=process.cwd(),t=process.argv.slice(2),n=t[0],o=n==="init",s=new Set(["dev","start","build","test"]),i$1=!n||n==="--help"||n==="-h"||n==="help",a$2=mn(e),l=k.existsSync(m.join(e,".rapidkit","project.json")),d$1=pe(e),f=re(d$1,e)||ne(d$1,e),p=!!n&&s.has(n)&&f;if(St(t[0])||t[0]==="create"||t[0]==="init"&&a$2&&!l)return false;try{let w=n==="shell"&&t[1]==="activate",C=n==="create",P=await ur(e,{cwd:e,timeoutMs:1200});if(P.ok&&P.data?.isRapidkitProject&&P.data.engine==="python"){let S=C||St(n);if(!i$1&&!w&&!S&&!o&&!p){if(n&&Zr.includes(n)){let $=await nn(e).catch(()=>[]);if($.length>0){process.stderr.write(c$1.red("\u274C Strict policy violations prevent running this command:")+`
183
- `);for(let N of $)process.stderr.write(c$1.red(` \u2022 ${N}`)+`
184
- `);process.exit(1);}}let A=await d(process.argv.slice(2),{cwd:e});process.exit(A);}}}catch{}let u=fn(e),y=a(),g=i(e),h=null;for(let w of g)if(await j__default.pathExists(w)){if(await r(w)){a$1.warn(`Skipping legacy/broken Windows launcher candidate: ${w}. Falling back to core bridge.`);continue}h=w;break}let b=n==="create";if(n==="init"&&a$2&&!l)return false;if(n&&Zr.includes(n)){let w=await nn(e);if(w.length>0){process.stderr.write(c$1.red("\u274C Strict policy violations prevent running this command:")+`
166
+ `;await k.promises.writeFile(o,n,"utf-8");}function ui(r){let e=r.trim().toLowerCase();return e==="true"||e==="1"||e==="on"?true:e==="false"||e==="0"||e==="off"?false:null}function Do(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 To(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 No(r,e){let t=V(r),o=t?f__default.join(t,".rapidkit","policies.yml"):null,n="isolated";if(o&&await ___default.pathExists(o))try{let a=await k.promises.readFile(o,"utf-8"),l=To(a);if(l.status==="failed")return console.log(c$1.red(`\u274C ${l.message}`)),{ok:false,code:1};n=l.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=n,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 F(r,e,t){return await new Promise(o=>{let n=spawn(r,e,{stdio:"inherit",cwd:t,shell:b$3()});n.on("close",i=>o(i??1)),n.on("error",()=>o(1));})}async function We(r,e){await ___default.outputFile(r,`${JSON.stringify(e,null,2)}
167
+ `,"utf-8");}async function mi(r,e,t){let o=process.env.RAPIDKIT_TEST_IMPORT_SYNC_FAIL==="1"&&(process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"),n=e.workspace?f__default.resolve(e.workspace):null,i=n??V(process.cwd()),s=false,a=false;if(n){if(!ze(n)){let d=`Workspace path is not a valid RapidKit workspace: ${n}`;return e.json?console.log(JSON.stringify({error:d},null,2)):console.log(c$1.red(`\u274C ${d}`)),1}}else if(!i||!ze(i)){let d=await hi();i=d.workspacePath,s=true,a=d.created;}if(!i||!ze(i)){let d="Not inside a RapidKit workspace";return e.json?console.log(JSON.stringify({error:d},null,2)):(console.log(c$1.red(`\u274C ${d}`)),console.log(c$1.gray("\u{1F4A1} Run this command from a workspace root or pass --workspace <path>."))),1}let l=`cd ${i}`,u=t?.syncWorkspaceProjects??(async d=>{if(o)throw new Error("forced sync failure for command-level import rollback test");let{syncWorkspaceProjects:p}=await import('./workspace-776YW7I6.js');await p(d,true);}),m=t?.rollbackImportedProjectImport??po;try{let d=await uo({workspacePath:i,source:r,name:e.name,sourceType:e.git===true?"git-url":void 0});try{await u(i);}catch(p){await m(i,d.path);try{await u(i);}catch{}throw new Error(`Workspace sync failed after import and the imported project was rolled back: ${p instanceof Error?p.message:String(p)}`)}return e.json?(console.log(JSON.stringify({workspacePath:i,workspaceResolution:s?"default-auto":n?"explicit":"nearest",defaultWorkspaceCreated:s?a:false,suggestedCdCommand:l,importedProject:d},null,2)),0):(s&&console.log(c$1.yellow(`\u2139 Imported outside a workspace, so RapidKit used the default workspace: ${i}`)),console.log(c$1.green(`\u2714 Imported project: ${d.name}`)),console.log(c$1.gray(` Workspace: ${i}`)),console.log(c$1.gray(` Destination: ${d.path}`)),console.log(c$1.gray(` Stack: ${d.stack} (${d.confidence})`)),console.log(c$1.gray(` Source: ${e.git===true||Qt(r)?"git-url":"local-folder"}`)),console.log(c$1.gray(` Next shell step: ${l}`)),0)}catch(d){let p=d instanceof Error?d.message:String(d);return e.json?console.log(JSON.stringify({error:p},null,2)):console.log(c$1.red(`\u274C Import failed: ${p}`)),1}}async function sr(r){let e=new Set(["python-only","polyglot","enterprise"]),t="minimal";try{let i=f__default.join(r,".rapidkit","workspace.json");t=JSON.parse(await k.promises.readFile(i,"utf-8")).profile??"minimal";}catch{t="minimal";}if(!await(async()=>{if(e.has(t))return true;let i=await lr(r);if(i.length===0)return false;for(let s of i){let a=ue(s),l=a?.module_support;if(!(ne(a,s)||se(a,s))&&l!==false)return le(a,s)||ie(a,s),true}return false})())return 0;let n="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")&&(n=a);}catch{}if(n==="poetry"||n==="venv"){let i=f__default.join(r,"pyproject.toml"),s=false;try{s=(await k.promises.readFile(i,"utf-8")).includes("rapidkit-core");}catch{s=false;}let a=process.env.RAPIDKIT_DEV_PATH,l=a?await ___default.pathExists(a):false;if(s){let u=Qn(r);if(!await ___default.pathExists(u)){let p=await Zn(r);if(p!==0)return p}let d=await F(u,l&&a?["-m","pip","install",a,"--quiet","--disable-pip-version-check"]:["-m","pip","install","rapidkit-core","--quiet","--disable-pip-version-check"],r);if(d!==0)return d}else {let u=await F("poetry",["install","--no-root"],r);if(u!==0)return u;let m=await F("poetry",["add","rapidkit-core"],r);if(m!==0)return m}try{let{writeWorkspaceLauncher:u}=await import('./create-4NQKTQ3C.js');await u(r,n==="venv"?"venv":"poetry");}catch{}return 0}return 0}async function lr(r){let e=[],t=new Set,o=[r];for(;o.length>0;){let n=o.pop();if(!n||t.has(n))continue;t.add(n);let i=[];try{i=await k.promises.readdir(n,{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__default.join(n,s.name),l=f__default.join(a,".rapidkit","context.json"),u=f__default.join(a,".rapidkit","project.json");if(await ___default.pathExists(l)||await ___default.pathExists(u)){e.push(a);continue}o.push(a);}}return e}function fi(r){let e="my-workspace",t=1;for(;;){let o=t===1?e:`${e}-${t}`,n=f__default.join(r,o);if(!k.existsSync(n))return {name:o,targetPath:n};t+=1;}}var gi="default-workspace";function yi(){return f__default.join(homedir(),"Workspai","rapidkits",gi)}async function hi(){let r=yi(),e=f__default.basename(r),t=ze(r);await ___default.ensureDir(f__default.join(r,".rapidkit")),await b$2(r,d$1(e,b()));let o=f__default.join(r,".rapidkit","workspace.json");return await ___default.pathExists(o)||await We(o,{name:e,workspace_name:e,profile:"minimal",createdAt:new Date().toISOString(),createdBy:"rapidkit-npm-import-fallback"}),{workspacePath:r,created:!t}}async function or(r){let t=await Ie("go",{runCommandInCwd:F,runCoreRapidkit:e$1}).initProject(r);return t.message&&console.log(c$1.red(`\u274C ${t.message}`)),t.exitCode}async function at(r,e){let t=Ie("node",{runCommandInCwd:F,runCoreRapidkit:e$1});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 Ge(r,e){let t=Ie("java",{runCommandInCwd:F,runCoreRapidkit:e$1});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 wi(r,e=ar){let t=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof t>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let i=function(R){if(!R)return null;let j=R.trim().toLowerCase();return j==="minimal"||j==="java-only"||j==="go-only"||j==="python-only"||j==="node-only"||j==="polyglot"||j==="enterprise"?j:null},s=function(R){let ce=R.match(/^\s*mode:\s*([a-zA-Z]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase()==="strict"?"strict":"warn",de=(ve,B)=>{let je=R.match(new RegExp(`^\\s*${ve}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return je?je[1].toLowerCase()==="true":B};return {mode:ce,dependency_sharing_mode:Do(R),rules:{enforce_workspace_marker:de("enforce_workspace_marker",true),enforce_toolchain_lock:de("enforce_toolchain_lock",false),disallow_untrusted_tool_sources:de("disallow_untrusted_tool_sources",false),enforce_compatibility_matrix:de("enforce_compatibility_matrix",false),require_mirror_lock_for_offline:de("require_mirror_lock_for_offline",true)}}};let a=["init"],l,u=false,m=false,d=false;for(let R=1;R<r.length;R+=1){let j=r[R];if(j==="--ci"){u=true;continue}if(j==="--offline"){m=true;continue}if(j==="--json"){d=true;continue}if(j==="--profile"){let G=r[R+1];if(!G||G.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;l=G,R+=1;continue}if(j.startsWith("--profile=")){l=j.slice(10);continue}a.push(j);}let p=i(l);if(l&&!p)return console.log(c$1.red(`Invalid profile: ${l}. Use one of: minimal, java-only, go-only, python-only, node-only, polyglot, enterprise.`)),1;let y=process.cwd(),g=f__default.join(y,".rapidkit-workspace"),h=f__default.join(y,".rapidkit","workspace.json"),b;!k.existsSync(g)&&k.existsSync(h)?b=y:(b=V(y),b||(b=ai(y)));let w=[],C=null,P=null;if(b)try{let R=f__default.join(b,".rapidkit","workspace.json"),j=await k.promises.readFile(R,"utf-8"),G=JSON.parse(j);P=i(G.profile);}catch{P=null;}let S=["minimal","java-only","python-only","node-only","go-only","polyglot","enterprise"],I={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"},M=p;if(!!b&&!p&&!u&&!d&&!!process.stdin.isTTY&&!!process.stdout.isTTY){let R=P||"minimal",{chosenProfile:j}=await _e.prompt([{type:"rawlist",name:"chosenProfile",message:`Select workspace profile for bootstrap (current: ${R})`,choices:S.map(G=>({name:G===R?`${I[G]} \u2190 current`:I[G],value:G})),default:S.indexOf(R)}]);M=j;}let L=M||P||"minimal";if(b)try{let j=L==="python-only"||L==="polyglot"||L==="enterprise"?"poetry":"venv",G;try{let B=(await k.promises.readFile(f__default.join(b,".python-version"),"utf-8")).trim();B&&(G=B);}catch{}let{syncWorkspaceFoundationFiles:ce}=await import('./create-4NQKTQ3C.js'),de=await ce(b,{workspaceName:f__default.basename(b),installMethod:j,pythonVersion:G,profile:L,writeMarker:true,writeGitignore:true,onlyIfMissing:true});w.push({id:"workspace.legacy.sync",status:de.length>0?"passed":"skipped",message:de.length>0?`Legacy workspace foundation synchronized: ${de.join(", ")}`:"Workspace foundation files are already up to date."});}catch(R){w.push({id:"workspace.legacy.sync",status:"failed",message:`Failed to synchronize legacy workspace foundation files: ${R.message}`});}if(b&&M&&M!==P)try{let R=f__default.join(b,".rapidkit","workspace.json"),j=await k.promises.readFile(R,"utf-8"),G=JSON.parse(j);G.profile=M,await k.promises.writeFile(R,JSON.stringify(G,null,2)+`
168
+ `,"utf-8");}catch{}let K={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}},Q=null;if(b)try{let R=await k.promises.readFile(f__default.join(b,".rapidkit","policies.yml"),"utf-8");Q=R,K=s(R);}catch{w.push({id:"policy.file",status:"skipped",message:"No workspace policy file found; using default bootstrap policy."});}else w.push({id:"workspace.detect",status:"skipped",message:"No workspace marker found; bootstrap runs in project/single-path mode."});if(b){let R=To(Q);K.dependency_sharing_mode=R.mode,w.push({id:"policy.schema.dependency_sharing_mode",status:R.status,message:R.message}),w.push({id:"policy.dependency_sharing_mode.effective",status:"passed",message:K.dependency_sharing_mode==="isolated"?"Effective dependency mode: isolated (default secure mode).":K.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 j=k.existsSync(f__default.join(b,".rapidkit-workspace"));w.push({id:"policy.enforce_workspace_marker",status:!K.rules.enforce_workspace_marker||j?"passed":"failed",message:!K.rules.enforce_workspace_marker||j?"Workspace marker policy satisfied.":"Workspace marker policy failed: .rapidkit-workspace is missing."});let G=k.existsSync(f__default.join(b,".rapidkit","toolchain.lock"));w.push({id:"policy.enforce_toolchain_lock",status:!K.rules.enforce_toolchain_lock||G?"passed":"failed",message:!K.rules.enforce_toolchain_lock||G?"Toolchain lock policy satisfied.":"Toolchain lock policy failed: .rapidkit/toolchain.lock is missing."});let ce=process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||k.existsSync(f__default.join(b,".rapidkit","trusted-sources.lock"));w.push({id:"policy.disallow_untrusted_tool_sources",status:!K.rules.disallow_untrusted_tool_sources||ce?"passed":"failed",message:!K.rules.disallow_untrusted_tool_sources||ce?"Trusted tool sources policy satisfied.":"Trusted tool sources policy failed: set RAPIDKIT_TRUSTED_SOURCES=1 or provide .rapidkit/trusted-sources.lock."});let de=f__default.join(b,".rapidkit","compatibility-matrix.json"),ve=k.existsSync(de),B=K.rules.enforce_compatibility_matrix;if(w.push({id:"policy.enforce_compatibility_matrix",status:!B||ve?"passed":"failed",message:!B||ve?"Compatibility matrix policy satisfied.":"Compatibility matrix policy failed: .rapidkit/compatibility-matrix.json is missing."}),ve)try{let T=await k.promises.readFile(de,"utf-8"),H=JSON.parse(T),ct=!!H&&typeof H=="object";w.push({id:"compatibility.matrix.parse",status:ct?"passed":"failed",message:ct?"Compatibility matrix parsed successfully.":"Compatibility matrix parse failed: invalid JSON object."});}catch{w.push({id:"compatibility.matrix.parse",status:"failed",message:"Compatibility matrix parse failed: invalid JSON."});}let je=f__default.join(b,".rapidkit","mirror-config.json"),Te=f__default.join(b,".rapidkit","mirror.lock"),Qe=k.existsSync(je),Ot=k.existsSync(Te),dr={};if(Qe)try{dr=JSON.parse(await k.promises.readFile(je,"utf-8")),w.push({id:"mirror.config.parse",status:"passed",message:"Mirror configuration parsed successfully."});}catch{w.push({id:"mirror.config.parse",status:"failed",message:"Mirror configuration parse failed: invalid JSON in .rapidkit/mirror-config.json."});}let Dt=await Yt(b,{ciMode:u,offlineMode:m});if(w.push(...Dt.checks.map(T=>({id:T.id,status:T.status,message:T.message}))),C=Dt.details,Dt.details.lockWritten&&(Ot=true),m){let T=process.env.RAPIDKIT_MIRROR_ENABLED==="1"||dr.enabled===true;w.push({id:"offline.mirror.enabled",status:T?"passed":"failed",message:T?"Offline mode mirror is enabled.":'Offline mode requires mirror enablement (set RAPIDKIT_MIRROR_ENABLED=1 or .rapidkit/mirror-config.json {"enabled": true}).'});let H=K.rules.require_mirror_lock_for_offline;w.push({id:"offline.mirror.lock",status:!H||Ot?"passed":"failed",message:!H||Ot?"Offline mode mirror lock policy satisfied.":"Offline mode mirror lock policy failed: .rapidkit/mirror.lock is missing."});}else w.push({id:"offline.mirror.enabled",status:"skipped",message:"Offline mirror checks skipped (offline mode is disabled)."});let Fo=await lr(b),te=new Set;for(let T of Fo){let H=ue(T);if(ne(H,T)){te.add("go");continue}if(se(H,T)){te.add("java");continue}if(ie(H,T)){te.add("node");continue}if(le(H,T)){te.add("python");continue}te.add("unknown");}if(L==="go-only"){let T=te.size===0||[...te].every(H=>H==="go");w.push({id:"profile.go-only",status:T?"passed":"failed",message:T?"go-only profile validated for discovered projects.":`go-only profile mismatch: detected runtimes [${[...te].join(", ")}].`});}else if(L==="java-only"){let T=te.size===0||[...te].every(H=>H==="java");w.push({id:"profile.java-only",status:T?"passed":"failed",message:T?"java-only profile validated for discovered projects.":`java-only profile mismatch: detected runtimes [${[...te].join(", ")}].`});}else if(L==="python-only"){let T=te.size===0||[...te].every(H=>H==="python");w.push({id:"profile.python-only",status:T?"passed":"failed",message:T?"python-only profile validated for discovered projects.":`python-only profile mismatch: detected runtimes [${[...te].join(", ")}].`});}else if(L==="node-only"){let T=te.size===0||[...te].every(H=>H==="node");w.push({id:"profile.node-only",status:T?"passed":"failed",message:T?"node-only profile validated for discovered projects.":`node-only profile mismatch: detected runtimes [${[...te].join(", ")}].`});}else if(L==="minimal"){let T=[...te].filter(ct=>ct!=="unknown"),H=T.length<=1;w.push({id:"profile.minimal",status:H?"passed":"failed",message:H?"minimal profile is compatible with detected runtime mix.":`minimal profile mismatch: multiple runtimes detected [${T.join(", ")}].`});}else L==="enterprise"&&(w.push({id:"profile.enterprise.ci",status:u?"passed":"failed",message:u?"enterprise profile running with --ci.":"enterprise profile expects --ci for deterministic non-interactive mode."}),w.push({id:"profile.enterprise.compatibility-matrix",status:ve?"passed":"failed",message:ve?"enterprise profile has compatibility matrix.":"enterprise profile requires .rapidkit/compatibility-matrix.json."}),w.push({id:"profile.enterprise.mirror-config",status:Qe?"passed":"failed",message:Qe?"enterprise profile has mirror configuration.":"enterprise profile requires .rapidkit/mirror-config.json."}));}u&&(process.env.RAPIDKIT_BOOTSTRAP_CI="1"),m&&(process.env.RAPIDKIT_OFFLINE_MODE="1");let pe=w.some(R=>R.id.startsWith("policy.schema.")&&R.status==="failed")||K.mode==="strict"&&w.some(R=>R.status==="failed"),U=b||y,$=f__default.join(U,".rapidkit","reports"),x=new Date().toISOString().replace(/[:.]/g,"-"),q=f__default.join($,`bootstrap-compliance-${x}.json`),ge=f__default.join($,"bootstrap-compliance.latest.json"),W={command:"bootstrap",timestamp:new Date().toISOString(),workspacePath:b,profile:L,options:{ci:u,offline:m,strict:K.mode==="strict"},policyMode:K.mode,policyRules:K.rules,mirrorLifecycle:C,checks:w};if(pe){let R={...W,result:"blocked",initExitCode:null};return await ___default.ensureDir($),await We(q,R),await We(ge,R),d?process.stdout.write(`${JSON.stringify(R,null,2)}
169
+ `):(console.log(c$1.red("\u274C Bootstrap blocked by strict policy checks.")),console.log(c$1.gray(`Compliance report: ${q}`))),1}let Z=0;d||(Z=await e(a));let ke=w.filter(R=>R.status==="failed").length,Se=Z!==0?"failed":ke>0?"ok_with_warnings":"ok",X={...W,result:Se,initExitCode:Z};if(await ___default.ensureDir($),await We(q,X),await We(ge,X),d)process.stdout.write(`${JSON.stringify(X,null,2)}
170
+ `);else {let R=w.filter(j=>j.status==="failed").length;R>0&&console.log(c$1.yellow(`\u26A0\uFE0F Bootstrap completed with ${R} policy/profile warnings.`)),console.log(c$1.gray(`Compliance report: ${q}`));}return Z}finally{typeof t>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=t;}}async function ki(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 o=async(d,p)=>{if(d==="node"){if(!k.existsSync(f__default.join(p,"package.json")))return {exitCode:0,message:"Node warm-up skipped: package.json not found in current directory."};let g=k.existsSync(f__default.join(p,"pnpm-lock.yaml")),h=k.existsSync(f__default.join(p,"yarn.lock"));return g?{exitCode:await F("pnpm",["install","--lockfile-only","--ignore-scripts"],p)}:h?{exitCode:await F("yarn",["install","--ignore-scripts"],p)}:{exitCode:await F("npm",["install","--package-lock-only","--ignore-scripts"],p)}}if(d==="go")return k.existsSync(f__default.join(p,"go.mod"))?{exitCode:await F("go",["mod","download"],p)}:{exitCode:0,message:"Go warm-up skipped: go.mod not found in current directory."};if(d==="java"){let y=k.existsSync(f__default.join(p,"pom.xml")),g=k.existsSync(f__default.join(p,"build.gradle"))||k.existsSync(f__default.join(p,"build.gradle.kts")),h=f__default.join(p,process.platform==="win32"?"gradlew.bat":"gradlew"),b=k.existsSync(h);return !y&&!g?{exitCode:0,message:"Java warm-up skipped: pom.xml or build.gradle not found in current directory."}:y?{exitCode:await F("mvn",["-B","-q","-DskipTests","dependency:go-offline"],p)}:{exitCode:await F(b?h:"gradle",["--no-daemon","dependencies"],p)}}return {exitCode:0,message:"Dependency warm-up currently applies to node/go/java runtimes."}},n=Ie(e,{runCommandInCwd:F,runCoreRapidkit:(d,p)=>e$1(d,{...p,cwd:void 0})}),i=await n.checkPrereqs(),s=await n.doctorHints(process.cwd()),a=V(process.cwd()),l=a||process.cwd(),u=null,m=async()=>e!=="java"||!a?[]:u||(u=(await lr(a)).filter(p=>{let y=ue(p);return se(y,p)}),u);if(i.exitCode===0){console.log(c$1.green(`\u2705 ${e} prerequisites look good.`));let d=["python","node","go","java"].filter(p=>p!==e).join("/");if(console.log(c$1.gray(` Scope: validated ${e} runtime only. ${d} 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.")),n.warmSetupCache&&((await n.warmSetupCache(l)).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 p=await m();if(p.length>0){let y=0,g=0,h=0;for(let b of p){let w=await o("java",b),C=/skipped/i.test(w.message||""),P=f__default.relative(a,b)||f__default.basename(b);w.message&&console.log(c$1.gray(` [${P}] ${w.message}`)),w.exitCode===0&&!C?y+=1:w.exitCode===0&&C?h+=1:g+=1;}y>0&&console.log(c$1.gray(` java dependency warm-up completed for ${y} project(s) (--warm-deps).`)),g>0&&console.log(c$1.yellow(` java dependency warm-up failed for ${g} project(s) (non-fatal).`)),y===0&&g===0&&h>0&&console.log(c$1.gray(" java dependency warm-up skipped for discovered workspace projects."));}else {let y=await o("java",l),g=/skipped/i.test(y.message||"");y.message&&console.log(c$1.gray(` ${y.message}`)),y.exitCode===0&&!g?console.log(c$1.gray(` ${e} dependency warm-up completed (--warm-deps).`)):y.exitCode!==0&&console.log(c$1.yellow(` ${e} dependency warm-up failed (non-fatal).`));}}else {let p=await o(e,l),y=/skipped/i.test(p.message||"");p.message&&console.log(c$1.gray(` ${p.message}`)),p.exitCode===0&&!y?console.log(c$1.gray(` ${e} dependency warm-up completed (--warm-deps).`)):p.exitCode!==0&&console.log(c$1.yellow(` ${e} dependency warm-up failed (non-fatal).`));}if(a)try{let p=f__default.join(a,".rapidkit","toolchain.lock"),y={};try{y=JSON.parse(await k.promises.readFile(p,"utf-8"));}catch{}(!y.runtime||typeof y.runtime!="object")&&(y.runtime={});let g=y.runtime;if(e==="python"){let h=null;try{let{execa:b}=await import('execa');for(let w of cr()){let P=await b(w,w==="py"?["-3","--version"]:["--version"],{cwd:a,stdio:"pipe",reject:false,timeout:3e3});if(P.exitCode===0){let I=(P.stdout||P.stderr||"").match(/Python\s+(\S+)/);if(h=I?I[1]:null,h)break}}}catch{}g.python={...g.python||{},version:h,last_setup:new Date().toISOString()};}else if(e==="node")g.node={...g.node||{},version:process.version,last_setup:new Date().toISOString()};else if(e==="go"){let h=null;try{let{execa:b}=await import('execa'),C=((await b("go",["version"],{cwd:a,stdio:"pipe"})).stdout||"").match(/go(\d+\.\d+(?:\.\d+)?)/i);h=C?C[1]:null;}catch{}g.go={...g.go||{},version:h,last_setup:new Date().toISOString()};}else if(e==="java"){let h=null,b=null,w=null,C=await m(),S=k.existsSync(f__default.join(l,"pom.xml"))||k.existsSync(f__default.join(l,"build.gradle"))||k.existsSync(f__default.join(l,"build.gradle.kts"))?l:C[0]||l;try{let{execa:I}=await import('execa'),M=await I("java",["-version"],{cwd:a,stdio:"pipe",reject:false,timeout:3e3}),L=`${M.stdout||""}
171
+ ${M.stderr||""}`.match(/version\s+"([^"]+)"/i);h=L?L[1]:null;let K=k.existsSync(f__default.join(S,"pom.xml")),Q=k.existsSync(f__default.join(S,"build.gradle"))||k.existsSync(f__default.join(S,"build.gradle.kts"));if(K){b="maven";let ae=(()=>{let x=f__default.join(S,"mvnw.cmd");if(process.platform==="win32"&&k.existsSync(x))return x;let q=f__default.join(S,"mvnw");return k.existsSync(q)?q:"mvn"})(),pe=await I(ae,["-version"],{cwd:S,stdio:"pipe",reject:false,timeout:3e3}),$=`${pe.stdout||""}
172
+ ${pe.stderr||""}`.match(/Apache Maven\s+(\S+)/i);w=$?$[1]:null;}else if(Q){b="gradle";let ae=(()=>{let x=f__default.join(S,"gradlew.bat");if(process.platform==="win32"&&k.existsSync(x))return x;let q=f__default.join(S,"gradlew");return k.existsSync(q)?q:"gradle"})(),pe=await I(ae,["--version"],{cwd:S,stdio:"pipe",reject:false,timeout:3e3}),$=`${pe.stdout||""}
173
+ ${pe.stderr||""}`.match(/Gradle\s+(\S+)/i);w=$?$[1]:null;}}catch{}g.java={...g.java||{},version:h,build_tool:b,build_tool_version:w,last_setup:new Date().toISOString()};}y.updated_at=new Date().toISOString(),await k.promises.writeFile(p,JSON.stringify(y,null,2)+`
174
+ `,"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(`
175
+ Hints:`));for(let d of s)console.log(c$1.gray(`- ${d}`));}return i.exitCode}function vi(r){let e={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};for(let t of r.split(`
176
+ `)){let o=t.trim(),n=o.match(/^strategy:\s*(\S+)/);n&&(e.strategy=n[1].replace(/['"]]/g,""));let i=o.match(/^prune_on_bootstrap:\s*(true|false)/);i&&(e.prune_on_bootstrap=i[1]==="true");let s=o.match(/^self_heal:\s*(true|false)/);s&&(e.self_heal=s[1]==="true");let a=o.match(/^verify_integrity:\s*(true|false)/);a&&(e.verify_integrity=a[1]==="true");}return e}async function bi(r){let e=(r[1]||"status").toLowerCase(),t=It.getInstance(),o=V(process.cwd()),n={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};if(o)try{let i=await k.promises.readFile(f__default.join(o,".rapidkit","cache-config.yml"),"utf-8");n=vi(i);}catch{}return e==="status"?(console.log(c$1.cyan("RapidKit cache is enabled")),console.log(c$1.cyan("RapidKit cache status")),o?(console.log(c$1.gray(` Workspace: ${o}`)),console.log(c$1.gray(` Strategy: ${n.strategy}`)),console.log(c$1.gray(` Self-heal: ${n.self_heal}`)),console.log(c$1.gray(` Prune on bootstrap:${n.prune_on_bootstrap}`)),console.log(c$1.gray(` Verify integrity: ${n.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).")),n.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"?n.self_heal?(await t.clear(),console.log(c$1.green("\u2705 Cache repaired (self-heal applied, stale entries evicted).")),n.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 Pi(r,e,t,o){let n=(e||"show").toLowerCase(),i=f__default.join(r,".rapidkit","policies.yml");if(n==="show"||n==="status"||n==="get"){let m=await Co(r),d=bo(m);return console.log(c$1.cyan(`Policy file: ${i}`)),console.log(c$1.gray(` mode: ${d.mode}`)),console.log(c$1.gray(` dependency_sharing_mode: ${d.dependency_sharing_mode}`)),console.log(c$1.gray(" rules:")),console.log(c$1.gray(` enforce_workspace_marker: ${d.rules.enforce_workspace_marker}`)),console.log(c$1.gray(` enforce_toolchain_lock: ${d.rules.enforce_toolchain_lock}`)),console.log(c$1.gray(` disallow_untrusted_tool_sources: ${d.rules.disallow_untrusted_tool_sources}`)),console.log(c$1.gray(` enforce_compatibility_matrix: ${d.rules.enforce_compatibility_matrix}`)),console.log(c$1.gray(` require_mirror_lock_for_offline: ${d.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(n!=="set")return console.log(c$1.red(`Unknown workspace policy action: ${e||""}`)),console.log(c$1.gray("Available: show, set")),1;if(!t||typeof o>"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(),l=await Co(r);if(s==="mode"){let m=o.trim().toLowerCase();if(m!=="warn"&&m!=="strict")return console.log(c$1.red("\u274C Invalid mode. Use: warn | strict")),1;l=Po(l,"mode",`${m} # "warn" or "strict"`);}else if(s==="dependency_sharing_mode"){let m=o.trim().toLowerCase();if(m!=="isolated"&&m!=="shared-runtime-caches"&&m!=="shared-node-deps")return console.log(c$1.red("\u274C Invalid dependency_sharing_mode. Use: isolated | shared-runtime-caches | shared-node-deps")),1;l=Po(l,"dependency_sharing_mode",`${m} # "isolated" or "shared-runtime-caches" or "shared-node-deps"`);}else if(s.startsWith("rules.")){let m=s.slice(6);if(!(m in Oo))return console.log(c$1.red(`\u274C Unknown policy rule: ${m}`)),1;let d=ui(o);if(d===null)return console.log(c$1.red("\u274C Rule values must be boolean: true | false")),1;l=li(l,m,d);}else return console.log(c$1.red(`\u274C Unknown policy key: ${s}`)),1;await pi(r,l);let u=bo(l);return console.log(c$1.green(`\u2705 Updated ${s} in .rapidkit/policies.yml`)),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(" Tip: run `npx rapidkit workspace policy show` to inspect all values.")),0}async function Ci(r){let e=(r[1]||"status").toLowerCase(),t=r.includes("--json"),o=V(process.cwd());if(!o)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 n=f__default.join(o,".rapidkit"),i=f__default.join(n,"mirror-config.json"),s=f__default.join(n,"mirror.lock"),a=f__default.join(n,"mirror","artifacts"),l=f__default.join(n,"reports");async function u(m){let d=new Date().toISOString().replace(/[:.]/g,"-"),p=f__default.join(l,`mirror-ops-${d}.json`),y=f__default.join(l,"mirror-ops.latest.json");await ___default.ensureDir(l),await We(p,m),await We(y,m);}if(e==="status"){if(!await ___default.pathExists(i))try{let b={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 ___default.ensureDir(n),await k.promises.writeFile(i,JSON.stringify(b,null,2)+`
177
+ `,"utf-8"),console.log(c$1.gray(" mirror-config.json created with defaults (.rapidkit/mirror-config.json)"));}catch{}let d=await ___default.pathExists(i),p=await ___default.pathExists(a),y=await ___default.pathExists(s),g=p?(await k.promises.readdir(a,{withFileTypes:true})).filter(b=>b.isFile()).length:0,h={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:o,mirror:{configExists:d,lockExists:y,artifactsCount:g}};return await u(h),t?(process.stdout.write(`${JSON.stringify(h,null,2)}
178
+ `),0):(console.log(c$1.cyan("RapidKit mirror status")),console.log(c$1.gray(`Workspace: ${o}`)),console.log(c$1.gray(`Config: ${d?"present":"missing"} (${i})`)),console.log(c$1.gray(`Lock: ${y?"present":"missing"} (${s})`)),console.log(c$1.gray(`Artifacts: ${g}`)),0)}if(e==="sync"||e==="verify"||e==="rotate"){let m=await Yt(o,{ciMode:true,offlineMode:e==="verify",forceRun:true}),d=m.checks.filter(g=>g.status==="failed"),p=m.checks.some(g=>g.id.startsWith("mirror.verify.")&&g.status==="failed");if(e==="verify"&&p){let g={command:"mirror",action:e,result:"failed",timestamp:new Date().toISOString(),workspacePath:o,details:m.details,checks:m.checks};if(await u(g),t)return process.stdout.write(`${JSON.stringify(g,null,2)}
179
+ `),1;console.log(c$1.red("\u274C Mirror verify failed."));for(let h of m.checks.filter(b=>b.id.startsWith("mirror.verify.")))console.log(c$1.gray(`- ${h.id}: ${h.message}`));return 1}if(d.length>0){let g={command:"mirror",action:e,result:"failed",timestamp:new Date().toISOString(),workspacePath:o,details:m.details,checks:m.checks};if(await u(g),t)return process.stdout.write(`${JSON.stringify(g,null,2)}
180
+ `),1;console.log(c$1.yellow(`\u26A0\uFE0F Mirror ${e} completed with ${d.length} issue(s).`));for(let h of d)console.log(c$1.gray(`- ${h.id}: ${h.message}`));return 1}let y={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:o,details:m.details,checks:m.checks};return await u(y),t?(process.stdout.write(`${JSON.stringify(y,null,2)}
181
+ `),0):e==="rotate"?(console.log(c$1.green(`\u2705 Mirror rotate completed. Rotated files: ${m.details.rotatedFiles}.`)),0):e==="verify"?(console.log(c$1.green(`\u2705 Mirror verify completed. Verified artifacts: ${m.details.verifiedArtifacts}.`)),0):(console.log(c$1.green(`\u2705 Mirror sync completed. Synced artifacts: ${m.details.syncedArtifacts}.`)),0)}return console.log(c$1.yellow("Usage: rapidkit mirror <status|sync|verify|rotate> [--json]")),1}async function ar(r){let e=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof e>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let t=process.cwd(),o=await No(t,async()=>{let n=V(t),i=Ie("python",{runCommandInCwd:F,runCoreRapidkit:e$1}),s=r.slice(1).filter(y=>!y.startsWith("-"));if(s.length>0){let y=f__default.resolve(t,s[0]),g=ue(y),h=await Xt(y);return ne(g,y)||h==="go"?await or(y):se(g,y)||h==="java"?await Ge("init",y):ie(g,y)||h==="node"?await tr(y):le(g,y)||h==="python"?await er(y,i):await e$1(r,{cwd:t})}let a=ue(t),l=!!V(t)&&t===V(t);if(!l&&ne(a,t))return await or(t);let u=await Xt(t);if(!l&&(se(a,t)||u==="java"))return await Ge("init",t);if(!l&&(ie(a,t)||u==="node"))return await tr(t);if(!l&&(le(a,t)||u==="python"))return await er(t,i);let m=n||V(t),d=Mo(t),p=d?f__default.dirname(f__default.dirname(d)):null;if(p&&p!==m){let y=ue(p),g=await Xt(p);return ne(y,p)||g==="go"?await or(p):se(y,p)||g==="java"?await Ge("init",p):ie(y,p)||g==="node"?await tr(p):le(y,p)||g==="python"?await er(p,i):await e$1(["init"],{cwd:p})}if(m&&t===m){console.log(c$1.yellow("\u26A0\uFE0F Running `npx rapidkit init` at workspace root.")),console.log(c$1.gray(" Root `init`, `workspace init`, and `workspace run init` now share the same full-init flow:\n workspace-profile dependencies first, then project dependency initialization.\n"));let y=await sr(m);if(y!==0)return y;let{runWorkspaceStage:g}=await import('./workspace-run-7EGSG2UO.js');return (await g({workspacePath:m,stage:"init",affected:false,blastRadius:false,parallel:false,continueOnError:false,strict:false,json:false,enforceGates:false})).summary.exitCode}if(!m){let y=await a$2(),{name:g}=fi(t),{createProject:h}=await import('./create-4NQKTQ3C.js');return await h(g,{yes:true,userConfig:y}),0}return await e$1(r,{cwd:t})});return o.ok?o.value:o.code}finally{typeof e>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=e;}}async function xo(r){let e=V(r);if(!e)return [];let t="warn";try{let l=await k.promises.readFile(f__default.join(e,".rapidkit","policies.yml"),"utf-8");(l.match(/^\s*enforcement_mode:\s*(warn|strict)\s*(?:#.*)?$/m)??l.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m))?.[1]==="strict"&&(t="strict");}catch{return []}if(t!=="strict")return [];let o=[],n=f__default.join(e,".rapidkit","toolchain.lock");if(!k.existsSync(n))return o.push("toolchain.lock is missing \u2014 run `rapidkit bootstrap` first (strict mode requires a reproducible toolchain)."),o;let i={};try{i=JSON.parse(await k.promises.readFile(n,"utf-8"));}catch{return o.push("toolchain.lock is invalid JSON \u2014 regenerate it with `rapidkit bootstrap` before running commands in strict mode."),o}let s=i.runtime??{},a=ue(r);ne(a,r)&&!s.go?.version?o.push("go.version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."):ie(a,r)&&!s.node?.version?o.push("node.version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."):se(a,r)&&!s.java?.version?o.push("java.version is not pinned in toolchain.lock \u2014 run `rapidkit setup java` first."):le(a,r)&&!s.python?.version&&o.push("python.version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");try{let u=JSON.parse(await k.promises.readFile(f__default.join(e,".rapidkit","workspace.json"),"utf-8")).profile??"";u==="python-only"&&(ne(a,r)||ie(a,r)||se(a,r))?o.push('Workspace profile is "python-only" but this project is not Python.'):u==="node-only"&&(ne(a,r)||le(a,r)||se(a,r))?o.push('Workspace profile is "node-only" but this project is not Node.'):u==="go-only"&&(ie(a,r)||le(a,r)||se(a,r))?o.push('Workspace profile is "go-only" but this project is not Go.'):u==="java-only"&&(le(a,r)||ie(a,r)||ne(a,r))&&o.push('Workspace profile is "java-only" but this project is not Java.');}catch{}return o}async function xi(){let r=async w=>{if(!a()||!w.toLowerCase().endsWith(".cmd"))return false;try{let P=(await ___default.readFile(w,"utf8")).replace(/\r\n/g,`
182
+ `).toLowerCase(),S=P.includes("\\.rapidkit\\rapidkit"),I=P.includes("\\.rapidkit\\rapidkit.cmd")||P.includes("\\.rapidkit\\rapidkit.exe")||P.includes("\\.venv\\scripts\\rapidkit.exe");return S&&!I}catch{return false}},e=process.cwd(),t=process.argv.slice(2),o=t[0],n=o==="init",i$1=new Set(["dev","start","build","test"]),s=!o||o==="--help"||o==="-h"||o==="help",a$2=ze(e),l=k.existsSync(f__default.join(e,".rapidkit","project.json")),u=ue(e),m=ne(u,e)||ie(u,e),d=!!o&&i$1.has(o)&&m;if(Mt(t[0])||t[0]==="create"||t[0]==="init"&&a$2&&!l)return false;try{let w=o==="shell"&&t[1]==="activate",C=o==="create",P=await Pr(e,{cwd:e,timeoutMs:1200});if(P.ok&&P.data?.isRapidkitProject&&P.data.engine==="python"){let S=C||Mt(o);if(!s&&!w&&!S&&!n&&!d){if(o&&ko.includes(o)){let M=await xo(e).catch(()=>[]);if(M.length>0){process.stderr.write(c$1.red("\u274C Strict policy violations prevent running this command:")+`
183
+ `);for(let N of M)process.stderr.write(c$1.red(` \u2022 ${N}`)+`
184
+ `);process.exit(1);}}let I=await e$1(process.argv.slice(2),{cwd:e});process.exit(I);}}}catch{}let p=Mo(e),y=a(),g=i(e),h=null;for(let w of g)if(await ___default.pathExists(w)){if(await r(w)){a$1.warn(`Skipping legacy/broken Windows launcher candidate: ${w}. Falling back to core bridge.`);continue}h=w;break}let b=o==="create";if(o==="init"&&a$2&&!l)return false;if(o&&ko.includes(o)){let w=await xo(e);if(w.length>0){process.stderr.write(c$1.red("\u274C Strict policy violations prevent running this command:")+`
185
185
  `);for(let C of w)process.stderr.write(c$1.red(` \u2022 ${C}`)+`
186
- `);process.exit(1);}}if(h&&n&&Qr.includes(n)&&!b&&!o&&!p){a$1.debug(`Delegating to local CLI: ${h} ${t.join(" ")}`);let w=n==="init"?Hr():process.env,C=spawn(h,t,{stdio:"inherit",cwd:e,shell:y,env:w});return C.on("close",P=>{process.exit(P??0);}),C.on("error",P=>{a$1.error(`Failed to run local rapidkit: ${P.message}`),process.exit(1);}),true}if(u&&await j__default.pathExists(u))try{if((await j__default.readJson(u)).engine==="pip"){let C=t[0],P=i(e),S=null;for(let A of P)if(await j__default.pathExists(A)){if(await r(A)){a$1.warn(`Skipping legacy/broken Windows launcher candidate: ${A}. Falling back to core bridge.`);continue}S=A;break}if(S&&C&&Qr.includes(C)&&C!=="init"&&!p){a$1.debug(`Delegating to local CLI (early detection): ${S} ${t.join(" ")}`);let A=C==="init"?Hr():process.env,$=spawn(S,t,{stdio:"inherit",cwd:e,env:A});return $.on("close",N=>process.exit(N??0)),$.on("error",N=>{a$1.error(`Failed to run local rapidkit: ${N.message}`),process.exit(1);}),true}if(C==="shell"&&t[1]==="activate"){let A=a()?`# RapidKit: activation snippet (PowerShell)
186
+ `);process.exit(1);}}if(h&&o&&wo.includes(o)&&!b&&!n&&!d){a$1.debug(`Delegating to local CLI: ${h} ${t.join(" ")}`);let w=o==="init"?fo():process.env,C=spawn(h,t,{stdio:"inherit",cwd:e,shell:y,env:w});return C.on("close",P=>{process.exit(P??0);}),C.on("error",P=>{a$1.error(`Failed to run local rapidkit: ${P.message}`),process.exit(1);}),true}if(p&&await ___default.pathExists(p))try{if((await ___default.readJson(p)).engine==="pip"){let C=t[0],P=i(e),S=null;for(let I of P)if(await ___default.pathExists(I)){if(await r(I)){a$1.warn(`Skipping legacy/broken Windows launcher candidate: ${I}. Falling back to core bridge.`);continue}S=I;break}if(S&&C&&wo.includes(C)&&C!=="init"&&!d){a$1.debug(`Delegating to local CLI (early detection): ${S} ${t.join(" ")}`);let I=C==="init"?fo():process.env,M=spawn(S,t,{stdio:"inherit",cwd:e,env:I});return M.on("close",N=>process.exit(N??0)),M.on("error",N=>{a$1.error(`Failed to run local rapidkit: ${N.message}`),process.exit(1);}),true}if(C==="shell"&&t[1]==="activate"){let I=a()?`# RapidKit: activation snippet (PowerShell)
187
187
  $venv = ".venv"
188
188
  if (Test-Path "$venv\\Scripts\\Activate.ps1") { . "$venv\\Scripts\\Activate.ps1" }
189
189
  $env:RAPIDKIT_PROJECT_ROOT = (Get-Location).Path
@@ -203,12 +203,12 @@ export RAPIDKIT_PROJECT_ROOT="$(pwd)"
203
203
  export PATH="$(pwd)/.rapidkit:$(pwd):$PATH"
204
204
  `;console.log(c$1.green.bold(`
205
205
  \u2705 Activation snippet \u2014 run the following to activate this project in your current shell:
206
- `)),console.log(A),console.log(c$1.gray(`
206
+ `)),console.log(I),console.log(c$1.gray(`
207
207
  \u{1F4A1} After activation you can run: rapidkit dev
208
- `)),process.exit(0);}if(!i$1&&!St(C)&&C!=="init"&&!p){let A=await d(t,{cwd:e});process.exit(A);}}}catch{}return false}var De=null,Rt=false,we=new Command,Yo=process.env.RAPIDKIT_SHOW_LEGACY==="1"||process.env.RAPIDKIT_SHOW_LEGACY?.toLowerCase()==="true";async function zo(r){if(r.length===0)return false;let e=r[0],t=r[1];if(Mo.includes(e))return false;if(un.includes(e))return true;if(St(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(s=>n.has(s)))return false;let o=await h$1();return o?o.has(e):!!(a$4.has(e)||r.length>1)}we.name("rapidkit").description("Create RapidKit workspaces and projects").version(b());var Qo=a()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";we.addHelpText("beforeAll",`RapidKit NPM CLI
208
+ `)),process.exit(0);}if(!s&&!Mt(C)&&C!=="init"&&!d){let I=await e$1(t,{cwd:e});process.exit(I);}}}catch{}return false}var De=null,At=false,fe=new Command,ji=process.env.RAPIDKIT_SHOW_LEGACY==="1"||process.env.RAPIDKIT_SHOW_LEGACY?.toLowerCase()==="true";async function Ri(r){if(r.length===0)return false;let e=r[0],t=r[1];if(ni.includes(e))return false;if(Ao.includes(e))return true;if(Mt(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 o=new Set(["--yes","-y","--skip-git","--skip-install","--debug","--dry-run","--no-update-check","--create-workspace","--no-workspace"]);if(r.some(i=>o.has(i)))return false;let n=await i$1();return n?n.has(e):!!(a$4.has(e)||r.length>1)}fe.name("rapidkit").description("Create RapidKit workspaces and projects").version(b());var _i=a()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";fe.addHelpText("beforeAll",`RapidKit NPM CLI
209
209
 
210
210
  Create workspaces, scaffold projects, and manage your development toolchain.
211
- `);we.addHelpText("afterAll",`
211
+ `);fe.addHelpText("afterAll",`
212
212
  Workspace Setup Commands
213
213
  rapidkit bootstrap Bootstrap projects in workspace (--profile java-only|python-only|node-only|go-only|polyglot|enterprise)
214
214
  rapidkit setup <runtime> Set up runtime toolchain (runtime: python | node | go | java)
@@ -228,46 +228,46 @@ Quick start:
228
228
  npx rapidkit my-workspace # Create + bootstrap workspace
229
229
  cd my-workspace
230
230
  npx rapidkit create project # Interactive kit picker
231
- ${Qo} # Install deps + run
231
+ ${_i} # Install deps + run
232
232
 
233
233
  Notes:
234
234
  --skip-install (npm wrapper) enables fast-path for lock/dependency steps.
235
235
  It is different from core --skip-essentials (essential module installation).
236
236
 
237
237
  Use "rapidkit help <command>" for more information.
238
- `);we.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(`
238
+ `);fe.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 o=await b$1();a$1.debug("RapidKit config loaded",o);let n=c(t,o,{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(c$1.blue.bold(`
239
239
  \u{1F680} Welcome to RapidKit NPM CLI!
240
- `)),r||(kn(),process.exit(0));try{Je(r);}catch(a){throw a instanceof e&&(a$1.error(`
240
+ `)),r||(Ko(),process.exit(0));try{qe(r);}catch(a){throw a instanceof e&&(a$1.error(`
241
241
  \u274C ${a.message}`),a.details&&a$1.warn(`\u{1F4A1} ${a.details}
242
- `),process.exit(1)),a}let s=m.resolve(process.cwd(),r);De=s,await j__default.pathExists(s)&&(a$1.error(`
242
+ `),process.exit(1)),a}let i=f__default.resolve(process.cwd(),r);De=i,await ___default.pathExists(i)&&(a$1.error(`
243
243
  \u274C Directory "${r}" already exists`),console.log(c$1.cyan(`
244
244
  \u{1F4A1} Choose a different name or delete the existing directory.
245
- `)),process.exit(1));let i=!!e$2.template;if(e$2.dryRun){console.log(c$1.cyan(`
245
+ `)),process.exit(1));let s=!!e$2.template;if(e$2.dryRun){console.log(c$1.cyan(`
246
246
  \u{1F50D} Dry-run mode - showing what would be created:
247
- `)),console.log(c$1.white("\u{1F4C2} Path:"),s),console.log(c$1.white("\u{1F4E6} Type:"),i?`Project (${e$2.template})`:"Workspace"),console.log();return}if(!e$2.yes&&!i?await Ee.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)
248
- `)),i){let a=String(e$2.template||"").trim(),l=a.toLowerCase(),d$1=l==="fastapi"?"fastapi.standard":l==="nestjs"?"nestjs.standard":l==="spring"||l==="springboot"||l==="java"?"springboot.standard":l==="go"||l==="fiber"?"gofiber.standard":l==="gin"?"gogin.standard":a;if(jt(d$1)){let C=m.resolve(process.cwd(),r),{generateGoFiberKit:P}=await import('./gofiber-standard-JDPREQCP.js');await P(C,{project_name:r,module_path:r,skipGit:e$2.skipGit});return}if(rt(d$1)){let C=m.resolve(process.cwd(),r),{generateGoGinKit:P}=await import('./gogin-standard-DCERHHVB.js');await P(C,{project_name:r,module_path:r,skipGit:e$2.skipGit});return}if(nt(d$1)){let C=m.resolve(process.cwd(),r),{generateSpringBootKit:P}=await import('./springboot-standard-AGTOOTNT.js');await P(C,{project_name:r,artifact_id:r,skipGit:e$2.skipGit});return}if(!!!Qt(process.cwd())){let{registerWorkspaceAtPath:C}=await import('./create-3V7O72CO.js');if(e$2.createWorkspace)await C(process.cwd(),{skipGit:e$2.skipGit,yes:e$2.yes,userConfig:t});else if(!e$2.noWorkspace)if(e$2.yes)await C(process.cwd(),{skipGit:e$2.skipGit,yes:true,userConfig:t});else {let{createWs:P}=await Ee.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 C(process.cwd(),{skipGit:e$2.skipGit,yes:false,userConfig:t});}}let p=["create","project",d$1,r,"--output",process.cwd()];e$2.yes&&p.push("--yes");let u=z(process.cwd()),y=!!e$2.skipInstall,g=y||!!u;y&&p.push("--skip-essentials");let h=g?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0,b=await e$1(p,{cwd:process.cwd(),env:h});b!==0&&process.exit(b),u&&!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 w=Qt(process.cwd());if(w){let C=m.dirname(w),P=m.join(C,".python-version"),S=m.join(s,".python-version");try{if(await j__default.pathExists(P)){let A=k.readFileSync(P,"utf-8");k.writeFileSync(S,A.trim()+`
249
- `),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 C=await d(["init",s],{cwd:process.cwd()});if(C!==0&&process.exit(C),w){let P=m.dirname(w),S=m.join(P,".python-version"),A=m.join(s,".python-version");try{if(await j__default.pathExists(S)){let $=k.readFileSync(S,"utf-8");k.writeFileSync(A,$.trim()+`
250
- `),a$1.debug(`Re-synced Python version ${$.trim()} after init`);}}catch($){a$1.debug("Could not re-sync Python version after init:",$);}}}}else {let{createProject:a}=await import('./create-3V7O72CO.js');await a(r,{skipGit:e$2.skipGit,dryRun:e$2.dryRun,yes:e$2.yes,userConfig:o,installMethod:e$2.installMethod,profile:e$2.profile});}}catch(t){t instanceof e?(a$1.error(`
247
+ `)),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)
248
+ `)),s){let a=String(e$2.template||"").trim(),l=a.toLowerCase(),u=l==="fastapi"?"fastapi.standard":l==="nestjs"?"nestjs.standard":l==="spring"||l==="springboot"||l==="java"?"springboot.standard":l==="go"||l==="fiber"?"gofiber.standard":l==="gin"?"gogin.standard":a;if($t(u)){let C=f__default.resolve(process.cwd(),r),{generateGoFiberKit:P}=await import('./gofiber-standard-JDPREQCP.js');await P(C,{project_name:r,module_path:r,skipGit:e$2.skipGit});return}if(it(u)){let C=f__default.resolve(process.cwd(),r),{generateGoGinKit:P}=await import('./gogin-standard-DCERHHVB.js');await P(C,{project_name:r,module_path:r,skipGit:e$2.skipGit});return}if(st(u)){let C=f__default.resolve(process.cwd(),r),{generateSpringBootKit:P}=await import('./springboot-standard-AGTOOTNT.js');await P(C,{project_name:r,artifact_id:r,skipGit:e$2.skipGit});return}if(!!!ir(process.cwd())){let{registerWorkspaceAtPath:C}=await import('./create-4NQKTQ3C.js');if(e$2.createWorkspace)await C(process.cwd(),{skipGit:e$2.skipGit,yes:e$2.yes,userConfig:t});else if(!e$2.noWorkspace)if(e$2.yes)await C(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 C(process.cwd(),{skipGit:e$2.skipGit,yes:false,userConfig:t});}}let d=["create","project",u,r,"--output",process.cwd()];e$2.yes&&d.push("--yes");let p=V(process.cwd()),y=!!e$2.skipInstall,g=y||!!p;y&&d.push("--skip-essentials");let h=g?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0,b=await f$1(d,{cwd:process.cwd(),env:h});b!==0&&process.exit(b),p&&!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 w=ir(process.cwd());if(w){let C=f__default.dirname(w),P=f__default.join(C,".python-version"),S=f__default.join(i,".python-version");try{if(await ___default.pathExists(P)){let I=k.readFileSync(P,"utf-8");k.writeFileSync(S,I.trim()+`
249
+ `),a$1.debug(`Synced Python version ${I.trim()} from workspace to project`);}}catch(I){a$1.debug("Could not sync Python version from workspace:",I);}}if(!e$2.skipInstall){let C=await e$1(["init",i],{cwd:process.cwd()});if(C!==0&&process.exit(C),w){let P=f__default.dirname(w),S=f__default.join(P,".python-version"),I=f__default.join(i,".python-version");try{if(await ___default.pathExists(S)){let M=k.readFileSync(S,"utf-8");k.writeFileSync(I,M.trim()+`
250
+ `),a$1.debug(`Re-synced Python version ${M.trim()} after init`);}}catch(M){a$1.debug("Could not re-sync Python version after init:",M);}}}}else {let{createProject:a}=await import('./create-4NQKTQ3C.js');await a(r,{skipGit:e$2.skipGit,dryRun:e$2.dryRun,yes:e$2.yes,userConfig:n,installMethod:e$2.installMethod,profile:e$2.profile});}}catch(t){t instanceof e?(a$1.error(`
251
251
  \u274C ${t.message}`),t.details&&a$1.warn(`\u{1F4A1} ${t.details}`),a$1.debug("Error code:",t.code)):(a$1.error(`
252
- \u274C An unexpected error occurred:`),console.error(t)),process.exit(1);}finally{De=null;}});$r(we);fr(we);we.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(l){let d=l;for(;;){let f=m.join(d,".rapidkit","context.json");if(k.existsSync(f))return f;let p=m.dirname(d);if(p===d)break;d=p;}return null}let n=t(e);function o(l){let d=l;for(;;){let f=m.join(d,".venv"),p=m.join(d,".rapidkit","activate");if(k.existsSync(p)||k.existsSync(f))return {venv:f,activateFile:p};let u=m.dirname(d);if(u===d)break;d=u;}return null}let s=o(e);!n&&!s&&(console.log(c$1.yellow("No RapidKit project found in this directory")),process.exit(1));let i;s&&k.existsSync(s.activateFile)?i=s.activateFile:s&&k.existsSync(s.venv)?i=h(s.venv):(console.log(c$1.yellow("No virtual environment found")),process.exit(1));let a$1=a();console.log(a$1?`call "${i}"`:`. "${i}"`);});we.command("readiness").description("\u{1F6A6} Generate machine-readable release readiness summary (env + doctor + verify + dependency)").option("--json","Output readiness result in JSON format").option("--strict","Exit with code 1 unless overall readiness is pass").action(async r=>{await Lr(r);});we.command("doctor [scope]").description("\u{1FA7A} Check RapidKit system health by default; use workspace or project for scoped checks").option("--workspace","Check entire workspace (including all projects)").option("--project","Check only the current project (or nearest parent project)").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"&&r!=="project"&&(console.log(c$1.red(`Unknown doctor scope: ${r}`)),console.log(c$1.gray("Available: workspace, project")),console.log(c$1.gray("Usage: npx rapidkit doctor | npx rapidkit doctor workspace | npx rapidkit doctor project")),process.exit(1));let t=await Oo({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-VR432RMW.js');await n({...e,workspace:e.workspace||r==="workspace",project:e.project||r==="project"});});we.command("workspace <action> [subaction] [key] [value]").description(`Manage RapidKit workspaces (list, sync, policy, share, run)
252
+ \u274C An unexpected error occurred:`),console.error(t)),process.exit(1);}finally{De=null;}});Br(fe);jr(fe);fe.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(l){let u=l;for(;;){let m=f__default.join(u,".rapidkit","context.json");if(k.existsSync(m))return m;let d=f__default.dirname(u);if(d===u)break;u=d;}return null}let o=t(e);function n(l){let u=l;for(;;){let m=f__default.join(u,".venv"),d=f__default.join(u,".rapidkit","activate");if(k.existsSync(d)||k.existsSync(m))return {venv:m,activateFile:d};let p=f__default.dirname(u);if(p===u)break;u=p;}return null}let i=n(e);!o&&!i&&(console.log(c$1.yellow("No RapidKit project found in this directory")),process.exit(1));let s;i&&k.existsSync(i.activateFile)?s=i.activateFile:i&&k.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}"`);});fe.command("readiness").description("\u{1F6A6} Generate machine-readable release readiness summary (env + doctor + verify + dependency)").option("--json","Output readiness result in JSON format").option("--strict","Exit with code 1 unless overall readiness is pass").action(async r=>{await Zr(r);});fe.command("import <source>").description("Import a local backend project folder or clone a git repository into the current workspace").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--name <projectName>","Override imported project folder name").option("--git","Force source to be treated as a git repository URL").option("--json","Emit machine-readable JSON output").action(async(r,e)=>{let t=await mi(r,e);t!==0&&process.exit(t);});fe.command("doctor [scope]").description("\u{1FA7A} Check RapidKit system health by default; use workspace or project for scoped checks").option("--workspace","Check entire workspace (including all projects)").option("--project","Check only the current project (or nearest parent project)").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"&&r!=="project"&&(console.log(c$1.red(`Unknown doctor scope: ${r}`)),console.log(c$1.gray("Available: workspace, project")),console.log(c$1.gray("Usage: npx rapidkit doctor | npx rapidkit doctor workspace | npx rapidkit doctor project")),process.exit(1));let t=await si({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:o}=await import('./doctor-BGVPFJ5U.js');await o({...e,workspace:e.workspace||r==="workspace",project:e.project||r==="project"});});fe.command("workspace <action> [subaction] [key] [value]").description(`Manage RapidKit workspaces (list, sync, policy, share, run)
253
253
  workspace run <stage> \u2014 fleet stage execution across discovered projects
254
- stages: init | test | build | start (dev excluded by design)`).option("--output <file>","Output file path for workspace share bundle").option("--include-paths","Include absolute paths in workspace share bundle").option("--no-doctor","Exclude doctor evidence in workspace share bundle").option("--affected","Run only affected projects (requires git diff context)").option("--blast-radius","Include downstream dependents from workspace dependency graph").option("--since <ref>","Git ref for affected calculation (default: HEAD~1)").option("--parallel","Run project stages in parallel").option("--max-workers <count>","Maximum parallel workers (default: min(4, selected))").option("--continue-on-error","Continue running remaining projects after a failure").option("--json","Emit machine-readable JSON output").option("--strict","Return non-zero exit on warn/fail gate outcomes").option("--no-gates","Skip doctor/readiness pre-run gates").action(async function(r,e,t,n){let o=this.opts(),s=i=>{let a=z(process.cwd());a||(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 l=m.resolve(process.cwd()),d=m.resolve(a);return l!==d&&(console.log(c$1.red(`\u274C Workspace action "${i}" must be run from workspace root.`)),console.log(c$1.gray(`\u{1F4A1} Workspace root: ${a}`)),console.log(c$1.white(` cd ${a}`)),(i==="run init"||i==="init")&&console.log(c$1.gray(" For project-only init in the current directory, run: npx rapidkit init")),process.exit(1)),a};if(r==="list"){let{listWorkspaces:i}=await import('./workspace-7JHX7L3E.js');await i();}else if(r==="sync"){let i=s("sync"),{syncWorkspaceProjects:a}=await import('./workspace-7JHX7L3E.js');console.log(c$1.cyan(`\u{1F4C2} Scanning workspace: ${m.basename(i)}`)),await a(i);}else if(r==="policy"){let i=s("policy"),a=await Vo(i,e,t,n);a!==0&&process.exit(a);}else if(r==="share"){let i=s("share"),a=o.output||e,{createWorkspaceShareBundle:l}=await import('./workspace-7JHX7L3E.js'),d=await l(i,{outputPath:a,includePaths:o.includePaths===true,includeDoctorEvidence:o.doctor!==false});console.log(c$1.green(`\u2714 Workspace share bundle exported: ${d}`)),console.log(c$1.gray("Share this JSON with your team for reproducible workspace/project diagnostics."));}else if(r==="run"){let i=s(`run ${e||""}`.trim());(!e||!["init","test","build","start"].includes(e))&&(console.log(c$1.red(`Unknown workspace run stage: ${e||"(none provided)"}`)),console.log(c$1.gray("Available stages: init | test | build | start")),console.log(c$1.gray(" \u2022 init \u2014 run install/bootstrap across the project fleet")),console.log(c$1.gray(" \u2022 test \u2014 run test suite across selected projects")),console.log(c$1.gray(" \u2022 build \u2014 compile/package across selected projects")),console.log(c$1.gray(" \u2022 start \u2014 start services (smoke/e2e scenarios)")),console.log(c$1.gray(" Note: dev is excluded \u2014 it is a local-only primitive, not a CI stage")),process.exit(2));let a=Number(o.maxWorkers??""),l=Number.isFinite(a)?Math.max(1,Math.trunc(a)):void 0;if(e==="init"){let p=await Zt(i);p!==0&&process.exit(p);}let{runWorkspaceStage:d}=await import('./workspace-run-3HRMQT7D.js'),f=await d({workspacePath:i,stage:e,affected:o.affected===true,blastRadius:o.blastRadius===true,since:o.since,parallel:o.parallel===true,maxWorkers:l,continueOnError:o.continueOnError===true,strict:o.strict===true,json:o.json===true,enforceGates:o.gates});o.json&&console.log(JSON.stringify(f,null,2)),f.summary.exitCode!==0&&process.exit(f.summary.exitCode);}else if(r==="init"){console.log(c$1.yellow("\u2139 workspace init is an alias of: npx rapidkit workspace run init")),console.log(c$1.gray(` Equivalent full-init aliases at workspace root:
254
+ stages: init | test | build | start (dev excluded by design)`).option("--output <file>","Output file path for workspace share bundle").option("--include-paths","Include absolute paths in workspace share bundle").option("--no-doctor","Exclude doctor evidence in workspace share bundle").option("--affected","Run only affected projects (requires git diff context)").option("--blast-radius","Include downstream dependents from workspace dependency graph").option("--since <ref>","Git ref for affected calculation (default: HEAD~1)").option("--parallel","Run project stages in parallel").option("--max-workers <count>","Maximum parallel workers (default: min(4, selected))").option("--continue-on-error","Continue running remaining projects after a failure").option("--json","Emit machine-readable JSON output").option("--strict","Return non-zero exit on warn/fail gate outcomes").option("--no-gates","Skip doctor/readiness pre-run gates").action(async function(r,e,t,o){let n=this.opts(),i=s=>{let a=V(process.cwd());a||(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 l=f__default.resolve(process.cwd()),u=f__default.resolve(a);return l!==u&&(console.log(c$1.red(`\u274C Workspace action "${s}" must be run from workspace root.`)),console.log(c$1.gray(`\u{1F4A1} Workspace root: ${a}`)),console.log(c$1.white(` cd ${a}`)),(s==="run init"||s==="init")&&console.log(c$1.gray(" For project-only init in the current directory, run: npx rapidkit init")),process.exit(1)),a};if(r==="list"){let{listWorkspaces:s}=await import('./workspace-776YW7I6.js');await s();}else if(r==="sync"){let s=i("sync"),{syncWorkspaceProjects:a}=await import('./workspace-776YW7I6.js');console.log(c$1.cyan(`\u{1F4C2} Scanning workspace: ${f__default.basename(s)}`)),await a(s);}else if(r==="policy"){let s=i("policy"),a=await Pi(s,e,t,o);a!==0&&process.exit(a);}else if(r==="share"){let s=i("share"),a=n.output||e,{createWorkspaceShareBundle:l}=await import('./workspace-776YW7I6.js'),u=await l(s,{outputPath:a,includePaths:n.includePaths===true,includeDoctorEvidence:n.doctor!==false});console.log(c$1.green(`\u2714 Workspace share bundle exported: ${u}`)),console.log(c$1.gray("Share this JSON with your team for reproducible workspace/project diagnostics."));}else if(r==="run"){let s=i(`run ${e||""}`.trim());(!e||!["init","test","build","start"].includes(e))&&(console.log(c$1.red(`Unknown workspace run stage: ${e||"(none provided)"}`)),console.log(c$1.gray("Available stages: init | test | build | start")),console.log(c$1.gray(" \u2022 init \u2014 run install/bootstrap across the project fleet")),console.log(c$1.gray(" \u2022 test \u2014 run test suite across selected projects")),console.log(c$1.gray(" \u2022 build \u2014 compile/package across selected projects")),console.log(c$1.gray(" \u2022 start \u2014 start services (smoke/e2e scenarios)")),console.log(c$1.gray(" Note: dev is excluded \u2014 it is a local-only primitive, not a CI stage")),process.exit(2));let a=Number(n.maxWorkers??""),l=Number.isFinite(a)?Math.max(1,Math.trunc(a)):void 0;if(e==="init"){let d=await sr(s);d!==0&&process.exit(d);}let{runWorkspaceStage:u}=await import('./workspace-run-7EGSG2UO.js'),m=await u({workspacePath:s,stage:e,affected:n.affected===true,blastRadius:n.blastRadius===true,since:n.since,parallel:n.parallel===true,maxWorkers:l,continueOnError:n.continueOnError===true,strict:n.strict===true,json:n.json===true,enforceGates:n.gates});n.json&&console.log(JSON.stringify(m,null,2)),m.summary.exitCode!==0&&process.exit(m.summary.exitCode);}else if(r==="init"){console.log(c$1.yellow("\u2139 workspace init is an alias of: npx rapidkit workspace run init")),console.log(c$1.gray(` Equivalent full-init aliases at workspace root:
255
255
  npx rapidkit init | npx rapidkit workspace init | npx rapidkit workspace run init
256
- `));let i=s("init"),a=Number(o.maxWorkers??""),l=Number.isFinite(a)?Math.max(1,Math.trunc(a)):void 0,d=await Zt(i);d!==0&&process.exit(d);let{runWorkspaceStage:f}=await import('./workspace-run-3HRMQT7D.js'),p=await f({workspacePath:i,stage:"init",affected:o.affected===true,blastRadius:o.blastRadius===true,since:o.since,parallel:o.parallel===true,maxWorkers:l,continueOnError:o.continueOnError===true,strict:o.strict===true,json:o.json===true,enforceGates:o.gates});o.json&&console.log(JSON.stringify(p,null,2)),p.summary.exitCode!==0&&process.exit(p.summary.exitCode);}else console.log(c$1.red(`Unknown workspace action: ${r}`)),console.log(c$1.gray("Available: list, sync, policy, share, run")),process.exit(1);});function kn(){let r=a()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";console.log(c$1.white(`Usage:
256
+ `));let s=i("init"),a=Number(n.maxWorkers??""),l=Number.isFinite(a)?Math.max(1,Math.trunc(a)):void 0,u=await sr(s);u!==0&&process.exit(u);let{runWorkspaceStage:m}=await import('./workspace-run-7EGSG2UO.js'),d=await m({workspacePath:s,stage:"init",affected:n.affected===true,blastRadius:n.blastRadius===true,since:n.since,parallel:n.parallel===true,maxWorkers:l,continueOnError:n.continueOnError===true,strict:n.strict===true,json:n.json===true,enforceGates:n.gates});n.json&&console.log(JSON.stringify(d,null,2)),d.summary.exitCode!==0&&process.exit(d.summary.exitCode);}else console.log(c$1.red(`Unknown workspace action: ${r}`)),console.log(c$1.gray("Available: list, sync, policy, share, run")),process.exit(1);});function Ko(){let r=a()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";console.log(c$1.white(`Usage:
257
257
  `)),console.log(c$1.cyan(` npx rapidkit <workspace-name> [options]
258
258
  `)),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}
259
259
  `)),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
260
- `)),console.log(c$1.bold("Workspace commands (inside a workspace):")),console.log(c$1.gray(" npx rapidkit bootstrap [--profile <p>] Re-bootstrap toolchains")),console.log(c$1.gray(" npx rapidkit workspace list List registered workspaces")),console.log(c$1.gray(" npx rapidkit workspace share [--output <file>] Export collaboration bundle")),console.log(c$1.gray(" npx rapidkit workspace policy show Show effective workspace policies")),console.log(c$1.gray(" npx rapidkit workspace policy set <k> <v> Update workspace policy values")),console.log(c$1.gray(" npx rapidkit setup python|node|go|java [--warm-deps] Set up runtime (+ optional deps warm-up)")),console.log(c$1.gray(" npx rapidkit mirror [status|sync|verify|rotate] Registry mirror management")),console.log(c$1.gray(` npx rapidkit cache [status|clear|prune|repair] Package cache management
260
+ `)),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 import <path|git-url> Copy or clone a backend project into this workspace")),console.log(c$1.gray(" npx rapidkit workspace share [--output <file>] Export collaboration bundle")),console.log(c$1.gray(" npx rapidkit workspace policy show Show effective workspace policies")),console.log(c$1.gray(" npx rapidkit workspace policy set <k> <v> Update workspace policy values")),console.log(c$1.gray(" npx rapidkit setup python|node|go|java [--warm-deps] Set up runtime (+ optional deps warm-up)")),console.log(c$1.gray(" npx rapidkit mirror [status|sync|verify|rotate] Registry mirror management")),console.log(c$1.gray(` npx rapidkit cache [status|clear|prune|repair] Package cache management
261
261
  `)),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
262
262
  `)),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
263
263
  `)),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
264
- `)),Yo?(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
264
+ `)),ji?(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
265
265
  `))):console.log(c$1.gray(`Tip: set RAPIDKIT_SHOW_LEGACY=1 to show legacy template flags in help.
266
- `));}var on="__rapidkit_signal_handlers_registered__",sn=globalThis;sn[on]||(sn[on]=true,process.on("SIGINT",async()=>{if(!Rt){if(Rt=true,console.log(c$1.yellow(`
266
+ `));}var jo="__rapidkit_signal_handlers_registered__",Ro=globalThis;Ro[jo]||(Ro[jo]=true,process.on("SIGINT",async()=>{if(!At){if(At=true,console.log(c$1.yellow(`
267
267
 
268
- \u26A0\uFE0F Interrupted by user`)),De&&await j__default.pathExists(De)){console.log(c$1.gray("Cleaning up partial installation..."));try{await j__default.remove(De),console.log(c$1.green("\u2713 Cleanup complete"));}catch(r){a$1.debug("Cleanup failed:",r);}}process.exit(130);}}),process.on("SIGTERM",async()=>{if(!Rt){if(Rt=true,a$1.debug("Received SIGTERM"),De&&await j__default.pathExists(De))try{await j__default.remove(De);}catch(r){a$1.debug("Cleanup failed:",r);}process.exit(143);}}));var Zo=process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test",Xo=(()=>{let r=process.argv[1];if(!r)return false;try{return k.realpathSync(r)===k.realpathSync(fileURLToPath(import.meta.url))}catch{return m.resolve(r)===m.resolve(fileURLToPath(import.meta.url))}})(),ei=!Zo||Xo;if(ei){let r=process.argv.slice(2),e=r[0],t=process.cwd(),n=mn(t),o=k.existsSync(m.join(t,".rapidkit","project.json")),s=Xr(e),i=e==="init"&&n&&!o;(r.length===0||r.length===1&&(e==="--help"||e==="-h"||e==="help"))&&(console.log(c$1.blue.bold(`
268
+ \u26A0\uFE0F Interrupted by user`)),De&&await ___default.pathExists(De)){console.log(c$1.gray("Cleaning up partial installation..."));try{await ___default.remove(De),console.log(c$1.green("\u2713 Cleanup complete"));}catch(r){a$1.debug("Cleanup failed:",r);}}process.exit(130);}}),process.on("SIGTERM",async()=>{if(!At){if(At=true,a$1.debug("Received SIGTERM"),De&&await ___default.pathExists(De))try{await ___default.remove(De);}catch(r){a$1.debug("Cleanup failed:",r);}process.exit(143);}}));var Si=process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test",Ei=(()=>{let r=process.argv[1];if(!r)return false;try{return k.realpathSync(r)===k.realpathSync(fileURLToPath(import.meta.url))}catch{return f__default.resolve(r)===f__default.resolve(fileURLToPath(import.meta.url))}})(),Ii=!Si||Ei;if(Ii){let r=process.argv.slice(2),e=r[0],t=process.cwd(),o=ze(t),n=k.existsSync(f__default.join(t,".rapidkit","project.json")),i=vo(e),s=e==="init"&&o&&!n;(r.length===0||r.length===1&&(e==="--help"||e==="-h"||e==="help"))&&(console.log(c$1.blue.bold(`
269
269
  \u{1F680} Welcome to RapidKit NPM CLI!
270
- `)),kn(),process.exit(0)),s?we.parse():i?Xt(r).then(l=>process.exit(l)).catch(l=>{process.stderr.write(`RapidKit (npm) failed to run workspace init: ${l?.message??l}
271
- `),process.exit(1);}):Bo().then(async l=>{if(!l){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)}
272
- `),Xr(d$1[0])){we.parse();return}if(d$1[0]==="create"){let p=await dn(d$1);process.exit(p);}if(d$1[0]==="init"){let p=await Xt(d$1);process.exit(p);}if($o(d$1[0])){if(d$1[0]==="bootstrap"){let u=await Wo(d$1);process.exit(u);}if(d$1[0]==="setup"){let u=await Jo(d$1);process.exit(u);}if(d$1[0]==="cache"){let u=await Uo(d$1);process.exit(u);}let p=await Ho(d$1);process.exit(p);}if(pn.includes(d$1[0])){let p=d$1[0],u=pe(process.cwd()),y=z(process.cwd()),g=false;if(y){let C=m.join(y,".rapidkit","policies.yml");if(await j__default.pathExists(C))try{let P=await k.promises.readFile(C,"utf-8");if(g=((P.match(/^\s*enforcement_mode:\s*(warn|strict)\s*(?:#.*)?$/m)??P.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m))?.[1]??"warn")==="strict",g){let $=m.join(y,".rapidkit","toolchain.lock"),N=[];if(!await j__default.pathExists($))N.push("toolchain.lock is missing \u2014 run `rapidkit bootstrap` first (strict mode requires a reproducible toolchain).");else try{let Q=JSON.parse(await k.promises.readFile($,"utf-8")).runtime??{};re(u,process.cwd())&&!Q.go?.version&&N.push("Go runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."),ne(u,process.cwd())&&!Q.node?.version&&N.push("Node runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."),oe(u,process.cwd())&&!Q.java?.version&&N.push("Java runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup java` first."),ae(u,process.cwd())&&!Q.python?.version&&N.push("Python runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");}catch{N.push("toolchain.lock is invalid JSON \u2014 regenerate it with `rapidkit bootstrap` before running commands in strict mode.");}let G=m.join(y,".rapidkit","workspace.json");if(await j__default.pathExists(G))try{let Q=JSON.parse(await k.promises.readFile(G,"utf-8")).profile??"";Q==="python-only"&&(re(u,process.cwd())||ne(u,process.cwd())||oe(u,process.cwd()))&&N.push('Workspace profile is "python-only" but this project is not Python. Update the workspace profile or use a polyglot workspace.'),Q==="node-only"&&(re(u,process.cwd())||ae(u,process.cwd())||oe(u,process.cwd()))&&N.push('Workspace profile is "node-only" but this project is not Node. Update the workspace profile or use a polyglot workspace.'),Q==="go-only"&&(ae(u,process.cwd())||ne(u,process.cwd())||oe(u,process.cwd()))&&N.push('Workspace profile is "go-only" but this project is not Go. Update the workspace profile or use a polyglot workspace.'),Q==="java-only"&&(ae(u,process.cwd())||ne(u,process.cwd())||re(u,process.cwd()))&&N.push('Workspace profile is "java-only" but this project is not Java. Update the workspace profile or use a polyglot workspace.');}catch{}if(N.length>0){console.log(c$1.red(`\u274C Strict policy violations block \`${p}\`:`));for(let K of N)console.log(c$1.red(` \u2022 ${K}`));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 h=await Wt({startPath:process.cwd(),action:p,writeReport:true}),b=g||process.env.RAPIDKIT_LIFECYCLE_ENFORCE_READINESS==="1"||process.env.RAPIDKIT_ENFORCE_READINESS==="1";if(h.blocking&&b){console.log(c$1.red(`\u274C Release readiness blocks \`${p}\`:`));for(let C of h.blockingReasons)console.log(c$1.red(` \u2022 ${C}`));h.evidencePath&&console.log(c$1.gray(`\u2139\uFE0F Readiness evidence: ${h.evidencePath}`)),process.exit(1);}h.overallStatus!=="pass"&&!b&&(console.log(c$1.yellow(`\u26A0\uFE0F Release readiness is ${h.overallStatus}. Command continues in warn mode.`)),h.evidencePath&&console.log(c$1.gray(` Evidence: ${h.evidencePath} (set RAPIDKIT_LIFECYCLE_ENFORCE_READINESS=1 to block)`)));let w=await wn(process.cwd(),async()=>{if(re(u,process.cwd())){let C=Me("go",{runCommandInCwd:L,runCoreRapidkit:d}),P=p==="dev"?await C.runDev(process.cwd()):p==="test"?await C.runTest(process.cwd()):p==="build"?await C.runBuild(process.cwd()):await C.runStart(process.cwd());return P.message&&console.log(c$1.red(`\u274C ${P.message}`)),P.exitCode}if(oe(u,process.cwd()))return p==="dev"?await Fe("dev",process.cwd()):p==="test"?await Fe("test",process.cwd()):p==="build"?await Fe("build",process.cwd()):await Fe("start",process.cwd());if(ne(u,process.cwd()))return p==="dev"?await ot("dev",process.cwd()):p==="test"?await ot("test",process.cwd()):p==="build"?await ot("build",process.cwd()):await ot("start",process.cwd());if(ae(u,process.cwd())){let C=Me("python",{runCommandInCwd:L,runCoreRapidkit:d});return p==="dev"?(await C.runDev(process.cwd())).exitCode:p==="test"?(await C.runTest(process.cwd())).exitCode:p==="build"?(await C.runBuild(process.cwd())).exitCode:(await C.runStart(process.cwd())).exitCode}return -1});w.ok||process.exit(w.code),w.value>=0&&process.exit(w.value);}if(d$1[0]==="add"||d$1[0]==="module"&&d$1[1]==="add"){let p=pe(process.cwd());if(p?.module_support===false){let u=p?.runtime==="java"?"Spring Boot":"Go";console.error(c$1.red(`\u274C RapidKit modules are not available for ${u} 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 f=await zo(d$1);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] shouldForwardToCore=${f}
273
- `),f){let p=await d(d$1,{cwd:process.cwd()});process.exit(p);}we.parse();}});}export{Eo as NPM_ONLY_TOP_LEVEL_COMMANDS,Mo as WRAPPER_ORCHESTRATED_PROJECT_COMMANDS,Oo as detectWindowsDoctorWorkspaceShadow,Wo as handleBootstrapCommand,Uo as handleCacheCommand,dn as handleCreateOrFallback,Xt as handleInitCommand,Ho as handleMirrorCommand,Jo as handleSetupCommand,Zt as installWorkspaceDependencies,zo as shouldForwardToCore};
270
+ `)),Ko(),process.exit(0)),i?fe.parse():s?ar(r).then(l=>process.exit(l)).catch(l=>{process.stderr.write(`RapidKit (npm) failed to run workspace init: ${l?.message??l}
271
+ `),process.exit(1);}):xi().then(async l=>{if(!l){let u=process.argv.slice(2);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] argv=${JSON.stringify(u)}
272
+ `),vo(u[0])){fe.parse();return}if(u[0]==="create"){let d=await Io(u);process.exit(d);}if(u[0]==="init"){let d=await ar(u);process.exit(d);}if(ii(u[0])){if(u[0]==="bootstrap"){let p=await wi(u);process.exit(p);}if(u[0]==="setup"){let p=await ki(u);process.exit(p);}if(u[0]==="cache"){let p=await bi(u);process.exit(p);}let d=await Ci(u);process.exit(d);}if($o.includes(u[0])){let d=u[0],p=ue(process.cwd()),y=V(process.cwd()),g=false;if(y){let C=f__default.join(y,".rapidkit","policies.yml");if(await ___default.pathExists(C))try{let P=await k.promises.readFile(C,"utf-8");if(g=((P.match(/^\s*enforcement_mode:\s*(warn|strict)\s*(?:#.*)?$/m)??P.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m))?.[1]??"warn")==="strict",g){let M=f__default.join(y,".rapidkit","toolchain.lock"),N=[];if(!await ___default.pathExists(M))N.push("toolchain.lock is missing \u2014 run `rapidkit bootstrap` first (strict mode requires a reproducible toolchain).");else try{let Q=JSON.parse(await k.promises.readFile(M,"utf-8")).runtime??{};ne(p,process.cwd())&&!Q.go?.version&&N.push("Go runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."),ie(p,process.cwd())&&!Q.node?.version&&N.push("Node runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."),se(p,process.cwd())&&!Q.java?.version&&N.push("Java runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup java` first."),le(p,process.cwd())&&!Q.python?.version&&N.push("Python runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");}catch{N.push("toolchain.lock is invalid JSON \u2014 regenerate it with `rapidkit bootstrap` before running commands in strict mode.");}let L=f__default.join(y,".rapidkit","workspace.json");if(await ___default.pathExists(L))try{let Q=JSON.parse(await k.promises.readFile(L,"utf-8")).profile??"";Q==="python-only"&&(ne(p,process.cwd())||ie(p,process.cwd())||se(p,process.cwd()))&&N.push('Workspace profile is "python-only" but this project is not Python. Update the workspace profile or use a polyglot workspace.'),Q==="node-only"&&(ne(p,process.cwd())||le(p,process.cwd())||se(p,process.cwd()))&&N.push('Workspace profile is "node-only" but this project is not Node. Update the workspace profile or use a polyglot workspace.'),Q==="go-only"&&(le(p,process.cwd())||ie(p,process.cwd())||se(p,process.cwd()))&&N.push('Workspace profile is "go-only" but this project is not Go. Update the workspace profile or use a polyglot workspace.'),Q==="java-only"&&(le(p,process.cwd())||ie(p,process.cwd())||ne(p,process.cwd()))&&N.push('Workspace profile is "java-only" but this project is not Java. Update the workspace profile or use a polyglot workspace.');}catch{}if(N.length>0){console.log(c$1.red(`\u274C Strict policy violations block \`${d}\`:`));for(let K of N)console.log(c$1.red(` \u2022 ${K}`));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 h=await Ht({startPath:process.cwd(),action:d,writeReport:true}),b=g||process.env.RAPIDKIT_LIFECYCLE_ENFORCE_READINESS==="1"||process.env.RAPIDKIT_ENFORCE_READINESS==="1";if(h.blocking&&b){console.log(c$1.red(`\u274C Release readiness blocks \`${d}\`:`));for(let C of h.blockingReasons)console.log(c$1.red(` \u2022 ${C}`));h.evidencePath&&console.log(c$1.gray(`\u2139\uFE0F Readiness evidence: ${h.evidencePath}`)),process.exit(1);}h.overallStatus!=="pass"&&!b&&(console.log(c$1.yellow(`\u26A0\uFE0F Release readiness is ${h.overallStatus}. Command continues in warn mode.`)),h.evidencePath&&console.log(c$1.gray(` Evidence: ${h.evidencePath} (set RAPIDKIT_LIFECYCLE_ENFORCE_READINESS=1 to block)`)));let w=await No(process.cwd(),async()=>{if(ne(p,process.cwd())){let C=Ie("go",{runCommandInCwd:F,runCoreRapidkit:e$1}),P=d==="dev"?await C.runDev(process.cwd()):d==="test"?await C.runTest(process.cwd()):d==="build"?await C.runBuild(process.cwd()):await C.runStart(process.cwd());return P.message&&console.log(c$1.red(`\u274C ${P.message}`)),P.exitCode}if(se(p,process.cwd()))return d==="dev"?await Ge("dev",process.cwd()):d==="test"?await Ge("test",process.cwd()):d==="build"?await Ge("build",process.cwd()):await Ge("start",process.cwd());if(ie(p,process.cwd()))return d==="dev"?await at("dev",process.cwd()):d==="test"?await at("test",process.cwd()):d==="build"?await at("build",process.cwd()):await at("start",process.cwd());if(le(p,process.cwd())){let C=Ie("python",{runCommandInCwd:F,runCoreRapidkit:e$1});return d==="dev"?(await C.runDev(process.cwd())).exitCode:d==="test"?(await C.runTest(process.cwd())).exitCode:d==="build"?(await C.runBuild(process.cwd())).exitCode:(await C.runStart(process.cwd())).exitCode}return -1});w.ok||process.exit(w.code),w.value>=0&&process.exit(w.value);}if(u[0]==="add"||u[0]==="module"&&u[1]==="add"){let d=ue(process.cwd());if(d?.module_support===false){let p=d?.runtime==="java"?"Spring Boot":"Go";console.error(c$1.red(`\u274C RapidKit modules are not available for ${p} 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 m=await Ri(u);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] shouldForwardToCore=${m}
273
+ `),m){let d=await e$1(u,{cwd:process.cwd()});process.exit(d);}fe.parse();}});}export{ti as NPM_ONLY_TOP_LEVEL_COMMANDS,ni as WRAPPER_ORCHESTRATED_PROJECT_COMMANDS,si as detectWindowsDoctorWorkspaceShadow,wi as handleBootstrapCommand,bi as handleCacheCommand,Io as handleCreateOrFallback,mi as handleImportCommand,ar as handleInitCommand,Ci as handleMirrorCommand,ki as handleSetupCommand,sr as installWorkspaceDependencies,Ri as shouldForwardToCore};