rapidkit 0.29.1 → 0.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,190 +1,200 @@
1
1
  #!/usr/bin/env node
2
- import {e as e$2,c as c$2}from'./chunk-TYC54P7X.js';import {f as f$1,e as e$1,d,i as i$1,a as a$5}from'./chunk-BFCIY2QK.js';import {a as a$2,b as b$1,c,e,j}from'./chunk-7OGOVP5U.js';import {b as b$2,d as d$1}from'./chunk-RV6HBTFC.js';import {a as a$6}from'./chunk-VKLL63TL.js';import {c as c$3}from'./chunk-NFUXULIF.js';import {a,h,i,f as f$2,b as b$3,c as c$1,d as d$2}from'./chunk-Z5LKRG57.js';import {b,a as a$3}from'./chunk-AC6KIKII.js';import {a as a$1}from'./chunk-VM2TOHNX.js';import {c as c$4}from'./chunk-2FIX2MDC.js';import {Command,Option}from'commander';import a$4 from'chalk';import Ae from'inquirer';import*as f from'path';import f__default from'path';import {fileURLToPath}from'url';import {exec,spawn}from'child_process';import bn from'validate-npm-package-name';import*as _ from'fs-extra';import ___default from'fs-extra';import k,{promises,createWriteStream}from'fs';import Hr,{tmpdir,homedir}from'os';import {execa}from'execa';import {promisify}from'util';import Bn from'ora';import pr,{createVerify,createHash,createHmac}from'crypto';import Eo from'http';import Ao from'https';function Ve(r){let e=bn(r);if(!e.validForNewPackages){let o=e.errors||[],n=e.warnings||[],s=[...o,...n];throw new j(r,`NPM validation failed: ${s.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 xn(){return d$2()}function Sn(r,e){return r==="py"?["-3",...e]:e}function Cn(r){return typeof r=="object"&&r!==null}async function Rn(r,e,t,o=c$4()){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 _n(r,e){let t=["-m","rapidkit",...r],o=xn();for(let n of o){let s=await Rn(n,Sn(n,t),e?.cwd,e?.timeoutMs);if(!s.ok)continue;let i=(s.stdout??"").trim();try{let c=JSON.parse(i);return Cn(c)?{ok:true,command:n,exitCode:s.exitCode,stdout:s.stdout,stderr:s.stderr,data:c}:{ok:false,command:n,exitCode:s.exitCode,stdout:s.stdout,stderr:s.stderr}}catch{return {ok:false,command:n,exitCode:s.exitCode,stdout:s.stdout,stderr:s.stderr}}}return {ok:false}}async function qr(r,e){let t=await _n(["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 Ye=f__default.join(Hr.homedir(),".rapidkitrc.json"),En=f__default.join(Hr.homedir(),".rapidkit","config.json");function Ur(r){try{if(!k.existsSync(r))return {};let e=k.readFileSync(r,"utf-8"),t=JSON.parse(e);return !t||typeof t!="object"||Array.isArray(t)?{}:t}catch{return {}}}function Vr(r){if(process.platform!=="win32")try{k.chmodSync(r,384);}catch{}}function ze(){let r=Ur(Ye),e=Ur(En);return k.existsSync(Ye)&&Vr(Ye),{...r,openaiApiKey:r.openaiApiKey??e.openaiApiKey,aiEnabled:r.aiEnabled??e.aiEnabled,telemetry:r.telemetry??e.telemetry}}function Ct(r){let t={...ze(),...r};k.writeFileSync(Ye,JSON.stringify(t,null,2),{encoding:"utf-8",mode:384}),Vr(Ye);}function at(){return process.env.OPENAI_API_KEY||ze().openaiApiKey||null}function Qt(){return ze().aiEnabled!==false}function Zt(){return Ye}async function Yr(){return (await import('inquirer')).default}function zr(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(a$4.red(`
2
+ import {e as e$2,c as c$2}from'./chunk-TYC54P7X.js';import {f,e as e$1,d,i as i$1,a as a$4,g}from'./chunk-BFCIY2QK.js';import {a as a$2,b as b$1,c,e,j}from'./chunk-7OGOVP5U.js';import {b as b$2,d as d$1}from'./chunk-RV6HBTFC.js';import {a as a$5}from'./chunk-VKLL63TL.js';import {c as c$3}from'./chunk-NFUXULIF.js';import {a,h,i,f as f$1,b as b$3,d as d$2,c as c$1}from'./chunk-Z5LKRG57.js';import {b,a as a$3}from'./chunk-AC6KIKII.js';import {a as a$1}from'./chunk-VM2TOHNX.js';import {c as c$4}from'./chunk-2FIX2MDC.js';import {Command,Option}from'commander';import s from'chalk';import $e from'inquirer';import*as y from'path';import y__default from'path';import {fileURLToPath}from'url';import {spawn}from'child_process';import Kn from'validate-npm-package-name';import*as _ from'fs-extra';import ___default from'fs-extra';import v,{promises,createWriteStream}from'fs';import to,{tmpdir,homedir}from'os';import {execa}from'execa';import cs from'ora';import wr,{createVerify,createHash,createHmac}from'crypto';import Go from'http';import qo from'https';function Qe(t){let e=Kn(t);if(!e.validForNewPackages){let o=e.errors||[],n=e.warnings||[],i=[...o,...n];throw new j(t,`NPM validation failed: ${i.join(", ")}`)}if(!/^[a-z][a-z0-9_-]*$/.test(t))throw new j(t,"Must start with a lowercase letter and contain only lowercase letters, numbers, hyphens, and underscores");if(["test","tests","src","dist","build","lib","python","pip","poetry","node","npm","rapidkit","rapidkit"].includes(t.toLowerCase()))throw new j(t,`"${t}" is a reserved name. Please choose a different name.`);if(t.length<2)throw new j(t,"Name must be at least 2 characters long");if(t.length>214)throw new j(t,"Name must be less than 214 characters");return true}function Gn(){return d$2()}function qn(t,e){return t==="py"?["-3",...e]:e}function Bn(t){return typeof t=="object"&&t!==null}async function Un(t,e,r,o=c$4()){try{let n=await execa(t,e,{cwd:r,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 Vn(t,e){let r=["-m","rapidkit",...t],o=Gn();for(let n of o){let i=await Un(n,qn(n,r),e?.cwd,e?.timeoutMs);if(!i.ok)continue;let c=(i.stdout??"").trim();try{let a=JSON.parse(c);return Bn(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 Zr(t,e){let r=await Vn(["project","detect","--path",t,"--json"],e);return !r.ok||!r.data||r.data.schema_version!==1?{ok:false,command:r.command,exitCode:r.exitCode,stdout:r.stdout,stderr:r.stderr}:r}var Ze=y__default.join(to.homedir(),".rapidkitrc.json"),Hn=y__default.join(to.homedir(),".rapidkit","config.json");function Xr(t){try{if(!v.existsSync(t))return {};let e=v.readFileSync(t,"utf-8"),r=JSON.parse(e);return !r||typeof r!="object"||Array.isArray(r)?{}:r}catch{return {}}}function ro(t){if(process.platform!=="win32")try{v.chmodSync(t,384);}catch{}}function Xe(){let t=Xr(Ze),e=Xr(Hn);return v.existsSync(Ze)&&ro(Ze),{...t,openaiApiKey:t.openaiApiKey??e.openaiApiKey,aiEnabled:t.aiEnabled??e.aiEnabled,telemetry:t.telemetry??e.telemetry}}function It(t){let r={...Xe(),...t};v.writeFileSync(Ze,JSON.stringify(r,null,2),{encoding:"utf-8",mode:384}),ro(Ze);}function pt(){return process.env.OPENAI_API_KEY||Xe().openaiApiKey||null}function or(){return Xe().aiEnabled!==false}function nr(){return Ze}async function oo(){return (await import('inquirer')).default}function no(t){let e=t.command("config").description("Configure RapidKit settings");e.command("set-api-key").description("Set OpenAI API key for AI features").option("--key <key>","API key (or enter interactively)").action(async r=>{let o=r.key;o?o.startsWith("sk-")||(console.log(s.red(`
3
3
  \u274C Invalid API key format (should start with sk-)
4
- `)),process.exit(1)):o=(await(await Yr()).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,Ct({openaiApiKey:o}),console.log(a$4.green(`
4
+ `)),process.exit(1)):o=(await(await oo()).prompt([{type:"password",name:"apiKey",message:"Enter your OpenAI API key:",validate:c=>c?c.startsWith("sk-")?c.length<20?"API key seems too short":true:"Invalid API key format (should start with sk-)":"API key is required"}])).apiKey,It({openaiApiKey:o}),console.log(s.green(`
5
5
  \u2705 OpenAI API key saved successfully!
6
- `)),console.log(a$4.gray(`Stored in: ${Zt()}`)),console.log(a$4.cyan(`
7
- \u{1F389} You can now use AI features:`)),console.log(a$4.white(' rapidkit ai recommend "I need user authentication"')),console.log(a$4.gray(`
8
- \u{1F4A1} To generate module embeddings (one-time):`)),console.log(a$4.white(" cd rapidkit-npm")),console.log(a$4.white(` npx tsx src/ai/generate-embeddings.ts
9
- `));}),e.command("show").description("Show current configuration").action(()=>{let t=ze();if(console.log(a$4.bold(`
6
+ `)),console.log(s.gray(`Stored in: ${nr()}`)),console.log(s.cyan(`
7
+ \u{1F389} You can now use AI features:`)),console.log(s.white(' rapidkit ai recommend "I need user authentication"')),console.log(s.gray(`
8
+ \u{1F4A1} To generate module embeddings (one-time):`)),console.log(s.white(" cd rapidkit-npm")),console.log(s.white(` npx tsx src/ai/generate-embeddings.ts
9
+ `));}),e.command("show").description("Show current configuration").action(()=>{let r=Xe();if(console.log(s.bold(`
10
10
  \u2699\uFE0F RapidKit Configuration
11
- `)),t.openaiApiKey){let o=t.openaiApiKey.substring(0,8)+"..."+t.openaiApiKey.slice(-4);console.log(a$4.cyan("OpenAI API Key:"),a$4.white(o));}else console.log(a$4.cyan("OpenAI API Key:"),a$4.red("Not set")),console.log(a$4.gray(" Set with: rapidkit config set-api-key"));console.log(a$4.cyan("AI Features:"),t.aiEnabled!==false?a$4.green("Enabled"):a$4.red("Disabled")),console.log(a$4.gray(`
12
- \u{1F4C1} Config file: ${Zt()}
13
- `));}),e.command("remove-api-key").description("Remove stored OpenAI API key").action(async()=>{if(!ze().openaiApiKey){console.log(a$4.yellow(`
11
+ `)),r.openaiApiKey){let o=r.openaiApiKey.substring(0,8)+"..."+r.openaiApiKey.slice(-4);console.log(s.cyan("OpenAI API Key:"),s.white(o));}else console.log(s.cyan("OpenAI API Key:"),s.red("Not set")),console.log(s.gray(" Set with: rapidkit config set-api-key"));console.log(s.cyan("AI Features:"),r.aiEnabled!==false?s.green("Enabled"):s.red("Disabled")),console.log(s.gray(`
12
+ \u{1F4C1} Config file: ${nr()}
13
+ `));}),e.command("remove-api-key").description("Remove stored OpenAI API key").action(async()=>{if(!Xe().openaiApiKey){console.log(s.yellow(`
14
14
  \u26A0\uFE0F No API key is currently stored
15
- `));return}(await(await Yr()).prompt([{type:"confirm",name:"confirm",message:"Are you sure you want to remove your OpenAI API key?",default:false}])).confirm?(Ct({openaiApiKey:void 0}),console.log(a$4.green(`
15
+ `));return}(await(await oo()).prompt([{type:"confirm",name:"confirm",message:"Are you sure you want to remove your OpenAI API key?",default:false}])).confirm?(It({openaiApiKey:void 0}),console.log(s.green(`
16
16
  \u2705 API key removed successfully
17
- `))):console.log(a$4.gray(`
17
+ `))):console.log(s.gray(`
18
18
  Cancelled
19
- `));}),e.command("ai <action>").description("Enable or disable AI features (enable|disable)").action(t=>{t!=="enable"&&t!=="disable"&&(console.log(a$4.red(`
20
- \u274C Invalid action: ${t}`)),console.log(a$4.gray(`Use: rapidkit config ai enable|disable
21
- `)),process.exit(1));let o=t==="enable";Ct({aiEnabled:o}),console.log(a$4.green(`
19
+ `));}),e.command("ai <action>").description("Enable or disable AI features (enable|disable)").action(r=>{r!=="enable"&&r!=="disable"&&(console.log(s.red(`
20
+ \u274C Invalid action: ${r}`)),console.log(s.gray(`Use: rapidkit config ai enable|disable
21
+ `)),process.exit(1));let o=r==="enable";It({aiEnabled:o}),console.log(s.green(`
22
22
  \u2705 AI features ${o?"enabled":"disabled"}
23
- `));});}var Rt=null,_t=false,Xt=null;async function An(){return Xt||(Xt=(await import('openai')).default),Xt}function Qr(){_t=true;}function Zr(r){let t=new Array(1536),o=0;for(let s=0;s<r.length;s++)o=(o<<5)-o+r.charCodeAt(s),o=o&o;for(let s=0;s<1536;s++)o=o*1664525+1013904223&4294967295,t[s]=o/4294967295*2-1;let n=Math.sqrt(t.reduce((s,i)=>s+i*i,0));return t.map(s=>s/n)}async function Et(r){let e=await An();Rt=new e({apiKey:r});}function Xr(){if(!Rt)throw new Error("OpenAI client not initialized. Call initOpenAI() first with your API key.");return Rt}async function er(r){return _t?Zr(r):(await Xr().embeddings.create({model:"text-embedding-3-small",input:r,encoding_format:"float"})).data[0].embedding}async function eo(r){return _t?r.map(Zr):(await Xr().embeddings.create({model:"text-embedding-3-small",input:r,encoding_format:"float"})).data.map(o=>o.embedding)}function to(){return Rt!==null}function Qe(){return _t}var Mn=promisify(exec);function tr(r){return Array.isArray(r)?r.filter(e=>typeof e=="string"):[]}function On(r){return !r||typeof r!="object"?{}:r}var or=[{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"]}],Me=null,rr=0,Dn=300*1e3;function Nn(r){let e=On(r),t=e.slug||e.name||e.id||e.module_id||"",o=tr(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:Wn(e.framework),dependencies:tr(e.dependencies),useCases:tr(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 Wn(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 Fn(){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,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(Nn).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)"),or}}async function At(){let r=Date.now();return Qe()?(Me=or,rr=r,Me):(Me&&r-rr<Dn||(Me=await Fn(),rr=r,Me.length===0&&(console.warn("\u26A0\uFE0F No modules found, using fallback catalog"),Me=or)),Me)}var Kn=fileURLToPath(import.meta.url),oo=f__default.dirname(Kn),Ze=null,no=new Map;function Gn(r){return [r.name,r.description,r.longDescription,...r.keywords,...r.useCases].filter(Boolean).join(" ")}async function Jn(r){let e=no.get(r.id);if(e)return e;let t=await er(Gn(r));return no.set(r.id,t),t}function qn(){if(Ze)return Ze;let r=[f__default.join(oo,"../../data/modules-embeddings.json"),f__default.join(oo,"../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)?Ze={model:"mock-or-text-embedding-3-small",dimension:o[0]?.embedding?.length||1536,generated_at:new Date().toISOString(),modules:o}:Ze=o,!Ze)throw new Error("failed to load embeddings data");return Ze}function so(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 i=0;i<r.length;i++)t+=r[i]*e[i],o+=r[i]*r[i],n+=e[i]*e[i];let s=Math.sqrt(o)*Math.sqrt(n);return s===0?0:t/s}function io(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 ao(r,e=5){let t=await At(),o=await er(r);if(Qe()){let i=await Promise.all(t.map(async c=>{let l=await Jn(c);return {module:c,score:so(o,l),reason:io(c,r)}}));return i.sort((c,l)=>l.score-c.score),i.slice(0,e)}let s=qn().modules.map(i=>{let c=t.find(d=>d.id===i.id);if(!c)return null;let l=so(o,i.embedding);return {module:c,score:l,reason:io(c,r)}}).filter(i=>i!==null);return s.sort((i,c)=>c.score-i.score),s.slice(0,e)}var Hn=fileURLToPath(import.meta.url),co=f__default.dirname(Hn);async function po(){return (await import('inquirer')).default}function lo(r){return r instanceof Error?r.message:String(r)}function Vn(){return [f__default.join(co,"../../data/modules-embeddings.json"),f__default.join(co,"../data/modules-embeddings.json"),f__default.join(process.cwd(),"data/modules-embeddings.json")]}function uo(){let r=Vn();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 $t(r=true,e){try{if(!to()&&!Qe())return console.log(a$4.red(`
24
- \u274C OpenAI not initialized`)),console.log(a$4.yellow("Please set your API key:")),console.log(a$4.white(" rapidkit config set-api-key")),console.log(a$4.gray(` OR set: export OPENAI_API_KEY="sk-..."
25
- `)),false;console.log(a$4.blue(`
23
+ `));});}var Mt=null,Ot=false,sr=null;async function zn(){return sr||(sr=(await import('openai')).default),sr}function so(){Ot=true;}function io(t){let r=new Array(1536),o=0;for(let i=0;i<t.length;i++)o=(o<<5)-o+t.charCodeAt(i),o=o&o;for(let i=0;i<1536;i++)o=o*1664525+1013904223&4294967295,r[i]=o/4294967295*2-1;let n=Math.sqrt(r.reduce((i,c)=>i+c*c,0));return r.map(i=>i/n)}async function Nt(t){let e=await zn();Mt=new e({apiKey:t});}function ao(){if(!Mt)throw new Error("OpenAI client not initialized. Call initOpenAI() first with your API key.");return Mt}async function ir(t){return Ot?io(t):(await ao().embeddings.create({model:"text-embedding-3-small",input:t,encoding_format:"float"})).data[0].embedding}async function co(t){return Ot?t.map(io):(await ao().embeddings.create({model:"text-embedding-3-small",input:t,encoding_format:"float"})).data.map(o=>o.embedding)}function lo(){return Mt!==null}function et(){return Ot}function ar(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"):[]}function Yn(t){return !t||typeof t!="object"?{}:t}var lr=[{id:"authentication-core",name:"Authentication Core",category:"auth",description:"Complete authentication system with password hashing, JWT tokens, OAuth 2.0, and secure session management",longDescription:"Production-ready authentication with bcrypt password hashing, JWT access/refresh tokens, OAuth 2.0 providers (Google, GitHub, etc), rate limiting, and security best practices.",keywords:["auth","login","password","jwt","oauth","token","authentication","security","signin","signup"],framework:"both",dependencies:[],useCases:["User login and logout","Password reset flow","OAuth social login (Google, GitHub)","JWT authentication","Secure session management","Token refresh","Rate limiting"]},{id:"users-core",name:"Users Core",category:"auth",description:"User management system with profiles, roles, permissions, and user CRUD operations",longDescription:"Complete user management with user profiles, role-based access control (RBAC), permissions, user search, soft delete, and audit trails.",keywords:["user","profile","role","permission","rbac","management","admin","accounts"],framework:"both",dependencies:["authentication-core"],useCases:["User registration","User profile management","Role management (admin, user, etc)","Permission system","User administration dashboard","Soft delete users"]},{id:"session-management",name:"Session Management",category:"auth",description:"Secure session handling with Redis storage, session rotation, and device tracking",longDescription:"Advanced session management with Redis-backed storage, automatic session rotation, device fingerprinting, IP tracking, and session revocation.",keywords:["session","redis","cookie","storage","device","tracking"],framework:"both",dependencies:["authentication-core","redis-cache"],useCases:["User session management","Remember me functionality","Device tracking","Session security","Logout from all devices","Session expiration"]},{id:"db-postgres",name:"PostgreSQL",category:"database",description:"PostgreSQL integration with async SQLAlchemy, migrations, connection pooling, and query optimization",longDescription:"Production-ready PostgreSQL with async SQLAlchemy 2.0, Alembic migrations, connection pooling, query optimization, JSON support, and full-text search.",keywords:["postgres","postgresql","database","sql","sqlalchemy","migration","orm","relational"],framework:"both",dependencies:[],useCases:["Relational database","Complex SQL queries","Database transactions","Data integrity","Production-grade database","ACID compliance"]},{id:"db-mongodb",name:"MongoDB",category:"database",description:"MongoDB integration with Motor async driver, schema validation, and aggregation pipelines",longDescription:"Async MongoDB with Motor driver, Pydantic schema validation, aggregation pipelines, indexes, and Atlas integration.",keywords:["mongodb","mongo","nosql","document","database","motor"],framework:"both",dependencies:[],useCases:["Document storage","Flexible schema","Real-time data","JSON documents","Unstructured data","Analytics"]},{id:"stripe-payment",name:"Stripe Payment",category:"payment",description:"Stripe integration with payment intents, subscriptions, webhooks, and customer portal",longDescription:"Complete Stripe integration with Payment Intents API, subscription management, automatic webhooks, customer portal, refunds, and SCA compliance.",keywords:["stripe","payment","subscription","billing","checkout","webhook","credit card"],framework:"both",dependencies:[],useCases:["Accept credit card payments","Subscription billing","One-time payments","Checkout flow","Payment webhooks","Refunds and disputes"]},{id:"email",name:"Email",category:"communication",description:"Email sending with templates, SMTP/SendGrid/AWS SES support, and queue management",longDescription:"Production email system with Jinja2 templates, multiple providers (SMTP, SendGrid, AWS SES), queue management, retry logic, and bounce handling.",keywords:["email","mail","smtp","sendgrid","ses","template","notification"],framework:"both",dependencies:[],useCases:["Welcome emails","Password reset emails","Notifications","Marketing emails","Transactional emails","Email templates"]},{id:"sms",name:"SMS",category:"communication",description:"SMS sending with Twilio, verification codes, and delivery tracking",longDescription:"SMS integration with Twilio, verification codes, two-factor authentication, delivery tracking, and international support.",keywords:["sms","twilio","text","message","2fa","verification","otp"],framework:"both",dependencies:[],useCases:["2FA verification codes","SMS notifications","Phone verification","OTP generation","SMS alerts"]},{id:"redis-cache",name:"Redis Cache",category:"infrastructure",description:"Redis caching with decorators, TTL management, and cache invalidation patterns",longDescription:"Redis integration with async client, caching decorators, TTL management, cache invalidation, pub/sub, and rate limiting.",keywords:["redis","cache","memory","performance","speed","pubsub"],framework:"both",dependencies:[],useCases:["API response caching","Session storage","Rate limiting","Real-time features","Performance optimization","Pub/sub messaging"]},{id:"celery",name:"Celery",category:"infrastructure",description:"Background task processing with Celery, periodic tasks, and monitoring",longDescription:"Celery task queue with Redis/RabbitMQ backend, periodic tasks (cron), task monitoring, retry logic, and failure handling.",keywords:["celery","task","background","queue","async","worker","job","cron"],framework:"fastapi",dependencies:["redis-cache"],useCases:["Background email sending","Data processing","Report generation","Scheduled tasks","Long-running jobs"]},{id:"storage",name:"Storage",category:"infrastructure",description:"File storage with S3, local filesystem, and image processing",longDescription:"Unified storage interface for AWS S3, local files, image resizing, format conversion, CDN integration, and presigned URLs.",keywords:["storage","s3","file","upload","image","cdn","aws"],framework:"both",dependencies:[],useCases:["File uploads","Image storage","Document management","Profile pictures","Media files","CDN integration"]}],Oe=null,cr=0,Qn=300*1e3;function Zn(t){let e=Yn(t),r=e.slug||e.name||e.id||e.module_id||"",o=ar(e.keywords??e.tags);return {id:r,name:e.display_name||e.name||"",category:Xn(e.category||"infrastructure"),description:e.description||e.summary||"",longDescription:e.long_description||e.description||"",keywords:o.map(n=>n.toLowerCase()),framework:es(e.framework),dependencies:ar(e.dependencies),useCases:ar(e.use_cases??e.useCases)}}function Xn(t){return {auth:"auth",authentication:"auth",database:"database",payment:"payment",billing:"payment",communication:"communication",infrastructure:"infrastructure",security:"security",analytics:"analytics"}[t.toLowerCase()]||"infrastructure"}function es(t){if(!t)return "both";if(typeof t=="string"){if(t.toLowerCase().includes("fastapi"))return "fastapi";if(t.toLowerCase().includes("nest"))return "nestjs"}return "both"}async function ts(){try{let t=await g(["modules","list","--json-schema","1"],{cwd:process.cwd()});if(t.exitCode!==0)throw new Error(t.stderr.trim()||"Python Core modules command failed");let e=t.stdout.match(/\{[\s\S]*\}/),r=e?e[0]:t.stdout,o=JSON.parse(r),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(Zn).filter(i=>i.id&&i.name)}catch(t){return console.warn("\u26A0\uFE0F Failed to fetch modules from Python Core:",t.message),console.warn(" Using fallback module catalog (11 modules)"),lr}}async function Dt(){let t=Date.now();return et()?(Oe=lr,cr=t,Oe):(Oe&&t-cr<Qn||(Oe=await ts(),cr=t,Oe.length===0&&(console.warn("\u26A0\uFE0F No modules found, using fallback catalog"),Oe=lr)),Oe)}var os=fileURLToPath(import.meta.url),uo=y__default.dirname(os),tt=null,mo=new Map;function ns(t){return [t.name,t.description,t.longDescription,...t.keywords,...t.useCases].filter(Boolean).join(" ")}async function ss(t){let e=mo.get(t.id);if(e)return e;let r=await ir(ns(t));return mo.set(t.id,r),r}function is(){if(tt)return tt;let t=[y__default.join(uo,"../../data/modules-embeddings.json"),y__default.join(uo,"../data/modules-embeddings.json"),y__default.join(process.cwd(),"data/modules-embeddings.json")],e=null;for(let n of t)if(v.existsSync(n)){e=n;break}if(!e)throw new Error("embeddings file not found");let r=v.readFileSync(e,"utf-8"),o=JSON.parse(r);if(Array.isArray(o)?tt={model:"mock-or-text-embedding-3-small",dimension:o[0]?.embedding?.length||1536,generated_at:new Date().toISOString(),modules:o}:tt=o,!tt)throw new Error("failed to load embeddings data");return tt}function fo(t,e){if(t.length!==e.length)throw new Error("Vectors must have the same length");let r=0,o=0,n=0;for(let c=0;c<t.length;c++)r+=t[c]*e[c],o+=t[c]*t[c],n+=e[c]*e[c];let i=Math.sqrt(o)*Math.sqrt(n);return i===0?0:r/i}function go(t,e){let r=e.toLowerCase(),o=t.keywords.filter(n=>r.includes(n)||n.includes(r));return o.length>0?`Matches: ${o.slice(0,3).join(", ")}`:`Relevant for: ${t.useCases[0]}`}async function ho(t,e=5){let r=await Dt(),o=await ir(t);if(et()){let c=await Promise.all(r.map(async a=>{let l=await ss(a);return {module:a,score:fo(o,l),reason:go(a,t)}}));return c.sort((a,l)=>l.score-a.score),c.slice(0,e)}let i=is().modules.map(c=>{let a=r.find(f=>f.id===c.id);if(!a)return null;let l=fo(o,c.embedding);return {module:a,score:l,reason:go(a,t)}}).filter(c=>c!==null);return i.sort((c,a)=>a.score-c.score),i.slice(0,e)}var ls=fileURLToPath(import.meta.url),yo=y__default.dirname(ls);async function ko(){return (await import('inquirer')).default}function wo(t){return t instanceof Error?t.message:String(t)}function ds(){return [y__default.join(yo,"../../data/modules-embeddings.json"),y__default.join(yo,"../data/modules-embeddings.json"),y__default.join(process.cwd(),"data/modules-embeddings.json")]}function vo(){let t=ds();for(let e of t)if(v.existsSync(e))try{let r=JSON.parse(v.readFileSync(e,"utf-8")),o=Array.isArray(r)?r:r.modules||[];return {exists:true,path:e,moduleCount:o.length,generatedAt:r.generated_at||null}}catch{continue}return {exists:false,path:null,moduleCount:0,generatedAt:null}}async function Wt(t=true,e){try{if(!lo()&&!et())return console.log(s.red(`
24
+ \u274C OpenAI not initialized`)),console.log(s.yellow("Please set your API key:")),console.log(s.white(" rapidkit config set-api-key")),console.log(s.gray(` OR set: export OPENAI_API_KEY="sk-..."
25
+ `)),false;console.log(s.blue(`
26
26
  \u{1F916} Generating AI embeddings for RapidKit modules...
27
- `)),console.log(a$4.gray("\u{1F4E1} Fetching modules from RapidKit..."));let t=await At();console.log(a$4.green(`\u2713 Found ${t.length} modules
28
- `));let o=t.length*50/1e6*.02;if(console.log(a$4.cyan(`\u{1F4B0} Estimated cost: ~$${o.toFixed(3)}`)),console.log(a$4.gray(` (Based on ${t.length} modules at $0.02/1M tokens)
29
- `)),r){let i=await po(),{confirm:c}=await i.prompt([{type:"confirm",name:"confirm",message:"Generate embeddings now?",default:true}]);if(!c)return console.log(a$4.yellow(`
27
+ `)),console.log(s.gray("\u{1F4E1} Fetching modules from RapidKit..."));let r=await Dt();console.log(s.green(`\u2713 Found ${r.length} modules
28
+ `));let o=r.length*50/1e6*.02;if(console.log(s.cyan(`\u{1F4B0} Estimated cost: ~$${o.toFixed(3)}`)),console.log(s.gray(` (Based on ${r.length} modules at $0.02/1M tokens)
29
+ `)),t){let c=await ko(),{confirm:a}=await c.prompt([{type:"confirm",name:"confirm",message:"Generate embeddings now?",default:true}]);if(!a)return console.log(s.yellow(`
30
30
  \u26A0\uFE0F Embeddings generation cancelled
31
- `)),false}let n=t.map(i=>`${i.name}. ${i.description}. ${i.longDescription}. Keywords: ${i.keywords.join(", ")}. Use cases: ${i.useCases.join(", ")}.`),s=Bn(`Generating embeddings for ${t.length} modules...`).start();try{let i=await eo(n);s.succeed(`Generated embeddings for ${t.length} modules`);let c={model:"text-embedding-3-small",dimension:i[0].length,generated_at:new Date().toISOString(),modules:t.map((m,p)=>({id:m.id,name:m.name,embedding:i[p]}))},l=e||f__default.join(process.cwd(),"data","modules-embeddings.json"),d=f__default.dirname(l);return k.existsSync(d)||k.mkdirSync(d,{recursive:true}),k.writeFileSync(l,JSON.stringify(c,null,2)),console.log(a$4.green(`
32
- \u2705 Embeddings generated successfully!`)),console.log(a$4.gray(`\u{1F4C1} Saved to: ${l}`)),console.log(a$4.gray(`\u{1F4CA} Size: ${t.length} modules, ${i[0].length} dimensions
33
- `)),true}catch(i){s.fail("Failed to generate embeddings");let c=lo(i);return c.includes("429")?(console.log(a$4.red(`
34
- \u274C OpenAI API quota exceeded`)),console.log(a$4.yellow(`Please check your billing: https://platform.openai.com/account/billing
35
- `))):c.includes("401")?(console.log(a$4.red(`
36
- \u274C Invalid API key`)),console.log(a$4.yellow("Please set a valid API key:")),console.log(a$4.white(` rapidkit config set-api-key
37
- `))):console.log(a$4.red(`
38
- \u274C Error: ${c}
39
- `)),false}}catch(t){return console.log(a$4.red(`
40
- \u274C Failed to generate embeddings: ${lo(t)}
41
- `)),false}}async function mo(r=true){if(uo().exists)return true;if(console.log(a$4.yellow(`
42
- \u26A0\uFE0F Module embeddings not found`)),console.log(a$4.gray(`AI recommendations require embeddings to be generated.
43
- `)),!r)return console.log(a$4.red("\u274C Cannot generate embeddings in non-interactive mode")),console.log(a$4.white(`Run: rapidkit ai generate-embeddings
44
- `)),false;let t=await po(),{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 $t(true):(o==="manual"&&(console.log(a$4.cyan(`
31
+ `)),false}let n=r.map(c=>`${c.name}. ${c.description}. ${c.longDescription}. Keywords: ${c.keywords.join(", ")}. Use cases: ${c.useCases.join(", ")}.`),i=cs(`Generating embeddings for ${r.length} modules...`).start();try{let c=await co(n);i.succeed(`Generated embeddings for ${r.length} modules`);let a={model:"text-embedding-3-small",dimension:c[0].length,generated_at:new Date().toISOString(),modules:r.map((p,d)=>({id:p.id,name:p.name,embedding:c[d]}))},l=e||y__default.join(process.cwd(),"data","modules-embeddings.json"),f=y__default.dirname(l);return v.existsSync(f)||v.mkdirSync(f,{recursive:true}),v.writeFileSync(l,JSON.stringify(a,null,2)),console.log(s.green(`
32
+ \u2705 Embeddings generated successfully!`)),console.log(s.gray(`\u{1F4C1} Saved to: ${l}`)),console.log(s.gray(`\u{1F4CA} Size: ${r.length} modules, ${c[0].length} dimensions
33
+ `)),true}catch(c){i.fail("Failed to generate embeddings");let a=wo(c);return a.includes("429")?(console.log(s.red(`
34
+ \u274C OpenAI API quota exceeded`)),console.log(s.yellow(`Please check your billing: https://platform.openai.com/account/billing
35
+ `))):a.includes("401")?(console.log(s.red(`
36
+ \u274C Invalid API key`)),console.log(s.yellow("Please set a valid API key:")),console.log(s.white(` rapidkit config set-api-key
37
+ `))):console.log(s.red(`
38
+ \u274C Error: ${a}
39
+ `)),false}}catch(r){return console.log(s.red(`
40
+ \u274C Failed to generate embeddings: ${wo(r)}
41
+ `)),false}}async function Po(t=true){if(vo().exists)return true;if(console.log(s.yellow(`
42
+ \u26A0\uFE0F Module embeddings not found`)),console.log(s.gray(`AI recommendations require embeddings to be generated.
43
+ `)),!t)return console.log(s.red("\u274C Cannot generate embeddings in non-interactive mode")),console.log(s.white(`Run: rapidkit ai generate-embeddings
44
+ `)),false;let r=await ko(),{action:o}=await r.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 Wt(true):(o==="manual"&&(console.log(s.cyan(`
45
45
  \u{1F4DD} To generate embeddings manually:
46
- `)),console.log(a$4.white("1. Get OpenAI API key from: https://platform.openai.com/api-keys")),console.log(a$4.white("2. Set the API key:")),console.log(a$4.gray(" rapidkit config set-api-key")),console.log(a$4.gray(` OR: export OPENAI_API_KEY="sk-..."
47
- `)),console.log(a$4.white("3. Generate embeddings:")),console.log(a$4.gray(` rapidkit ai generate-embeddings
48
- `)),console.log(a$4.cyan(`\u{1F4B0} Cost: ~$0.50 one-time
49
- `))),false)}async function fo(){let r=uo();return r.exists?(console.log(a$4.blue(`
50
- \u{1F504} Updating embeddings...`)),console.log(a$4.gray(`Current: ${r.moduleCount} modules`)),console.log(a$4.gray(`Generated: ${r.generatedAt||"unknown"}
51
- `)),r.path?await $t(true,r.path):false):(console.log(a$4.yellow(`
52
- \u26A0\uFE0F No existing embeddings found`)),console.log(a$4.gray(`Use: rapidkit ai generate-embeddings
53
- `)),false)}function Mt(r,e){let t=c$2({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 ge(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 ie(r,e){return Mt(r,e)==="go"}function ae(r,e){return Mt(r,e)==="node"}function ce(r,e){return Mt(r,e)==="java"}function pe(r,e){return Mt(r,e)==="python"}async function yo(){return (await import('inquirer')).default}function nr(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 wo(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{Qt()||(console.log(a$4.yellow(`
54
- \u26A0\uFE0F AI features are disabled`)),console.log(a$4.gray(`Enable with: rapidkit config ai enable
55
- `)),process.exit(1));let n=at();n?await Et(n):(console.log(a$4.yellow(`
46
+ `)),console.log(s.white("1. Get OpenAI API key from: https://platform.openai.com/api-keys")),console.log(s.white("2. Set the API key:")),console.log(s.gray(" rapidkit config set-api-key")),console.log(s.gray(` OR: export OPENAI_API_KEY="sk-..."
47
+ `)),console.log(s.white("3. Generate embeddings:")),console.log(s.gray(` rapidkit ai generate-embeddings
48
+ `)),console.log(s.cyan(`\u{1F4B0} Cost: ~$0.50 one-time
49
+ `))),false)}async function bo(){let t=vo();return t.exists?(console.log(s.blue(`
50
+ \u{1F504} Updating embeddings...`)),console.log(s.gray(`Current: ${t.moduleCount} modules`)),console.log(s.gray(`Generated: ${t.generatedAt||"unknown"}
51
+ `)),t.path?await Wt(true,t.path):false):(console.log(s.yellow(`
52
+ \u26A0\uFE0F No existing embeddings found`)),console.log(s.gray(`Use: rapidkit ai generate-embeddings
53
+ `)),false)}function Ft(t,e){let r=c$2({runtime:typeof t?.runtime=="string"?t.runtime:void 0,framework:typeof t?.framework=="string"?t.framework:void 0,kitName:typeof t?.kit_name=="string"?t.kit_name:typeof t?.kit=="string"?t.kit:void 0});return r.runtime!=="unknown"?r.runtime:e$2(e,t).runtime}function ge(t){let e=t;for(;;){let r=y__default.join(e,".rapidkit","project.json");if(v.existsSync(r))try{return JSON.parse(v.readFileSync(r,"utf8"))}catch{return null}let o=y__default.dirname(e);if(o===e)break;e=o;}return null}function ce(t,e){return Ft(t,e)==="go"}function le(t,e){return Ft(t,e)==="node"}function de(t,e){return Ft(t,e)==="java"}function ue(t,e){return Ft(t,e)==="python"}async function So(){return (await import('inquirer')).default}function dr(t){if(t&&typeof t=="object"){let e=t;return {message:typeof e.message=="string"?e.message:String(t),code:typeof e.code=="string"?e.code:void 0}}return {message:String(t)}}function Co(t,e=0){console.log(JSON.stringify(t,null,2)),e!==0&&process.exit(e);}function Ro(t){let e=t.command("ai").description("AI-powered features");e.command("recommend").description("Get AI-powered module recommendations").argument("[query]",'What do you want to build? (e.g., "user authentication with email")').option("-n, --number <count>","Number of recommendations","5").option("--json","Output as JSON").action(async(r,o)=>{try{or()||(o.json&&Co({ok:false,error:{code:"AI_DISABLED",message:"AI features are disabled",remediation:"rapidkit config ai enable"}},1),console.log(s.yellow(`
54
+ \u26A0\uFE0F AI features are disabled`)),console.log(s.gray(`Enable with: rapidkit config ai enable
55
+ `)),process.exit(1));let n=pt();n?await Nt(n):(o.json||(console.log(s.yellow(`
56
56
  \u26A0\uFE0F OpenAI API key not configured - using MOCK MODE for testing
57
- `)),console.log(a$4.gray("\u{1F4DD} Note: Mock embeddings provide approximate results for testing.")),console.log(a$4.gray(` For production, configure your OpenAI API key:
58
- `)),console.log(a$4.white(" 1. Get your key from: https://platform.openai.com/api-keys")),console.log(a$4.white(" 2. Configure it: rapidkit config set-api-key")),console.log(a$4.gray(` OR set: export OPENAI_API_KEY="sk-proj-..."
59
- `)),Qr());let s=t;s||(s=(await(await yo()).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(a$4.blue(`
57
+ `)),console.log(s.gray("\u{1F4DD} Note: Mock embeddings provide approximate results for testing.")),console.log(s.gray(` For production, configure your OpenAI API key:
58
+ `)),console.log(s.white(" 1. Get your key from: https://platform.openai.com/api-keys")),console.log(s.white(" 2. Configure it: rapidkit config set-api-key")),console.log(s.gray(` OR set: export OPENAI_API_KEY="sk-proj-..."
59
+ `))),so());let i=r;i||(i=(await(await So()).prompt([{type:"input",name:"query",message:"\u{1F916} What do you want to build?",validate:u=>u.length===0?"Please enter a description":u.length<3?"Please be more specific (at least 3 characters)":true}])).query),o.json||console.log(s.blue(`
60
60
  \u{1F916} Analyzing your request...
61
- `)),await mo(!o.json)||(console.log(a$4.yellow(`
61
+ `)),(n?await Po(!o.json):true)||(o.json&&Co({ok:false,query:i,error:{code:"EMBEDDINGS_MISSING",message:"Module embeddings are not available",remediation:"rapidkit ai generate-embeddings"}},1),console.log(s.yellow(`
62
62
  \u26A0\uFE0F Cannot proceed without embeddings
63
- `)),process.exit(1));let c=parseInt(o.number,10),l=await ao(s,c);if(l.length===0||l[0].score<.3)if(console.log(a$4.yellow(`
63
+ `)),process.exit(1));let a=parseInt(o.number,10),l=await ho(i,a);if(l.length===0||l[0].score<.3)if(console.log(s.yellow(`
64
64
  \u26A0\uFE0F No matching modules found in RapidKit registry.
65
- `)),console.log(a$4.cyan(`\u{1F4A1} Options:
66
- `)),console.log(a$4.white("1. Create custom module:")),console.log(a$4.gray(" rapidkit modules scaffold <name> --category <category>")),console.log(a$4.gray(` Example: rapidkit modules scaffold blockchain-integration --category integrations
67
- `)),console.log(a$4.white("2. Search with different keywords")),console.log(a$4.gray(` Try more general terms (e.g., "storage" instead of "blockchain")
68
- `)),console.log(a$4.white("3. Request feature:")),console.log(a$4.gray(` https://github.com/rapidkitlabs/rapidkit/issues
69
- `)),l.length>0)console.log(a$4.yellow(`\u26A0\uFE0F Low confidence matches found:
70
- `));else return;if(o.json){console.log(JSON.stringify({query:s,recommendations:l},null,2));return}console.log(a$4.green.bold(`\u{1F4E6} Recommended Modules:
71
- `)),l.forEach((u,h)=>{let g=(u.score*100).toFixed(1),y=u.score>.8?" \u2B50":"";console.log(a$4.bold(`${h+1}. ${u.module.name}${y}`)),console.log(a$4.gray(` ${u.module.description}`)),console.log(a$4.cyan(` Match: ${g}%`)+a$4.gray(` - ${u.reason}`)),console.log(a$4.yellow(` Category: ${u.module.category}`)),u.module.dependencies.length>0&&console.log(a$4.magenta(` Requires: ${u.module.dependencies.join(", ")}`)),console.log();});let d=l.slice(0,3).map(u=>u.module.id);console.log(a$4.cyan("\u{1F4A1} Quick install (top 3):")),console.log(a$4.white(` rapidkit add module ${d.join(" ")}
72
- `));let m=await yo(),{shouldInstall:p}=await m.prompt([{type:"confirm",name:"shouldInstall",message:"Would you like to install these modules now?",default:false}]);if(p){let{selectedModules:u}=await m.prompt([{type:"checkbox",name:"selectedModules",message:"Select modules to install:",choices:l.map(h=>({name:`${h.module.name} - ${h.module.description}`,value:h.module.id,checked:h.score>.7}))}]);if(u.length>0){console.log(a$4.blue(`
73
- \u{1F4E6} Installing ${u.length} modules...
74
- `)),console.log(a$4.gray(`Command: rapidkit add module ${u.join(" ")}`));let h=ge(process.cwd());if(h?.module_support===false){let y=h?.runtime==="java"?"Spring Boot":"Go";console.log(a$4.red(`
75
- \u274C RapidKit modules are not available for ${y} npm-level kits.`)),console.log(a$4.gray(` The module system requires Python and is currently only supported for FastAPI and NestJS projects.
76
- `));return}let g=await f$1(["add","module",...u],{cwd:process.cwd()});console.log(g===0?a$4.green(`
65
+ `)),console.log(s.cyan(`\u{1F4A1} Options:
66
+ `)),console.log(s.white("1. Create custom module:")),console.log(s.gray(" rapidkit modules scaffold <name> --category <category>")),console.log(s.gray(` Example: rapidkit modules scaffold blockchain-integration --category integrations
67
+ `)),console.log(s.white("2. Search with different keywords")),console.log(s.gray(` Try more general terms (e.g., "storage" instead of "blockchain")
68
+ `)),console.log(s.white("3. Request feature:")),console.log(s.gray(` https://github.com/rapidkitlabs/rapidkit/issues
69
+ `)),l.length>0)console.log(s.yellow(`\u26A0\uFE0F Low confidence matches found:
70
+ `));else return;if(o.json){console.log(JSON.stringify({query:i,recommendations:l},null,2));return}console.log(s.green.bold(`\u{1F4E6} Recommended Modules:
71
+ `)),l.forEach((m,g)=>{let u=(m.score*100).toFixed(1),h=m.score>.8?" \u2B50":"";console.log(s.bold(`${g+1}. ${m.module.name}${h}`)),console.log(s.gray(` ${m.module.description}`)),console.log(s.cyan(` Match: ${u}%`)+s.gray(` - ${m.reason}`)),console.log(s.yellow(` Category: ${m.module.category}`)),m.module.dependencies.length>0&&console.log(s.magenta(` Requires: ${m.module.dependencies.join(", ")}`)),console.log();});let f$1=l.slice(0,3).map(m=>m.module.id);console.log(s.cyan("\u{1F4A1} Quick install (top 3):")),console.log(s.white(` rapidkit add module ${f$1.join(" ")}
72
+ `));let p=await So(),{shouldInstall:d}=await p.prompt([{type:"confirm",name:"shouldInstall",message:"Would you like to install these modules now?",default:false}]);if(d){let{selectedModules:m}=await p.prompt([{type:"checkbox",name:"selectedModules",message:"Select modules to install:",choices:l.map(g=>({name:`${g.module.name} - ${g.module.description}`,value:g.module.id,checked:g.score>.7}))}]);if(m.length>0){console.log(s.blue(`
73
+ \u{1F4E6} Installing ${m.length} modules...
74
+ `)),console.log(s.gray(`Command: rapidkit add module ${m.join(" ")}`));let g=ge(process.cwd());if(g?.module_support===false){let h=g?.runtime==="java"?"Spring Boot":"Go";console.log(s.red(`
75
+ \u274C RapidKit modules are not available for ${h} npm-level kits.`)),console.log(s.gray(` The module system requires Python and is currently only supported for FastAPI and NestJS projects.
76
+ `));return}let u=await f(["add","module",...m],{cwd:process.cwd()});console.log(u===0?s.green(`
77
77
  \u2705 Selected modules installed successfully
78
- `):a$4.red(`
79
- \u274C Module installation failed (exit code: ${g})
80
- `));}else console.log(a$4.gray(`
78
+ `):s.red(`
79
+ \u274C Module installation failed (exit code: ${u})
80
+ `));}else console.log(s.gray(`
81
81
  No modules selected
82
- `));}}catch(n){let s=nr(n);a$1.error(`
83
- \u274C Error:`,s.message),s.code==="invalid_api_key"?(console.log(a$4.yellow(`
84
- \u{1F4A1} Your API key may be invalid or expired`)),console.log(a$4.cyan(` Update it: rapidkit config set-api-key
85
- `))):s.message.includes("embeddings file not found")&&(console.log(a$4.yellow(`
86
- \u{1F4A1} Module embeddings not generated yet`)),console.log(a$4.cyan(" Generate them (one-time):")),console.log(a$4.white(" cd rapidkit-npm")),console.log(a$4.white(' export OPENAI_API_KEY="sk-proj-..."')),console.log(a$4.white(` npx tsx src/ai/generate-embeddings.ts
87
- `))),process.exit(1);}}),e.command("info").description("Show AI features information").action(()=>{let t=at(),o=Qt();console.log(a$4.bold(`
82
+ `));}}catch(n){let i=dr(n);a$1.error(`
83
+ \u274C Error:`,i.message),i.code==="invalid_api_key"?(console.log(s.yellow(`
84
+ \u{1F4A1} Your API key may be invalid or expired`)),console.log(s.cyan(` Update it: rapidkit config set-api-key
85
+ `))):i.message.includes("embeddings file not found")&&(console.log(s.yellow(`
86
+ \u{1F4A1} Module embeddings not generated yet`)),console.log(s.cyan(" Generate them (one-time):")),console.log(s.white(" cd rapidkit-npm")),console.log(s.white(' export OPENAI_API_KEY="sk-proj-..."')),console.log(s.white(` npx tsx src/ai/generate-embeddings.ts
87
+ `))),process.exit(1);}}),e.command("info").description("Show AI features information").action(()=>{let r=pt(),o=or();console.log(s.bold(`
88
88
  \u{1F916} RapidKit AI Features
89
- `)),console.log(a$4.cyan("Status:"),o?a$4.green("Enabled"):a$4.red("Disabled")),console.log(a$4.cyan("API Key:"),t?a$4.green("Configured \u2713"):a$4.red("Not configured \u2717")),console.log(a$4.bold(`
89
+ `)),console.log(s.cyan("Status:"),o?s.green("Enabled"):s.red("Disabled")),console.log(s.cyan("API Key:"),r?s.green("Configured \u2713"):s.red("Not configured \u2717")),console.log(s.bold(`
90
90
  \u{1F4E6} Available Features:
91
- `)),console.log(a$4.white("\u2022 Module Recommender")+a$4.gray(" - AI-powered module suggestions")),console.log(a$4.gray(' Usage: rapidkit ai recommend "I need authentication"')),console.log(a$4.bold(`
91
+ `)),console.log(s.white("\u2022 Module Recommender")+s.gray(" - AI-powered module suggestions")),console.log(s.gray(' Usage: rapidkit ai recommend "I need authentication"')),console.log(s.bold(`
92
92
  \u{1F4B0} Pricing:
93
- `)),console.log(a$4.white("\u2022 Per query: ~$0.0002")+a$4.gray(" (practically free)")),console.log(a$4.white("\u2022 100 queries: ~$0.02")+a$4.gray(" (2 cents)")),console.log(a$4.white("\u2022 1000 queries: ~$0.20")+a$4.gray(" (20 cents)")),console.log(a$4.bold(`
93
+ `)),console.log(s.white("\u2022 Per query: ~$0.0002")+s.gray(" (practically free)")),console.log(s.white("\u2022 100 queries: ~$0.02")+s.gray(" (2 cents)")),console.log(s.white("\u2022 1000 queries: ~$0.20")+s.gray(" (20 cents)")),console.log(s.bold(`
94
94
  \u{1F680} Getting Started:
95
- `)),t?(console.log(a$4.green("\u2713 You're all set!")),console.log(a$4.white(' Try: rapidkit ai recommend "user authentication"'))):(console.log(a$4.white("1. Get OpenAI API key: https://platform.openai.com/api-keys")),console.log(a$4.white("2. Configure: rapidkit config set-api-key")),console.log(a$4.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=at();t||(console.log(a$4.red(`
95
+ `)),r?(console.log(s.green("\u2713 You're all set!")),console.log(s.white(' Try: rapidkit ai recommend "user authentication"'))):(console.log(s.white("1. Get OpenAI API key: https://platform.openai.com/api-keys")),console.log(s.white("2. Configure: rapidkit config set-api-key")),console.log(s.white('3. Try: rapidkit ai recommend "user authentication"'))),console.log();}),e.command("generate-embeddings").description("Generate AI embeddings for all modules (one-time setup)").option("--force","Force regeneration even if embeddings exist").action(async()=>{try{let r=pt();r||(console.log(s.red(`
96
96
  \u274C OpenAI API key not configured
97
- `)),console.log(a$4.cyan(`To generate embeddings, you need an OpenAI API key:
98
- `)),console.log(a$4.white("1. Get your key from: https://platform.openai.com/api-keys")),console.log(a$4.white("2. Configure it: rapidkit config set-api-key")),console.log(a$4.gray(`
99
- OR set environment variable:`)),console.log(a$4.white(` export OPENAI_API_KEY="sk-proj-..."
100
- `)),process.exit(1)),Et(t);let o=await $t(true);o&&(console.log(a$4.green("\u2705 Ready to use AI recommendations!")),console.log(a$4.cyan(`Try: rapidkit ai recommend "authentication"
101
- `))),process.exit(o?0:1);}catch(t){let o=nr(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=at();t||(console.log(a$4.red(`
97
+ `)),console.log(s.cyan(`To generate embeddings, you need an OpenAI API key:
98
+ `)),console.log(s.white("1. Get your key from: https://platform.openai.com/api-keys")),console.log(s.white("2. Configure it: rapidkit config set-api-key")),console.log(s.gray(`
99
+ OR set environment variable:`)),console.log(s.white(` export OPENAI_API_KEY="sk-proj-..."
100
+ `)),process.exit(1)),Nt(r);let o=await Wt(true);o&&(console.log(s.green("\u2705 Ready to use AI recommendations!")),console.log(s.cyan(`Try: rapidkit ai recommend "authentication"
101
+ `))),process.exit(o?0:1);}catch(r){let o=dr(r);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 r=pt();r||(console.log(s.red(`
102
102
  \u274C OpenAI API key not configured
103
- `)),console.log(a$4.white(`Set your API key: rapidkit config set-api-key
104
- `)),process.exit(1)),Et(t);let o=await fo();process.exit(o?0:1);}catch(t){let o=nr(t);a$1.error("Failed to update embeddings:",o.message),process.exit(1);}});}var Ot=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 c=k.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(c==="shared-runtime-caches"||c==="shared-node-deps"||c==="isolated")return c}catch{}return "isolated"}withGoCacheEnv(e,t){let o=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),s=o==="shared-runtime-caches"?f__default.join(n||e,".rapidkit","cache","go"):f__default.join(e,".rapidkit","cache","go"),i=process.env.GOMODCACHE,c=process.env.GOCACHE;return process.env.GOMODCACHE=f__default.join(s,"mod"),process.env.GOCACHE=f__default.join(s,"build"),t().finally(()=>{typeof i>"u"?delete process.env.GOMODCACHE:process.env.GOMODCACHE=i,typeof c>"u"?delete process.env.GOCACHE:process.env.GOCACHE=c;})}async checkPrereqs(){return this.run("go",["version"],process.cwd())}async warmSetupCache(e){return this.withGoCacheEnv(e,async()=>{try{return process.env.GOMODCACHE&&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(s=>k.existsSync(s));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 Dt=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||""}`,s=n.match(/version\s+"([^"]+)"/i);if(s?.[1])return this.parseMajorJavaVersion(s[1]);let i=n.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 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")),s=k.existsSync(f__default.join(e,"gradlew"))||k.existsSync(f__default.join(e,"gradlew.bat"));return {hasMavenProject:t||o,hasMavenWrapper:o,hasGradleProject:n||s,hasGradleWrapper:s}}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 c=k.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(c==="shared-runtime-caches"||c==="shared-node-deps"||c==="isolated")return c}catch{}return "isolated"}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 s=n.shift();if(!s||o.has(s))continue;o.add(s);let i=[];try{i=k.readdirSync(s,{withFileTypes:true});}catch{continue}for(let c of i){if(!c.isDirectory()||c.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(c.name))continue;let l=f__default.join(s,c.name),d=this.inspectJavaProject(l);(d.hasMavenProject||d.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),s=o==="shared-runtime-caches"?f__default.join(n||e,".rapidkit","cache","java","m2"):f__default.join(e,".rapidkit","cache","java","m2"),i=o==="shared-runtime-caches"?f__default.join(n||e,".rapidkit","cache","java","gradle"):f__default.join(e,".rapidkit","cache","java","gradle"),c=process.env.MAVEN_OPTS,l=process.env.GRADLE_USER_HOME,d=`-Dmaven.repo.local=${s}`;return process.env.MAVEN_OPTS=c?`${c} ${d}`:d,process.env.GRADLE_USER_HOME=i,t().finally(()=>{typeof c>"u"?delete process.env.MAVEN_OPTS:process.env.MAVEN_OPTS=c,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:s}=this.buildToolCommand(e),i=await this.runCommand(n,[...s,...t],e);if(i===0||!o)return {exitCode:i};let c=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:i,message:c||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 s=k.readdirSync(o).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 f__default.join(o,s)}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 c=this.readRequiredJavaMajor(e),l=await this.detectInstalledJavaMajor(t,e);if(l!==null&&l<c)return {exitCode:1,message:`Detected Java ${l}, but project requires Java ${c}+.`};let d=f__default.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<c)return {exitCode:1,message:`Detected JAVA_HOME version ${u}, but project requires Java ${c}+.`}}catch{}}if(this.isMavenProject(e)||this.isGradleProject(e)){let c=this.detectBuildTool(e),l=c==="gradle"?["--version"]:["-version"],d=await this.runBuildTool(e,l);return d.exitCode!==0?d:c==="maven"&&!this.inspectJavaProject(e).hasMavenWrapper?this.checkSystemMavenVersion(e):d}let n=this.findWorkspaceRoot(e);if(n&&n===e){let c=this.discoverWorkspaceJavaProjects(n);if(c.length>0){let l=c.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=c.filter(h=>this.readRequiredJavaMajor(h)>p).map(h=>f__default.relative(e,h)).join(", ");return {exitCode:1,message:`Detected Java ${p}, but workspace project(s) [${u}] require Java ${l}+.`}}}let d=false,m=false;for(let p of c){let u=this.inspectJavaProject(p);u.hasMavenProject&&!u.hasMavenWrapper&&(d=true),u.hasGradleProject&&!u.hasGradleWrapper&&(m=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(m){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 c=await this.checkSystemMavenVersion(e);return c.exitCode!==0?c:{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 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 Nt=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 c=k.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(c==="shared-runtime-caches"||c==="shared-node-deps"||c==="isolated")return c}catch{}return "isolated"}withDependencyEnv(e,t,o){let n=this.resolveDependencyMode(e),s=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=n==="isolated"?f__default.join(e,".rapidkit","cache","node"):f__default.join(s||e,".rapidkit","cache","node"),c=process.env.npm_config_cache,l=process.env.npm_config_store_dir;return t==="pnpm"?(process.env.npm_config_store_dir=f__default.join(i,"pnpm-store"),process.env.npm_config_cache=f__default.join(i,"pnpm-cache")):t==="yarn"?process.env.npm_config_cache=f__default.join(i,"yarn-cache"):process.env.npm_config_cache=f__default.join(i,"npm-cache"),o().finally(()=>{typeof c>"u"?delete process.env.npm_config_cache:process.env.npm_config_cache=c,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 Tt=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 c=k.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(c==="shared-runtime-caches"||c==="shared-node-deps"||c==="isolated")return c}catch{}return "isolated"}withPythonCacheEnv(e,t){let o=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),s=o==="shared-runtime-caches"?f__default.join(n||e,".rapidkit","cache","python"):f__default.join(e,".rapidkit","cache","python"),i=process.env.PIP_CACHE_DIR,c=process.env.POETRY_CACHE_DIR;return process.env.PIP_CACHE_DIR=f__default.join(s,"pip"),process.env.POETRY_CACHE_DIR=f__default.join(s,"poetry"),t().finally(()=>{typeof i>"u"?delete process.env.PIP_CACHE_DIR:process.env.PIP_CACHE_DIR=i,typeof c>"u"?delete process.env.POETRY_CACHE_DIR:process.env.POETRY_CACHE_DIR=c;})}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 Yn(){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$1(),typeof r.RAPIDKIT_SKIP_LOCK_SYNC>"u"&&(r.RAPIDKIT_SKIP_LOCK_SYNC="1"),r}function Oe(r,e){return r==="go"?new Ot((t,o,n)=>e.runCommandInCwd(t,o,n)):r==="node"?new Nt((t,o,n)=>e.runCommandInCwd(t,o,n)):r==="java"?new Dt((t,o,n)=>e.runCommandInCwd(t,o,n)):new Tt((t,o)=>e.runCoreRapidkit(t,{cwd:o,env:Yn()}))}var Po=f__default.join(Hr.homedir(),".rapidkit","cache"),bo=1440*60*1e3;function ir(){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(Po,`vitest-${e}`):Po}var Ft=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(ir(),`${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<bo)return a$1.debug(`Cache hit (memory): ${e}`),o.data;try{let n=this.getCachePath(e),s=await promises.readFile(n,"utf-8"),i=JSON.parse(s);if(i.version===t&&Date.now()-i.timestamp<bo)return a$1.debug(`Cache hit (disk): ${e}`),this.memoryCache.set(e,i),i.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(ir(),{recursive:true});let s=this.getCachePath(e),i=this.getTempCachePath(s);await promises.writeFile(i,JSON.stringify(n),"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=ir(),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 Zn(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 Xn(r){let e=ge(r);return ie(e,r)?"go":ce(e,r)?"java":ae(e,r)?"node":pe(e,r)?"python":"unknown"}function es(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 lt(r){return r&&typeof r=="object"&&!Array.isArray(r)?r:{}}function ts(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=lt(o.runtime),i=["python","node","go","java"].filter(c=>{let l=lt(n[c]);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 c=lt(n[e]);if(typeof c.version!="string"||c.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 rs(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$3(t,"workspace")?{payload:t,path:e}:{payload:null,path:e}}catch{return {payload:null,path:e}}}function os(r){let e=rs(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=lt(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 ns(r){let e=f__default.join(r,".rapidkit","reports"),t=es(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(),s=lt(o.summary),i=Number(s.failedChecks??0);return n==="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}: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 ss(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((i,c)=>{let l=Number(c.vulnerabilities??0);return Number.isFinite(l)?i+Math.max(0,l):i},0),s=o.filter(i=>i.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}: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 is(r){return r.some(e=>e.status==="fail")?"fail":r.some(e=>e.status==="warn")?"warn":"pass"}async function as(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 ar(r={}){let e=f__default.resolve(r.startPath??process.cwd()),t=Zn(e)??e,o=Xn(e),n=ts(t,o),s=os(t),i=ns(t),c=ss(s.payload,t),l=[n,s.gate,i,c],d=is(l),m={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&&(m.evidencePath=await as(t,m)),m}function cs(r){return r==="pass"?a$4.green("PASS"):r==="warn"?a$4.yellow("WARN"):a$4.red("FAIL")}function ls(r){return r==="pass"?a$4.green("PASS"):r==="warn"?a$4.yellow("WARN"):a$4.red("FAIL")}async function xo(r){let e=await ar({writeReport:true});if(r.json)console.log(JSON.stringify(e,null,2));else {console.log(a$4.bold.cyan(`
103
+ `)),console.log(s.white(`Set your API key: rapidkit config set-api-key
104
+ `)),process.exit(1)),Nt(r);let o=await bo();process.exit(o?0:1);}catch(r){let o=dr(r);a$1.error("Failed to update embeddings:",o.message),process.exit(1);}});}var us="rapidkit.product-factory-plan.v1",ms="rapidkit.private-product-manifest.v1";function mt(t,e=""){return typeof t=="string"&&t.trim()?t.trim():e}function pr(t){return typeof t=="string"&&t.trim()?t.trim():null}function fs(t,e){return typeof t=="number"&&Number.isFinite(t)?t:e}function Eo(t){return Array.isArray(t)?[...new Set(t.filter(e=>typeof e=="string").map(e=>e.trim()).filter(Boolean))]:[]}function Ao(t){if(!/^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/.test(t))throw new Error(`Invalid product slug "${t}". Use lowercase letters, numbers, and hyphens.`)}function gs(t,e,r){let o=mt(t.slug);if(!o)throw new Error(`Backlog product at index ${e} is missing slug.`);Ao(o);let n=Eo(t.modules),i=Eo(t.moduleGaps);return {rank:fs(t.rank,e+1),slug:o,title:mt(t.title,o),category:mt(t.category,"Uncategorized"),tier:mt(t.tier,"pro"),summary:mt(t.summary),modules:n,moduleGaps:i,recommendedKit:r,workspaceProfile:"enterprise",readiness:{status:i.length>0?"blocked-by-module-gaps":"ready-for-private-manifest",blockingGaps:i}}}function hs(t){if(!t||typeof t!="object"||Array.isArray(t))throw new Error("Backlog must be a JSON object.");return t}async function ys(t){let e=y__default.resolve(process.cwd(),t),r=hs(await ___default.readJson(e));if(!Array.isArray(r.products))throw new Error("Backlog must contain a products array.");return {absolutePath:e,payload:r}}function ws(t,e){let r=[...t];if(e.tier){let o=e.tier.toLowerCase();r=r.filter(n=>n.tier.toLowerCase()===o);}if(e.category){let o=e.category.toLowerCase();r=r.filter(n=>n.category.toLowerCase()===o);}if(e.limit){let o=Number.parseInt(e.limit,10);if(!Number.isInteger(o)||o<1)throw new Error("--limit must be a positive integer.");r=r.slice(0,o);}return r}async function $o(t){let e=t.kit?.trim()||"fastapi.standard",{absolutePath:r,payload:o}=await ys(t.backlogPath),n=o.products,i=n.map((p,d)=>gs(p,d,e)),c=ws(i,t),a=new Set(c.flatMap(p=>p.modules)),l=c.flatMap(p=>p.moduleGaps),f=c.filter(p=>p.readiness.status==="ready-for-private-manifest").length;return {schemaVersion:us,generatedAt:(t.now??new Date).toISOString(),source:{backlogPath:r,backlogSchemaVersion:pr(o.schemaVersion),purpose:pr(o.purpose),publicationRule:pr(o.publicationRule)},defaults:{kit:e,workspaceProfile:"enterprise",projectSlug:"api"},stats:{totalProducts:n.length,plannedProducts:c.length,readyProducts:f,blockedProducts:c.length-f,uniqueModules:a.size,knownModuleGaps:l.length},products:c}}function ot(t){return JSON.stringify(t,null,2)}function ks(t){return `sha256:${wr.createHash("sha256").update(ot(t)).digest("hex")}`}async function vs(t){let e=await $o({backlogPath:t.backlogPath,kit:t.kit,now:t.now}),r=e.products.find(i=>i.slug===t.slug);if(!r)throw new Error(`Product "${t.slug}" was not found in backlog.`);let o=t.outputRoot||"../rapidkit-examples-pro",n={schemaVersion:ms,generatedAt:e.generatedAt,product:{rank:r.rank,slug:r.slug,title:r.title,category:r.category,tier:r.tier,summary:r.summary},workspace:{name:r.slug,profile:"enterprise",outputHint:y__default.join(o,r.slug)},projects:[{slug:"api",kit:r.recommendedKit,runtime:"python",framework:"fastapi",modules:r.modules,moduleGaps:r.moduleGaps}],factory:{sourceBacklogPath:e.source.backlogPath,manifestChecksum:"",requiredCommands:[`npx rapidkit create workspace ${r.slug} --yes --profile enterprise`,`npx rapidkit create project ${r.recommendedKit} api --yes --skip-install`,"npx rapidkit init","npx rapidkit workspace run test --strict --json","npx rapidkit readiness --strict --json"],releaseEvidencePath:`.rapidkit/product-factory/${r.slug}/release-evidence.json`}};return {...n,factory:{...n.factory,manifestChecksum:ks({...n,factory:{...n.factory,manifestChecksum:""}})}}}async function _o(t,e,r=false){let o=y__default.resolve(process.cwd(),t);if(!r&&await ___default.pathExists(o))throw new Error(`Refusing to overwrite existing file: ${o}. Use --force.`);await ___default.ensureDir(y__default.dirname(o)),await ___default.writeFile(o,`${ot(e)}
105
+ `,"utf-8");}function Ps(t,e){let r=y__default.join(".rapidkit","product-factory","manifests",`${e}.manifest.json`);return t?t.endsWith(".json")?t:y__default.join(t,`${e}.manifest.json`):r}function bs(t,e){console.log(s.bold(`
106
+ RapidKit Product Factory Plan
107
+ `)),console.log(s.cyan("Products:"),s.white(String(t.stats.plannedProducts))),console.log(s.cyan("Ready:"),s.green(String(t.stats.readyProducts))),console.log(s.cyan("Blocked:"),s.yellow(String(t.stats.blockedProducts))),console.log(s.cyan("Unique modules:"),s.white(String(t.stats.uniqueModules))),console.log(s.cyan("Known gaps:"),s.yellow(String(t.stats.knownModuleGaps))),e&&console.log(s.gray(`
108
+ Wrote plan: ${y__default.resolve(process.cwd(),e)}`)),console.log(s.gray(`
109
+ Next: npx rapidkit product manifest create <slug> --from-backlog <file>
110
+ `));}function js(t,e){console.log(s.bold(`
111
+ RapidKit Private Product Manifest
112
+ `)),console.log(s.cyan("Product:"),s.white(t.product.slug)),console.log(s.cyan("Kit:"),s.white(t.projects[0].kit)),console.log(s.cyan("Modules:"),s.white(String(t.projects[0].modules.length))),console.log(s.cyan("Module gaps:"),s.yellow(String(t.projects[0].moduleGaps.length))),console.log(s.cyan("Checksum:"),s.white(t.factory.manifestChecksum)),console.log(s.gray(`
113
+ Wrote manifest: ${y__default.resolve(process.cwd(),e)}
114
+ `));}function Io(t){let e=t.command("product",{hidden:true}).description("Product Factory commands for private workspace product manifests");e.command("plan <backlog>").description("Build a deterministic Product Factory plan from a workspace backlog JSON").option("--output <file>","Write plan JSON to file").option("--kit <kit>","Default API kit for generated product manifests","fastapi.standard").option("--tier <tier>","Filter products by tier").option("--category <category>","Filter products by category").option("--limit <count>","Limit planned products").option("--json","Print JSON to stdout").action(async(r,o)=>{try{let n=await $o({backlogPath:r,kit:o.kit,tier:o.tier,category:o.category,limit:o.limit});o.output&&await _o(o.output,n,true),o.json?console.log(ot(n)):bs(n,o.output);}catch(n){let i=n instanceof Error?n.message:String(n);o.json?console.log(ot({ok:false,error:{message:i}})):console.error(s.red(`Product plan failed: ${i}`)),process.exit(1);}}),e.command("manifest").description("Create or inspect private product manifests").command("create <slug>").description("Create a private product manifest from a backlog product slug").requiredOption("--from-backlog <file>","Source workspace backlog JSON").option("--output <fileOrDir>","Manifest output file or directory").option("--kit <kit>","API kit for the generated workspace product","fastapi.standard").option("--workspace-output <dir>","Suggested root for generated product workspaces").option("--json","Print JSON to stdout").option("--force","Overwrite existing manifest file").action(async(r,o)=>{try{Ao(r);let n=await vs({backlogPath:o.fromBacklog,slug:r,kit:o.kit,outputRoot:o.workspaceOutput}),i=Ps(o.output,r);await _o(i,n,o.force===true),o.json?console.log(ot(n)):js(n,i);}catch(n){let i=n instanceof Error?n.message:String(n);o.json?console.log(ot({ok:false,error:{message:i}})):console.error(s.red(`Product manifest create failed: ${i}`)),process.exit(1);}});}var Kt=class{constructor(e){this.runCommand=e;}runtime="go";async run(e,r,o){return {exitCode:await this.runCommand(e,r,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 r=e;for(;;){if(v.existsSync(y__default.join(r,".rapidkit-workspace")))return r;let o=y__default.dirname(r);if(o===r)break;r=o;}return null}resolveDependencyMode(e){let r=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(r==="shared-runtime-caches"||r==="shared-node-deps"||r==="isolated")return r;let o=this.findWorkspaceRoot(e);if(!o)return "isolated";let n=y__default.join(o,".rapidkit","policies.yml");if(!v.existsSync(n))return "isolated";try{let a=v.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,r){let o=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=o==="shared-runtime-caches"?y__default.join(n||e,".rapidkit","cache","go"):y__default.join(e,".rapidkit","cache","go"),c=process.env.GOMODCACHE,a=process.env.GOCACHE;return process.env.GOMODCACHE=y__default.join(i,"mod"),process.env.GOCACHE=y__default.join(i,"build"),r().finally(()=>{typeof c>"u"?delete process.env.GOMODCACHE:process.env.GOMODCACHE=c,typeof a>"u"?delete process.env.GOCACHE:process.env.GOCACHE=a;})}async checkPrereqs(){return this.run("go",["version"],process.cwd())}async warmSetupCache(e){return this.withGoCacheEnv(e,async()=>{try{return process.env.GOMODCACHE&&v.mkdirSync(process.env.GOMODCACHE,{recursive:true}),process.env.GOCACHE&&v.mkdirSync(process.env.GOCACHE,{recursive:true}),{exitCode:0}}catch{return {exitCode:1,message:"Failed to prepare Go cache directories"}}})}async initProject(e){return this.withGoCacheEnv(e,async()=>{let r=await this.ensureGoInstalled(e);return r||this.run("go",["mod","tidy"],e)})}async runDev(e){return this.withGoCacheEnv(e,()=>(async()=>{let r=await this.ensureGoInstalled(e);if(r)return r;let o=y__default.join(e,"Makefile");return v.existsSync(o)?this.run("make",["run"],e):this.run("go",["run","./main.go"],e)})())}async runTest(e){return this.withGoCacheEnv(e,async()=>{let r=await this.ensureGoInstalled(e);return r||this.run("go",["test","./..."],e)})}async runBuild(e){return this.withGoCacheEnv(e,async()=>{let r=await this.ensureGoInstalled(e);return r||this.run("go",["build","./..."],e)})}async runStart(e){return this.withGoCacheEnv(e,async()=>{let o=(a()?[y__default.join(e,"server.exe"),y__default.join(e,"server")]:[y__default.join(e,"server")]).find(i=>v.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 Jt=class{constructor(e){this.runCommand=e;}runtime="java";isExecutable(e){if(process.platform==="win32")return true;try{return (v.statSync(e).mode&73)!==0}catch{return false}}ensureWrapperExecutable(e){if(process.platform==="win32"||this.isExecutable(e))return true;try{return v.chmodSync(e,493),this.isExecutable(e)}catch{return false}}resolveJavaCommand(e){let r=process.env.JAVA_HOME?.trim();if(!r)return "java";let o=y__default.join(r,"bin",process.platform==="win32"?"java.exe":"java");return v.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 r=y__default.join(e,"pom.xml");if(!v.existsSync(r))return 21;try{let n=v.readFileSync(r,"utf-8").match(/<java\.version>\s*([^<\s]+)\s*<\/java\.version>/i);return this.parseMajorJavaVersion(n?.[1])??21}catch{return 21}}async detectInstalledJavaMajor(e,r){try{let o=await execa(e,["-version"],{cwd:r,timeout:5e3,reject:false});if(o.exitCode!==0)return null;let n=`${o.stdout||""}
115
+ ${o.stderr||""}`,i=n.match(/version\s+"([^"]+)"/i);if(i?.[1])return this.parseMajorJavaVersion(i[1]);let c=n.match(/(?:openjdk|java)\s+(\d+(?:[._]\d+)?)/i);return c?.[1]?this.parseMajorJavaVersion(c[1]):null}catch{return null}}parseMavenVersion(e){if(!e)return null;let r=e.match(/Apache Maven\s+(\d+)\.(\d+)\.(\d+)/i);return r?[Number.parseInt(r[1],10),Number.parseInt(r[2],10),Number.parseInt(r[3],10)]:null}isMavenVersionAtLeast(e,r){for(let o=0;o<3;o+=1){if(e[o]>r[o])return true;if(e[o]<r[o])return false}return true}async checkSystemMavenVersion(e){try{let r=await execa("mvn",["-version"],{cwd:e,timeout:5e3,reject:false});if(r.exitCode!==0)return {exitCode:r.exitCode||1,message:"Maven is required and must be available on PATH (3.9+)."};let o=this.parseMavenVersion(`${r.stdout||""}
116
+ ${r.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 r=v.existsSync(y__default.join(e,"pom.xml")),o=v.existsSync(y__default.join(e,"mvnw"))||v.existsSync(y__default.join(e,"mvnw.cmd")),n=v.existsSync(y__default.join(e,"build.gradle"))||v.existsSync(y__default.join(e,"build.gradle.kts"))||v.existsSync(y__default.join(e,"settings.gradle"))||v.existsSync(y__default.join(e,"settings.gradle.kts")),i=v.existsSync(y__default.join(e,"gradlew"))||v.existsSync(y__default.join(e,"gradlew.bat"));return {hasMavenProject:r||o,hasMavenWrapper:o,hasGradleProject:n||i,hasGradleWrapper:i}}findWorkspaceRoot(e){let r=e;for(;;){if(v.existsSync(y__default.join(r,".rapidkit-workspace")))return r;let o=y__default.dirname(r);if(o===r)break;r=o;}return null}resolveDependencyMode(e){let r=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(r==="shared-runtime-caches"||r==="shared-node-deps"||r==="isolated")return r;let o=this.findWorkspaceRoot(e);if(!o)return "isolated";let n=y__default.join(o,".rapidkit","policies.yml");if(!v.existsSync(n))return "isolated";try{let a=v.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 r=y__default.join(e,"mvnw.cmd");if(process.platform==="win32"&&v.existsSync(r))return {command:r,baseArgs:[]};let o=y__default.join(e,"mvnw");return v.existsSync(o)?this.ensureWrapperExecutable(o)?{command:o,baseArgs:[]}:{command:"sh",baseArgs:[o]}:{command:"mvn",baseArgs:[]}}gradleCommand(e){let r=y__default.join(e,"gradlew.bat");if(process.platform==="win32"&&v.existsSync(r))return {command:r,baseArgs:[]};let o=y__default.join(e,"gradlew");return v.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 r=[],o=new Set,n=[e];for(;n.length>0;){let i=n.shift();if(!i||o.has(i))continue;o.add(i);let c=[];try{c=v.readdirSync(i,{withFileTypes:true});}catch{continue}for(let a of c){if(!a.isDirectory()||a.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(a.name))continue;let l=y__default.join(i,a.name),f=this.inspectJavaProject(l);(f.hasMavenProject||f.hasGradleProject)&&r.push(l),n.push(l);}}return r}withJavaCacheEnv(e,r){let o=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=o==="shared-runtime-caches"?y__default.join(n||e,".rapidkit","cache","java","m2"):y__default.join(e,".rapidkit","cache","java","m2"),c=o==="shared-runtime-caches"?y__default.join(n||e,".rapidkit","cache","java","gradle"):y__default.join(e,".rapidkit","cache","java","gradle"),a=process.env.MAVEN_OPTS,l=process.env.GRADLE_USER_HOME,f=`-Dmaven.repo.local=${i}`;return process.env.MAVEN_OPTS=a?`${a} ${f}`:f,process.env.GRADLE_USER_HOME=c,r().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,r,o=true){return this.withJavaCacheEnv(e,async()=>{try{let{command:n,baseArgs:i}=this.buildToolCommand(e),c=await this.runCommand(n,[...i,...r],e);if(c===0||!o)return {exitCode:c};let a=v.existsSync(y__default.join(e,"pom.xml")),l=v.existsSync(y__default.join(e,"build.gradle"))||v.existsSync(y__default.join(e,"build.gradle.kts"));return {exitCode:c,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 r=[y__default.join(e,"target"),y__default.join(e,"build","libs")];for(let o of r){if(!v.existsSync(o))continue;let i=v.readdirSync(o).filter(c=>c.toLowerCase().endsWith(".jar")).find(c=>!c.toLowerCase().endsWith("-sources.jar")&&!c.toLowerCase().endsWith("-javadoc.jar")&&!c.toLowerCase().endsWith("-plain.jar"));if(i)return y__default.join(o,i)}return null}commandArgsFor(e,r){if(e==="gradle"){let o=this.shouldUseGradleNoDaemon()?["--no-daemon"]:[];return r==="init"?[...o,"dependencies"]:r==="dev"?[...o,"bootRun"]:r==="test"?[...o,"test"]:[...o,"bootJar"]}return r==="init"?["-B","-q","-DskipTests","dependency:go-offline"]:r==="dev"?["spring-boot:run"]:r==="test"?["test"]:["-DskipTests","package"]}detectBuildTool(e){return this.isGradleProject(e)?"gradle":"maven"}async checkPrereqs(){let e=process.cwd(),r=this.resolveJavaCommand(e),o=await this.runCommand(r,["-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(r,e);if(l!==null&&l<a)return {exitCode:1,message:`Detected Java ${l}, but project requires Java ${a}+.`};let f=y__default.join(process.env.JAVA_HOME||"","release");if(process.env.JAVA_HOME&&v.existsSync(f))try{let d=v.readFileSync(f,"utf-8").match(/^JAVA_VERSION="([^"]+)"/m),m=this.parseMajorJavaVersion(d?.[1]);if(m!==null&&m<a)return {exitCode:1,message:`Detected JAVA_HOME version ${m}, but project requires Java ${a}+.`}}catch{}}if(this.isMavenProject(e)||this.isGradleProject(e)){let a=this.detectBuildTool(e),l=a==="gradle"?["--version"]:["-version"],f=await this.runBuildTool(e,l);return f.exitCode!==0?f:a==="maven"&&!this.inspectJavaProject(e).hasMavenWrapper?this.checkSystemMavenVersion(e):f}let n=this.findWorkspaceRoot(e);if(n&&n===e){let a=this.discoverWorkspaceJavaProjects(n);if(a.length>0){let l=a.reduce((d,m)=>Math.max(d,this.readRequiredJavaMajor(m)),0);if(l>0){let d=await this.detectInstalledJavaMajor(r,e);if(d!==null&&d<l){let m=a.filter(g=>this.readRequiredJavaMajor(g)>d).map(g=>y__default.relative(e,g)).join(", ");return {exitCode:1,message:`Detected Java ${d}, but workspace project(s) [${m}] require Java ${l}+.`}}}let f=false,p=false;for(let d of a){let m=this.inspectJavaProject(d);m.hasMavenProject&&!m.hasMavenWrapper&&(f=true),m.hasGradleProject&&!m.hasGradleWrapper&&(p=true);}if(f){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 m=await this.checkSystemMavenVersion(e);if(m.exitCode!==0)return m}if(p){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 c=await this.withJavaCacheEnv(e,async()=>this.runCommand("gradle",["--version"],e));return c===0?{exitCode:0}:{exitCode:i||c||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 r=process.env.MAVEN_OPTS?.match(/-Dmaven\.repo\.local=([^\s]+)/)?.[1];return r&&v.mkdirSync(r,{recursive:true}),process.env.GRADLE_USER_HOME&&v.mkdirSync(process.env.GRADLE_USER_HOME,{recursive:true}),{exitCode:0}}catch{return {exitCode:1,message:"Failed to prepare Java cache directories"}}})}async initProject(e){return this.runBuildTool(e,this.commandArgsFor(this.detectBuildTool(e),"init"))}async runDev(e){return this.runBuildTool(e,this.commandArgsFor(this.detectBuildTool(e),"dev"))}async runTest(e){return this.runBuildTool(e,this.commandArgsFor(this.detectBuildTool(e),"test"))}async runBuild(e){return this.runBuildTool(e,this.commandArgsFor(this.detectBuildTool(e),"build"))}async runStart(e){let r=this.resolveJarPath(e);if(r)return {exitCode:await this.runCommand(this.resolveJavaCommand(e),["-jar",r],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 Gt=class{constructor(e){this.runCommand=e;}runtime="node";async run(e,r,o){return {exitCode:await this.runCommand(e,r,o)}}findWorkspaceRoot(e){let r=e;for(;;){if(v.existsSync(y__default.join(r,".rapidkit-workspace")))return r;let o=y__default.dirname(r);if(o===r)break;r=o;}return null}resolveDependencyMode(e){let r=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(r==="shared-runtime-caches"||r==="shared-node-deps"||r==="isolated")return r;let o=this.findWorkspaceRoot(e);if(!o)return "isolated";let n=y__default.join(o,".rapidkit","policies.yml");if(!v.existsSync(n))return "isolated";try{let a=v.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,r,o){let n=this.resolveDependencyMode(e),i=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),c=n==="isolated"?y__default.join(e,".rapidkit","cache","node"):y__default.join(i||e,".rapidkit","cache","node"),a=process.env.npm_config_cache,l=process.env.npm_config_store_dir;return r==="pnpm"?(process.env.npm_config_store_dir=y__default.join(c,"pnpm-store"),process.env.npm_config_cache=y__default.join(c,"pnpm-cache")):r==="yarn"?process.env.npm_config_cache=y__default.join(c,"yarn-cache"):process.env.npm_config_cache=y__default.join(c,"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 v.existsSync(y__default.join(e,"pnpm-lock.yaml"))?"pnpm":v.existsSync(y__default.join(e,"yarn.lock"))?"yarn":"npm"}scriptArgs(e,r){return e==="npm"?["run",r]:["run",r]}async checkPrereqs(){return this.run("node",["--version"],process.cwd())}async warmSetupCache(e){let r=this.detectPackageManager(e);return this.withDependencyEnv(e,r,async()=>{try{return process.env.npm_config_cache&&v.mkdirSync(process.env.npm_config_cache,{recursive:true}),r==="pnpm"&&process.env.npm_config_store_dir&&v.mkdirSync(process.env.npm_config_store_dir,{recursive:true}),{exitCode:0}}catch{return {exitCode:1,message:"Failed to prepare Node cache directories"}}})}async initProject(e){let r=this.detectPackageManager(e),o=this.resolveDependencyMode(e),n=o==="shared-runtime-caches"||o==="shared-node-deps"?["install","--prefer-offline"]:["install"];return this.withDependencyEnv(e,r,()=>this.run(r,n,e))}async runDev(e){let r=this.detectPackageManager(e);return this.withDependencyEnv(e,r,()=>this.run(r,this.scriptArgs(r,"dev"),e))}async runTest(e){let r=this.detectPackageManager(e);return this.withDependencyEnv(e,r,()=>this.run(r,this.scriptArgs(r,"test"),e))}async runBuild(e){let r=this.detectPackageManager(e);return this.withDependencyEnv(e,r,()=>this.run(r,this.scriptArgs(r,"build"),e))}async runStart(e){let r=this.detectPackageManager(e);return this.withDependencyEnv(e,r,()=>this.run(r,this.scriptArgs(r,"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 qt=class{constructor(e){this.runCore=e;}runtime="python";async run(e,r){return {exitCode:await this.withPythonCacheEnv(r,()=>this.runCore(e,r))}}findWorkspaceRoot(e){let r=e;for(;;){if(v.existsSync(y__default.join(r,".rapidkit-workspace")))return r;let o=y__default.dirname(r);if(o===r)break;r=o;}return null}resolveDependencyMode(e){let r=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(r==="shared-runtime-caches"||r==="shared-node-deps"||r==="isolated")return r;let o=this.findWorkspaceRoot(e);if(!o)return "isolated";let n=y__default.join(o,".rapidkit","policies.yml");if(!v.existsSync(n))return "isolated";try{let a=v.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,r){let o=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=o==="shared-runtime-caches"?y__default.join(n||e,".rapidkit","cache","python"):y__default.join(e,".rapidkit","cache","python"),c=process.env.PIP_CACHE_DIR,a=process.env.POETRY_CACHE_DIR;return process.env.PIP_CACHE_DIR=y__default.join(i,"pip"),process.env.POETRY_CACHE_DIR=y__default.join(i,"poetry"),r().finally(()=>{typeof c>"u"?delete process.env.PIP_CACHE_DIR:process.env.PIP_CACHE_DIR=c,typeof a>"u"?delete process.env.POETRY_CACHE_DIR:process.env.POETRY_CACHE_DIR=a;})}async checkPrereqs(){let e=process.cwd(),r=await this.run(["doctor","check"],e);return r.exitCode===0?r: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 xs(){let t={...process.env},e=t.PATH||"";if(e){let r=e.split(y__default.delimiter).filter(o=>!o.replace(/\\/g,"/").includes("/.pyenv/shims")).join(y__default.delimiter);t.PATH=r;}return t.PYENV_VERSION="system",t.POETRY_PYTHON=t.POETRY_PYTHON||c$1(),typeof t.RAPIDKIT_SKIP_LOCK_SYNC>"u"&&(t.RAPIDKIT_SKIP_LOCK_SYNC="1"),t}function De(t,e){return t==="go"?new Kt((r,o,n)=>e.runCommandInCwd(r,o,n)):t==="node"?new Gt((r,o,n)=>e.runCommandInCwd(r,o,n)):t==="java"?new Jt((r,o,n)=>e.runCommandInCwd(r,o,n)):new qt((r,o)=>e.runCoreRapidkit(r,{cwd:o,env:xs()}))}var No=y__default.join(to.homedir(),".rapidkit","cache"),Do=1440*60*1e3;function mr(){let t=process.env.RAPIDKIT_CACHE_DIR?.trim();if(t)return t;let e=process.env.VITEST_WORKER_ID?.trim();return e?y__default.join(No,`vitest-${e}`):No}var Ut=class t{static instance;memoryCache=new Map;constructor(){}static getInstance(){return t.instance||(t.instance=new t),t.instance}getCacheKey(e){return createHash("md5").update(e).digest("hex")}getCachePath(e){return y__default.join(mr(),`${this.getCacheKey(e)}.json`)}getTempCachePath(e){let r=`${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`;return `${e}.${r}.tmp`}async get(e,r="1.0"){let o=this.memoryCache.get(e);if(o&&o.version===r&&Date.now()-o.timestamp<Do)return a$1.debug(`Cache hit (memory): ${e}`),o.data;try{let n=this.getCachePath(e),i=await promises.readFile(n,"utf-8"),c=JSON.parse(i);if(c.version===r&&Date.now()-c.timestamp<Do)return a$1.debug(`Cache hit (disk): ${e}`),this.memoryCache.set(e,c),c.data;await promises.unlink(n).catch(()=>{});}catch{a$1.debug(`Cache miss: ${e}`);}return null}async set(e,r,o="1.0"){let n={data:r,timestamp:Date.now(),version:o};this.memoryCache.set(e,n);try{await promises.mkdir(mr(),{recursive:true});let i=this.getCachePath(e),c=this.getTempCachePath(i);await promises.writeFile(c,JSON.stringify(n),"utf-8"),await promises.rename(c,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 r=this.getCachePath(e);await promises.unlink(r),a$1.debug(`Cache invalidated: ${e}`);}catch{}}async clear(){this.memoryCache.clear();try{let e=mr(),r=await promises.readdir(e);await Promise.all(r.map(o=>promises.unlink(y__default.join(e,o)))),a$1.debug("Cache cleared");}catch{}}};function Rs(t){let e=t;for(;;){if(v.existsSync(y__default.join(e,".rapidkit-workspace"))||v.existsSync(y__default.join(e,".rapidkit","workspace.json")))return e;let r=y__default.dirname(e);if(r===e)break;e=r;}return null}function Es(t){let e=ge(t);return ce(e,t)?"go":de(e,t)?"java":le(e,t)?"node":ue(e,t)?"python":"unknown"}function _s(t,e){if(!v.existsSync(t))return null;let r=v.readdirSync(t).filter(o=>o.endsWith(".json")&&e.some(n=>n.test(o))).map(o=>y__default.join(t,o));return r.length===0?null:(r.sort((o,n)=>v.statSync(n).mtimeMs-v.statSync(o).mtimeMs),r[0])}function ft(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}function As(t,e){let r=y__default.join(t,".rapidkit","toolchain.lock");if(!v.existsSync(r))return {gate:"env",status:"fail",summary:"toolchain.lock is missing",details:["Run rapidkit bootstrap to pin runtime versions and generate a reproducible toolchain."],evidencePath:r};try{let o=JSON.parse(v.readFileSync(r,"utf-8")),n=ft(o.runtime),c=["python","node","go","java"].filter(a=>{let l=ft(n[a]);return typeof l.version=="string"&&l.version.trim().length>0});if(c.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:r};if(e!=="unknown"){let a=ft(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:r}}return {gate:"env",status:"pass",summary:`Pinned runtimes: ${c.join(", ")}`,details:[],evidencePath:r}}catch{return {gate:"env",status:"fail",summary:"toolchain.lock is invalid JSON",details:["Regenerate lockfile with rapidkit bootstrap."],evidencePath:r}}}function $s(t){let e=y__default.join(t,".rapidkit","reports","doctor-last-run.json");if(!v.existsSync(e))return {payload:null,path:e};try{let r=JSON.parse(v.readFileSync(e,"utf-8"));return c$3(r,"workspace")?{payload:r,path:e}:{payload:null,path:e}}catch{return {payload:null,path:e}}}function Is(t){let e=$s(t);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 r=ft(e.payload.summary),o=Number(r.totalIssues??0);return r.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 Ms(t){let e=y__default.join(t,".rapidkit","reports"),r=_s(e,[/verify-pack-contract/i,/^verify.*\.json$/i]);if(!r)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:y__default.join(e,"*verify-pack-contract*.json")};try{let o=JSON.parse(v.readFileSync(r,"utf-8")),n=String(o.status??"").toLowerCase(),i=ft(o.summary),c=Number(i.failedChecks??0);return n==="fail"||c>0?{gate:"verify",status:"fail",summary:"Verify-pack contract reports failed checks",details:["Fix failed verify checks and regenerate verify-pack contract evidence."],evidencePath:r}:n==="pass"?{gate:"verify",status:"pass",summary:"Verify-pack contract passed",details:[],evidencePath:r}:{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:r}}catch{return {gate:"verify",status:"fail",summary:"Verify-pack contract is invalid JSON",details:["Regenerate verify-pack contract artifact."],evidencePath:r}}}function Os(t,e){let r=y__default.join(e,".rapidkit","reports","doctor-last-run.json");if(!t)return {gate:"dependency",status:"warn",summary:"Dependency risk check skipped (doctor evidence missing)",details:["Run rapidkit doctor workspace --json to include dependency findings."],evidencePath:r};let o=Array.isArray(t.projects)?t.projects:[],n=o.reduce((c,a)=>{let l=Number(a.vulnerabilities??0);return Number.isFinite(l)?c+Math.max(0,l):c},0),i=o.filter(c=>c.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:r}:i>0?{gate:"dependency",status:"warn",summary:`${i} project(s) report missing dependencies`,details:["Run project init/bootstrap and regenerate doctor evidence."],evidencePath:r}:{gate:"dependency",status:"pass",summary:"No dependency vulnerabilities reported",details:[],evidencePath:r}}function Ns(t){return t.some(e=>e.status==="fail")?"fail":t.some(e=>e.status==="warn")?"warn":"pass"}async function Ds(t,e){let r=y__default.join(t,".rapidkit","reports","release-readiness-last-run.json");return await ___default.ensureDir(y__default.dirname(r)),await ___default.writeJSON(r,e,{spaces:2}),r}async function fr(t={}){let e=y__default.resolve(t.startPath??process.cwd()),r=Rs(e)??e,o=Es(e),n=As(r,o),i=Is(r),c=Ms(r),a=Os(i.payload,r),l=[n,i.gate,c,a],f=Ns(l),p={schemaVersion:"v1",generatedAt:new Date().toISOString(),workspacePath:r,projectPath:e,action:t.action,overallStatus:f,blocking:f==="fail",blockingReasons:l.filter(d=>d.status==="fail").map(d=>`${d.gate}: ${d.summary}`),gates:l};return t.writeReport!==false&&(p.evidencePath=await Ds(r,p)),p}function Ts(t){return t==="pass"?s.green("PASS"):t==="warn"?s.yellow("WARN"):s.red("FAIL")}function Ws(t){return t==="pass"?s.green("PASS"):t==="warn"?s.yellow("WARN"):s.red("FAIL")}async function Wo(t){let e=await fr({writeReport:true});if(t.json)console.log(JSON.stringify(e,null,2));else {console.log(s.bold.cyan(`
107
117
  \u{1F6A6} RapidKit Release Readiness
108
- `)),console.log(a$4.bold(`Workspace: ${a$4.cyan(f__default.basename(e.workspacePath))}`)),console.log(a$4.gray(`Path: ${e.workspacePath}`)),console.log(`Overall: ${ls(e.overallStatus)}`);for(let t of e.gates){console.log(` - ${t.gate}: ${cs(t.status)} ${t.summary}`);for(let o of t.details)console.log(a$4.gray(` ${o}`));t.evidencePath&&console.log(a$4.gray(` evidence: ${t.evidencePath}`));}e.evidencePath&&console.log(a$4.gray(`
109
- Evidence saved: ${e.evidencePath}`));}r.strict&&e.overallStatus!=="pass"&&process.exit(1);}async function ms(r){let e=await promises.readFile(r);return createHash("sha256").update(e).digest("hex")}async function So(r,e){await _.outputFile(r,`${JSON.stringify(e,null,2)}
110
- `,"utf-8");}function Ce(r,e){return f__default.isAbsolute(e)?e:f__default.join(r,e)}function fs(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 gs(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(s=>s.trim()).filter(s=>s.length>0&&!s.startsWith("#"));for(let s of n)t.add(s.toLowerCase());}catch{}return t}async function hs(r,e,t){await _.ensureDir(f__default.dirname(e)),await new Promise((o,n)=>{let i=(r.startsWith("https://")?Ao:Eo).get(r,c=>{if(!c.statusCode||c.statusCode<200||c.statusCode>=300){n(new Error(`HTTP ${c.statusCode||"unknown"}`)),c.resume();return}let l=createWriteStream(e);c.pipe(l),l.on("finish",()=>{l.close(),o();}),l.on("error",d=>{n(d);});});i.setTimeout(t,()=>{i.destroy(new Error(`Request timeout after ${t}ms`));}),i.on("error",c=>{n(c);});});}async function ys(r,e,t,o,n){let s=new URL(r),i=JSON.stringify(e),c=s.protocol==="https:"?Ao:Eo;await new Promise((l,d)=>{let m=c.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),...o?{Authorization:`Bearer ${o}`}:{},...n||{}}},p=>{if(!p.statusCode||p.statusCode<200||p.statusCode>=300){d(new Error(`HTTP ${p.statusCode||"unknown"}`)),p.resume();return}p.resume(),l();});m.setTimeout(t,()=>{m.destroy(new Error(`Request timeout after ${t}ms`));}),m.on("error",p=>{d(p);}),m.write(i),m.end();});}function Co(r){return new Promise(e=>setTimeout(e,r))}async function ws(r,e,t,o){let n=Ce(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 ks(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",s=createHmac(o,t).update(JSON.stringify(r)).digest("hex");return {headers:{[n]:s,"x-rapidkit-evidence-signature-alg":o}}}async function vs(r,e,t){let o=(t.algorithm||"sha256").toLowerCase(),n=Ce(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 s=await promises.readFile(n,"utf-8"),i=await promises.readFile(e),c=createVerify(o);c.update(i),c.end();let l=Buffer.from(t.signature,"base64"),d=c.verify(s,l),m=createHash("sha256").update(s).digest("hex");return {verified:d,algorithm:o,publicKeyPath:n,publicKeyFingerprint:m,signature:t.signature,message:d?"Attestation verified.":"Attestation signature verification failed."}}catch(s){return {verified:false,algorithm:o,publicKeyPath:n,publicKeyFingerprint:"",signature:t.signature,message:`Attestation verification error: ${s.message}`}}}async function Ps(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 s=t.signaturePath?Ce(r,t.signaturePath):null;if(!s||!await _.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],c=t.certificatePath?Ce(r,t.certificatePath):null;c&&i.push("--certificate",c);let l=t.bundlePath?Ce(r,t.bundlePath):null;l&&i.push("--bundle",l);let d=t.keyPath?Ce(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),o.requireTransparencyLog||i.push("--insecure-ignore-tlog");try{let m=await execa("cosign",i,{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:c,signaturePath:s}:{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:c,signaturePath:s}}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:c,signaturePath:s}}}async function bs(r,e){let t=e.algorithm||"sha256",o=Ce(r,e.policyPath),n=Ce(r,e.signaturePath),s=Ce(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(s))return {verified:false,message:`Governance policy public key not found: ${s}`,policies:null};try{let i=await promises.readFile(o,"utf-8"),c=(await promises.readFile(n,"utf-8")).trim(),l=await promises.readFile(s,"utf-8"),d=createVerify(t);return d.update(i),d.end(),d.verify(l,Buffer.from(c,"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 cr(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"),s=f__default.join(n,"mirror-config.json"),i=f__default.join(n,"mirror.lock"),c=f__default.join(n,"mirror","artifacts"),l=f__default.join(n,"reports"),d=await gs(r);if(!await _.pathExists(s))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(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: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(c);let u=Math.max(0,m.prefetch?.retries??2),h=Math.max(0,m.prefetch?.backoffMs??250),g=Math.max(1e3,m.prefetch?.timeoutMs??15e3),y=m.security?.requireAttestation===true,P=m.security?.requireSigstore===true,w=m.security?.requireTransparencyLog===true,j=m.security?.requireSignedGovernance===true,b=m.security?.evidenceExport,E=(process.env.RAPIDKIT_ENV||m.security?.governance?.environment||"dev").toLowerCase(),I=m.security?.governance?.policies||{};if(m.security?.governanceBundle){let H=await bs(r,m.security.governanceBundle);if(t.push({id:"governance.bundle.verify",status:H.verified?"passed":"failed",message:H.message}),H.verified&&H.policies)I=H.policies,o.governanceBundleVerified=true;else if(j)return {checks:t,details:o}}let D=I[E],F=w||D?.requireTransparencyLog===true,G=[],L=Array.isArray(m.artifacts)?m.artifacts:[],X=[];for(let H=0;H<L.length;H+=1){let O=L[H],x=O.id||`artifact-${H+1}`,B=O.source?Ce(r,O.source):null,ye=fs(O,x),J=f__default.join(c,ye),ee=false,Pe={sourceType:"path",source:B||O.url||"unknown",host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true};if(B&&await _.pathExists(B))await _.ensureDir(f__default.dirname(J)),await _.copyFile(B,J),o.syncedArtifacts+=1,ee=true,Pe={sourceType:"path",source:B,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(O.url){let de="";try{de=new URL(O.url).hostname.toLowerCase();}catch{t.push({id:`mirror.prefetch.${x}`,status:"failed",message:`Invalid URL for ${x}: ${O.url}`});continue}if(!(process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||d.has(de))){t.push({id:`mirror.prefetch.trust.${x}`,status:"failed",message:`Untrusted mirror host for ${x}: ${de}. Add host to .rapidkit/trusted-sources.lock or set RAPIDKIT_TRUSTED_SOURCES=1.`});continue}if(e.offlineMode&&(await _.pathExists(J)?(ee=true,Pe={sourceType:"url",source:O.url,host:de,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.`}),!ee))continue;if(!ee){let V=null,Re=0;for(let Le=1;Le<=u+1;Le+=1){Re=Le;try{await hs(O.url,J,g),o.syncedArtifacts+=1,ee=true,Pe={sourceType:"url",source:O.url,host:de,fetchedAt:new Date().toISOString(),attempts:Re,trusted:true},t.push({id:`mirror.prefetch.${x}`,status:"passed",message:Re>1?`Prefetched artifact ${x} from ${de} after ${Re} attempts.`:`Prefetched artifact ${x} from ${de}.`});break}catch(nt){if(V=nt,Le<=u){await Co(h*Le);continue}}}if(!ee){t.push({id:`mirror.prefetch.${x}`,status:"failed",message:`Failed to prefetch ${x} after ${u+1} attempt(s): ${V?.message||"unknown error"}`});continue}}if(!ee){t.push({id:`mirror.prefetch.${x}`,status:"failed",message:`Failed to prefetch ${x}.`});continue}}if(!ee){O.required||e.offlineMode?t.push({id:`mirror.sync.${x}`,status:"failed",message:`Mirror source missing for ${x}${B?`: ${B}`:""}`}):t.push({id:`mirror.sync.${x}`,status:"skipped",message:`Mirror source not found for optional artifact ${x}.`});continue}let $e=await ms(J);if(O.sha256&&O.sha256.toLowerCase()!==$e.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 te=O.attestation?await vs(r,J,O.attestation):null;if(O.attestation){if(t.push({id:`mirror.attest.${x}`,status:te?.verified?"passed":"failed",message:te?.message||"Attestation verification failed."}),!te?.verified)continue}else if(y){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=O.attestation?.sigstore,S=R?await Ps(r,J,R,{requireTransparencyLog:F}):null;if(R){if(t.push({id:`mirror.sigstore.${x}`,status:S?.verified?"passed":"failed",message:S?.message||"Sigstore verification failed."}),G.push({artifactId:x,verified:!!S?.verified,tlogVerified:!!S?.tlogVerified,identity:S?.identity||null,issuer:S?.issuer||null,rekorUrl:S?.rekorUrl||null,timestamp:new Date().toISOString(),environment:E}),!S?.verified)continue}else if(P){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&&S?.verified&&D){let de=D.allowedIdentities||[];if(de.length>0){let V=!!S.identity&&de.includes(S.identity);if(t.push({id:`mirror.sigstore.policy.identity.${x}`,status:V?"passed":"failed",message:V?`Sigstore identity policy passed for ${x} in ${E}.`:`Sigstore identity policy failed for ${x} in ${E}.`}),!V)continue}let me=D.allowedIssuers||[];if(me.length>0){let V=!!S.issuer&&me.includes(S.issuer);if(t.push({id:`mirror.sigstore.policy.issuer.${x}`,status:V?"passed":"failed",message:V?`Sigstore issuer policy passed for ${x} in ${E}.`:`Sigstore issuer policy failed for ${x} in ${E}.`}),!V)continue}let be=D.allowedRekorUrls||[];if(be.length>0){let V=!!S.rekorUrl&&be.includes(S.rekorUrl);if(t.push({id:`mirror.sigstore.policy.rekor.${x}`,status:V?"passed":"failed",message:V?`Sigstore Rekor policy passed for ${x} in ${E}.`:`Sigstore Rekor policy failed for ${x} in ${E}.`}),!V)continue}}else D&&t.push({id:`mirror.sigstore.policy.${x}`,status:"skipped",message:`Sigstore governance policy configured for ${E} but no verified Sigstore attestation for ${x}.`});let q=await promises.stat(J);X.push({id:x,path:f__default.relative(r,J),sha256:$e,size:q.size,provenance:Pe,attestation:{detached:{provided:!!O.attestation,verified:te?.verified||false,algorithm:te?.algorithm||null,publicKeyPath:te?.publicKeyPath||null,publicKeyFingerprint:te?.publicKeyFingerprint||null,signature:te?.signature||null,verifiedAt:te?.verified?new Date().toISOString():null},sigstore:{provided:!!R,verified:S?.verified||false,tlogVerified:S?.tlogVerified||false,identity:S?.identity||null,issuer:S?.issuer||null,rekorUrl:S?.rekorUrl||null,bundlePath:S?.bundlePath||null,certificatePath:S?.certificatePath||null,signaturePath:S?.signaturePath||null,verifiedAt:S?.verified?new Date().toISOString():null}}});}let le=m.retention?.keepLast;if(typeof le=="number"&&le>0){let O=(await promises.readdir(c,{withFileTypes:true})).filter(x=>x.isFile()).map(x=>f__default.join(c,x.name));if(O.length>le){let x=await Promise.all(O.map(async ye=>({filePath:ye,stat:await promises.stat(ye)})));x.sort((ye,J)=>J.stat.mtimeMs-ye.stat.mtimeMs);let B=x.slice(le);for(let ye of B)await promises.unlink(ye.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 fe={schemaVersion:"1.0",generatedAt:new Date().toISOString(),mode:m.mode||null,environment:E,artifacts:X};if(await promises.writeFile(i,`${JSON.stringify(fe,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,i)}.`}),o.transparencyEvidenceRecords=G.length,G.length>0){let H={schemaVersion:"1.0",generatedAt:new Date().toISOString(),environment:E,records:G},O=new Date().toISOString().replace(/[:.]/g,"-"),x=f__default.join(l,`transparency-evidence-${O}.json`),B=f__default.join(l,"transparency-evidence.latest.json");if(await _.ensureDir(l),await So(x,H),await So(B,H),o.transparencyEvidenceWritten=true,t.push({id:"sigstore.evidence.write",status:"passed",message:`Transparency evidence written to ${f__default.relative(r,B)}.`}),b?.enabled){let ye=Math.max(1e3,b.timeoutMs??1e4);if(b.target==="file")if(!b.filePath)t.push({id:"sigstore.evidence.export.file",status:"failed",message:"Evidence export target=file requires security.evidenceExport.filePath."});else try{let J=Ce(r,b.filePath);await _.ensureDir(f__default.dirname(J)),await promises.appendFile(J,`${JSON.stringify(H)}
113
- `,"utf-8"),o.evidenceExported=true,o.evidenceExportTarget=J,t.push({id:"sigstore.evidence.export.file",status:"passed",message:`Transparency evidence exported to file sink ${J}.`});}catch(J){t.push({id:"sigstore.evidence.export.file",status:"failed",message:`Evidence file export failed: ${J.message}`});}else if(b.target==="http")if(!b.endpoint)t.push({id:"sigstore.evidence.export.http",status:"failed",message:"Evidence export target=http requires security.evidenceExport.endpoint."});else {let J=Math.max(0,b.retries??0),ee=Math.max(0,b.backoffMs??500),Pe=ks(H,b.signing);Pe.error&&t.push({id:"sigstore.evidence.export.http",status:"failed",message:Pe.error});try{let $e=b.authTokenEnv?process.env[b.authTokenEnv]:void 0,te=false,R=null;for(let S=1;S<=J+1;S+=1)try{if(Pe.error)throw new Error(Pe.error);await ys(b.endpoint,H,ye,$e,Pe.headers),o.evidenceExported=true,o.evidenceExportTarget=b.endpoint,t.push({id:"sigstore.evidence.export.http",status:"passed",message:S>1?`Transparency evidence exported to HTTP endpoint ${b.endpoint} after ${S} attempts.`:`Transparency evidence exported to HTTP endpoint ${b.endpoint}.`}),te=true;break}catch(q){R=q,S<=J&&await Co(ee*S);}if(!te)throw R||new Error("unknown evidence export error")}catch($e){let te=`Evidence HTTP export failed: ${$e.message}`;t.push({id:"sigstore.evidence.export.http",status:"failed",message:te});try{let R=await ws(r,b.deadLetterPath,H,te);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(b.failOnError&&t.some(ee=>ee.status==="failed"&&(ee.id==="sigstore.evidence.export.file"||ee.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 lr(r){return f.join(r,".rapidkit","imported-projects.json")}async function Io(r){let e=lr(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 s=n;return typeof s.name=="string"&&typeof s.path=="string"&&typeof s.stack=="string"&&typeof s.confidence=="string"&&typeof s.importedAt=="string"})}catch{return []}}async function $o(r,e){if(e.length===0)return;let t=await Io(r),o=new Map;for(let c of t)o.set(c.path,c);for(let c of e)o.set(c.path,c);let n=Array.from(o.values()).sort((c,l)=>c.name.localeCompare(l.name)).map(c=>({...c})),s={version:1,updatedAt:new Date().toISOString(),projects:n},i=lr(r);await ___default.ensureDir(f.dirname(i)),await ___default.writeJSON(i,s,{spaces:2});}async function dt(r,e){if(e.length===0)return;let t=await Io(r),o=new Set(e.map(c=>f.resolve(c))),n=t.filter(c=>!o.has(f.resolve(c.path))),s={version:1,updatedAt:new Date().toISOString(),projects:n},i=lr(r);await ___default.ensureDir(f.dirname(i)),await ___default.writeJSON(i,s,{spaces:2});}function Mo(r){return r.trim().toLowerCase().replace(/\.git$/i,"").replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,64)}function xs(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(":"),s=(n[n.length-1]||o).replace(/\.git$/i,"");return Mo(s)||"imported-project"}function dr(r){let e=r.trim();return e.includes("://")||e.startsWith("git@")}function Ss(r){return dr(r)?"git-url":"local-folder"}async function Cs(r,e){let t=Mo(e)||"imported-project",o=0;for(;;){let n=o===0?t:o===1?`${t}-imported`:`${t}-imported-${o}`,s=f__default.join(r,n);if(!await ___default.pathExists(s))return s;o+=1;}}function Rs(r,e){let t=f__default.resolve(r),o=f__default.resolve(e),n=f__default.relative(t,o);return n===""||n.length>0&&!n.startsWith("..")&&!f__default.isAbsolute(n)}function _s(r,e){if(Rs(r,e))throw new Error("Import source must be outside the current workspace root.")}async function Es(r,e){let t={name:e.name,path:e.path,stack:e.stack,confidence:e.confidence,source:e.source,importedAt:new Date().toISOString()};await $o(r,[t]);}async function Oo(r){await ___default.pathExists(r)&&await ___default.remove(r);}async function Do(r,e){await Oo(e),await dt(r,[e]);}async function No(r){let e=f__default.resolve(r.workspacePath),t=r.source.trim(),o=r.sourceType??Ss(t),n=r.name??(o==="git-url"?xs(t):f__default.basename(t)),s=await Cs(e,n),i=false;try{if(o==="local-folder"){let d=f__default.resolve(t),m=await ___default.stat(d).catch(()=>null);if(!m||!m.isDirectory())throw new Error("Import source is not a directory.");_s(e,d),i=true,await ___default.copy(d,s,{overwrite:false,errorOnExist:true});}else i=true,await execa("git",["clone","--depth","1",t,s],{timeout:12e4});let c=e$2(s),l={name:f__default.basename(s),path:s,stack:c.importStack,confidence:c.confidence,source:o};return await Es(e,l),l}catch(c){if(i)try{await Oo(s);}catch(l){let d=c instanceof Error?c.message:String(c),m=l instanceof Error?l.message:String(l);throw new Error(`Import failed: ${d}. Rollback also failed: ${m}`)}throw c}}var Wo="rapidkit-workspace-snapshot-v1",Fo="rapidkit-project-archive-v1",As=[".rapidkit/workspace.json",".rapidkit-workspace","rapidkit.config.json","rapidkit.config.js","rapidkit.config.cjs","rapidkit.config.mjs","package.json"],Is=new Set([".git","node_modules",".venv","dist","build","target","coverage","htmlcov",".next"]),ut={requireReasonForDestructiveOps:false,requireSafetySnapshotForDestructiveOps:true,allowPermanentDelete:true};function tt(r=new Date){return r.toISOString().replace(/[:.]/g,"-")}function ur(r){let e=r.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");if(!e)throw new Error("Snapshot name must contain at least one letter or number.");return e.slice(0,120)}async function $s(r){try{let e=await ___default.readJson(r);return e&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}function Ms(r,e){if(!r)return e;let t=r.trim().toLowerCase();return ["true","yes","1","on"].includes(t)?true:["false","no","0","off"].includes(t)?false:e}async function Os(r){let e=f__default.join(r,".rapidkit","policies.yml");if(!await ___default.pathExists(e))return {...ut};try{let t=await ___default.readFile(e,"utf-8"),o=(n,s)=>{let i=t.match(new RegExp(`^\\s*${n}:\\s*([^#\\n]+)`,"m"));return Ms(i?.[1],s)};return {requireReasonForDestructiveOps:o("require_reason_for_destructive_ops",ut.requireReasonForDestructiveOps),requireSafetySnapshotForDestructiveOps:o("require_safety_snapshot_for_destructive_ops",ut.requireSafetySnapshotForDestructiveOps),allowPermanentDelete:o("allow_permanent_delete",ut.allowPermanentDelete)}}catch{return {...ut}}}function Ds(r){return f__default.join(r,".rapidkit","audit","events.jsonl")}async function Ee(r,e){let t={schema:"rapidkit-workspace-audit-event-v1",id:pr.randomUUID(),timestamp:new Date().toISOString(),workspacePath:r,...e},o=Ds(r);return await ___default.ensureDir(f__default.dirname(o)),await ___default.appendFile(o,`${JSON.stringify(t)}
114
- `,"utf-8"),t}async function Lt(r,e,t){let o=await Os(r);if(o.requireReasonForDestructiveOps&&!t.reason?.trim())throw new Error(`${e} requires --reason by workspace policy.`);if(o.requireSafetySnapshotForDestructiveOps&&t.safetySnapshot===false)throw new Error(`${e} requires a safety snapshot by workspace policy.`);if(t.permanent&&!o.allowPermanentDelete)throw new Error("Permanent project delete is disabled by workspace policy.");return o}function Ns(r=process.cwd()){let e=f__default.resolve(r),t=f__default.resolve(Hr.tmpdir());for(;;){if(e!==t&&(___default.existsSync(f__default.join(e,".rapidkit-workspace"))||___default.existsSync(f__default.join(e,".rapidkit","workspace.json"))))return e;let o=f__default.dirname(e);if(o===e)return null;e=o;}}function Te(r){let e=r?f__default.resolve(r):Ns(process.cwd());if(!e)throw new Error("Not inside a RapidKit workspace. Run from workspace root or pass --workspace.");if(!___default.existsSync(f__default.join(e,".rapidkit-workspace"))&&!___default.existsSync(f__default.join(e,".rapidkit","workspace.json")))throw new Error(`Workspace path is not a RapidKit workspace: ${e}`);return e}async function Ts(r){let e=await $s(f__default.join(r,".rapidkit","workspace.json")),t=e?.workspace_name??e?.name;return typeof t=="string"&&t.trim()?t.trim():f__default.basename(r)}function Kt(r){return f__default.join(r,".rapidkit","snapshots")}function mt(r){return f__default.join(r,".rapidkit","archive","projects")}function mr(r){return f__default.join(r,"files")}function Ws(r){return f__default.join(Hr.tmpdir(),`rapidkit-workspace-snapshot-${process.pid}-${r}-${pr.randomBytes(4).toString("hex")}`)}function fr(r,e){let t=f__default.relative(r,e);if(!t)return true;let o=t.split(f__default.sep);return o[0]===".rapidkit"&&["snapshots","archive","audit"].includes(o[1]||"")?false:!o.some(n=>Is.has(n))}async function Fs(r){return (await a$6(r,{descendIntoMatchedProjects:false})).map(t=>({name:f__default.basename(t),relativePath:f__default.relative(r,t)}))}async function Ls(r,e){let t=[];for(let o of As){let n=f__default.join(r,o);if(!await ___default.pathExists(n))continue;let s=f__default.join(e,o);await ___default.copy(n,s,{filter:i=>fr(r,i)}),t.push(o);}return t}async function Ks(r,e){await ___default.writeJson(f__default.join(r,"snapshot.json"),e,{spaces:2});}async function gr(r){let e=f__default.join(r,"snapshot.json"),t=await ___default.readJson(e);if(!t||typeof t!="object"||t.schema!==Wo)throw new Error(`Invalid RapidKit workspace snapshot manifest: ${e}`);return t}async function Gs(r){let e=0,t=0,o=[r];for(;o.length>0;){let n=o.shift();if(!n)continue;let s=[];try{s=await ___default.readdir(n,{withFileTypes:true});}catch{continue}for(let i of s){let c=f__default.join(n,i.name);if(i.isDirectory()){o.push(c);continue}if(i.isFile())try{let l=await ___default.stat(c);e+=1,t+=l.size;}catch{}}}return {files:e,bytes:t}}async function rt(r={}){let e=Te(r.workspacePath),t=r.name?r.name:`snapshot-${tt()}`,o=ur(t),n=f__default.join(Kt(e),o),s=Ws(o);if(await ___default.pathExists(n))throw new Error(`Snapshot already exists: ${o}`);let i=mr(s);try{await ___default.ensureDir(i);let c=r.includeProjects?"full":"metadata",l=c==="full"?["."]:await Ls(e,i);c==="full"&&await ___default.copy(e,i,{filter:m=>fr(e,m)});let d={schema:Wo,name:o,mode:c,reason:r.reason,createdAt:new Date().toISOString(),workspaceName:await Ts(e),workspacePath:e,copiedPaths:l,projects:await Fs(e)};return await Ks(s,d),await ___default.ensureDir(f__default.dirname(n)),await ___default.move(s,n,{overwrite:false}),await Ee(e,{action:"snapshot.create",target:o,status:"succeeded",reason:r.reason,details:{mode:c,copiedPaths:l,snapshotPath:n,projectCount:d.projects.length}}),{manifest:d,snapshotPath:n}}catch(c){throw await ___default.remove(s),await Ee(e,{action:"snapshot.create",target:o,status:"failed",reason:r.reason,details:{error:c instanceof Error?c.message:String(c)}}),c}}async function Lo(r){let e=Te(r.workspacePath),t=f__default.join(Kt(e),ur(r.name));if(!await ___default.pathExists(t))throw new Error(`Snapshot not found: ${r.name}`);let o=await gr(t),n=mr(t),s=await Gs(n);return {manifest:o,snapshotPath:t,filesRoot:n,estimatedFileCount:s.files,estimatedBytes:s.bytes}}async function Ko(r={}){let e=Te(r.workspacePath),t=Kt(e);if(!await ___default.pathExists(t))return [];let o=await ___default.readdir(t,{withFileTypes:true}),n=[];for(let s of o){if(!s.isDirectory())continue;let i=f__default.join(t,s.name);try{n.push({...await gr(i),snapshotPath:i});}catch{}}return n.sort((s,i)=>i.createdAt.localeCompare(s.createdAt))}async function Go(r){let e=Te(r.workspacePath),t=f__default.join(Kt(e),ur(r.name));if(!await ___default.pathExists(t))throw new Error(`Snapshot not found: ${r.name}`);let o=await gr(t),n=mr(t),s=o.mode==="full"?["."]:Array.from(new Set(o.copiedPaths.map(l=>l.startsWith(".rapidkit/")?".rapidkit":l)));if(r.dryRun)return await Ee(e,{action:"snapshot.restore",target:o.name,status:"planned",reason:r.reason,details:{restoredPaths:s}}),{workspacePath:e,snapshotPath:t,restoredPaths:s,dryRun:true};if(!r.force)throw new Error("Restore is destructive. Re-run with --force after reviewing --dry-run output.");await Lt(e,"snapshot.restore",{reason:r.reason,safetySnapshot:r.safetySnapshot});let i;if(r.safetySnapshot!==false&&(i=(await rt({workspacePath:e,name:`pre-restore-${o.name}-${tt()}`,reason:`Automatic safety snapshot before restoring ${o.name}`,includeProjects:false})).snapshotPath),o.mode==="full")await ___default.copy(n,e,{overwrite:true,errorOnExist:false,filter:l=>fr(n,l)});else for(let l of o.copiedPaths)await ___default.copy(f__default.join(n,l),f__default.join(e,l),{overwrite:true,errorOnExist:false});let c={workspacePath:e,snapshotPath:t,restoredPaths:s,dryRun:false,safetySnapshotPath:i};return await Ee(e,{action:"snapshot.restore",target:o.name,status:"succeeded",reason:r.reason,details:{restoredPaths:s,safetySnapshotPath:i}}),c}function Jo(r){let e=r.trim();if(!e)throw new Error("Project name/path is required.");return e}async function qo(r,e){let t=Jo(e),o=f__default.isAbsolute(t)?f__default.resolve(t):f__default.resolve(r,t);if(o.startsWith(`${f__default.resolve(r)}${f__default.sep}`)&&await ___default.pathExists(o))return o;let s=(await a$6(r,{descendIntoMatchedProjects:false})).filter(i=>{let c=f__default.relative(r,i);return f__default.basename(i)===t||c===t});if(s.length===0)throw new Error(`Project not found in workspace: ${e}`);if(s.length>1)throw new Error(`Project reference is ambiguous: ${e}`);return s[0]}async function hr(r){try{let{syncWorkspaceProjects:e}=await import('./workspace-2JHFIZ3J.js');await e(r,true);}catch{}}function Js(r,e){let t=pr.randomBytes(4).toString("hex");return f__default.join(mt(r),`${e}-${tt()}-${t}`)}async function Uo(r){let e=f__default.join(r,"rapidkit-archive.json"),t=await ___default.readJson(e);if(!t||typeof t!="object"||t.schema!==Fo)throw new Error(`Invalid RapidKit archive manifest: ${e}`);return t}async function yr(r={}){let e=Te(r.workspacePath),t=mt(e);if(!await ___default.pathExists(t))return [];let o=await ___default.readdir(t,{withFileTypes:true}),n=[];for(let s of o){if(!s.isDirectory())continue;let i=f__default.join(t,s.name),c=f__default.join(i,"rapidkit-archive.json");try{n.push({...await Uo(i),archivePath:i,manifestPath:c});}catch{}}return n.sort((s,i)=>i.archivedAt.localeCompare(s.archivedAt))}async function qs(r,e){let t=Jo(e),o=f__default.isAbsolute(t)?f__default.resolve(t):f__default.resolve(mt(r),t);if(o.startsWith(`${f__default.resolve(mt(r))}${f__default.sep}`)&&await ___default.pathExists(f__default.join(o,"rapidkit-archive.json")))return o;let s=(await yr({workspacePath:r})).filter(i=>f__default.basename(i.archivePath)===t||i.projectName===t||f__default.relative(mt(r),i.archivePath)===t);if(s.length===0)throw new Error(`Archived project not found: ${e}`);if(s.length>1)throw new Error(`Archive reference is ambiguous: ${e}`);return s[0].archivePath}async function wr(r){let e=Te(r.workspacePath),t=await qo(e,r.project),o=f__default.basename(t),n=Js(e,o),s=f__default.join(n,"rapidkit-archive.json");if(r.dryRun)return await Ee(e,{action:"project.archive",target:o,status:"planned",reason:r.reason,details:{projectPath:t,archivePath:n}}),{workspacePath:e,projectName:o,projectPath:t,action:"archive",archivePath:n,manifestPath:s,dryRun:true};await Lt(e,"project.archive",{reason:r.reason,safetySnapshot:true});let i=await rt({workspacePath:e,name:`pre-archive-${o}-${tt()}`,reason:r.reason||`Automatic safety snapshot before archiving ${o}`,includeProjects:false});await ___default.ensureDir(f__default.dirname(n)),await ___default.move(t,n,{overwrite:false});let c={schema:Fo,projectName:o,originalPath:t,archivedPath:n,reason:r.reason,archivedAt:new Date().toISOString(),safetySnapshotPath:i.snapshotPath};return await ___default.writeJson(s,c,{spaces:2}),await dt(e,[t]),await hr(e),await Ee(e,{action:"project.archive",target:o,status:"succeeded",reason:r.reason,details:{projectPath:t,archivePath:n,manifestPath:s,safetySnapshotPath:i.snapshotPath}}),{workspacePath:e,projectName:o,projectPath:t,action:"archive",archivePath:n,manifestPath:s,safetySnapshotPath:i.snapshotPath,dryRun:false}}async function Bo(r){if(!r.permanent)return wr(r);let e=Te(r.workspacePath),t=await qo(e,r.project),o=f__default.basename(t);if(r.confirm!==o)throw new Error(`Permanent delete requires --confirm ${o}`);if(r.dryRun)return await Ee(e,{action:"project.delete",target:o,status:"planned",reason:r.reason,details:{projectPath:t,permanent:true}}),{workspacePath:e,projectName:o,projectPath:t,action:"delete",dryRun:true};await Lt(e,"project.delete",{reason:r.reason,permanent:true,safetySnapshot:true});let n=await rt({workspacePath:e,name:`pre-delete-${o}-${tt()}`,reason:r.reason||`Automatic safety snapshot before deleting ${o}`,includeProjects:false});return await ___default.remove(t),await dt(e,[t]),await hr(e),await Ee(e,{action:"project.delete",target:o,status:"succeeded",reason:r.reason,details:{projectPath:t,permanent:true,safetySnapshotPath:n.snapshotPath}}),{workspacePath:e,projectName:o,projectPath:t,action:"delete",safetySnapshotPath:n.snapshotPath,dryRun:false}}async function Ho(r){let e=Te(r.workspacePath),t=await qs(e,r.archive),o=await Uo(t),n=r.targetName?.trim()||o.projectName,s=f__default.join(e,n);if(!s.startsWith(`${f__default.resolve(e)}${f__default.sep}`))throw new Error(`Archive restore target escapes workspace: ${n}`);if(await ___default.pathExists(s)&&!r.force)throw new Error(`Project path already exists. Re-run with --force to overwrite: ${s}`);if(r.dryRun)return await Ee(e,{action:"project.restore",target:n,status:"planned",reason:r.reason,details:{archivePath:t,projectPath:s}}),{workspacePath:e,projectName:n,projectPath:s,action:"restore",archivePath:t,manifestPath:f__default.join(t,"rapidkit-archive.json"),dryRun:true};await Lt(e,"project.restore",{reason:r.reason,safetySnapshot:true});let i=await rt({workspacePath:e,name:`pre-restore-project-${n}-${tt()}`,reason:r.reason||`Automatic safety snapshot before restoring ${n}`,includeProjects:false});return await ___default.move(t,s,{overwrite:r.force===true}),await hr(e),await Ee(e,{action:"project.restore",target:n,status:"succeeded",reason:r.reason,details:{archivePath:t,projectPath:s,safetySnapshotPath:i.snapshotPath}}),{workspacePath:e,projectName:n,projectPath:s,action:"restore",archivePath:t,manifestPath:f__default.join(s,"rapidkit-archive.json"),safetySnapshotPath:i.snapshotPath,dryRun:false}}function kr(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 Hs(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 gt(r){let e=r.trim().toLowerCase();return e.startsWith("gogin")||e==="gin"}function ht(r){let e=r.trim().toLowerCase();return e.startsWith("springboot")||e==="spring"||e==="springboot"||e==="java"}function ve(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 Er(){return d$2()}function Yo(){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$1()),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 Vs(r){return f$2(f__default.join(r,".venv"))}async function dn(r,e){return await K(r,["--version"],e)===0}async function vr(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 s=f__default.join(r,"package.json");if(await ___default.pathExists(s))return "node";let i=f__default.join(r,"pyproject.toml"),c=f__default.join(r,"requirements.txt"),l=f__default.join(r,"poetry.lock");return await ___default.pathExists(i)||await ___default.pathExists(c)||await ___default.pathExists(l)?"python":null}async function Ys(r){for(let e of Er())if(await K(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],r)===0)return 0;return 1}async function pn(r){for(let e of Er())if(await K(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],r)===0)return 0;return 1}async function zs(r){let e=f$2(f__default.join(r,".venv"));if(!await ___default.pathExists(e)){let s=await pn(r);if(s!==0)return s}if(!await dn("poetry",r))return 0;let o=await K("poetry",["config","virtualenvs.in-project","true","--local"],r);if(o!==0)return o;let n=await K("poetry",["env","use",e],r);return n!==0?n:0}async function Qs(r){let e=f$2(f__default.join(r,".venv"));if(!await ___default.pathExists(e)){let n=await pn(r);if(n!==0)return n}await K(e,["-m","pip","install","--upgrade","pip","setuptools","wheel"],r);let t=f__default.join(r,"requirements.txt");if(await ___default.pathExists(t)&&await K(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 K(e,["-m","pip","install","-e","."],r)===0||await K(e,["-m","pip","install","."],r)===0)?0:1}async function Pr(r,e){return await zs(r)!==0&&console.log(a$4.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(a$4.yellow("\u26A0\uFE0F Python init fallback: installing dependencies directly into project .venv")),await Qs(r))}async function br(r){let e=await yt("init",r);if(e===0)return 0;let t=["npm","pnpm","yarn"];for(let o of t){if(!await dn(o,r))continue;if(await K(o,["install"],r)===0)return console.log(a$4.green(`\u2705 Node init fallback succeeded with ${o} install`)),0}return e}async function zo(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>]
115
- `),1;try{Ve(t);}catch(i){let c=i instanceof Error?i.message:String(i);return process.stderr.write(`${c}
116
- `),1}let o=ve(r,"--output")||process.cwd(),n=f__default.resolve(o,t),s=r.includes("--skip-git")||r.includes("--no-git");try{let{default:i}=await import('fs-extra');if(await i.ensureDir(f__default.dirname(n)),await i.pathExists(n))return process.stderr.write(`\u274C Directory "${n}" already exists
117
- `),1;await i.ensureDir(n);let{generateGoFiberKit:c}=await import('./gofiber-standard-TFPNBIMS.js');await c(n,{project_name:t,module_path:t,skipGit:s});let l=Y(process.cwd());if(l){let{syncWorkspaceProjects:d}=await import('./workspace-2JHFIZ3J.js');await d(l,true);}return 0}catch(i){return process.stderr.write(`RapidKit Go/Fiber generator failed: ${i?.message??i}
118
- `),1}}async function Qo(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>]
119
- `),1;try{Ve(t);}catch(i){let c=i instanceof Error?i.message:String(i);return process.stderr.write(`${c}
120
- `),1}let o=ve(r,"--output")||process.cwd(),n=f__default.resolve(o,t),s=r.includes("--skip-git")||r.includes("--no-git");try{let{default:i}=await import('fs-extra');if(await i.ensureDir(f__default.dirname(n)),await i.pathExists(n))return process.stderr.write(`\u274C Directory "${n}" already exists
121
- `),1;await i.ensureDir(n);let{generateGoGinKit:c}=await import('./gogin-standard-7UJ2OBYL.js');await c(n,{project_name:t,module_path:t,skipGit:s});let l=Y(process.cwd());if(l){let{syncWorkspaceProjects:d}=await import('./workspace-2JHFIZ3J.js');await d(l,true);}return 0}catch(i){return process.stderr.write(`RapidKit Go/Gin generator failed: ${i?.message??i}
122
- `),1}}async function Zo(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>]
123
- `),1;try{Ve(t);}catch(g){let y=g instanceof Error?g.message:String(g);return process.stderr.write(`${y}
124
- `),1}let o=ve(r,"--output")||process.cwd(),n=f__default.resolve(o,t),s=r.includes("--skip-git")||r.includes("--no-git"),i=ve(r,"--java-version"),c=ve(r,"--spring-boot-version"),l=ve(r,"--springdoc-version"),d=ve(r,"--group-id"),m=ve(r,"--package-name"),p=ve(r,"--description"),u=ve(r,"--port"),h=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
125
- `),1;if(c&&!h(c.trim()))return process.stderr.write(`Invalid --spring-boot-version. Expected semantic version, e.g. 3.5.0
126
- `),1;if(l&&!h(l.trim()))return process.stderr.write(`Invalid --springdoc-version. Expected semantic version, e.g. 2.8.9
127
- `),1;if(d&&!/^[A-Za-z0-9_.-]+$/.test(d.trim()))return process.stderr.write(`Invalid --group-id. Use dot-separated Java package identifiers only.
128
- `),1;if(m&&!/^[A-Za-z0-9_.-]+$/.test(m.trim()))return process.stderr.write(`Invalid --package-name. Use dot-separated Java package identifiers only.
129
- `),1;if(u&&!/^\d+$/.test(u.trim()))return process.stderr.write(`Invalid --port. Expected numeric TCP port, e.g. 8080
130
- `),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
131
- `),1;await g.ensureDir(n);let{generateSpringBootKit:y}=await import('./springboot-standard-H6GYMH3P.js');await y(n,{project_name:t,artifact_id:t,java_version:i?.trim(),spring_boot_version:c?.trim(),springdoc_version:l?.trim(),group_id:d?.trim(),package_name:m?.trim(),description:p?.trim(),port:u?.trim(),skipGit:s});let P=Y(process.cwd());if(P){let{syncWorkspaceProjects:w}=await import('./workspace-2JHFIZ3J.js');await w(P,true);}return 0}catch(g){return process.stderr.write(`RapidKit Spring Boot generator failed: ${g?.message??g}
132
- `),1}}async function jr(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\`.
118
+ `)),console.log(s.bold(`Workspace: ${s.cyan(y__default.basename(e.workspacePath))}`)),console.log(s.gray(`Path: ${e.workspacePath}`)),console.log(`Overall: ${Ws(e.overallStatus)}`);for(let r of e.gates){console.log(` - ${r.gate}: ${Ts(r.status)} ${r.summary}`);for(let o of r.details)console.log(s.gray(` ${o}`));r.evidencePath&&console.log(s.gray(` evidence: ${r.evidencePath}`));}e.evidencePath&&console.log(s.gray(`
119
+ Evidence saved: ${e.evidencePath}`));}t.strict&&e.overallStatus!=="pass"&&process.exit(1);}async function Js(t){let e=await promises.readFile(t);return createHash("sha256").update(e).digest("hex")}async function Fo(t,e){await _.outputFile(t,`${JSON.stringify(e,null,2)}
120
+ `,"utf-8");}function Re(t,e){return y__default.isAbsolute(e)?e:y__default.join(t,e)}function Gs(t,e){if(t.target)return t.target;if(t.source)return y__default.basename(t.source);if(t.url)try{let r=new URL(t.url).pathname,o=y__default.basename(r);if(o&&o!=="/")return o}catch{}return `${e}.artifact`}async function qs(t){let e=y__default.join(t,".rapidkit","trusted-sources.lock"),r=new Set(["localhost","127.0.0.1"]);if(!await _.pathExists(e))return r;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)r.add(i.toLowerCase());}catch{}return r}async function Bs(t,e,r){await _.ensureDir(y__default.dirname(e)),await new Promise((o,n)=>{let c=(t.startsWith("https://")?qo:Go).get(t,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",f=>{n(f);});});c.setTimeout(r,()=>{c.destroy(new Error(`Request timeout after ${r}ms`));}),c.on("error",a=>{n(a);});});}async function Us(t,e,r,o,n){let i=new URL(t),c=JSON.stringify(e),a=i.protocol==="https:"?qo:Go;await new Promise((l,f)=>{let p=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(c),...o?{Authorization:`Bearer ${o}`}:{},...n||{}}},d=>{if(!d.statusCode||d.statusCode<200||d.statusCode>=300){f(new Error(`HTTP ${d.statusCode||"unknown"}`)),d.resume();return}d.resume(),l();});p.setTimeout(r,()=>{p.destroy(new Error(`Request timeout after ${r}ms`));}),p.on("error",d=>{f(d);}),p.write(c),p.end();});}function Lo(t){return new Promise(e=>setTimeout(e,t))}async function Vs(t,e,r,o){let n=Re(t,e||".rapidkit/reports/evidence-export-dead-letter.ndjson");return await _.ensureDir(y__default.dirname(n)),await promises.appendFile(n,`${JSON.stringify({timestamp:new Date().toISOString(),reason:o,payload:r})}
121
+ `,"utf-8"),n}function Hs(t,e){if(!e?.enabled)return {headers:{}};let r=process.env[e.hmacKeyEnv];if(!r)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,r).update(JSON.stringify(t)).digest("hex");return {headers:{[n]:i,"x-rapidkit-evidence-signature-alg":o}}}async function zs(t,e,r){let o=(r.algorithm||"sha256").toLowerCase(),n=Re(t,r.publicKeyPath);if(!await _.pathExists(n))return {verified:false,algorithm:o,publicKeyPath:n,publicKeyFingerprint:"",signature:r.signature,message:`Public key not found: ${n}`};try{let i=await promises.readFile(n,"utf-8"),c=await promises.readFile(e),a=createVerify(o);a.update(c),a.end();let l=Buffer.from(r.signature,"base64"),f=a.verify(i,l),p=createHash("sha256").update(i).digest("hex");return {verified:f,algorithm:o,publicKeyPath:n,publicKeyFingerprint:p,signature:r.signature,message:f?"Attestation verified.":"Attestation signature verification failed."}}catch(i){return {verified:false,algorithm:o,publicKeyPath:n,publicKeyFingerprint:"",signature:r.signature,message:`Attestation verification error: ${i.message}`}}}async function Ys(t,e,r,o){let n=process.env.RAPIDKIT_SIGSTORE_MOCK;if(n==="success")return {verified:true,tlogVerified:o.requireTransparencyLog,message:"Sigstore verification passed (mock).",identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:r.bundlePath||null,certificatePath:r.certificatePath||null,signaturePath:r.signaturePath||null};if(n==="fail")return {verified:false,tlogVerified:false,message:"Sigstore verification failed (mock).",identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:r.bundlePath||null,certificatePath:r.certificatePath||null,signaturePath:r.signaturePath||null};let i=r.signaturePath?Re(t,r.signaturePath):null;if(!i||!await _.pathExists(i))return {verified:false,tlogVerified:false,message:"Sigstore signaturePath is missing or not found.",identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:r.bundlePath||null,certificatePath:r.certificatePath||null,signaturePath:i};let c=["verify-blob",e,"--signature",i],a=r.certificatePath?Re(t,r.certificatePath):null;a&&c.push("--certificate",a);let l=r.bundlePath?Re(t,r.bundlePath):null;l&&c.push("--bundle",l);let f=r.keyPath?Re(t,r.keyPath):null;f&&c.push("--key",f),r.identity&&c.push("--certificate-identity",r.identity),r.issuer&&c.push("--certificate-oidc-issuer",r.issuer),r.rekorUrl&&c.push("--rekor-url",r.rekorUrl),o.requireTransparencyLog||c.push("--insecure-ignore-tlog");try{let p=await execa("cosign",c,{reject:false});return p.exitCode===0?{verified:true,tlogVerified:o.requireTransparencyLog,message:"Sigstore verification passed.",identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:l,certificatePath:a,signaturePath:i}:{verified:false,tlogVerified:false,message:`Sigstore verification failed: ${p.stderr||p.stdout||"unknown error"}`,identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:l,certificatePath:a,signaturePath:i}}catch(p){return {verified:false,tlogVerified:false,message:`Sigstore verification error: ${p.message}`,identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:l,certificatePath:a,signaturePath:i}}}async function Qs(t,e){let r=e.algorithm||"sha256",o=Re(t,e.policyPath),n=Re(t,e.signaturePath),i=Re(t,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 c=await promises.readFile(o,"utf-8"),a=(await promises.readFile(n,"utf-8")).trim(),l=await promises.readFile(i,"utf-8"),f=createVerify(r);return f.update(c),f.end(),f.verify(l,Buffer.from(a,"base64"))?{verified:true,message:"Governance policy bundle verified.",policies:JSON.parse(c).policies||{}}:{verified:false,message:"Governance policy bundle signature verification failed.",policies:null}}catch(c){return {verified:false,message:`Governance policy bundle verification error: ${c.message}`,policies:null}}}async function gr(t,e){let r=[],o={syncedArtifacts:0,verifiedArtifacts:0,rotatedFiles:0,lockWritten:false,governanceBundleVerified:false,transparencyEvidenceWritten:false,transparencyEvidenceRecords:0,evidenceExported:false,evidenceExportTarget:null},n=y__default.join(t,".rapidkit"),i=y__default.join(n,"mirror-config.json"),c=y__default.join(n,"mirror.lock"),a=y__default.join(n,"mirror","artifacts"),l=y__default.join(n,"reports"),f=await qs(t);if(!await _.pathExists(i))return r.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: .rapidkit/mirror-config.json not found."}),{checks:r,details:o};let p={};try{p=JSON.parse(await promises.readFile(i,"utf-8"));}catch{return r.push({id:"mirror.lifecycle.config",status:"failed",message:"Mirror lifecycle failed: invalid JSON in mirror-config.json."}),{checks:r,details:o}}if(!(e.forceRun===true||e.ciMode||e.offlineMode||p.mode==="offline-only"))return r.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: not in ci/offline mode."}),{checks:r,details:o};await _.ensureDir(a);let m=Math.max(0,p.prefetch?.retries??2),g=Math.max(0,p.prefetch?.backoffMs??250),u=Math.max(1e3,p.prefetch?.timeoutMs??15e3),h=p.security?.requireAttestation===true,k=p.security?.requireSigstore===true,w=p.security?.requireTransparencyLog===true,S=p.security?.requireSignedGovernance===true,b=p.security?.evidenceExport,j=(process.env.RAPIDKIT_ENV||p.security?.governance?.environment||"dev").toLowerCase(),A=p.security?.governance?.policies||{};if(p.security?.governanceBundle){let z=await Qs(t,p.security.governanceBundle);if(r.push({id:"governance.bundle.verify",status:z.verified?"passed":"failed",message:z.message}),z.verified&&z.policies)A=z.policies,o.governanceBundleVerified=true;else if(S)return {checks:r,details:o}}let D=A[j],me=w||D?.requireTransparencyLog===true,G=[],M=Array.isArray(p.artifacts)?p.artifacts:[],Pe=[];for(let z=0;z<M.length;z+=1){let N=M[z],x=N.id||`artifact-${z+1}`,H=N.source?Re(t,N.source):null,ye=Gs(N,x),B=y__default.join(a,ye),oe=false,be={sourceType:"path",source:H||N.url||"unknown",host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true};if(H&&await _.pathExists(H))await _.ensureDir(y__default.dirname(B)),await _.copyFile(H,B),o.syncedArtifacts+=1,oe=true,be={sourceType:"path",source:H,host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true},r.push({id:`mirror.sync.${x}`,status:"passed",message:`Mirrored artifact ${x} from source path.`});else if(N.url){let pe="";try{pe=new URL(N.url).hostname.toLowerCase();}catch{r.push({id:`mirror.prefetch.${x}`,status:"failed",message:`Invalid URL for ${x}: ${N.url}`});continue}if(!(process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||f.has(pe))){r.push({id:`mirror.prefetch.trust.${x}`,status:"failed",message:`Untrusted mirror host for ${x}: ${pe}. Add host to .rapidkit/trusted-sources.lock or set RAPIDKIT_TRUSTED_SOURCES=1.`});continue}if(e.offlineMode&&(await _.pathExists(B)?(oe=true,be={sourceType:"url",source:N.url,host:pe,fetchedAt:new Date().toISOString(),attempts:0,trusted:true},r.push({id:`mirror.prefetch.${x}`,status:"passed",message:`Offline mode reused existing mirrored artifact ${x}.`})):r.push({id:`mirror.prefetch.${x}`,status:"failed",message:`Offline mode cannot prefetch remote artifact ${x} without an existing mirrored copy.`}),!oe))continue;if(!oe){let Y=null,Ee=0;for(let Je=1;Je<=m+1;Je+=1){Ee=Je;try{await Bs(N.url,B,u),o.syncedArtifacts+=1,oe=true,be={sourceType:"url",source:N.url,host:pe,fetchedAt:new Date().toISOString(),attempts:Ee,trusted:true},r.push({id:`mirror.prefetch.${x}`,status:"passed",message:Ee>1?`Prefetched artifact ${x} from ${pe} after ${Ee} attempts.`:`Prefetched artifact ${x} from ${pe}.`});break}catch(ct){if(Y=ct,Je<=m){await Lo(g*Je);continue}}}if(!oe){r.push({id:`mirror.prefetch.${x}`,status:"failed",message:`Failed to prefetch ${x} after ${m+1} attempt(s): ${Y?.message||"unknown error"}`});continue}}if(!oe){r.push({id:`mirror.prefetch.${x}`,status:"failed",message:`Failed to prefetch ${x}.`});continue}}if(!oe){N.required||e.offlineMode?r.push({id:`mirror.sync.${x}`,status:"failed",message:`Mirror source missing for ${x}${H?`: ${H}`:""}`}):r.push({id:`mirror.sync.${x}`,status:"skipped",message:`Mirror source not found for optional artifact ${x}.`});continue}let Me=await Js(B);if(N.sha256&&N.sha256.toLowerCase()!==Me.toLowerCase()){r.push({id:`mirror.verify.${x}`,status:"failed",message:`Checksum mismatch for ${x}.`});continue}o.verifiedArtifacts+=1,r.push({id:`mirror.verify.${x}`,status:"passed",message:`Checksum verified for ${x}.`});let ne=N.attestation?await zs(t,B,N.attestation):null;if(N.attestation){if(r.push({id:`mirror.attest.${x}`,status:ne?.verified?"passed":"failed",message:ne?.message||"Attestation verification failed."}),!ne?.verified)continue}else if(h){r.push({id:`mirror.attest.${x}`,status:"failed",message:`Attestation is required but missing for ${x}.`});continue}else r.push({id:`mirror.attest.${x}`,status:"skipped",message:`No attestation provided for ${x}.`});let E=N.attestation?.sigstore,C=E?await Ys(t,B,E,{requireTransparencyLog:me}):null;if(E){if(r.push({id:`mirror.sigstore.${x}`,status:C?.verified?"passed":"failed",message:C?.message||"Sigstore verification failed."}),G.push({artifactId:x,verified:!!C?.verified,tlogVerified:!!C?.tlogVerified,identity:C?.identity||null,issuer:C?.issuer||null,rekorUrl:C?.rekorUrl||null,timestamp:new Date().toISOString(),environment:j}),!C?.verified)continue}else if(k){r.push({id:`mirror.sigstore.${x}`,status:"failed",message:`Sigstore attestation is required but missing for ${x}.`});continue}else r.push({id:`mirror.sigstore.${x}`,status:"skipped",message:`No Sigstore attestation provided for ${x}.`});if(E&&C?.verified&&D){let pe=D.allowedIdentities||[];if(pe.length>0){let Y=!!C.identity&&pe.includes(C.identity);if(r.push({id:`mirror.sigstore.policy.identity.${x}`,status:Y?"passed":"failed",message:Y?`Sigstore identity policy passed for ${x} in ${j}.`:`Sigstore identity policy failed for ${x} in ${j}.`}),!Y)continue}let fe=D.allowedIssuers||[];if(fe.length>0){let Y=!!C.issuer&&fe.includes(C.issuer);if(r.push({id:`mirror.sigstore.policy.issuer.${x}`,status:Y?"passed":"failed",message:Y?`Sigstore issuer policy passed for ${x} in ${j}.`:`Sigstore issuer policy failed for ${x} in ${j}.`}),!Y)continue}let je=D.allowedRekorUrls||[];if(je.length>0){let Y=!!C.rekorUrl&&je.includes(C.rekorUrl);if(r.push({id:`mirror.sigstore.policy.rekor.${x}`,status:Y?"passed":"failed",message:Y?`Sigstore Rekor policy passed for ${x} in ${j}.`:`Sigstore Rekor policy failed for ${x} in ${j}.`}),!Y)continue}}else D&&r.push({id:`mirror.sigstore.policy.${x}`,status:"skipped",message:`Sigstore governance policy configured for ${j} but no verified Sigstore attestation for ${x}.`});let U=await promises.stat(B);Pe.push({id:x,path:y__default.relative(t,B),sha256:Me,size:U.size,provenance:be,attestation:{detached:{provided:!!N.attestation,verified:ne?.verified||false,algorithm:ne?.algorithm||null,publicKeyPath:ne?.publicKeyPath||null,publicKeyFingerprint:ne?.publicKeyFingerprint||null,signature:ne?.signature||null,verifiedAt:ne?.verified?new Date().toISOString():null},sigstore:{provided:!!E,verified:C?.verified||false,tlogVerified:C?.tlogVerified||false,identity:C?.identity||null,issuer:C?.issuer||null,rekorUrl:C?.rekorUrl||null,bundlePath:C?.bundlePath||null,certificatePath:C?.certificatePath||null,signaturePath:C?.signaturePath||null,verifiedAt:C?.verified?new Date().toISOString():null}}});}let Q=p.retention?.keepLast;if(typeof Q=="number"&&Q>0){let N=(await promises.readdir(a,{withFileTypes:true})).filter(x=>x.isFile()).map(x=>y__default.join(a,x.name));if(N.length>Q){let x=await Promise.all(N.map(async ye=>({filePath:ye,stat:await promises.stat(ye)})));x.sort((ye,B)=>B.stat.mtimeMs-ye.stat.mtimeMs);let H=x.slice(Q);for(let ye of H)await promises.unlink(ye.filePath),o.rotatedFiles+=1;}}r.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 q={schemaVersion:"1.0",generatedAt:new Date().toISOString(),mode:p.mode||null,environment:j,artifacts:Pe};if(await promises.writeFile(c,`${JSON.stringify(q,null,2)}
122
+ `,"utf-8"),o.lockWritten=true,r.push({id:"mirror.lock.write",status:"passed",message:`Mirror lock updated at ${y__default.relative(t,c)}.`}),o.transparencyEvidenceRecords=G.length,G.length>0){let z={schemaVersion:"1.0",generatedAt:new Date().toISOString(),environment:j,records:G},N=new Date().toISOString().replace(/[:.]/g,"-"),x=y__default.join(l,`transparency-evidence-${N}.json`),H=y__default.join(l,"transparency-evidence.latest.json");if(await _.ensureDir(l),await Fo(x,z),await Fo(H,z),o.transparencyEvidenceWritten=true,r.push({id:"sigstore.evidence.write",status:"passed",message:`Transparency evidence written to ${y__default.relative(t,H)}.`}),b?.enabled){let ye=Math.max(1e3,b.timeoutMs??1e4);if(b.target==="file")if(!b.filePath)r.push({id:"sigstore.evidence.export.file",status:"failed",message:"Evidence export target=file requires security.evidenceExport.filePath."});else try{let B=Re(t,b.filePath);await _.ensureDir(y__default.dirname(B)),await promises.appendFile(B,`${JSON.stringify(z)}
123
+ `,"utf-8"),o.evidenceExported=true,o.evidenceExportTarget=B,r.push({id:"sigstore.evidence.export.file",status:"passed",message:`Transparency evidence exported to file sink ${B}.`});}catch(B){r.push({id:"sigstore.evidence.export.file",status:"failed",message:`Evidence file export failed: ${B.message}`});}else if(b.target==="http")if(!b.endpoint)r.push({id:"sigstore.evidence.export.http",status:"failed",message:"Evidence export target=http requires security.evidenceExport.endpoint."});else {let B=Math.max(0,b.retries??0),oe=Math.max(0,b.backoffMs??500),be=Hs(z,b.signing);be.error&&r.push({id:"sigstore.evidence.export.http",status:"failed",message:be.error});try{let Me=b.authTokenEnv?process.env[b.authTokenEnv]:void 0,ne=false,E=null;for(let C=1;C<=B+1;C+=1)try{if(be.error)throw new Error(be.error);await Us(b.endpoint,z,ye,Me,be.headers),o.evidenceExported=true,o.evidenceExportTarget=b.endpoint,r.push({id:"sigstore.evidence.export.http",status:"passed",message:C>1?`Transparency evidence exported to HTTP endpoint ${b.endpoint} after ${C} attempts.`:`Transparency evidence exported to HTTP endpoint ${b.endpoint}.`}),ne=true;break}catch(U){E=U,C<=B&&await Lo(oe*C);}if(!ne)throw E||new Error("unknown evidence export error")}catch(Me){let ne=`Evidence HTTP export failed: ${Me.message}`;r.push({id:"sigstore.evidence.export.http",status:"failed",message:ne});try{let E=await Vs(t,b.deadLetterPath,z,ne);r.push({id:"sigstore.evidence.export.deadletter",status:"passed",message:`Evidence export failure persisted to dead-letter sink ${E}.`});}catch(E){r.push({id:"sigstore.evidence.export.deadletter",status:"failed",message:`Evidence dead-letter write failed: ${E.message}`});}}}if(b.failOnError&&r.some(oe=>oe.status==="failed"&&(oe.id==="sigstore.evidence.export.file"||oe.id==="sigstore.evidence.export.http")))return {checks:r,details:o}}else r.push({id:"sigstore.evidence.export",status:"skipped",message:"Central evidence export not configured (security.evidenceExport.enabled=false)."});}else r.push({id:"sigstore.evidence.write",status:"skipped",message:"No Sigstore records available for transparency evidence output."}),r.push({id:"sigstore.evidence.export",status:"skipped",message:"Central evidence export skipped because no transparency evidence records exist."});return {checks:r,details:o}}function hr(t){return y.join(t,".rapidkit","imported-projects.json")}async function Bo(t){let e=hr(t);if(!await ___default.pathExists(e))return [];try{let r=await ___default.readJSON(e);return (Array.isArray(r?.projects)?r.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 Uo(t,e){if(e.length===0)return;let r=await Bo(t),o=new Map;for(let a of r)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},c=hr(t);await ___default.ensureDir(y.dirname(c)),await ___default.writeJSON(c,i,{spaces:2});}async function gt(t,e){if(e.length===0)return;let r=await Bo(t),o=new Set(e.map(a=>y.resolve(a))),n=r.filter(a=>!o.has(y.resolve(a.path))),i={version:1,updatedAt:new Date().toISOString(),projects:n},c=hr(t);await ___default.ensureDir(y.dirname(c)),await ___default.writeJSON(c,i,{spaces:2});}function Vo(t){return t.trim().toLowerCase().replace(/\.git$/i,"").replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,64)}function Xs(t){let e=t.trim();if(!e)return "imported-project";let r=e.replace(/\\/g,"/").replace(/\/+$/,"").split("/"),o=r[r.length-1]||e,n=o.split(":"),i=(n[n.length-1]||o).replace(/\.git$/i,"");return Vo(i)||"imported-project"}function yr(t){let e=t.trim();return e.includes("://")||e.startsWith("git@")}function ei(t){return yr(t)?"git-url":"local-folder"}async function ti(t,e){let r=Vo(e)||"imported-project",o=0;for(;;){let n=o===0?r:o===1?`${r}-imported`:`${r}-imported-${o}`,i=y__default.join(t,n);if(!await ___default.pathExists(i))return i;o+=1;}}function ri(t,e){let r=y__default.resolve(t),o=y__default.resolve(e),n=y__default.relative(r,o);return n===""||n.length>0&&!n.startsWith("..")&&!y__default.isAbsolute(n)}function oi(t,e){if(ri(t,e))throw new Error("Import source must be outside the current workspace root.")}async function ni(t,e){let r={name:e.name,path:e.path,stack:e.stack,confidence:e.confidence,source:e.source,importedAt:new Date().toISOString()};await Uo(t,[r]);}async function Ho(t){await ___default.pathExists(t)&&await ___default.remove(t);}async function zo(t,e){await Ho(e),await gt(t,[e]);}async function Yo(t){let e=y__default.resolve(t.workspacePath),r=t.source.trim(),o=t.sourceType??ei(r),n=t.name??(o==="git-url"?Xs(r):y__default.basename(r)),i=await ti(e,n),c=false;try{if(o==="local-folder"){let f=y__default.resolve(r),p=await ___default.stat(f).catch(()=>null);if(!p||!p.isDirectory())throw new Error("Import source is not a directory.");oi(e,f),c=true,await ___default.copy(f,i,{overwrite:false,errorOnExist:true});}else c=true,await execa("git",["clone","--depth","1",r,i],{timeout:12e4});let a=e$2(i),l={name:y__default.basename(i),path:i,stack:a.importStack,confidence:a.confidence,source:o};return await ni(e,l),l}catch(a){if(c)try{await Ho(i);}catch(l){let f=a instanceof Error?a.message:String(a),p=l instanceof Error?l.message:String(l);throw new Error(`Import failed: ${f}. Rollback also failed: ${p}`)}throw a}}var Zo="rapidkit-workspace-snapshot-v1",Xo="rapidkit-project-archive-v1",si=[".rapidkit/workspace.json",".rapidkit-workspace","rapidkit.config.json","rapidkit.config.js","rapidkit.config.cjs","rapidkit.config.mjs","package.json"],ii=new Set([".git","node_modules",".venv","dist","build","target","coverage","htmlcov",".next"]),yt={requireReasonForDestructiveOps:false,requireSafetySnapshotForDestructiveOps:true,allowPermanentDelete:true};function st(t=new Date){return t.toISOString().replace(/[:.]/g,"-")}function kr(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");if(!e)throw new Error("Snapshot name must contain at least one letter or number.");return e.slice(0,120)}async function ai(t){try{let e=await ___default.readJson(t);return e&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}function ci(t,e){if(!t)return e;let r=t.trim().toLowerCase();return ["true","yes","1","on"].includes(r)?true:["false","no","0","off"].includes(r)?false:e}async function li(t){let e=y__default.join(t,".rapidkit","policies.yml");if(!await ___default.pathExists(e))return {...yt};try{let r=await ___default.readFile(e,"utf-8"),o=(n,i)=>{let c=r.match(new RegExp(`^\\s*${n}:\\s*([^#\\n]+)`,"m"));return ci(c?.[1],i)};return {requireReasonForDestructiveOps:o("require_reason_for_destructive_ops",yt.requireReasonForDestructiveOps),requireSafetySnapshotForDestructiveOps:o("require_safety_snapshot_for_destructive_ops",yt.requireSafetySnapshotForDestructiveOps),allowPermanentDelete:o("allow_permanent_delete",yt.allowPermanentDelete)}}catch{return {...yt}}}function di(t){return y__default.join(t,".rapidkit","audit","events.jsonl")}async function Ae(t,e){let r={schema:"rapidkit-workspace-audit-event-v1",id:wr.randomUUID(),timestamp:new Date().toISOString(),workspacePath:t,...e},o=di(t);return await ___default.ensureDir(y__default.dirname(o)),await ___default.appendFile(o,`${JSON.stringify(r)}
124
+ `,"utf-8"),r}async function Vt(t,e,r){let o=await li(t);if(o.requireReasonForDestructiveOps&&!r.reason?.trim())throw new Error(`${e} requires --reason by workspace policy.`);if(o.requireSafetySnapshotForDestructiveOps&&r.safetySnapshot===false)throw new Error(`${e} requires a safety snapshot by workspace policy.`);if(r.permanent&&!o.allowPermanentDelete)throw new Error("Permanent project delete is disabled by workspace policy.");return o}function pi(t=process.cwd()){let e=y__default.resolve(t),r=y__default.resolve(to.tmpdir());for(;;){if(e!==r&&(___default.existsSync(y__default.join(e,".rapidkit-workspace"))||___default.existsSync(y__default.join(e,".rapidkit","workspace.json"))))return e;let o=y__default.dirname(e);if(o===e)return null;e=o;}}function Fe(t){let e=t?y__default.resolve(t):pi(process.cwd());if(!e)throw new Error("Not inside a RapidKit workspace. Run from workspace root or pass --workspace.");if(!___default.existsSync(y__default.join(e,".rapidkit-workspace"))&&!___default.existsSync(y__default.join(e,".rapidkit","workspace.json")))throw new Error(`Workspace path is not a RapidKit workspace: ${e}`);return e}async function ui(t){let e=await ai(y__default.join(t,".rapidkit","workspace.json")),r=e?.workspace_name??e?.name;return typeof r=="string"&&r.trim()?r.trim():y__default.basename(t)}function Ht(t){return y__default.join(t,".rapidkit","snapshots")}function wt(t){return y__default.join(t,".rapidkit","archive","projects")}function vr(t){return y__default.join(t,"files")}function mi(t){return y__default.join(to.tmpdir(),`rapidkit-workspace-snapshot-${process.pid}-${t}-${wr.randomBytes(4).toString("hex")}`)}function Pr(t,e){let r=y__default.relative(t,e);if(!r)return true;let o=r.split(y__default.sep);return o[0]===".rapidkit"&&["snapshots","archive","audit"].includes(o[1]||"")?false:!o.some(n=>ii.has(n))}async function fi(t){return (await a$5(t,{descendIntoMatchedProjects:false})).map(r=>({name:y__default.basename(r),relativePath:y__default.relative(t,r)}))}async function gi(t,e){let r=[];for(let o of si){let n=y__default.join(t,o);if(!await ___default.pathExists(n))continue;let i=y__default.join(e,o);await ___default.copy(n,i,{filter:c=>Pr(t,c)}),r.push(o);}return r}async function hi(t,e){await ___default.writeJson(y__default.join(t,"snapshot.json"),e,{spaces:2});}async function br(t){let e=y__default.join(t,"snapshot.json"),r=await ___default.readJson(e);if(!r||typeof r!="object"||r.schema!==Zo)throw new Error(`Invalid RapidKit workspace snapshot manifest: ${e}`);return r}async function yi(t){let e=0,r=0,o=[t];for(;o.length>0;){let n=o.shift();if(!n)continue;let i=[];try{i=await ___default.readdir(n,{withFileTypes:true});}catch{continue}for(let c of i){let a=y__default.join(n,c.name);if(c.isDirectory()){o.push(a);continue}if(c.isFile())try{let l=await ___default.stat(a);e+=1,r+=l.size;}catch{}}}return {files:e,bytes:r}}async function it(t={}){let e=Fe(t.workspacePath),r=t.name?t.name:`snapshot-${st()}`,o=kr(r),n=y__default.join(Ht(e),o),i=mi(o);if(await ___default.pathExists(n))throw new Error(`Snapshot already exists: ${o}`);let c=vr(i);try{await ___default.ensureDir(c);let a=t.includeProjects?"full":"metadata",l=a==="full"?["."]:await gi(e,c);a==="full"&&await ___default.copy(e,c,{filter:p=>Pr(e,p)});let f={schema:Zo,name:o,mode:a,reason:t.reason,createdAt:new Date().toISOString(),workspaceName:await ui(e),workspacePath:e,copiedPaths:l,projects:await fi(e)};return await hi(i,f),await ___default.ensureDir(y__default.dirname(n)),await ___default.move(i,n,{overwrite:false}),await Ae(e,{action:"snapshot.create",target:o,status:"succeeded",reason:t.reason,details:{mode:a,copiedPaths:l,snapshotPath:n,projectCount:f.projects.length}}),{manifest:f,snapshotPath:n}}catch(a){throw await ___default.remove(i),await Ae(e,{action:"snapshot.create",target:o,status:"failed",reason:t.reason,details:{error:a instanceof Error?a.message:String(a)}}),a}}async function en(t){let e=Fe(t.workspacePath),r=y__default.join(Ht(e),kr(t.name));if(!await ___default.pathExists(r))throw new Error(`Snapshot not found: ${t.name}`);let o=await br(r),n=vr(r),i=await yi(n);return {manifest:o,snapshotPath:r,filesRoot:n,estimatedFileCount:i.files,estimatedBytes:i.bytes}}async function tn(t={}){let e=Fe(t.workspacePath),r=Ht(e);if(!await ___default.pathExists(r))return [];let o=await ___default.readdir(r,{withFileTypes:true}),n=[];for(let i of o){if(!i.isDirectory())continue;let c=y__default.join(r,i.name);try{n.push({...await br(c),snapshotPath:c});}catch{}}return n.sort((i,c)=>c.createdAt.localeCompare(i.createdAt))}async function rn(t){let e=Fe(t.workspacePath),r=y__default.join(Ht(e),kr(t.name));if(!await ___default.pathExists(r))throw new Error(`Snapshot not found: ${t.name}`);let o=await br(r),n=vr(r),i=o.mode==="full"?["."]:Array.from(new Set(o.copiedPaths.map(l=>l.startsWith(".rapidkit/")?".rapidkit":l)));if(t.dryRun)return await Ae(e,{action:"snapshot.restore",target:o.name,status:"planned",reason:t.reason,details:{restoredPaths:i}}),{workspacePath:e,snapshotPath:r,restoredPaths:i,dryRun:true};if(!t.force)throw new Error("Restore is destructive. Re-run with --force after reviewing --dry-run output.");await Vt(e,"snapshot.restore",{reason:t.reason,safetySnapshot:t.safetySnapshot});let c;if(t.safetySnapshot!==false&&(c=(await it({workspacePath:e,name:`pre-restore-${o.name}-${st()}`,reason:`Automatic safety snapshot before restoring ${o.name}`,includeProjects:false})).snapshotPath),o.mode==="full")await ___default.copy(n,e,{overwrite:true,errorOnExist:false,filter:l=>Pr(n,l)});else for(let l of o.copiedPaths)await ___default.copy(y__default.join(n,l),y__default.join(e,l),{overwrite:true,errorOnExist:false});let a={workspacePath:e,snapshotPath:r,restoredPaths:i,dryRun:false,safetySnapshotPath:c};return await Ae(e,{action:"snapshot.restore",target:o.name,status:"succeeded",reason:t.reason,details:{restoredPaths:i,safetySnapshotPath:c}}),a}function on(t){let e=t.trim();if(!e)throw new Error("Project name/path is required.");return e}async function nn(t,e){let r=on(e),o=y__default.isAbsolute(r)?y__default.resolve(r):y__default.resolve(t,r);if(o.startsWith(`${y__default.resolve(t)}${y__default.sep}`)&&await ___default.pathExists(o))return o;let i=(await a$5(t,{descendIntoMatchedProjects:false})).filter(c=>{let a=y__default.relative(t,c);return y__default.basename(c)===r||a===r});if(i.length===0)throw new Error(`Project not found in workspace: ${e}`);if(i.length>1)throw new Error(`Project reference is ambiguous: ${e}`);return i[0]}async function jr(t){try{let{syncWorkspaceProjects:e}=await import('./workspace-YLFC25EZ.js');await e(t,true);}catch{}}function wi(t,e){let r=wr.randomBytes(4).toString("hex");return y__default.join(wt(t),`${e}-${st()}-${r}`)}async function sn(t){let e=y__default.join(t,"rapidkit-archive.json"),r=await ___default.readJson(e);if(!r||typeof r!="object"||r.schema!==Xo)throw new Error(`Invalid RapidKit archive manifest: ${e}`);return r}async function xr(t={}){let e=Fe(t.workspacePath),r=wt(e);if(!await ___default.pathExists(r))return [];let o=await ___default.readdir(r,{withFileTypes:true}),n=[];for(let i of o){if(!i.isDirectory())continue;let c=y__default.join(r,i.name),a=y__default.join(c,"rapidkit-archive.json");try{n.push({...await sn(c),archivePath:c,manifestPath:a});}catch{}}return n.sort((i,c)=>c.archivedAt.localeCompare(i.archivedAt))}async function ki(t,e){let r=on(e),o=y__default.isAbsolute(r)?y__default.resolve(r):y__default.resolve(wt(t),r);if(o.startsWith(`${y__default.resolve(wt(t))}${y__default.sep}`)&&await ___default.pathExists(y__default.join(o,"rapidkit-archive.json")))return o;let i=(await xr({workspacePath:t})).filter(c=>y__default.basename(c.archivePath)===r||c.projectName===r||y__default.relative(wt(t),c.archivePath)===r);if(i.length===0)throw new Error(`Archived project not found: ${e}`);if(i.length>1)throw new Error(`Archive reference is ambiguous: ${e}`);return i[0].archivePath}async function Sr(t){let e=Fe(t.workspacePath),r=await nn(e,t.project),o=y__default.basename(r),n=wi(e,o),i=y__default.join(n,"rapidkit-archive.json");if(t.dryRun)return await Ae(e,{action:"project.archive",target:o,status:"planned",reason:t.reason,details:{projectPath:r,archivePath:n}}),{workspacePath:e,projectName:o,projectPath:r,action:"archive",archivePath:n,manifestPath:i,dryRun:true};await Vt(e,"project.archive",{reason:t.reason,safetySnapshot:true});let c=await it({workspacePath:e,name:`pre-archive-${o}-${st()}`,reason:t.reason||`Automatic safety snapshot before archiving ${o}`,includeProjects:false});await ___default.ensureDir(y__default.dirname(n)),await ___default.move(r,n,{overwrite:false});let a={schema:Xo,projectName:o,originalPath:r,archivedPath:n,reason:t.reason,archivedAt:new Date().toISOString(),safetySnapshotPath:c.snapshotPath};return await ___default.writeJson(i,a,{spaces:2}),await gt(e,[r]),await jr(e),await Ae(e,{action:"project.archive",target:o,status:"succeeded",reason:t.reason,details:{projectPath:r,archivePath:n,manifestPath:i,safetySnapshotPath:c.snapshotPath}}),{workspacePath:e,projectName:o,projectPath:r,action:"archive",archivePath:n,manifestPath:i,safetySnapshotPath:c.snapshotPath,dryRun:false}}async function an(t){if(!t.permanent)return Sr(t);let e=Fe(t.workspacePath),r=await nn(e,t.project),o=y__default.basename(r);if(t.confirm!==o)throw new Error(`Permanent delete requires --confirm ${o}`);if(t.dryRun)return await Ae(e,{action:"project.delete",target:o,status:"planned",reason:t.reason,details:{projectPath:r,permanent:true}}),{workspacePath:e,projectName:o,projectPath:r,action:"delete",dryRun:true};await Vt(e,"project.delete",{reason:t.reason,permanent:true,safetySnapshot:true});let n=await it({workspacePath:e,name:`pre-delete-${o}-${st()}`,reason:t.reason||`Automatic safety snapshot before deleting ${o}`,includeProjects:false});return await ___default.remove(r),await gt(e,[r]),await jr(e),await Ae(e,{action:"project.delete",target:o,status:"succeeded",reason:t.reason,details:{projectPath:r,permanent:true,safetySnapshotPath:n.snapshotPath}}),{workspacePath:e,projectName:o,projectPath:r,action:"delete",safetySnapshotPath:n.snapshotPath,dryRun:false}}async function cn(t){let e=Fe(t.workspacePath),r=await ki(e,t.archive),o=await sn(r),n=t.targetName?.trim()||o.projectName,i=y__default.join(e,n);if(!i.startsWith(`${y__default.resolve(e)}${y__default.sep}`))throw new Error(`Archive restore target escapes workspace: ${n}`);if(await ___default.pathExists(i)&&!t.force)throw new Error(`Project path already exists. Re-run with --force to overwrite: ${i}`);if(t.dryRun)return await Ae(e,{action:"project.restore",target:n,status:"planned",reason:t.reason,details:{archivePath:r,projectPath:i}}),{workspacePath:e,projectName:n,projectPath:i,action:"restore",archivePath:r,manifestPath:y__default.join(r,"rapidkit-archive.json"),dryRun:true};await Vt(e,"project.restore",{reason:t.reason,safetySnapshot:true});let c=await it({workspacePath:e,name:`pre-restore-project-${n}-${st()}`,reason:t.reason||`Automatic safety snapshot before restoring ${n}`,includeProjects:false});return await ___default.move(r,i,{overwrite:t.force===true}),await jr(e),await Ae(e,{action:"project.restore",target:n,status:"succeeded",reason:t.reason,details:{archivePath:r,projectPath:i,safetySnapshotPath:c.snapshotPath}}),{workspacePath:e,projectName:n,projectPath:i,action:"restore",archivePath:r,manifestPath:y__default.join(i,"rapidkit-archive.json"),safetySnapshotPath:c.snapshotPath,dryRun:false}}function Cr(t){if(!t||typeof t!="object")return null;let e=t.code;return e==="PYTHON_NOT_FOUND"||e==="BRIDGE_VENV_BOOTSTRAP_FAILED"||e==="BRIDGE_VENV_CREATE_FAILED"||e==="BRIDGE_PIP_BOOTSTRAP_FAILED"?e:null}function bi(t){let e=t.trim().toLowerCase();return e?e.startsWith("fastapi")?"fastapi":e.startsWith("nestjs")?"nestjs":null:null}function Yt(t){let e=t.trim().toLowerCase();return e.startsWith("gofiber")||e==="go"||e==="go.standard"||e==="fiber"}function vt(t){let e=t.trim().toLowerCase();return e.startsWith("gogin")||e==="gin"}function Pt(t){let e=t.trim().toLowerCase();return e.startsWith("springboot")||e==="spring"||e==="springboot"||e==="java"}function ve(t,e){let r=t.indexOf(e);if(r>=0&&r+1<t.length)return t[r+1];let o=t.find(n=>n.startsWith(`${e}=`));if(o)return o.slice(e.length+1)}function Dr(){return d$2()}function dn(){let t={...process.env},e=t.PATH||"";return e&&(t.PATH=e.split(y__default.delimiter).filter(r=>!r.replace(/\\/g,"/").includes("/.pyenv/shims")).join(y__default.delimiter)),t.PYENV_VERSION="system",t.POETRY_PYTHON||(t.POETRY_PYTHON=c$1()),t.RAPIDKIT_SKIP_LOCK_SYNC||(t.RAPIDKIT_SKIP_LOCK_SYNC="1"),t.POETRY_KEYRING_ENABLED||(t.POETRY_KEYRING_ENABLED="false"),t.PYTHON_KEYRING_BACKEND||(t.PYTHON_KEYRING_BACKEND="keyring.backends.null.Keyring"),t.POETRY_NO_INTERACTION||(t.POETRY_NO_INTERACTION="1"),t}function ji(t){return f$1(y__default.join(t,".venv"))}async function _n(t,e){return await J(t,["--version"],e)===0}async function Rr(t){let e=y__default.join(t,"go.mod");if(await ___default.pathExists(e))return "go";let r=y__default.join(t,"pom.xml"),o=y__default.join(t,"build.gradle"),n=y__default.join(t,"build.gradle.kts");if(await ___default.pathExists(r)||await ___default.pathExists(o)||await ___default.pathExists(n))return "java";let i=y__default.join(t,"package.json");if(await ___default.pathExists(i))return "node";let c=y__default.join(t,"pyproject.toml"),a=y__default.join(t,"requirements.txt"),l=y__default.join(t,"poetry.lock");return await ___default.pathExists(c)||await ___default.pathExists(a)||await ___default.pathExists(l)?"python":null}async function xi(t){for(let e of Dr())if(await J(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function An(t){for(let e of Dr())if(await J(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function Si(t){let e=f$1(y__default.join(t,".venv"));if(!await ___default.pathExists(e)){let i=await An(t);if(i!==0)return i}if(!await _n("poetry",t))return 0;let o=await J("poetry",["config","virtualenvs.in-project","true","--local"],t);if(o!==0)return o;let n=await J("poetry",["env","use",e],t);return n!==0?n:0}async function Ci(t){let e=f$1(y__default.join(t,".venv"));if(!await ___default.pathExists(e)){let n=await An(t);if(n!==0)return n}await J(e,["-m","pip","install","--upgrade","pip","setuptools","wheel"],t);let r=y__default.join(t,"requirements.txt");if(await ___default.pathExists(r)&&await J(e,["-m","pip","install","-r","requirements.txt"],t)===0)return 0;let o=y__default.join(t,"pyproject.toml");return await ___default.pathExists(o)&&(await J(e,["-m","pip","install","-e","."],t)===0||await J(e,["-m","pip","install","."],t)===0)?0:1}async function Er(t,e){return await Si(t)!==0&&console.log(s.yellow("\u26A0\uFE0F Could not fully configure Poetry local venv. Trying fallback installer...")),(await e.initProject(t)).exitCode===0&&await ___default.pathExists(y__default.join(t,".venv"))?0:(console.log(s.yellow("\u26A0\uFE0F Python init fallback: installing dependencies directly into project .venv")),await Ci(t))}async function _r(t){let e=await bt("init",t);if(e===0)return 0;let r=["npm","pnpm","yarn"];for(let o of r){if(!await _n(o,t))continue;if(await J(o,["install"],t)===0)return console.log(s.green(`\u2705 Node init fallback succeeded with ${o} install`)),0}return e}async function pn(t){if(t[0]!=="create"||t[1]!=="project")return 1;let e=t[2],r=t[3];if(!e||!r)return process.stderr.write(`Usage: rapidkit create project gofiber.standard <name> [--output <dir>]
125
+ `),1;try{Qe(r);}catch(c){let a=c instanceof Error?c.message:String(c);return process.stderr.write(`${a}
126
+ `),1}let o=ve(t,"--output")||process.cwd(),n=y__default.resolve(o,r),i=t.includes("--skip-git")||t.includes("--no-git");try{let{default:c}=await import('fs-extra');if(await c.ensureDir(y__default.dirname(n)),await c.pathExists(n))return process.stderr.write(`\u274C Directory "${n}" already exists
127
+ `),1;await c.ensureDir(n);let{generateGoFiberKit:a}=await import('./gofiber-standard-TFPNBIMS.js');await a(n,{project_name:r,module_path:r,skipGit:i});let l=K(process.cwd());if(l){let{syncWorkspaceProjects:f}=await import('./workspace-YLFC25EZ.js');await f(l,true);}return 0}catch(c){return process.stderr.write(`RapidKit Go/Fiber generator failed: ${c?.message??c}
128
+ `),1}}async function un(t){if(t[0]!=="create"||t[1]!=="project")return 1;let e=t[2],r=t[3];if(!e||!r)return process.stderr.write(`Usage: rapidkit create project gogin.standard <name> [--output <dir>]
129
+ `),1;try{Qe(r);}catch(c){let a=c instanceof Error?c.message:String(c);return process.stderr.write(`${a}
130
+ `),1}let o=ve(t,"--output")||process.cwd(),n=y__default.resolve(o,r),i=t.includes("--skip-git")||t.includes("--no-git");try{let{default:c}=await import('fs-extra');if(await c.ensureDir(y__default.dirname(n)),await c.pathExists(n))return process.stderr.write(`\u274C Directory "${n}" already exists
131
+ `),1;await c.ensureDir(n);let{generateGoGinKit:a}=await import('./gogin-standard-7UJ2OBYL.js');await a(n,{project_name:r,module_path:r,skipGit:i});let l=K(process.cwd());if(l){let{syncWorkspaceProjects:f}=await import('./workspace-YLFC25EZ.js');await f(l,true);}return 0}catch(c){return process.stderr.write(`RapidKit Go/Gin generator failed: ${c?.message??c}
132
+ `),1}}async function mn(t){if(t[0]!=="create"||t[1]!=="project")return 1;let e=t[2],r=t[3];if(!e||!r)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>]
133
+ `),1;try{Qe(r);}catch(u){let h=u instanceof Error?u.message:String(u);return process.stderr.write(`${h}
134
+ `),1}let o=ve(t,"--output")||process.cwd(),n=y__default.resolve(o,r),i=t.includes("--skip-git")||t.includes("--no-git"),c=ve(t,"--java-version"),a=ve(t,"--spring-boot-version"),l=ve(t,"--springdoc-version"),f=ve(t,"--group-id"),p=ve(t,"--package-name"),d=ve(t,"--description"),m=ve(t,"--port"),g=u=>/^\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?$/.test(u);if(c&&!/^\d+$/.test(c.trim()))return process.stderr.write(`Invalid --java-version. Expected major version number, e.g. 21
135
+ `),1;if(a&&!g(a.trim()))return process.stderr.write(`Invalid --spring-boot-version. Expected semantic version, e.g. 3.5.0
136
+ `),1;if(l&&!g(l.trim()))return process.stderr.write(`Invalid --springdoc-version. Expected semantic version, e.g. 2.8.9
137
+ `),1;if(f&&!/^[A-Za-z0-9_.-]+$/.test(f.trim()))return process.stderr.write(`Invalid --group-id. Use dot-separated Java package identifiers only.
138
+ `),1;if(p&&!/^[A-Za-z0-9_.-]+$/.test(p.trim()))return process.stderr.write(`Invalid --package-name. Use dot-separated Java package identifiers only.
139
+ `),1;if(m&&!/^\d+$/.test(m.trim()))return process.stderr.write(`Invalid --port. Expected numeric TCP port, e.g. 8080
140
+ `),1;try{let{default:u}=await import('fs-extra');if(await u.ensureDir(y__default.dirname(n)),await u.pathExists(n))return process.stderr.write(`\u274C Directory "${n}" already exists
141
+ `),1;await u.ensureDir(n);let{generateSpringBootKit:h}=await import('./springboot-standard-H6GYMH3P.js');await h(n,{project_name:r,artifact_id:r,java_version:c?.trim(),spring_boot_version:a?.trim(),springdoc_version:l?.trim(),group_id:f?.trim(),package_name:p?.trim(),description:d?.trim(),port:m?.trim(),skipGit:i});let k=K(process.cwd());if(k){let{syncWorkspaceProjects:w}=await import('./workspace-YLFC25EZ.js');await w(k,true);}return 0}catch(u){return process.stderr.write(`RapidKit Spring Boot generator failed: ${u?.message??u}
142
+ `),1}}async function Ar(t,e){if(t.includes("--json"))return process.stderr.write("RapidKit (npm) offline fallback does not support --json for `create` commands.\nInstall Python 3.10+ and retry the same command.\n"),1;if(t[0]!=="create")return 1;if(t[1]!=="project")return process.stderr.write(`RapidKit (npm) could not run the Python core engine for \`create\`.
133
143
  Reason: ${e}.
134
144
  Install Python 3.10+ to use the interactive wizard and full kit catalog.
135
- `),1;let n=r[2],s=r[3];if(!n||!s)return process.stderr.write(`Usage: rapidkit create project <kit> <name> [--output <dir>]
145
+ `),1;let n=t[2],i=t[3];if(!n||!i)return process.stderr.write(`Usage: rapidkit create project <kit> <name> [--output <dir>]
136
146
  Tip: offline fallback supports only fastapi* and nestjs* kits.
137
- `),1;let i=Hs(n);if(!i)return process.stderr.write(`RapidKit (npm) could not run the Python core engine to create this kit.
147
+ `),1;let c=bi(n);if(!c)return process.stderr.write(`RapidKit (npm) could not run the Python core engine to create this kit.
138
148
  Reason: ${e}.
139
149
  Requested kit: ${n}
140
150
  Offline fallback only supports: fastapi.standard, nestjs.standard (and their shorthands).
141
151
  Install Python 3.10+ to access all kits.
142
- `),1;let c=ve(r,"--output")||process.cwd(),l=f__default.resolve(c,s),d=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
143
- `),1;let p="pip",u=Y(process.cwd());if(u)try{let{readWorkspaceMarker:g}=await import('./workspace-marker-IOPQ42A7.js'),y=await g(u);y?.metadata?.npm?.installMethod&&(p=y.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 ___default.ensureDir(l);let{generateDemoKit:h}=await import('./demo-kit-KTRITRWH.js');if(await h(l,{project_name:s,template:i,kit_name:n,skipGit:d,skipInstall:m,engine:p}),u){let{syncWorkspaceProjects:g}=await import('./workspace-2JHFIZ3J.js');await g(u,true);}return 0}catch(p){return process.stderr.write(`RapidKit (npm) offline fallback failed: ${p?.message??p}
144
- `),1}}async function un(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(a$4.gray("\u2139\uFE0F No subcommand provided for `create`; defaulting to `create workspace`."))):n=(await Ae.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",n,...o];return await un(s)}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"),s=r[2]&&!r[2].startsWith("-")?r[2]:void 0,i=ve(r,"--install-method"),c=i==="poetry"||i==="venv"||i==="pipx"?i:void 0,l=ve(r,"--profile"),d=l==="minimal"||l==="java-only"||l==="go-only"||l==="python-only"||l==="node-only"||l==="polyglot"||l==="enterprise"?l:void 0,m=s||(t?"my-workspace":(await Ae.prompt([{type:"input",name:"workspaceName",message:"Workspace name:",default:"my-workspace"}])).workspaceName);if(!m||!m.trim())return process.stderr.write(`Workspace name is required.
145
- `),1;try{Ve(m);}catch(y){if(y instanceof e)return process.stderr.write(`${y.message}
146
- `),1;throw y}let p=f__default.resolve(process.cwd(),m);if(!n&&await ___default.pathExists(p))return process.stderr.write(`\u274C Directory "${m}" already exists
147
- `),1;let u=await a$2(),h=u.author||process.env.USER||"RapidKit User";if(!t){let y=await Ae.prompt([{type:"input",name:"author",message:"Author name:",default:h}]);y.author?.trim()&&(h=y.author.trim());}let{createProject:g}=await import('./create-RDLT34XT.js');return await g(m,{skipGit:o,yes:t,dryRun:n,userConfig:{...u,author:h},installMethod:c,profile:d}),0}catch(t){return process.stderr.write(`RapidKit (npm) failed to create workspace: ${t?.message??t}
148
- `),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}
149
- `),1}if(!r[2]||r[2].startsWith("-")){console.log(a$4.bold(`
152
+ `),1;let a=ve(t,"--output")||process.cwd(),l=y__default.resolve(a,i),f=t.includes("--skip-git")||t.includes("--no-git"),p=t.includes("--skip-install");try{if(await ___default.ensureDir(y__default.dirname(l)),await ___default.pathExists(l))return process.stderr.write(`\u274C Directory "${l}" already exists
153
+ `),1;let d="pip",m=K(process.cwd());if(m)try{let{readWorkspaceMarker:u}=await import('./workspace-marker-IOPQ42A7.js'),h=await u(m);h?.metadata?.npm?.installMethod&&(d=h.metadata.npm.installMethod,a$1.debug(`Detected workspace engine: ${d}`));}catch(u){a$1.debug("Failed to read workspace marker",u);}else a$1.debug("No workspace found, using default engine: pip");await ___default.ensureDir(l);let{generateDemoKit:g}=await import('./demo-kit-KTRITRWH.js');if(await g(l,{project_name:i,template:c,kit_name:n,skipGit:f,skipInstall:p,engine:d}),m){let{syncWorkspaceProjects:u}=await import('./workspace-YLFC25EZ.js');await u(m,true),await Ve(m,{silent:true});}return 0}catch(d){return process.stderr.write(`RapidKit (npm) offline fallback failed: ${d?.message??d}
154
+ `),1}}async function $n(t){let e$2=new Set(["--yes","-y","--skip-git","--skip-install","--debug","--dry-run","--no-update-check","--create-workspace","--no-workspace"]);if(t[0]==="create"&&(!t[1]||t[1].startsWith("-"))){let r=t.includes("--yes")||t.includes("-y"),o=t.slice(1),n;!process.stdin.isTTY||r?(n="workspace",process.stdin.isTTY&&console.log(s.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 $n(i)}if(t[0]==="create"&&t[1]==="workspace")try{let r=t.includes("--yes")||t.includes("-y"),o=t.includes("--skip-git")||t.includes("--no-git"),n=t.includes("--dry-run"),i=t[2]&&!t[2].startsWith("-")?t[2]:void 0,c=ve(t,"--install-method"),a=c==="poetry"||c==="venv"||c==="pipx"?c:void 0,l=ve(t,"--profile"),f=l==="minimal"||l==="java-only"||l==="go-only"||l==="python-only"||l==="node-only"||l==="polyglot"||l==="enterprise"?l:void 0,p=i||(r?"my-workspace":(await $e.prompt([{type:"input",name:"workspaceName",message:"Workspace name:",default:"my-workspace"}])).workspaceName);if(!p||!p.trim())return process.stderr.write(`Workspace name is required.
155
+ `),1;try{Qe(p);}catch(h){if(h instanceof e)return process.stderr.write(`${h.message}
156
+ `),1;throw h}let d=y__default.resolve(process.cwd(),p);if(!n&&await ___default.pathExists(d))return process.stderr.write(`\u274C Directory "${p}" already exists
157
+ `),1;let m=await a$2(),g=m.author||process.env.USER||"RapidKit User";if(!r){let h=await $e.prompt([{type:"input",name:"author",message:"Author name:",default:g}]);h.author?.trim()&&(g=h.author.trim());}let{createProject:u}=await import('./create-KZYI3QRI.js');return await u(p,{skipGit:o,yes:r,dryRun:n,userConfig:{...m,author:g},installMethod:a,profile:f}),0}catch(r){return process.stderr.write(`RapidKit (npm) failed to create workspace: ${r?.message??r}
158
+ `),1}try{if(t[0]==="create"&&t[1]==="project"){if(t.includes("--help")||t.includes("-h"))try{return await d(),await e$1(["create","project","--help"],{cwd:process.cwd()})}catch(u){return process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${u?.message??u}
159
+ `),1}if(!t[2]||t[2].startsWith("-")){console.log(s.bold(`
150
160
  \u{1F680} RapidKit
151
- `));let{kitChoice:g}=await Ae.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)||gt(g)||ht(g)){let{projectName:P}=await Ae.prompt([{type:"input",name:"projectName",message:"Project name:",validate:j=>j.trim().length>0||"Project name is required"}]),w=r.slice(2).filter(j=>j.startsWith("-"));return gt(g)?await Qo(["create","project",g,P.trim(),...w]):ht(g)?await Zo(["create","project",g,P.trim(),...w]):await zo(["create","project",g,P.trim(),...w])}let{projectName:y}=await Ae.prompt([{type:"input",name:"projectName",message:"Project name:",validate:P=>P.trim().length>0||"Project name is required"}]);r.splice(2,0,g,y.trim());}{let g=Y(process.cwd()),y=(r[2]||"").toLowerCase();if(g&&y){let P=f__default.join(g,".rapidkit","workspace.json"),w=f__default.join(g,".rapidkit","policies.yml");try{let[j,b]=await Promise.all([___default.pathExists(P).then(fe=>fe?k.promises.readFile(P,"utf-8"):"{}"),___default.pathExists(w).then(fe=>fe?k.promises.readFile(w,"utf-8"):"")]),E=JSON.parse(j).profile,D=b.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]??"warn",F=Jt(y)||gt(y)||y.startsWith("go"),G=ht(y)||y.includes("spring"),L=["nestjs","react","vue","nextjs","next","vite","angular","svelte","express","koa","fastify"].some(fe=>y.includes(fe)),X=!F&&!L&&!G,le=null;if(E==="python-only"&&!X?le=`Kit "${y}" is not a Python kit, but workspace profile is "python-only".`:E==="node-only"&&!L?le=`Kit "${y}" is not a Node kit, but workspace profile is "node-only".`:E==="go-only"&&!F?le=`Kit "${y}" is not a Go kit, but workspace profile is "go-only".`:E==="java-only"&&!G&&(le=`Kit "${y}" is not a Java kit, but workspace profile is "java-only".`),le){if(D==="strict")return console.log(a$4.red(`\u274C Profile violation (strict mode): ${le}`)),console.log(a$4.gray("\u{1F4A1} Change workspace profile or use --no-workspace to skip enforcement.")),1;console.log(a$4.yellow(`\u26A0\uFE0F Profile warning: ${le}`)),console.log(a$4.gray('\u{1F4A1} Consider using a "polyglot" workspace profile for multi-language projects.'));}}catch{}}}if(Jt(r[2]||""))return await zo(r);if(gt(r[2]||""))return await Qo(r);if(ht(r[2]||""))return await Zo(r);let o=r.includes("--create-workspace"),n=r.includes("--no-workspace"),s=r.includes("--yes")||r.includes("-y"),i=r.includes("--skip-git")||r.includes("--no-git");if(!!!Cr(process.cwd())){let{registerWorkspaceAtPath:g}=await import('./create-RDLT34XT.js');if(o)await g(process.cwd(),{skipGit:i,yes:s,userConfig:await a$2()});else if(!n)if(s)await g(process.cwd(),{skipGit:i,yes:true,userConfig:await a$2()});else {let{createWs:y}=await Ae.prompt([{type:"confirm",name:"createWs",message:"This project will be created outside a RapidKit workspace. Create and register a workspace here?",default:true}]);y&&await g(process.cwd(),{skipGit:i,yes:false,userConfig:await a$2()});}}let d$1=[...r.filter(g=>{let y=g.split("=")[0];return !e$2.has(g)&&!e$2.has(y)})],m=Y(process.cwd()),h=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(d$1,{cwd:process.cwd(),env:h});if(g===0&&m&&!r.includes("--skip-install")&&(console.log(a$4.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(a$4.white(" Next: cd <project-name> && npx rapidkit init"))),g===0){let y=m||Y(process.cwd());if(y){try{let w=r[3];if(w){let j=r.indexOf("--output"),b=j>=0?r[j+1]:".",E=f__default.resolve(process.cwd(),b,w),I=f__default.join(y,".python-version"),D=f__default.join(E,".python-version");if(k.existsSync(I)&&k.existsSync(E)){let F=k.readFileSync(I,"utf-8");k.writeFileSync(D,F.trim()+`
152
- `),a$1.debug(`Synced Python version ${F.trim()} from workspace to ${w}`);}}}catch(w){a$1.debug("Could not sync Python version from workspace:",w);}let{syncWorkspaceProjects:P}=await import('./workspace-2JHFIZ3J.js');await P(y,true);}}return g}catch(g){let y=kr(g);return y?await jr(d$1,y):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${g?.message??g}
153
- `),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=Y(process.cwd());if(o){let{syncWorkspaceProjects:n}=await import('./workspace-2JHFIZ3J.js');await n(o,true);}}return t}catch(t){let o=kr(t);return o?await jr(r,o):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${t?.message??t}
154
- `),1)}return await d(),await e$1(r,{cwd:process.cwd()})}catch(t){let o=kr(t);return o?await jr(r,o):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${t?.message??t}
155
- `),1)}}var Xo=["init","dev","start","build","test","docs","lint","format","create","help","--help","-h"],Zs=["readiness","doctor","autopilot","import","snapshot","project","workspace","bootstrap","setup","cache","mirror","ai","config","shell"],Xs=["readiness","doctor","autopilot","import","snapshot","project","workspace","ai","config","shell"],ei=["bootstrap","setup","cache","mirror"],mn=["lint","format","docs"],ti=["init"],fn=["build","dev","start","test"],en=[...fn,...mn];function qt(r){return !!r&&Zs.includes(r)}function tn(r){return !!r&&Xs.includes(r)}function ri(r){return !!r&&ei.includes(r)}function ot(r){return k.existsSync(f__default.join(r,".rapidkit-workspace"))||k.existsSync(f__default.join(r,".rapidkit","workspace.json"))}function gn(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 Cr(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 Y(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 oi(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 s of n){if(!await ___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 ni(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 hn={enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true};function si(r){return r&&r.match(/^[\t ]*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]==="strict"?"strict":"warn"}function ft(r,e){let t=r.match(new RegExp(`^[\\t ]*${e}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return t?t[1]==="true":hn[e]}function rn(r){let e=r??"";return {mode:si(e),dependency_sharing_mode:yn(e),rules:{enforce_workspace_marker:ft(e,"enforce_workspace_marker"),enforce_toolchain_lock:ft(e,"enforce_toolchain_lock"),disallow_untrusted_tool_sources:ft(e,"disallow_untrusted_tool_sources"),enforce_compatibility_matrix:ft(e,"enforce_compatibility_matrix"),require_mirror_lock_for_offline:ft(e,"require_mirror_lock_for_offline")}}}function on(r,e,t){let o=`${e}: ${t}`,n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),s=new RegExp(`^[\\t ]*${n}:\\s*.*$`,"m");if(s.test(r))return r.replace(s,o);let i=/^[\t ]*rules:\s*(?:#.*)?$/m;return i.test(r)?r.replace(i,`${o}
156
- rules:`):`${r.endsWith(`
157
- `)?r:`${r}
161
+ `));let{kitChoice:u}=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(Yt(u)||vt(u)||Pt(u)){let{projectName:k}=await $e.prompt([{type:"input",name:"projectName",message:"Project name:",validate:j=>j.trim().length>0||"Project name is required"}]),w=t.slice(2).filter(j=>j.startsWith("-")),S;vt(u)?S=await un(["create","project",u,k.trim(),...w]):Pt(u)?S=await mn(["create","project",u,k.trim(),...w]):S=await pn(["create","project",u,k.trim(),...w]);let b=K(process.cwd());return S===0&&b&&await Ve(b),S}let{projectName:h}=await $e.prompt([{type:"input",name:"projectName",message:"Project name:",validate:k=>k.trim().length>0||"Project name is required"}]);t.splice(2,0,u,h.trim());}{let u=K(process.cwd()),h=(t[2]||"").toLowerCase();if(u&&h){let k=y__default.join(u,".rapidkit","workspace.json"),w=y__default.join(u,".rapidkit","policies.yml");try{let[S,b]=await Promise.all([___default.pathExists(k).then(q=>q?v.promises.readFile(k,"utf-8"):"{}"),___default.pathExists(w).then(q=>q?v.promises.readFile(w,"utf-8"):"")]),j=JSON.parse(S).profile,D=b.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]??"warn",me=Yt(h)||vt(h)||h.startsWith("go"),G=Pt(h)||h.includes("spring"),M=["nestjs","react","vue","nextjs","next","vite","angular","svelte","express","koa","fastify"].some(q=>h.includes(q)),Pe=!me&&!M&&!G,Q=null;if(j==="python-only"&&!Pe?Q=`Kit "${h}" is not a Python kit, but workspace profile is "python-only".`:j==="node-only"&&!M?Q=`Kit "${h}" is not a Node kit, but workspace profile is "node-only".`:j==="go-only"&&!me?Q=`Kit "${h}" is not a Go kit, but workspace profile is "go-only".`:j==="java-only"&&!G&&(Q=`Kit "${h}" is not a Java kit, but workspace profile is "java-only".`),Q){if(D==="strict")return console.log(s.red(`\u274C Profile violation (strict mode): ${Q}`)),console.log(s.gray("\u{1F4A1} Change workspace profile or use --no-workspace to skip enforcement.")),1;console.log(s.yellow(`\u26A0\uFE0F Profile warning: ${Q}`)),console.log(s.gray('\u{1F4A1} Consider using a "polyglot" workspace profile for multi-language projects.'));}}catch{}}}if(Yt(t[2]||"")){let u=await pn(t),h=K(process.cwd());return u===0&&h&&await Ve(h),u}if(vt(t[2]||"")){let u=await un(t),h=K(process.cwd());return u===0&&h&&await Ve(h),u}if(Pt(t[2]||"")){let u=await mn(t),h=K(process.cwd());return u===0&&h&&await Ve(h),u}let o=t.includes("--create-workspace"),n=t.includes("--no-workspace"),i=t.includes("--yes")||t.includes("-y"),c=t.includes("--skip-git")||t.includes("--no-git");if(!!!Mr(process.cwd())){let{registerWorkspaceAtPath:u}=await import('./create-KZYI3QRI.js');if(o)await u(process.cwd(),{skipGit:c,yes:i,userConfig:await a$2()});else if(!n)if(i)await u(process.cwd(),{skipGit:c,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 u(process.cwd(),{skipGit:c,yes:false,userConfig:await a$2()});}}let f=[...t.filter(u=>{let h=u.split("=")[0];return !e$2.has(u)&&!e$2.has(h)})],p=K(process.cwd()),g=t.includes("--skip-install")||!!p?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0;try{await d();let u=await e$1(f,{cwd:process.cwd(),env:g});if(u===0&&p&&!t.includes("--skip-install")&&(console.log(s.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(s.white(" Next: cd <project-name> && npx rapidkit init"))),u===0){let h=p||K(process.cwd());if(h){try{let w=t[3];if(w){let S=t.indexOf("--output"),b=S>=0?t[S+1]:".",j=y__default.resolve(process.cwd(),b,w),A=y__default.join(h,".python-version"),D=y__default.join(j,".python-version");if(v.existsSync(A)&&v.existsSync(j)){let me=v.readFileSync(A,"utf-8");v.writeFileSync(D,me.trim()+`
162
+ `),a$1.debug(`Synced Python version ${me.trim()} from workspace to ${w}`);}}}catch(w){a$1.debug("Could not sync Python version from workspace:",w);}let{syncWorkspaceProjects:k}=await import('./workspace-YLFC25EZ.js');await k(h,true),await Ve(h);}}return u}catch(u){let h=Cr(u);return h?await Ar(f,h):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${u?.message??u}
163
+ `),1)}}if(t[0]==="create"&&t[1]!=="project")try{await d();let r=await e$1(t,{cwd:process.cwd()});if(r===0){let o=K(process.cwd());if(o){let{syncWorkspaceProjects:n}=await import('./workspace-YLFC25EZ.js');await n(o,true);}}return r}catch(r){let o=Cr(r);return o?await Ar(t,o):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${r?.message??r}
164
+ `),1)}return await d(),await e$1(t,{cwd:process.cwd()})}catch(r){let o=Cr(r);return o?await Ar(t,o):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${r?.message??r}
165
+ `),1)}}var fn=["init","dev","start","build","test","docs","lint","format","create","help","--help","-h"],Ri=["analyze","readiness","doctor","autopilot","import","snapshot","project","workspace","bootstrap","setup","cache","mirror","ai","config","product","shell"],Ei=["analyze","readiness","doctor","autopilot","import","snapshot","project","workspace","ai","config","product","shell"],_i=["bootstrap","setup","cache","mirror"],In=["lint","format","docs"],Ai=["init"],Mn=["build","dev","start","test"],gn=[...Mn,...In];function jt(t){return !!t&&Ri.includes(t)}function hn(t){return !!t&&Ei.includes(t)}function yn(t){return !!t&&_i.includes(t)}function $i(t=process.env){let e=t.npm_config_user_agent||"",r=t.npm_execpath||"",o=t.npm_command||"";return e.startsWith("npm/")||e.includes(" npx/")||/(?:^|[/\\])npx(?:\.cmd)?$/i.test(r)||/(?:^|[/\\])npm(?:\.cmd)?$/i.test(r)||o==="exec"||o==="x"||o==="run-script"}function at(t){return v.existsSync(y__default.join(t,".rapidkit-workspace"))||v.existsSync(y__default.join(t,".rapidkit","workspace.json"))}function On(t){let e=t;for(;;){let r=y__default.join(e,".rapidkit","context.json");if(v.existsSync(r))return r;let o=y__default.dirname(e);if(o===e)break;e=o;}return null}function Mr(t){let e=t,r=y__default.resolve(tmpdir());for(;;){let o=y__default.join(e,".rapidkit-workspace");if(v.existsSync(o)&&y__default.resolve(e)!==r)return o;let n=y__default.dirname(e);if(n===e)break;e=n;}return null}function K(t){let e=t,r=y__default.resolve(tmpdir());for(;;){let o=y__default.join(e,".rapidkit-workspace");if(v.existsSync(o)&&y__default.resolve(e)!==r)return e;let n=y__default.dirname(e);if(n===e)break;e=n;}return null}async function Ve(t,e){try{let{syncWorkspaceContract:r}=await import('./workspace-contract-4UCEM44I.js'),o=await r({workspacePath:t});if(!e?.silent&&(o.addedProjects.length>0||o.updatedProjects.length>0)&&console.log(s.gray(`\u2139\uFE0F Workspace contract synced (${o.contract.projects.length} project(s)).`)),o.verification.status!=="passed"){console.log(s.yellow("\u26A0\uFE0F Workspace contract verification failed after project sync."));for(let n of o.verification.violations)console.log(s.gray(` Violation: ${n}`));console.log(s.white(" Next: npx rapidkit workspace contract inspect"));}}catch(r){e?.silent||console.log(s.yellow(`\u26A0\uFE0F Workspace contract sync skipped: ${r.message}`));}}async function Ii(t,e=process.cwd(),r=process.platform){if(!(t.workspaceFlag||t.scope==="workspace")||!a(r))return {detected:false};let n=i(e,r);for(let i of n){if(!await ___default.pathExists(i))continue;let c=i.toLowerCase();if(c.endsWith("rapidkit.cmd")||c.endsWith("rapidkit.exe"))return {detected:true,candidatePath:i,reason:"Found workspace-local rapidkit launcher on Windows."}}return {detected:false}}function Mi(t){let e=t;for(;;){let r=y__default.join(e,".rapidkit-workspace"),o=y__default.join(e,".rapidkit","workspace.json");if(!v.existsSync(r)&&v.existsSync(o))return e;let n=y__default.dirname(e);if(n===e)break;e=n;}return null}var Nn={enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true};function Oi(t){return t&&t.match(/^[\t ]*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]==="strict"?"strict":"warn"}function kt(t,e){let r=t.match(new RegExp(`^[\\t ]*${e}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return r?r[1]==="true":Nn[e]}function wn(t){let e=t??"";return {mode:Oi(e),dependency_sharing_mode:Dn(e),rules:{enforce_workspace_marker:kt(e,"enforce_workspace_marker"),enforce_toolchain_lock:kt(e,"enforce_toolchain_lock"),disallow_untrusted_tool_sources:kt(e,"disallow_untrusted_tool_sources"),enforce_compatibility_matrix:kt(e,"enforce_compatibility_matrix"),require_mirror_lock_for_offline:kt(e,"require_mirror_lock_for_offline")}}}function kn(t,e,r){let o=`${e}: ${r}`,n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`^[\\t ]*${n}:\\s*.*$`,"m");if(i.test(t))return t.replace(i,o);let c=/^[\t ]*rules:\s*(?:#.*)?$/m;return c.test(t)?t.replace(c,`${o}
166
+ rules:`):`${t.endsWith(`
167
+ `)?t:`${t}
158
168
  `}${o}
159
- `}function ii(r,e,t){let o=` ${e}: ${t?"true":"false"}`,n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),s=new RegExp(`^[\\t ]+${n}:\\s*.*$`,"m");if(s.test(r))return r.replace(s,o);let i=/^[\t ]*rules:\s*(?:#.*)?$/m;return i.test(r)?r.replace(i,`rules:
160
- ${o}`):`${r.endsWith(`
161
- `)?r:`${r}
169
+ `}function Ni(t,e,r){let o=` ${e}: ${r?"true":"false"}`,n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`^[\\t ]+${n}:\\s*.*$`,"m");if(i.test(t))return t.replace(i,o);let c=/^[\t ]*rules:\s*(?:#.*)?$/m;return c.test(t)?t.replace(c,`rules:
170
+ ${o}`):`${t.endsWith(`
171
+ `)?t:`${t}
162
172
  `}rules:
163
173
  ${o}
164
- `}function ai(){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(`
165
- `)}async function nn(r){let e=f__default.join(r,".rapidkit","policies.yml");return await ___default.pathExists(e)?k.promises.readFile(e,"utf-8"):ai()}async function ci(r,e){let t=f__default.join(r,".rapidkit"),o=f__default.join(t,"policies.yml");await ___default.ensureDir(t);let n=e.endsWith(`
174
+ `}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(`
175
+ `)}async function vn(t){let e=y__default.join(t,".rapidkit","policies.yml");return await ___default.pathExists(e)?v.promises.readFile(e,"utf-8"):Di()}async function Ti(t,e){let r=y__default.join(t,".rapidkit"),o=y__default.join(r,"policies.yml");await ___default.ensureDir(r);let n=e.endsWith(`
166
176
  `)?e:`${e}
167
- `;await k.promises.writeFile(o,n,"utf-8");}function li(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 wn(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 kn(r,e){let t=Y(r),o=t?f__default.join(t,".rapidkit","policies.yml"):null,n="isolated";if(o&&await ___default.pathExists(o))try{let c=await k.promises.readFile(o,"utf-8"),l=wn(c);if(l.status==="failed")return console.log(a$4.red(`\u274C ${l.message}`)),{ok:false,code:1};n=l.mode;}catch{return console.log(a$4.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=n,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 K(r,e,t){return await new Promise(o=>{let n=spawn(r,e,{stdio:"inherit",cwd:t,shell:b$3()});n.on("close",s=>o(s??1)),n.on("error",()=>o(1));})}async function Ue(r,e){await ___default.outputFile(r,`${JSON.stringify(e,null,2)}
168
- `,"utf-8");}async function di(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,s=n??Y(process.cwd()),i=false,c=false;if(n){if(!ot(n)){let p=`Workspace path is not a valid RapidKit workspace: ${n}`;return e.json?console.log(JSON.stringify({error:p},null,2)):console.log(a$4.red(`\u274C ${p}`)),1}}else if(!s||!ot(s)){let p=await fi();s=p.workspacePath,i=true,c=p.created;}if(!s||!ot(s)){let p="Not inside a RapidKit workspace";return e.json?console.log(JSON.stringify({error:p},null,2)):(console.log(a$4.red(`\u274C ${p}`)),console.log(a$4.gray("\u{1F4A1} Run this command from a workspace root or pass --workspace <path>."))),1}let l=`cd ${s}`,d=t?.syncWorkspaceProjects??(async p=>{if(o)throw new Error("forced sync failure for command-level import rollback test");let{syncWorkspaceProjects:u}=await import('./workspace-2JHFIZ3J.js');await u(p,true);}),m=t?.rollbackImportedProjectImport??Do;try{let p=await No({workspacePath:s,source:r,name:e.name,sourceType:e.git===true?"git-url":void 0});try{await d(s);}catch(u){await m(s,p.path);try{await d(s);}catch{}throw new Error(`Workspace sync failed after import and the imported project was rolled back: ${u instanceof Error?u.message:String(u)}`)}return e.json?(console.log(JSON.stringify({workspacePath:s,workspaceResolution:i?"default-auto":n?"explicit":"nearest",defaultWorkspaceCreated:i?c:false,suggestedCdCommand:l,importedProject:p},null,2)),0):(i&&console.log(a$4.yellow(`\u2139 Imported outside a workspace, so RapidKit used the default workspace: ${s}`)),console.log(a$4.green(`\u2714 Imported project: ${p.name}`)),console.log(a$4.gray(` Workspace: ${s}`)),console.log(a$4.gray(` Destination: ${p.path}`)),console.log(a$4.gray(` Stack: ${p.stack} (${p.confidence})`)),console.log(a$4.gray(` Source: ${e.git===true||dr(r)?"git-url":"local-folder"}`)),console.log(a$4.gray(` Next shell step: ${l}`)),0)}catch(p){let u=p instanceof Error?p.message:String(p);return e.json?console.log(JSON.stringify({error:u},null,2)):console.log(a$4.red(`\u274C Import failed: ${u}`)),1}}async function Rr(r){let e=new Set(["python-only","polyglot","enterprise"]),t="minimal";try{let s=f__default.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 Ar(r);if(s.length===0)return false;for(let i of s){let c=ge(i),l=c?.module_support;if(!(ie(c,i)||ce(c,i))&&l!==false)return pe(c,i)||ae(c,i),true}return false})())return 0;let n="poetry";try{let{readWorkspaceMarker:s}=await import('./workspace-marker-IOPQ42A7.js'),c=(await s(r))?.metadata?.npm?.installMethod;(c==="poetry"||c==="venv"||c==="pipx"||c==="pip")&&(n=c);}catch{}if(n==="poetry"||n==="venv"){let s=f__default.join(r,"pyproject.toml"),i=false;try{i=(await k.promises.readFile(s,"utf-8")).includes("rapidkit-core");}catch{i=false;}let c=process.env.RAPIDKIT_DEV_PATH,l=c?await ___default.pathExists(c):false;if(i){let d=Vs(r);if(!await ___default.pathExists(d)){let u=await Ys(r);if(u!==0)return u}let p=await K(d,l&&c?["-m","pip","install",c,"--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 K("poetry",["install","--no-root"],r);if(d!==0)return d;let m=await K("poetry",["add","rapidkit-core"],r);if(m!==0)return m}try{let{writeWorkspaceLauncher:d}=await import('./create-RDLT34XT.js');await d(r,n==="venv"?"venv":"poetry");}catch{}return 0}return 0}async function Ar(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 s=[];try{s=await k.promises.readdir(n,{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 c=f__default.join(n,i.name),l=f__default.join(c,".rapidkit","context.json"),d=f__default.join(c,".rapidkit","project.json");if(await ___default.pathExists(l)||await ___default.pathExists(d)){e.push(c);continue}o.push(c);}}return e}function pi(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 ui="default-workspace";function mi(){return f__default.join(homedir(),"Workspai","rapidkits",ui)}async function fi(){let r=mi(),e=f__default.basename(r),t=ot(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 Ue(o,{name:e,workspace_name:e,profile:"minimal",createdAt:new Date().toISOString(),createdBy:"rapidkit-npm-import-fallback"}),{workspacePath:r,created:!t}}async function xr(r){let t=await Oe("go",{runCommandInCwd:K,runCoreRapidkit:e$1}).initProject(r);return t.message&&console.log(a$4.red(`\u274C ${t.message}`)),t.exitCode}async function yt(r,e){let t=Oe("node",{runCommandInCwd:K,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 Be(r,e){let t=Oe("java",{runCommandInCwd:K,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 gi(r,e=_r){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 S=R.trim().toLowerCase();return S==="minimal"||S==="java-only"||S==="go-only"||S==="python-only"||S==="node-only"||S==="polyglot"||S==="enterprise"?S:null},i=function(R){let de=R.match(/^\s*mode:\s*([a-zA-Z]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase()==="strict"?"strict":"warn",me=(be,V)=>{let Re=R.match(new RegExp(`^\\s*${be}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return Re?Re[1].toLowerCase()==="true":V};return {mode:de,dependency_sharing_mode:yn(R),rules:{enforce_workspace_marker:me("enforce_workspace_marker",true),enforce_toolchain_lock:me("enforce_toolchain_lock",false),disallow_untrusted_tool_sources:me("disallow_untrusted_tool_sources",false),enforce_compatibility_matrix:me("enforce_compatibility_matrix",false),require_mirror_lock_for_offline:me("require_mirror_lock_for_offline",true)}}};let c=["init"],l,d=false,m=false,p=false;for(let R=1;R<r.length;R+=1){let S=r[R];if(S==="--ci"){d=true;continue}if(S==="--offline"){m=true;continue}if(S==="--json"){p=true;continue}if(S==="--profile"){let q=r[R+1];if(!q||q.startsWith("-"))return console.log(a$4.yellow("Usage: rapidkit bootstrap [path] [--profile <minimal|java-only|go-only|python-only|node-only|polyglot|enterprise>] [--ci] [--offline] [--json]")),1;l=q,R+=1;continue}if(S.startsWith("--profile=")){l=S.slice(10);continue}c.push(S);}let u=s(l);if(l&&!u)return console.log(a$4.red(`Invalid profile: ${l}. Use one of: minimal, java-only, go-only, python-only, node-only, polyglot, enterprise.`)),1;let h=process.cwd(),g=f__default.join(h,".rapidkit-workspace"),y=f__default.join(h,".rapidkit","workspace.json"),P;!k.existsSync(g)&&k.existsSync(y)?P=h:(P=Y(h),P||(P=ni(h)));let w=[],j=null,b=null;if(P)try{let R=f__default.join(P,".rapidkit","workspace.json"),S=await k.promises.readFile(R,"utf-8"),q=JSON.parse(S);b=s(q.profile);}catch{b=null;}let E=["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"},D=u;if(!!P&&!u&&!d&&!p&&!!process.stdin.isTTY&&!!process.stdout.isTTY){let R=b||"minimal",{chosenProfile:S}=await Ae.prompt([{type:"rawlist",name:"chosenProfile",message:`Select workspace profile for bootstrap (current: ${R})`,choices:E.map(q=>({name:q===R?`${I[q]} \u2190 current`:I[q],value:q})),default:E.indexOf(R)}]);D=S;}let G=D||b||"minimal";if(P)try{let S=G==="python-only"||G==="polyglot"||G==="enterprise"?"poetry":"venv",q;try{let V=(await k.promises.readFile(f__default.join(P,".python-version"),"utf-8")).trim();V&&(q=V);}catch{}let{syncWorkspaceFoundationFiles:de}=await import('./create-RDLT34XT.js'),me=await de(P,{workspaceName:f__default.basename(P),installMethod:S,pythonVersion:q,profile:G,writeMarker:true,writeGitignore:true,onlyIfMissing:true});w.push({id:"workspace.legacy.sync",status:me.length>0?"passed":"skipped",message:me.length>0?`Legacy workspace foundation synchronized: ${me.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(P&&D&&D!==b)try{let R=f__default.join(P,".rapidkit","workspace.json"),S=await k.promises.readFile(R,"utf-8"),q=JSON.parse(S);q.profile=D,await k.promises.writeFile(R,JSON.stringify(q,null,2)+`
169
- `,"utf-8");}catch{}let L={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}},X=null;if(P)try{let R=await k.promises.readFile(f__default.join(P,".rapidkit","policies.yml"),"utf-8");X=R,L=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(P){let R=wn(X);L.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:L.dependency_sharing_mode==="isolated"?"Effective dependency mode: isolated (default secure mode).":L.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 S=k.existsSync(f__default.join(P,".rapidkit-workspace"));w.push({id:"policy.enforce_workspace_marker",status:!L.rules.enforce_workspace_marker||S?"passed":"failed",message:!L.rules.enforce_workspace_marker||S?"Workspace marker policy satisfied.":"Workspace marker policy failed: .rapidkit-workspace is missing."});let q=k.existsSync(f__default.join(P,".rapidkit","toolchain.lock"));w.push({id:"policy.enforce_toolchain_lock",status:!L.rules.enforce_toolchain_lock||q?"passed":"failed",message:!L.rules.enforce_toolchain_lock||q?"Toolchain lock policy satisfied.":"Toolchain lock policy failed: .rapidkit/toolchain.lock is missing."});let de=process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||k.existsSync(f__default.join(P,".rapidkit","trusted-sources.lock"));w.push({id:"policy.disallow_untrusted_tool_sources",status:!L.rules.disallow_untrusted_tool_sources||de?"passed":"failed",message:!L.rules.disallow_untrusted_tool_sources||de?"Trusted tool sources policy satisfied.":"Trusted tool sources policy failed: set RAPIDKIT_TRUSTED_SOURCES=1 or provide .rapidkit/trusted-sources.lock."});let me=f__default.join(P,".rapidkit","compatibility-matrix.json"),be=k.existsSync(me),V=L.rules.enforce_compatibility_matrix;if(w.push({id:"policy.enforce_compatibility_matrix",status:!V||be?"passed":"failed",message:!V||be?"Compatibility matrix policy satisfied.":"Compatibility matrix policy failed: .rapidkit/compatibility-matrix.json is missing."}),be)try{let W=await k.promises.readFile(me,"utf-8"),z=JSON.parse(W),wt=!!z&&typeof z=="object";w.push({id:"compatibility.matrix.parse",status:wt?"passed":"failed",message:wt?"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 Re=f__default.join(P,".rapidkit","mirror-config.json"),Le=f__default.join(P,".rapidkit","mirror.lock"),nt=k.existsSync(Re),Ht=k.existsSync(Le),Ir={};if(nt)try{Ir=JSON.parse(await k.promises.readFile(Re,"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 Vt=await cr(P,{ciMode:d,offlineMode:m});if(w.push(...Vt.checks.map(W=>({id:W.id,status:W.status,message:W.message}))),j=Vt.details,Vt.details.lockWritten&&(Ht=true),m){let W=process.env.RAPIDKIT_MIRROR_ENABLED==="1"||Ir.enabled===true;w.push({id:"offline.mirror.enabled",status:W?"passed":"failed",message:W?"Offline mode mirror is enabled.":'Offline mode requires mirror enablement (set RAPIDKIT_MIRROR_ENABLED=1 or .rapidkit/mirror-config.json {"enabled": true}).'});let z=L.rules.require_mirror_lock_for_offline;w.push({id:"offline.mirror.lock",status:!z||Ht?"passed":"failed",message:!z||Ht?"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 Pn=await Ar(P),se=new Set;for(let W of Pn){let z=ge(W);if(ie(z,W)){se.add("go");continue}if(ce(z,W)){se.add("java");continue}if(ae(z,W)){se.add("node");continue}if(pe(z,W)){se.add("python");continue}se.add("unknown");}if(G==="go-only"){let W=se.size===0||[...se].every(z=>z==="go");w.push({id:"profile.go-only",status:W?"passed":"failed",message:W?"go-only profile validated for discovered projects.":`go-only profile mismatch: detected runtimes [${[...se].join(", ")}].`});}else if(G==="java-only"){let W=se.size===0||[...se].every(z=>z==="java");w.push({id:"profile.java-only",status:W?"passed":"failed",message:W?"java-only profile validated for discovered projects.":`java-only profile mismatch: detected runtimes [${[...se].join(", ")}].`});}else if(G==="python-only"){let W=se.size===0||[...se].every(z=>z==="python");w.push({id:"profile.python-only",status:W?"passed":"failed",message:W?"python-only profile validated for discovered projects.":`python-only profile mismatch: detected runtimes [${[...se].join(", ")}].`});}else if(G==="node-only"){let W=se.size===0||[...se].every(z=>z==="node");w.push({id:"profile.node-only",status:W?"passed":"failed",message:W?"node-only profile validated for discovered projects.":`node-only profile mismatch: detected runtimes [${[...se].join(", ")}].`});}else if(G==="minimal"){let W=[...se].filter(wt=>wt!=="unknown"),z=W.length<=1;w.push({id:"profile.minimal",status:z?"passed":"failed",message:z?"minimal profile is compatible with detected runtime mix.":`minimal profile mismatch: multiple runtimes detected [${W.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:be?"passed":"failed",message:be?"enterprise profile has compatibility matrix.":"enterprise profile requires .rapidkit/compatibility-matrix.json."}),w.push({id:"profile.enterprise.mirror-config",status:nt?"passed":"failed",message:nt?"enterprise profile has mirror configuration.":"enterprise profile requires .rapidkit/mirror-config.json."}));}d&&(process.env.RAPIDKIT_BOOTSTRAP_CI="1"),m&&(process.env.RAPIDKIT_OFFLINE_MODE="1");let fe=w.some(R=>R.id.startsWith("policy.schema.")&&R.status==="failed")||L.mode==="strict"&&w.some(R=>R.status==="failed"),H=P||h,O=f__default.join(H,".rapidkit","reports"),x=new Date().toISOString().replace(/[:.]/g,"-"),B=f__default.join(O,`bootstrap-compliance-${x}.json`),ye=f__default.join(O,"bootstrap-compliance.latest.json"),J={command:"bootstrap",timestamp:new Date().toISOString(),workspacePath:P,profile:G,options:{ci:d,offline:m,strict:L.mode==="strict"},policyMode:L.mode,policyRules:L.rules,mirrorLifecycle:j,checks:w};if(fe){let R={...J,result:"blocked",initExitCode:null};return await ___default.ensureDir(O),await Ue(B,R),await Ue(ye,R),p?process.stdout.write(`${JSON.stringify(R,null,2)}
170
- `):(console.log(a$4.red("\u274C Bootstrap blocked by strict policy checks.")),console.log(a$4.gray(`Compliance report: ${B}`))),1}let ee=0;p||(ee=await e(c));let Pe=w.filter(R=>R.status==="failed").length,$e=ee!==0?"failed":Pe>0?"ok_with_warnings":"ok",te={...J,result:$e,initExitCode:ee};if(await ___default.ensureDir(O),await Ue(B,te),await Ue(ye,te),p)process.stdout.write(`${JSON.stringify(te,null,2)}
171
- `);else {let R=w.filter(S=>S.status==="failed").length;R>0&&console.log(a$4.yellow(`\u26A0\uFE0F Bootstrap completed with ${R} policy/profile warnings.`)),console.log(a$4.gray(`Compliance report: ${B}`));}return ee}finally{typeof t>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=t;}}async function hi(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(a$4.yellow("Usage: rapidkit setup <python|node|go|java> [--warm-deps]")),1;let o=async(p,u)=>{if(p==="node"){if(!k.existsSync(f__default.join(u,"package.json")))return {exitCode:0,message:"Node warm-up skipped: package.json not found in current directory."};let g=k.existsSync(f__default.join(u,"pnpm-lock.yaml")),y=k.existsSync(f__default.join(u,"yarn.lock"));return g?{exitCode:await K("pnpm",["install","--lockfile-only","--ignore-scripts"],u)}:y?{exitCode:await K("yarn",["install","--ignore-scripts"],u)}:{exitCode:await K("npm",["install","--package-lock-only","--ignore-scripts"],u)}}if(p==="go")return k.existsSync(f__default.join(u,"go.mod"))?{exitCode:await K("go",["mod","download"],u)}:{exitCode:0,message:"Go warm-up skipped: go.mod not found in current directory."};if(p==="java"){let h=k.existsSync(f__default.join(u,"pom.xml")),g=k.existsSync(f__default.join(u,"build.gradle"))||k.existsSync(f__default.join(u,"build.gradle.kts")),y=f__default.join(u,process.platform==="win32"?"gradlew.bat":"gradlew"),P=k.existsSync(y);return !h&&!g?{exitCode:0,message:"Java warm-up skipped: pom.xml or build.gradle not found in current directory."}:h?{exitCode:await K("mvn",["-B","-q","-DskipTests","dependency:go-offline"],u)}:{exitCode:await K(P?y:"gradle",["--no-daemon","dependencies"],u)}}return {exitCode:0,message:"Dependency warm-up currently applies to node/go/java runtimes."}},n=Oe(e,{runCommandInCwd:K,runCoreRapidkit:(p,u)=>e$1(p,{...u,cwd:void 0})}),s=await n.checkPrereqs(),i=await n.doctorHints(process.cwd()),c=Y(process.cwd()),l=c||process.cwd(),d=null,m=async()=>e!=="java"||!c?[]:d||(d=(await Ar(c)).filter(u=>{let h=ge(u);return ce(h,u)}),d);if(s.exitCode===0){console.log(a$4.green(`\u2705 ${e} prerequisites look good.`));let p=["python","node","go","java"].filter(u=>u!==e).join("/");if(console.log(a$4.gray(` Scope: validated ${e} runtime only. ${p} checks are optional unless your workspace profile uses them.`)),e==="python"&&console.log(a$4.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(a$4.gray(` ${e} cache warm-up completed.`)):console.log(a$4.yellow(` ${e} cache warm-up skipped (non-fatal).`))),t)if(e==="java"&&c){let u=await m();if(u.length>0){let h=0,g=0,y=0;for(let P of u){let w=await o("java",P),j=/skipped/i.test(w.message||""),b=f__default.relative(c,P)||f__default.basename(P);w.message&&console.log(a$4.gray(` [${b}] ${w.message}`)),w.exitCode===0&&!j?h+=1:w.exitCode===0&&j?y+=1:g+=1;}h>0&&console.log(a$4.gray(` java dependency warm-up completed for ${h} project(s) (--warm-deps).`)),g>0&&console.log(a$4.yellow(` java dependency warm-up failed for ${g} project(s) (non-fatal).`)),h===0&&g===0&&y>0&&console.log(a$4.gray(" java dependency warm-up skipped for discovered workspace projects."));}else {let h=await o("java",l),g=/skipped/i.test(h.message||"");h.message&&console.log(a$4.gray(` ${h.message}`)),h.exitCode===0&&!g?console.log(a$4.gray(` ${e} dependency warm-up completed (--warm-deps).`)):h.exitCode!==0&&console.log(a$4.yellow(` ${e} dependency warm-up failed (non-fatal).`));}}else {let u=await o(e,l),h=/skipped/i.test(u.message||"");u.message&&console.log(a$4.gray(` ${u.message}`)),u.exitCode===0&&!h?console.log(a$4.gray(` ${e} dependency warm-up completed (--warm-deps).`)):u.exitCode!==0&&console.log(a$4.yellow(` ${e} dependency warm-up failed (non-fatal).`));}if(c)try{let u=f__default.join(c,".rapidkit","toolchain.lock"),h={};try{h=JSON.parse(await k.promises.readFile(u,"utf-8"));}catch{}(!h.runtime||typeof h.runtime!="object")&&(h.runtime={});let g=h.runtime;if(e==="python"){let y=null;try{let{execa:P}=await import('execa');for(let w of Er()){let b=await P(w,w==="py"?["-3","--version"]:["--version"],{cwd:c,stdio:"pipe",reject:false,timeout:3e3});if(b.exitCode===0){let I=(b.stdout||b.stderr||"").match(/Python\s+(\S+)/);if(y=I?I[1]:null,y)break}}}catch{}g.python={...g.python||{},version:y,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 y=null;try{let{execa:P}=await import('execa'),j=((await P("go",["version"],{cwd:c,stdio:"pipe"})).stdout||"").match(/go(\d+\.\d+(?:\.\d+)?)/i);y=j?j[1]:null;}catch{}g.go={...g.go||{},version:y,last_setup:new Date().toISOString()};}else if(e==="java"){let y=null,P=null,w=null,j=await m(),E=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:j[0]||l;try{let{execa:I}=await import('execa'),D=await I("java",["-version"],{cwd:c,stdio:"pipe",reject:false,timeout:3e3}),G=`${D.stdout||""}
172
- ${D.stderr||""}`.match(/version\s+"([^"]+)"/i);y=G?G[1]:null;let L=k.existsSync(f__default.join(E,"pom.xml")),X=k.existsSync(f__default.join(E,"build.gradle"))||k.existsSync(f__default.join(E,"build.gradle.kts"));if(L){P="maven";let le=(()=>{let x=f__default.join(E,"mvnw.cmd");if(process.platform==="win32"&&k.existsSync(x))return x;let B=f__default.join(E,"mvnw");return k.existsSync(B)?B:"mvn"})(),fe=await I(le,["-version"],{cwd:E,stdio:"pipe",reject:false,timeout:3e3}),O=`${fe.stdout||""}
173
- ${fe.stderr||""}`.match(/Apache Maven\s+(\S+)/i);w=O?O[1]:null;}else if(X){P="gradle";let le=(()=>{let x=f__default.join(E,"gradlew.bat");if(process.platform==="win32"&&k.existsSync(x))return x;let B=f__default.join(E,"gradlew");return k.existsSync(B)?B:"gradle"})(),fe=await I(le,["--version"],{cwd:E,stdio:"pipe",reject:false,timeout:3e3}),O=`${fe.stdout||""}
174
- ${fe.stderr||""}`.match(/Gradle\s+(\S+)/i);w=O?O[1]:null;}}catch{}g.java={...g.java||{},version:y,build_tool:P,build_tool_version:w,last_setup:new Date().toISOString()};}h.updated_at=new Date().toISOString(),await k.promises.writeFile(u,JSON.stringify(h,null,2)+`
175
- `,"utf-8"),console.log(a$4.gray(" toolchain.lock updated (.rapidkit/toolchain.lock)"));}catch{}}else console.log(a$4.red(`\u274C ${e} prerequisites check failed.`));if(i.length>0){console.log(a$4.gray(`
176
- Hints:`));for(let p of i)console.log(a$4.gray(`- ${p}`));}return s.exitCode}function yi(r){let e={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};for(let t of r.split(`
177
- `)){let o=t.trim(),n=o.match(/^strategy:\s*(\S+)/);n&&(e.strategy=n[1].replace(/['"]]/g,""));let s=o.match(/^prune_on_bootstrap:\s*(true|false)/);s&&(e.prune_on_bootstrap=s[1]==="true");let i=o.match(/^self_heal:\s*(true|false)/);i&&(e.self_heal=i[1]==="true");let c=o.match(/^verify_integrity:\s*(true|false)/);c&&(e.verify_integrity=c[1]==="true");}return e}async function wi(r){let e=(r[1]||"status").toLowerCase(),t=Ft.getInstance(),o=Y(process.cwd()),n={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};if(o)try{let s=await k.promises.readFile(f__default.join(o,".rapidkit","cache-config.yml"),"utf-8");n=yi(s);}catch{}return e==="status"?(console.log(a$4.cyan("RapidKit cache is enabled")),console.log(a$4.cyan("RapidKit cache status")),o?(console.log(a$4.gray(` Workspace: ${o}`)),console.log(a$4.gray(` Strategy: ${n.strategy}`)),console.log(a$4.gray(` Self-heal: ${n.self_heal}`)),console.log(a$4.gray(` Prune on bootstrap:${n.prune_on_bootstrap}`)),console.log(a$4.gray(` Verify integrity: ${n.verify_integrity}`))):console.log(a$4.gray(" (not inside a workspace \u2014 showing in-memory cache only)")),console.log(a$4.gray(" In-memory cache: enabled")),console.log(a$4.gray(" Use: rapidkit cache clear|prune|repair")),0):e==="clear"?(await t.clear(),console.log(a$4.green("Cache clear completed")),console.log(a$4.green("\u2705 Cache cleared (all entries removed).")),0):e==="prune"?(await t.clear(),console.log(a$4.green("\u2705 Cache pruned (stale entries removed).")),n.prune_on_bootstrap||console.log(a$4.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(a$4.green("\u2705 Cache repaired (self-heal applied, stale entries evicted).")),n.verify_integrity&&console.log(a$4.gray(" Integrity verification is enabled in cache-config.yml.")),0):(console.log(a$4.yellow("\u26A0\uFE0F self_heal is disabled in .rapidkit/cache-config.yml \u2014 skipping repair.")),0):(console.log(a$4.yellow("Usage: rapidkit cache <status|clear|prune|repair>")),1)}async function ki(r,e,t,o){let n=(e||"show").toLowerCase(),s=f__default.join(r,".rapidkit","policies.yml");if(n==="show"||n==="status"||n==="get"){let m=await nn(r),p=rn(m);return console.log(a$4.cyan(`Policy file: ${s}`)),console.log(a$4.gray(` mode: ${p.mode}`)),console.log(a$4.gray(` dependency_sharing_mode: ${p.dependency_sharing_mode}`)),console.log(a$4.gray(" rules:")),console.log(a$4.gray(` enforce_workspace_marker: ${p.rules.enforce_workspace_marker}`)),console.log(a$4.gray(` enforce_toolchain_lock: ${p.rules.enforce_toolchain_lock}`)),console.log(a$4.gray(` disallow_untrusted_tool_sources: ${p.rules.disallow_untrusted_tool_sources}`)),console.log(a$4.gray(` enforce_compatibility_matrix: ${p.rules.enforce_compatibility_matrix}`)),console.log(a$4.gray(` require_mirror_lock_for_offline: ${p.rules.require_mirror_lock_for_offline}`)),console.log(a$4.gray("Examples:")),console.log(a$4.gray(" npx rapidkit workspace policy set mode strict")),console.log(a$4.gray(" npx rapidkit workspace policy set dependency_sharing_mode shared-runtime-caches")),console.log(a$4.gray(" npx rapidkit workspace policy set rules.enforce_toolchain_lock true")),0}if(n!=="set")return console.log(a$4.red(`Unknown workspace policy action: ${e||""}`)),console.log(a$4.gray("Available: show, set")),1;if(!t||typeof o>"u")return console.log(a$4.yellow("Usage: rapidkit workspace policy set <key> <value>")),console.log(a$4.gray("Allowed keys:")),console.log(a$4.gray(" mode (warn|strict)")),console.log(a$4.gray(" dependency_sharing_mode (isolated|shared-runtime-caches|shared-node-deps)")),console.log(a$4.gray(" rules.enforce_workspace_marker (true|false)")),console.log(a$4.gray(" rules.enforce_toolchain_lock (true|false)")),console.log(a$4.gray(" rules.disallow_untrusted_tool_sources (true|false)")),console.log(a$4.gray(" rules.enforce_compatibility_matrix (true|false)")),console.log(a$4.gray(" rules.require_mirror_lock_for_offline (true|false)")),1;let i=t.trim(),l=await nn(r);if(i==="mode"){let m=o.trim().toLowerCase();if(m!=="warn"&&m!=="strict")return console.log(a$4.red("\u274C Invalid mode. Use: warn | strict")),1;l=on(l,"mode",`${m} # "warn" or "strict"`);}else if(i==="dependency_sharing_mode"){let m=o.trim().toLowerCase();if(m!=="isolated"&&m!=="shared-runtime-caches"&&m!=="shared-node-deps")return console.log(a$4.red("\u274C Invalid dependency_sharing_mode. Use: isolated | shared-runtime-caches | shared-node-deps")),1;l=on(l,"dependency_sharing_mode",`${m} # "isolated" or "shared-runtime-caches" or "shared-node-deps"`);}else if(i.startsWith("rules.")){let m=i.slice(6);if(!(m in hn))return console.log(a$4.red(`\u274C Unknown policy rule: ${m}`)),1;let p=li(o);if(p===null)return console.log(a$4.red("\u274C Rule values must be boolean: true | false")),1;l=ii(l,m,p);}else return console.log(a$4.red(`\u274C Unknown policy key: ${i}`)),1;await ci(r,l);let d=rn(l);return console.log(a$4.green(`\u2705 Updated ${i} in .rapidkit/policies.yml`)),console.log(a$4.gray(` mode: ${d.mode}`)),console.log(a$4.gray(` dependency_sharing_mode: ${d.dependency_sharing_mode}`)),console.log(a$4.gray(" Tip: run `npx rapidkit workspace policy show` to inspect all values.")),0}async function vi(r){let e=(r[1]||"status").toLowerCase(),t=r.includes("--json"),o=Y(process.cwd());if(!o)return console.log(a$4.red("\u274C Not inside a RapidKit workspace")),console.log(a$4.gray("\u{1F4A1} Run this command from within a workspace directory")),1;let n=f__default.join(o,".rapidkit"),s=f__default.join(n,"mirror-config.json"),i=f__default.join(n,"mirror.lock"),c=f__default.join(n,"mirror","artifacts"),l=f__default.join(n,"reports");async function d(m){let p=new Date().toISOString().replace(/[:.]/g,"-"),u=f__default.join(l,`mirror-ops-${p}.json`),h=f__default.join(l,"mirror-ops.latest.json");await ___default.ensureDir(l),await Ue(u,m),await Ue(h,m);}if(e==="status"){if(!await ___default.pathExists(s))try{let P={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(s,JSON.stringify(P,null,2)+`
178
- `,"utf-8"),console.log(a$4.gray(" mirror-config.json created with defaults (.rapidkit/mirror-config.json)"));}catch{}let p=await ___default.pathExists(s),u=await ___default.pathExists(c),h=await ___default.pathExists(i),g=u?(await k.promises.readdir(c,{withFileTypes:true})).filter(P=>P.isFile()).length:0,y={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:o,mirror:{configExists:p,lockExists:h,artifactsCount:g}};return await d(y),t?(process.stdout.write(`${JSON.stringify(y,null,2)}
179
- `),0):(console.log(a$4.cyan("RapidKit mirror status")),console.log(a$4.gray(`Workspace: ${o}`)),console.log(a$4.gray(`Config: ${p?"present":"missing"} (${s})`)),console.log(a$4.gray(`Lock: ${h?"present":"missing"} (${i})`)),console.log(a$4.gray(`Artifacts: ${g}`)),0)}if(e==="sync"||e==="verify"||e==="rotate"){let m=await cr(o,{ciMode:true,offlineMode:e==="verify",forceRun:true}),p=m.checks.filter(g=>g.status==="failed"),u=m.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:o,details:m.details,checks:m.checks};if(await d(g),t)return process.stdout.write(`${JSON.stringify(g,null,2)}
180
- `),1;console.log(a$4.red("\u274C Mirror verify failed."));for(let y of m.checks.filter(P=>P.id.startsWith("mirror.verify.")))console.log(a$4.gray(`- ${y.id}: ${y.message}`));return 1}if(p.length>0){let g={command:"mirror",action:e,result:"failed",timestamp:new Date().toISOString(),workspacePath:o,details:m.details,checks:m.checks};if(await d(g),t)return process.stdout.write(`${JSON.stringify(g,null,2)}
181
- `),1;console.log(a$4.yellow(`\u26A0\uFE0F Mirror ${e} completed with ${p.length} issue(s).`));for(let y of p)console.log(a$4.gray(`- ${y.id}: ${y.message}`));return 1}let h={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:o,details:m.details,checks:m.checks};return await d(h),t?(process.stdout.write(`${JSON.stringify(h,null,2)}
182
- `),0):e==="rotate"?(console.log(a$4.green(`\u2705 Mirror rotate completed. Rotated files: ${m.details.rotatedFiles}.`)),0):e==="verify"?(console.log(a$4.green(`\u2705 Mirror verify completed. Verified artifacts: ${m.details.verifiedArtifacts}.`)),0):(console.log(a$4.green(`\u2705 Mirror sync completed. Synced artifacts: ${m.details.syncedArtifacts}.`)),0)}return console.log(a$4.yellow("Usage: rapidkit mirror <status|sync|verify|rotate> [--json]")),1}async function _r(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 kn(t,async()=>{let n=Y(t),s=Oe("python",{runCommandInCwd:K,runCoreRapidkit:e$1}),i=r.slice(1).filter(h=>!h.startsWith("-"));if(i.length>0){let h=f__default.resolve(t,i[0]),g=ge(h),y=await vr(h);return ie(g,h)||y==="go"?await xr(h):ce(g,h)||y==="java"?await Be("init",h):ae(g,h)||y==="node"?await br(h):pe(g,h)||y==="python"?await Pr(h,s):await e$1(r,{cwd:t})}let c=ge(t),l=!!Y(t)&&t===Y(t);if(!l&&ie(c,t))return await xr(t);let d=await vr(t);if(!l&&(ce(c,t)||d==="java"))return await Be("init",t);if(!l&&(ae(c,t)||d==="node"))return await br(t);if(!l&&(pe(c,t)||d==="python"))return await Pr(t,s);let m=n||Y(t),p=gn(t),u=p?f__default.dirname(f__default.dirname(p)):null;if(u&&u!==m){let h=ge(u),g=await vr(u);return ie(h,u)||g==="go"?await xr(u):ce(h,u)||g==="java"?await Be("init",u):ae(h,u)||g==="node"?await br(u):pe(h,u)||g==="python"?await Pr(u,s):await e$1(["init"],{cwd:u})}if(m&&t===m){console.log(a$4.yellow("\u26A0\uFE0F Running `npx rapidkit init` at workspace root.")),console.log(a$4.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 h=await Rr(m);if(h!==0)return h;let{runWorkspaceStage:g}=await import('./workspace-run-F2VKW3ZK.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 h=await a$2(),{name:g}=pi(t),{createProject:y}=await import('./create-RDLT34XT.js');return await y(g,{yes:true,userConfig:h}),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 sn(r){let e=Y(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 s={};try{s=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 i=s.runtime??{},c=ge(r);ie(c,r)&&!i.go?.version?o.push("go.version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."):ae(c,r)&&!i.node?.version?o.push("node.version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."):ce(c,r)&&!i.java?.version?o.push("java.version is not pinned in toolchain.lock \u2014 run `rapidkit setup java` first."):pe(c,r)&&!i.python?.version&&o.push("python.version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");try{let d=JSON.parse(await k.promises.readFile(f__default.join(e,".rapidkit","workspace.json"),"utf-8")).profile??"";d==="python-only"&&(ie(c,r)||ae(c,r)||ce(c,r))?o.push('Workspace profile is "python-only" but this project is not Python.'):d==="node-only"&&(ie(c,r)||pe(c,r)||ce(c,r))?o.push('Workspace profile is "node-only" but this project is not Node.'):d==="go-only"&&(ae(c,r)||pe(c,r)||ce(c,r))?o.push('Workspace profile is "go-only" but this project is not Go.'):d==="java-only"&&(pe(c,r)||ae(c,r)||ie(c,r))&&o.push('Workspace profile is "java-only" but this project is not Java.');}catch{}return o}async function Pi(){let r=async w=>{if(!a()||!w.toLowerCase().endsWith(".cmd"))return false;try{let b=(await ___default.readFile(w,"utf8")).replace(/\r\n/g,`
183
- `).toLowerCase(),E=b.includes("\\.rapidkit\\rapidkit"),I=b.includes("\\.rapidkit\\rapidkit.cmd")||b.includes("\\.rapidkit\\rapidkit.exe")||b.includes("\\.venv\\scripts\\rapidkit.exe");return E&&!I}catch{return false}},e=process.cwd(),t=process.argv.slice(2),o=t[0],n=o==="init",s=new Set(["dev","start","build","test"]),i$1=!o||o==="--help"||o==="-h"||o==="help",c=ot(e),l=k.existsSync(f__default.join(e,".rapidkit","project.json")),d=ge(e),m=ie(d,e)||ae(d,e),p=!!o&&s.has(o)&&m;if(qt(t[0])||t[0]==="create"||t[0]==="init"&&c&&!l)return false;try{let w=o==="shell"&&t[1]==="activate",j=o==="create",b=await qr(e,{cwd:e,timeoutMs:1200});if(b.ok&&b.data?.isRapidkitProject&&b.data.engine==="python"){let E=j||qt(o);if(!i$1&&!w&&!E&&!n&&!p){if(o&&en.includes(o)){let D=await sn(e).catch(()=>[]);if(D.length>0){process.stderr.write(a$4.red("\u274C Strict policy violations prevent running this command:")+`
184
- `);for(let F of D)process.stderr.write(a$4.red(` \u2022 ${F}`)+`
185
- `);process.exit(1);}}let I=await e$1(process.argv.slice(2),{cwd:e});process.exit(I);}}}catch{}let u=gn(e),h=a(),g=i(e),y=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}y=w;break}let P=o==="create";if(o==="init"&&c&&!l)return false;if(o&&en.includes(o)){let w=await sn(e);if(w.length>0){process.stderr.write(a$4.red("\u274C Strict policy violations prevent running this command:")+`
186
- `);for(let j of w)process.stderr.write(a$4.red(` \u2022 ${j}`)+`
187
- `);process.exit(1);}}if(y&&o&&Xo.includes(o)&&!P&&!n&&!p){a$1.debug(`Delegating to local CLI: ${y} ${t.join(" ")}`);let w=o==="init"?Yo():process.env,j=spawn(y,t,{stdio:"inherit",cwd:e,shell:h,env:w});return j.on("close",b=>{process.exit(b??0);}),j.on("error",b=>{a$1.error(`Failed to run local rapidkit: ${b.message}`),process.exit(1);}),true}if(u&&await ___default.pathExists(u))try{if((await ___default.readJson(u)).engine==="pip"){let j=t[0],b=i(e),E=null;for(let I of b)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}E=I;break}if(E&&j&&Xo.includes(j)&&j!=="init"&&!p){a$1.debug(`Delegating to local CLI (early detection): ${E} ${t.join(" ")}`);let I=j==="init"?Yo():process.env,D=spawn(E,t,{stdio:"inherit",cwd:e,env:I});return D.on("close",F=>process.exit(F??0)),D.on("error",F=>{a$1.error(`Failed to run local rapidkit: ${F.message}`),process.exit(1);}),true}if(j==="shell"&&t[1]==="activate"){let I=a()?`# RapidKit: activation snippet (PowerShell)
177
+ `;await v.promises.writeFile(o,n,"utf-8");}function Wi(t){let e=t.trim().toLowerCase();return e==="true"||e==="1"||e==="on"?true:e==="false"||e==="0"||e==="off"?false:null}function Dn(t){if(!t)return "isolated";let r=t.match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();return r==="shared-runtime-caches"||r==="shared-node-deps"||r==="isolated"?r:"isolated"}function Tn(t){if(!t)return {mode:"isolated",status:"skipped",message:"No policies.yml found; dependency_sharing_mode defaults to isolated."};let e=t.match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m);if(!e)return {mode:"isolated",status:"skipped",message:"dependency_sharing_mode is not set; defaulting to isolated."};let r=e[1].toLowerCase();return r==="isolated"||r==="shared-runtime-caches"||r==="shared-node-deps"?{mode:r,status:"passed",message:`dependency_sharing_mode is valid: ${r}.`}:{mode:"isolated",status:"failed",message:`Invalid dependency_sharing_mode: ${r}. Use one of: isolated, shared-runtime-caches, shared-node-deps.`}}async function Wn(t,e){let r=K(t),o=r?y__default.join(r,".rapidkit","policies.yml"):null,n="isolated";if(o&&await ___default.pathExists(o))try{let a=await v.promises.readFile(o,"utf-8"),l=Tn(a);if(l.status==="failed")return console.log(s.red(`\u274C ${l.message}`)),{ok:false,code:1};n=l.mode;}catch{return console.log(s.red("\u274C Failed to read workspace policy file (.rapidkit/policies.yml).")),{ok:false,code:1}}let i=process.env.RAPIDKIT_DEP_SHARING_MODE,c=process.env.RAPIDKIT_WORKSPACE_PATH;process.env.RAPIDKIT_DEP_SHARING_MODE=n,r&&(process.env.RAPIDKIT_WORKSPACE_PATH=r);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 c>"u"?delete process.env.RAPIDKIT_WORKSPACE_PATH:process.env.RAPIDKIT_WORKSPACE_PATH=c;}}async function J(t,e,r){return await new Promise(o=>{let n=spawn(t,e,{stdio:"inherit",cwd:r,shell:b$3()});n.on("close",i=>o(i??1)),n.on("error",()=>o(1));})}async function He(t,e){await ___default.outputFile(t,`${JSON.stringify(e,null,2)}
178
+ `,"utf-8");}async function Fi(t,e,r){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?y__default.resolve(e.workspace):null,i=n??K(process.cwd()),c=false,a=false;if(n){if(!at(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(s.red(`\u274C ${d}`)),1}}else if(!i||!at(i)){let d=await Gi();i=d.workspacePath,c=true,a=d.created;}if(!i||!at(i)){let d="Not inside a RapidKit workspace";return e.json?console.log(JSON.stringify({error:d},null,2)):(console.log(s.red(`\u274C ${d}`)),console.log(s.gray("\u{1F4A1} Run this command from a workspace root or pass --workspace <path>."))),1}let l=`cd ${i}`,f=r?.syncWorkspaceProjects??(async d=>{if(o)throw new Error("forced sync failure for command-level import rollback test");let{syncWorkspaceProjects:m}=await import('./workspace-YLFC25EZ.js');await m(d,true);}),p=r?.rollbackImportedProjectImport??zo;try{let d=await Yo({workspacePath:i,source:t,name:e.name,sourceType:e.git===true?"git-url":void 0});try{await f(i);}catch(m){await p(i,d.path);try{await f(i);}catch{}throw new Error(`Workspace sync failed after import and the imported project was rolled back: ${m instanceof Error?m.message:String(m)}`)}return e.json?(console.log(JSON.stringify({workspacePath:i,workspaceResolution:c?"default-auto":n?"explicit":"nearest",defaultWorkspaceCreated:c?a:false,suggestedCdCommand:l,importedProject:d},null,2)),0):(c&&console.log(s.yellow(`\u2139 Imported outside a workspace, so RapidKit used the default workspace: ${i}`)),console.log(s.green(`\u2714 Imported project: ${d.name}`)),console.log(s.gray(` Workspace: ${i}`)),console.log(s.gray(` Destination: ${d.path}`)),console.log(s.gray(` Stack: ${d.stack} (${d.confidence})`)),console.log(s.gray(` Source: ${e.git===true||yr(t)?"git-url":"local-folder"}`)),console.log(s.gray(` Next shell step: ${l}`)),0)}catch(d){let m=d instanceof Error?d.message:String(d);return e.json?console.log(JSON.stringify({error:m},null,2)):console.log(s.red(`\u274C Import failed: ${m}`)),1}}async function Or(t){let e=new Set(["python-only","polyglot","enterprise"]),r="minimal";try{let i=y__default.join(t,".rapidkit","workspace.json");r=JSON.parse(await v.promises.readFile(i,"utf-8")).profile??"minimal";}catch{r="minimal";}if(!await(async()=>{if(e.has(r))return true;let i=await Tr(t);if(i.length===0)return false;for(let c of i){let a=ge(c),l=a?.module_support;if(!(ce(a,c)||de(a,c))&&l!==false)return ue(a,c)||le(a,c),true}return false})())return 0;let n="poetry";try{let{readWorkspaceMarker:i}=await import('./workspace-marker-IOPQ42A7.js'),a=(await i(t))?.metadata?.npm?.installMethod;(a==="poetry"||a==="venv"||a==="pipx"||a==="pip")&&(n=a);}catch{}if(n==="poetry"||n==="venv"){let i=y__default.join(t,"pyproject.toml"),c=false;try{c=(await v.promises.readFile(i,"utf-8")).includes("rapidkit-core");}catch{c=false;}let a=process.env.RAPIDKIT_DEV_PATH,l=a?await ___default.pathExists(a):false;if(c){let f=ji(t);if(!await ___default.pathExists(f)){let m=await xi(t);if(m!==0)return m}let d=await J(f,l&&a?["-m","pip","install",a,"--quiet","--disable-pip-version-check"]:["-m","pip","install","rapidkit-core","--quiet","--disable-pip-version-check"],t);if(d!==0)return d}else {let f=await J("poetry",["install","--no-root"],t);if(f!==0)return f;let p=await J("poetry",["add","rapidkit-core"],t);if(p!==0)return p}try{let{writeWorkspaceLauncher:f}=await import('./create-KZYI3QRI.js');await f(t,n==="venv"?"venv":"poetry");}catch{}return 0}return 0}async function Tr(t){let e=[],r=new Set,o=[t];for(;o.length>0;){let n=o.pop();if(!n||r.has(n))continue;r.add(n);let i=[];try{i=await v.promises.readdir(n,{withFileTypes:true});}catch{continue}for(let c of i){if(!c.isDirectory()||c.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(c.name))continue;let a=y__default.join(n,c.name),l=y__default.join(a,".rapidkit","context.json"),f=y__default.join(a,".rapidkit","project.json");if(await ___default.pathExists(l)||await ___default.pathExists(f)){e.push(a);continue}o.push(a);}}return e}function Li(t){let e="my-workspace",r=1;for(;;){let o=r===1?e:`${e}-${r}`,n=y__default.join(t,o);if(!v.existsSync(n))return {name:o,targetPath:n};r+=1;}}var Ki="default-workspace";function Ji(){return y__default.join(homedir(),"Workspai","rapidkits",Ki)}async function Gi(){let t=Ji(),e=y__default.basename(t),r=at(t);await ___default.ensureDir(y__default.join(t,".rapidkit")),await b$2(t,d$1(e,b()));let o=y__default.join(t,".rapidkit","workspace.json");return await ___default.pathExists(o)||await He(o,{name:e,workspace_name:e,profile:"minimal",createdAt:new Date().toISOString(),createdBy:"rapidkit-npm-import-fallback"}),{workspacePath:t,created:!r}}async function $r(t){let r=await De("go",{runCommandInCwd:J,runCoreRapidkit:e$1}).initProject(t);return r.message&&console.log(s.red(`\u274C ${r.message}`)),r.exitCode}async function bt(t,e){let r=De("node",{runCommandInCwd:J,runCoreRapidkit:e$1});return t==="init"?(await r.initProject(e)).exitCode:t==="dev"?(await r.runDev(e)).exitCode:t==="test"?(await r.runTest(e)).exitCode:t==="build"?(await r.runBuild(e)).exitCode:(await r.runStart(e)).exitCode}async function ze(t,e){let r=De("java",{runCommandInCwd:J,runCoreRapidkit:e$1});return t==="init"?(await r.initProject(e)).exitCode:t==="dev"?(await r.runDev(e)).exitCode:t==="test"?(await r.runTest(e)).exitCode:t==="build"?(await r.runBuild(e)).exitCode:(await r.runStart(e)).exitCode}async function Pn(t,e=Nr){let r=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof r>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let i=function(E){if(!E)return null;let C=E.trim().toLowerCase();return C==="minimal"||C==="java-only"||C==="go-only"||C==="python-only"||C==="node-only"||C==="polyglot"||C==="enterprise"?C:null},c=function(E){let pe=E.match(/^\s*mode:\s*([a-zA-Z]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase()==="strict"?"strict":"warn",fe=(je,Y)=>{let Ee=E.match(new RegExp(`^\\s*${je}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return Ee?Ee[1].toLowerCase()==="true":Y};return {mode:pe,dependency_sharing_mode:Dn(E),rules:{enforce_workspace_marker:fe("enforce_workspace_marker",true),enforce_toolchain_lock:fe("enforce_toolchain_lock",false),disallow_untrusted_tool_sources:fe("disallow_untrusted_tool_sources",false),enforce_compatibility_matrix:fe("enforce_compatibility_matrix",false),require_mirror_lock_for_offline:fe("require_mirror_lock_for_offline",true)}}};let a=["init"],l,f=false,p=false,d=false;for(let E=1;E<t.length;E+=1){let C=t[E];if(C==="--ci"){f=true;continue}if(C==="--offline"){p=true;continue}if(C==="--json"){d=true;continue}if(C==="--profile"){let U=t[E+1];if(!U||U.startsWith("-"))return console.log(s.yellow("Usage: rapidkit bootstrap [path] [--profile <minimal|java-only|go-only|python-only|node-only|polyglot|enterprise>] [--ci] [--offline] [--json]")),1;l=U,E+=1;continue}if(C.startsWith("--profile=")){l=C.slice(10);continue}a.push(C);}let m=i(l);if(l&&!m)return console.log(s.red(`Invalid profile: ${l}. Use one of: minimal, java-only, go-only, python-only, node-only, polyglot, enterprise.`)),1;let g=process.cwd(),u=y__default.join(g,".rapidkit-workspace"),h=y__default.join(g,".rapidkit","workspace.json"),k;!v.existsSync(u)&&v.existsSync(h)?k=g:(k=K(g),k||(k=Mi(g)));let w=[],S=null,b=null;if(k)try{let E=y__default.join(k,".rapidkit","workspace.json"),C=await v.promises.readFile(E,"utf-8"),U=JSON.parse(C);b=i(U.profile);}catch{b=null;}let j=["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"},D=m;if(!!k&&!m&&!f&&!d&&!!process.stdin.isTTY&&!!process.stdout.isTTY){let E=b||"minimal",{chosenProfile:C}=await $e.prompt([{type:"rawlist",name:"chosenProfile",message:`Select workspace profile for bootstrap (current: ${E})`,choices:j.map(U=>({name:U===E?`${A[U]} \u2190 current`:A[U],value:U})),default:j.indexOf(E)}]);D=C;}let G=D||b||"minimal";if(k)try{let C=G==="python-only"||G==="polyglot"||G==="enterprise"?"poetry":"venv",U;try{let Y=(await v.promises.readFile(y__default.join(k,".python-version"),"utf-8")).trim();Y&&(U=Y);}catch{}let{syncWorkspaceFoundationFiles:pe}=await import('./create-KZYI3QRI.js'),fe=await pe(k,{workspaceName:y__default.basename(k),installMethod:C,pythonVersion:U,profile:G,writeMarker:true,writeGitignore:true,onlyIfMissing:true});w.push({id:"workspace.legacy.sync",status:fe.length>0?"passed":"skipped",message:fe.length>0?`Legacy workspace foundation synchronized: ${fe.join(", ")}`:"Workspace foundation files are already up to date."});}catch(E){w.push({id:"workspace.legacy.sync",status:"failed",message:`Failed to synchronize legacy workspace foundation files: ${E.message}`});}if(k&&D&&D!==b)try{let E=y__default.join(k,".rapidkit","workspace.json"),C=await v.promises.readFile(E,"utf-8"),U=JSON.parse(C);U.profile=D,await v.promises.writeFile(E,JSON.stringify(U,null,2)+`
179
+ `,"utf-8");}catch{}let M={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}},Pe=null;if(k)try{let E=await v.promises.readFile(y__default.join(k,".rapidkit","policies.yml"),"utf-8");Pe=E,M=c(E);}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(k){let E=Tn(Pe);M.dependency_sharing_mode=E.mode,w.push({id:"policy.schema.dependency_sharing_mode",status:E.status,message:E.message}),w.push({id:"policy.dependency_sharing_mode.effective",status:"passed",message:M.dependency_sharing_mode==="isolated"?"Effective dependency mode: isolated (default secure mode).":M.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 C=v.existsSync(y__default.join(k,".rapidkit-workspace"));w.push({id:"policy.enforce_workspace_marker",status:!M.rules.enforce_workspace_marker||C?"passed":"failed",message:!M.rules.enforce_workspace_marker||C?"Workspace marker policy satisfied.":"Workspace marker policy failed: .rapidkit-workspace is missing."});let U=v.existsSync(y__default.join(k,".rapidkit","toolchain.lock"));w.push({id:"policy.enforce_toolchain_lock",status:!M.rules.enforce_toolchain_lock||U?"passed":"failed",message:!M.rules.enforce_toolchain_lock||U?"Toolchain lock policy satisfied.":"Toolchain lock policy failed: .rapidkit/toolchain.lock is missing."});let pe=process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||v.existsSync(y__default.join(k,".rapidkit","trusted-sources.lock"));w.push({id:"policy.disallow_untrusted_tool_sources",status:!M.rules.disallow_untrusted_tool_sources||pe?"passed":"failed",message:!M.rules.disallow_untrusted_tool_sources||pe?"Trusted tool sources policy satisfied.":"Trusted tool sources policy failed: set RAPIDKIT_TRUSTED_SOURCES=1 or provide .rapidkit/trusted-sources.lock."});let fe=y__default.join(k,".rapidkit","compatibility-matrix.json"),je=v.existsSync(fe),Y=M.rules.enforce_compatibility_matrix;if(w.push({id:"policy.enforce_compatibility_matrix",status:!Y||je?"passed":"failed",message:!Y||je?"Compatibility matrix policy satisfied.":"Compatibility matrix policy failed: .rapidkit/compatibility-matrix.json is missing."}),je)try{let F=await v.promises.readFile(fe,"utf-8"),Z=JSON.parse(F),xt=!!Z&&typeof Z=="object";w.push({id:"compatibility.matrix.parse",status:xt?"passed":"failed",message:xt?"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 Ee=y__default.join(k,".rapidkit","mirror-config.json"),Je=y__default.join(k,".rapidkit","mirror.lock"),ct=v.existsSync(Ee),Xt=v.existsSync(Je),Wr={};if(ct)try{Wr=JSON.parse(await v.promises.readFile(Ee,"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 er=await gr(k,{ciMode:f,offlineMode:p});if(w.push(...er.checks.map(F=>({id:F.id,status:F.status,message:F.message}))),S=er.details,er.details.lockWritten&&(Xt=true),p){let F=process.env.RAPIDKIT_MIRROR_ENABLED==="1"||Wr.enabled===true;w.push({id:"offline.mirror.enabled",status:F?"passed":"failed",message:F?"Offline mode mirror is enabled.":'Offline mode requires mirror enablement (set RAPIDKIT_MIRROR_ENABLED=1 or .rapidkit/mirror-config.json {"enabled": true}).'});let Z=M.rules.require_mirror_lock_for_offline;w.push({id:"offline.mirror.lock",status:!Z||Xt?"passed":"failed",message:!Z||Xt?"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 Ln=await Tr(k),ae=new Set;for(let F of Ln){let Z=ge(F);if(ce(Z,F)){ae.add("go");continue}if(de(Z,F)){ae.add("java");continue}if(le(Z,F)){ae.add("node");continue}if(ue(Z,F)){ae.add("python");continue}ae.add("unknown");}if(G==="go-only"){let F=ae.size===0||[...ae].every(Z=>Z==="go");w.push({id:"profile.go-only",status:F?"passed":"failed",message:F?"go-only profile validated for discovered projects.":`go-only profile mismatch: detected runtimes [${[...ae].join(", ")}].`});}else if(G==="java-only"){let F=ae.size===0||[...ae].every(Z=>Z==="java");w.push({id:"profile.java-only",status:F?"passed":"failed",message:F?"java-only profile validated for discovered projects.":`java-only profile mismatch: detected runtimes [${[...ae].join(", ")}].`});}else if(G==="python-only"){let F=ae.size===0||[...ae].every(Z=>Z==="python");w.push({id:"profile.python-only",status:F?"passed":"failed",message:F?"python-only profile validated for discovered projects.":`python-only profile mismatch: detected runtimes [${[...ae].join(", ")}].`});}else if(G==="node-only"){let F=ae.size===0||[...ae].every(Z=>Z==="node");w.push({id:"profile.node-only",status:F?"passed":"failed",message:F?"node-only profile validated for discovered projects.":`node-only profile mismatch: detected runtimes [${[...ae].join(", ")}].`});}else if(G==="minimal"){let F=[...ae].filter(xt=>xt!=="unknown"),Z=F.length<=1;w.push({id:"profile.minimal",status:Z?"passed":"failed",message:Z?"minimal profile is compatible with detected runtime mix.":`minimal profile mismatch: multiple runtimes detected [${F.join(", ")}].`});}else G==="enterprise"&&(w.push({id:"profile.enterprise.ci",status:f?"passed":"failed",message:f?"enterprise profile running with --ci.":"enterprise profile expects --ci for deterministic non-interactive mode."}),w.push({id:"profile.enterprise.compatibility-matrix",status:je?"passed":"failed",message:je?"enterprise profile has compatibility matrix.":"enterprise profile requires .rapidkit/compatibility-matrix.json."}),w.push({id:"profile.enterprise.mirror-config",status:ct?"passed":"failed",message:ct?"enterprise profile has mirror configuration.":"enterprise profile requires .rapidkit/mirror-config.json."}));}f&&(process.env.RAPIDKIT_BOOTSTRAP_CI="1"),p&&(process.env.RAPIDKIT_OFFLINE_MODE="1");let q=w.some(E=>E.id.startsWith("policy.schema.")&&E.status==="failed")||M.mode==="strict"&&w.some(E=>E.status==="failed"),z=k||g,N=y__default.join(z,".rapidkit","reports"),x=new Date().toISOString().replace(/[:.]/g,"-"),H=y__default.join(N,`bootstrap-compliance-${x}.json`),ye=y__default.join(N,"bootstrap-compliance.latest.json"),B={command:"bootstrap",timestamp:new Date().toISOString(),workspacePath:k,profile:G,options:{ci:f,offline:p,strict:M.mode==="strict"},policyMode:M.mode,policyRules:M.rules,mirrorLifecycle:S,checks:w};if(q){let E={...B,result:"blocked",initExitCode:null};return await ___default.ensureDir(N),await He(H,E),await He(ye,E),d?process.stdout.write(`${JSON.stringify(E,null,2)}
180
+ `):(console.log(s.red("\u274C Bootstrap blocked by strict policy checks.")),console.log(s.gray(`Compliance report: ${H}`))),1}let oe=0;d||(oe=await e(a));let be=w.filter(E=>E.status==="failed").length,Me=oe!==0?"failed":be>0?"ok_with_warnings":"ok",ne={...B,result:Me,initExitCode:oe};if(await ___default.ensureDir(N),await He(H,ne),await He(ye,ne),d)process.stdout.write(`${JSON.stringify(ne,null,2)}
181
+ `);else {let E=w.filter(C=>C.status==="failed").length;E>0&&console.log(s.yellow(`\u26A0\uFE0F Bootstrap completed with ${E} policy/profile warnings.`)),console.log(s.gray(`Compliance report: ${H}`));}return oe}finally{typeof r>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=r;}}async function bn(t){let e=(t[1]||"").toLowerCase(),r=t.includes("--warm-deps")||t.includes("--warm-dependencies");if(!e||!["python","node","go","java"].includes(e))return console.log(s.yellow("Usage: rapidkit setup <python|node|go|java> [--warm-deps]")),1;let o=async(d,m)=>{if(d==="node"){if(!v.existsSync(y__default.join(m,"package.json")))return {exitCode:0,message:"Node warm-up skipped: package.json not found in current directory."};let u=v.existsSync(y__default.join(m,"pnpm-lock.yaml")),h=v.existsSync(y__default.join(m,"yarn.lock"));return u?{exitCode:await J("pnpm",["install","--lockfile-only","--ignore-scripts"],m)}:h?{exitCode:await J("yarn",["install","--ignore-scripts"],m)}:{exitCode:await J("npm",["install","--package-lock-only","--ignore-scripts"],m)}}if(d==="go")return v.existsSync(y__default.join(m,"go.mod"))?{exitCode:await J("go",["mod","download"],m)}:{exitCode:0,message:"Go warm-up skipped: go.mod not found in current directory."};if(d==="java"){let g=v.existsSync(y__default.join(m,"pom.xml")),u=v.existsSync(y__default.join(m,"build.gradle"))||v.existsSync(y__default.join(m,"build.gradle.kts")),h=y__default.join(m,process.platform==="win32"?"gradlew.bat":"gradlew"),k=v.existsSync(h);return !g&&!u?{exitCode:0,message:"Java warm-up skipped: pom.xml or build.gradle not found in current directory."}:g?{exitCode:await J("mvn",["-B","-q","-DskipTests","dependency:go-offline"],m)}:{exitCode:await J(k?h:"gradle",["--no-daemon","dependencies"],m)}}return {exitCode:0,message:"Dependency warm-up currently applies to node/go/java runtimes."}},n=De(e,{runCommandInCwd:J,runCoreRapidkit:(d,m)=>e$1(d,{...m,cwd:void 0})}),i=await n.checkPrereqs(),c=await n.doctorHints(process.cwd()),a=K(process.cwd()),l=a||process.cwd(),f=null,p=async()=>e!=="java"||!a?[]:f||(f=(await Tr(a)).filter(m=>{let g=ge(m);return de(g,m)}),f);if(i.exitCode===0){console.log(s.green(`\u2705 ${e} prerequisites look good.`));let d=["python","node","go","java"].filter(m=>m!==e).join("/");if(console.log(s.gray(` Scope: validated ${e} runtime only. ${d} checks are optional unless your workspace profile uses them.`)),e==="python"&&console.log(s.gray(" Note: Poetry is recommended, but venv/pipx-based flows are supported in workspace creation.")),n.warmSetupCache&&((await n.warmSetupCache(l)).exitCode===0?console.log(s.gray(` ${e} cache warm-up completed.`)):console.log(s.yellow(` ${e} cache warm-up skipped (non-fatal).`))),r)if(e==="java"&&a){let m=await p();if(m.length>0){let g=0,u=0,h=0;for(let k of m){let w=await o("java",k),S=/skipped/i.test(w.message||""),b=y__default.relative(a,k)||y__default.basename(k);w.message&&console.log(s.gray(` [${b}] ${w.message}`)),w.exitCode===0&&!S?g+=1:w.exitCode===0&&S?h+=1:u+=1;}g>0&&console.log(s.gray(` java dependency warm-up completed for ${g} project(s) (--warm-deps).`)),u>0&&console.log(s.yellow(` java dependency warm-up failed for ${u} project(s) (non-fatal).`)),g===0&&u===0&&h>0&&console.log(s.gray(" java dependency warm-up skipped for discovered workspace projects."));}else {let g=await o("java",l),u=/skipped/i.test(g.message||"");g.message&&console.log(s.gray(` ${g.message}`)),g.exitCode===0&&!u?console.log(s.gray(` ${e} dependency warm-up completed (--warm-deps).`)):g.exitCode!==0&&console.log(s.yellow(` ${e} dependency warm-up failed (non-fatal).`));}}else {let m=await o(e,l),g=/skipped/i.test(m.message||"");m.message&&console.log(s.gray(` ${m.message}`)),m.exitCode===0&&!g?console.log(s.gray(` ${e} dependency warm-up completed (--warm-deps).`)):m.exitCode!==0&&console.log(s.yellow(` ${e} dependency warm-up failed (non-fatal).`));}if(a)try{let m=y__default.join(a,".rapidkit","toolchain.lock"),g={};try{g=JSON.parse(await v.promises.readFile(m,"utf-8"));}catch{}(!g.runtime||typeof g.runtime!="object")&&(g.runtime={});let u=g.runtime;if(e==="python"){let h=null;try{let{execa:k}=await import('execa');for(let w of Dr()){let b=await k(w,w==="py"?["-3","--version"]:["--version"],{cwd:a,stdio:"pipe",reject:false,timeout:3e3});if(b.exitCode===0){let A=(b.stdout||b.stderr||"").match(/Python\s+(\S+)/);if(h=A?A[1]:null,h)break}}}catch{}u.python={...u.python||{},version:h,last_setup:new Date().toISOString()};}else if(e==="node")u.node={...u.node||{},version:process.version,last_setup:new Date().toISOString()};else if(e==="go"){let h=null;try{let{execa:k}=await import('execa'),S=((await k("go",["version"],{cwd:a,stdio:"pipe"})).stdout||"").match(/go(\d+\.\d+(?:\.\d+)?)/i);h=S?S[1]:null;}catch{}u.go={...u.go||{},version:h,last_setup:new Date().toISOString()};}else if(e==="java"){let h=null,k=null,w=null,S=await p(),j=v.existsSync(y__default.join(l,"pom.xml"))||v.existsSync(y__default.join(l,"build.gradle"))||v.existsSync(y__default.join(l,"build.gradle.kts"))?l:S[0]||l;try{let{execa:A}=await import('execa'),D=await A("java",["-version"],{cwd:a,stdio:"pipe",reject:false,timeout:3e3}),G=`${D.stdout||""}
182
+ ${D.stderr||""}`.match(/version\s+"([^"]+)"/i);h=G?G[1]:null;let M=v.existsSync(y__default.join(j,"pom.xml")),Pe=v.existsSync(y__default.join(j,"build.gradle"))||v.existsSync(y__default.join(j,"build.gradle.kts"));if(M){k="maven";let Q=(()=>{let x=y__default.join(j,"mvnw.cmd");if(process.platform==="win32"&&v.existsSync(x))return x;let H=y__default.join(j,"mvnw");return v.existsSync(H)?H:"mvn"})(),q=await A(Q,["-version"],{cwd:j,stdio:"pipe",reject:false,timeout:3e3}),N=`${q.stdout||""}
183
+ ${q.stderr||""}`.match(/Apache Maven\s+(\S+)/i);w=N?N[1]:null;}else if(Pe){k="gradle";let Q=(()=>{let x=y__default.join(j,"gradlew.bat");if(process.platform==="win32"&&v.existsSync(x))return x;let H=y__default.join(j,"gradlew");return v.existsSync(H)?H:"gradle"})(),q=await A(Q,["--version"],{cwd:j,stdio:"pipe",reject:false,timeout:3e3}),N=`${q.stdout||""}
184
+ ${q.stderr||""}`.match(/Gradle\s+(\S+)/i);w=N?N[1]:null;}}catch{}u.java={...u.java||{},version:h,build_tool:k,build_tool_version:w,last_setup:new Date().toISOString()};}g.updated_at=new Date().toISOString(),await v.promises.writeFile(m,JSON.stringify(g,null,2)+`
185
+ `,"utf-8"),console.log(s.gray(" toolchain.lock updated (.rapidkit/toolchain.lock)"));}catch{}}else console.log(s.red(`\u274C ${e} prerequisites check failed.`));if(c.length>0){console.log(s.gray(`
186
+ Hints:`));for(let d of c)console.log(s.gray(`- ${d}`));}return i.exitCode}function qi(t){let e={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};for(let r of t.split(`
187
+ `)){let o=r.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 c=o.match(/^self_heal:\s*(true|false)/);c&&(e.self_heal=c[1]==="true");let a=o.match(/^verify_integrity:\s*(true|false)/);a&&(e.verify_integrity=a[1]==="true");}return e}async function jn(t){let e=(t[1]||"status").toLowerCase(),r=Ut.getInstance(),o=K(process.cwd()),n={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};if(o)try{let i=await v.promises.readFile(y__default.join(o,".rapidkit","cache-config.yml"),"utf-8");n=qi(i);}catch{}return e==="status"?(console.log(s.cyan("RapidKit cache is enabled")),console.log(s.cyan("RapidKit cache status")),o?(console.log(s.gray(` Workspace: ${o}`)),console.log(s.gray(` Strategy: ${n.strategy}`)),console.log(s.gray(` Self-heal: ${n.self_heal}`)),console.log(s.gray(` Prune on bootstrap:${n.prune_on_bootstrap}`)),console.log(s.gray(` Verify integrity: ${n.verify_integrity}`))):console.log(s.gray(" (not inside a workspace \u2014 showing in-memory cache only)")),console.log(s.gray(" In-memory cache: enabled")),console.log(s.gray(" Use: rapidkit cache clear|prune|repair")),0):e==="clear"?(await r.clear(),console.log(s.green("Cache clear completed")),console.log(s.green("\u2705 Cache cleared (all entries removed).")),0):e==="prune"?(await r.clear(),console.log(s.green("\u2705 Cache pruned (stale entries removed).")),n.prune_on_bootstrap||console.log(s.gray(" Tip: set prune_on_bootstrap: true in .rapidkit/cache-config.yml to auto-prune on every bootstrap.")),0):e==="repair"?n.self_heal?(await r.clear(),console.log(s.green("\u2705 Cache repaired (self-heal applied, stale entries evicted).")),n.verify_integrity&&console.log(s.gray(" Integrity verification is enabled in cache-config.yml.")),0):(console.log(s.yellow("\u26A0\uFE0F self_heal is disabled in .rapidkit/cache-config.yml \u2014 skipping repair.")),0):(console.log(s.yellow("Usage: rapidkit cache <status|clear|prune|repair>")),1)}async function Bi(t,e,r,o){let n=(e||"show").toLowerCase(),i=y__default.join(t,".rapidkit","policies.yml");if(n==="show"||n==="status"||n==="get"){let p=await vn(t),d=wn(p);return console.log(s.cyan(`Policy file: ${i}`)),console.log(s.gray(` mode: ${d.mode}`)),console.log(s.gray(` dependency_sharing_mode: ${d.dependency_sharing_mode}`)),console.log(s.gray(" rules:")),console.log(s.gray(` enforce_workspace_marker: ${d.rules.enforce_workspace_marker}`)),console.log(s.gray(` enforce_toolchain_lock: ${d.rules.enforce_toolchain_lock}`)),console.log(s.gray(` disallow_untrusted_tool_sources: ${d.rules.disallow_untrusted_tool_sources}`)),console.log(s.gray(` enforce_compatibility_matrix: ${d.rules.enforce_compatibility_matrix}`)),console.log(s.gray(` require_mirror_lock_for_offline: ${d.rules.require_mirror_lock_for_offline}`)),console.log(s.gray("Examples:")),console.log(s.gray(" npx rapidkit workspace policy set mode strict")),console.log(s.gray(" npx rapidkit workspace policy set dependency_sharing_mode shared-runtime-caches")),console.log(s.gray(" npx rapidkit workspace policy set rules.enforce_toolchain_lock true")),0}if(n!=="set")return console.log(s.red(`Unknown workspace policy action: ${e||""}`)),console.log(s.gray("Available: show, set")),1;if(!r||typeof o>"u")return console.log(s.yellow("Usage: rapidkit workspace policy set <key> <value>")),console.log(s.gray("Allowed keys:")),console.log(s.gray(" mode (warn|strict)")),console.log(s.gray(" dependency_sharing_mode (isolated|shared-runtime-caches|shared-node-deps)")),console.log(s.gray(" rules.enforce_workspace_marker (true|false)")),console.log(s.gray(" rules.enforce_toolchain_lock (true|false)")),console.log(s.gray(" rules.disallow_untrusted_tool_sources (true|false)")),console.log(s.gray(" rules.enforce_compatibility_matrix (true|false)")),console.log(s.gray(" rules.require_mirror_lock_for_offline (true|false)")),1;let c=r.trim(),l=await vn(t);if(c==="mode"){let p=o.trim().toLowerCase();if(p!=="warn"&&p!=="strict")return console.log(s.red("\u274C Invalid mode. Use: warn | strict")),1;l=kn(l,"mode",`${p} # "warn" or "strict"`);}else if(c==="dependency_sharing_mode"){let p=o.trim().toLowerCase();if(p!=="isolated"&&p!=="shared-runtime-caches"&&p!=="shared-node-deps")return console.log(s.red("\u274C Invalid dependency_sharing_mode. Use: isolated | shared-runtime-caches | shared-node-deps")),1;l=kn(l,"dependency_sharing_mode",`${p} # "isolated" or "shared-runtime-caches" or "shared-node-deps"`);}else if(c.startsWith("rules.")){let p=c.slice(6);if(!(p in Nn))return console.log(s.red(`\u274C Unknown policy rule: ${p}`)),1;let d=Wi(o);if(d===null)return console.log(s.red("\u274C Rule values must be boolean: true | false")),1;l=Ni(l,p,d);}else return console.log(s.red(`\u274C Unknown policy key: ${c}`)),1;await Ti(t,l);let f=wn(l);return console.log(s.green(`\u2705 Updated ${c} in .rapidkit/policies.yml`)),console.log(s.gray(` mode: ${f.mode}`)),console.log(s.gray(` dependency_sharing_mode: ${f.dependency_sharing_mode}`)),console.log(s.gray(" Tip: run `npx rapidkit workspace policy show` to inspect all values.")),0}async function xn(t){let e=(t[1]||"status").toLowerCase(),r=t.includes("--json"),o=K(process.cwd());if(!o)return console.log(s.red("\u274C Not inside a RapidKit workspace")),console.log(s.gray("\u{1F4A1} Run this command from within a workspace directory")),1;let n=y__default.join(o,".rapidkit"),i=y__default.join(n,"mirror-config.json"),c=y__default.join(n,"mirror.lock"),a=y__default.join(n,"mirror","artifacts"),l=y__default.join(n,"reports");async function f(p){let d=new Date().toISOString().replace(/[:.]/g,"-"),m=y__default.join(l,`mirror-ops-${d}.json`),g=y__default.join(l,"mirror-ops.latest.json");await ___default.ensureDir(l),await He(m,p),await He(g,p);}if(e==="status"){if(!await ___default.pathExists(i))try{let k={schema_version:"1.0",enabled:false,strategy:"on-demand",artifacts:[],created_at:new Date().toISOString(),note:"Auto-generated by rapidkit mirror status. Set enabled: true and add artifact entries to activate mirroring."};await ___default.ensureDir(n),await v.promises.writeFile(i,JSON.stringify(k,null,2)+`
188
+ `,"utf-8"),console.log(s.gray(" mirror-config.json created with defaults (.rapidkit/mirror-config.json)"));}catch{}let d=await ___default.pathExists(i),m=await ___default.pathExists(a),g=await ___default.pathExists(c),u=m?(await v.promises.readdir(a,{withFileTypes:true})).filter(k=>k.isFile()).length:0,h={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:o,mirror:{configExists:d,lockExists:g,artifactsCount:u}};return await f(h),r?(process.stdout.write(`${JSON.stringify(h,null,2)}
189
+ `),0):(console.log(s.cyan("RapidKit mirror status")),console.log(s.gray(`Workspace: ${o}`)),console.log(s.gray(`Config: ${d?"present":"missing"} (${i})`)),console.log(s.gray(`Lock: ${g?"present":"missing"} (${c})`)),console.log(s.gray(`Artifacts: ${u}`)),0)}if(e==="sync"||e==="verify"||e==="rotate"){let p=await gr(o,{ciMode:true,offlineMode:e==="verify",forceRun:true}),d=p.checks.filter(u=>u.status==="failed"),m=p.checks.some(u=>u.id.startsWith("mirror.verify.")&&u.status==="failed");if(e==="verify"&&m){let u={command:"mirror",action:e,result:"failed",timestamp:new Date().toISOString(),workspacePath:o,details:p.details,checks:p.checks};if(await f(u),r)return process.stdout.write(`${JSON.stringify(u,null,2)}
190
+ `),1;console.log(s.red("\u274C Mirror verify failed."));for(let h of p.checks.filter(k=>k.id.startsWith("mirror.verify.")))console.log(s.gray(`- ${h.id}: ${h.message}`));return 1}if(d.length>0){let u={command:"mirror",action:e,result:"failed",timestamp:new Date().toISOString(),workspacePath:o,details:p.details,checks:p.checks};if(await f(u),r)return process.stdout.write(`${JSON.stringify(u,null,2)}
191
+ `),1;console.log(s.yellow(`\u26A0\uFE0F Mirror ${e} completed with ${d.length} issue(s).`));for(let h of d)console.log(s.gray(`- ${h.id}: ${h.message}`));return 1}let g={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:o,details:p.details,checks:p.checks};return await f(g),r?(process.stdout.write(`${JSON.stringify(g,null,2)}
192
+ `),0):e==="rotate"?(console.log(s.green(`\u2705 Mirror rotate completed. Rotated files: ${p.details.rotatedFiles}.`)),0):e==="verify"?(console.log(s.green(`\u2705 Mirror verify completed. Verified artifacts: ${p.details.verifiedArtifacts}.`)),0):(console.log(s.green(`\u2705 Mirror sync completed. Synced artifacts: ${p.details.syncedArtifacts}.`)),0)}return console.log(s.yellow("Usage: rapidkit mirror <status|sync|verify|rotate> [--json]")),1}async function Nr(t){let e=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof e>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let r=process.cwd(),o=await Wn(r,async()=>{let n=K(r),i=De("python",{runCommandInCwd:J,runCoreRapidkit:e$1}),c=t.slice(1).filter(g=>!g.startsWith("-"));if(c.length>0){let g=y__default.resolve(r,c[0]),u=ge(g),h=await Rr(g);return ce(u,g)||h==="go"?await $r(g):de(u,g)||h==="java"?await ze("init",g):le(u,g)||h==="node"?await _r(g):ue(u,g)||h==="python"?await Er(g,i):await e$1(t,{cwd:r})}let a=ge(r),l=!!K(r)&&r===K(r);if(!l&&ce(a,r))return await $r(r);let f=await Rr(r);if(!l&&(de(a,r)||f==="java"))return await ze("init",r);if(!l&&(le(a,r)||f==="node"))return await _r(r);if(!l&&(ue(a,r)||f==="python"))return await Er(r,i);let p=n||K(r),d=On(r),m=d?y__default.dirname(y__default.dirname(d)):null;if(m&&m!==p){let g=ge(m),u=await Rr(m);return ce(g,m)||u==="go"?await $r(m):de(g,m)||u==="java"?await ze("init",m):le(g,m)||u==="node"?await _r(m):ue(g,m)||u==="python"?await Er(m,i):await e$1(["init"],{cwd:m})}if(p&&r===p){console.log(s.yellow("\u26A0\uFE0F Running `npx rapidkit init` at workspace root.")),console.log(s.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 g=await Or(p);if(g!==0)return g;let{runWorkspaceStage:u}=await import('./workspace-run-TGNMTL2V.js');return (await u({workspacePath:p,stage:"init",affected:false,blastRadius:false,parallel:false,continueOnError:false,strict:false,json:false,enforceGates:false})).summary.exitCode}if(!p){let g=await a$2(),{name:u}=Li(r),{createProject:h}=await import('./create-KZYI3QRI.js');return await h(u,{yes:true,userConfig:g}),0}return await e$1(t,{cwd:r})});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 Sn(t){let e=K(t);if(!e)return [];let r="warn";try{let l=await v.promises.readFile(y__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"&&(r="strict");}catch{return []}if(r!=="strict")return [];let o=[],n=y__default.join(e,".rapidkit","toolchain.lock");if(!v.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 v.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 c=i.runtime??{},a=ge(t);ce(a,t)&&!c.go?.version?o.push("go.version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."):le(a,t)&&!c.node?.version?o.push("node.version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."):de(a,t)&&!c.java?.version?o.push("java.version is not pinned in toolchain.lock \u2014 run `rapidkit setup java` first."):ue(a,t)&&!c.python?.version&&o.push("python.version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");try{let f=JSON.parse(await v.promises.readFile(y__default.join(e,".rapidkit","workspace.json"),"utf-8")).profile??"";f==="python-only"&&(ce(a,t)||le(a,t)||de(a,t))?o.push('Workspace profile is "python-only" but this project is not Python.'):f==="node-only"&&(ce(a,t)||ue(a,t)||de(a,t))?o.push('Workspace profile is "node-only" but this project is not Node.'):f==="go-only"&&(le(a,t)||ue(a,t)||de(a,t))?o.push('Workspace profile is "go-only" but this project is not Go.'):f==="java-only"&&(ue(a,t)||le(a,t)||ce(a,t))&&o.push('Workspace profile is "java-only" but this project is not Java.');}catch{}return o}async function Ui(){let t=async w=>{if(!a()||!w.toLowerCase().endsWith(".cmd"))return false;try{let b=(await ___default.readFile(w,"utf8")).replace(/\r\n/g,`
193
+ `).toLowerCase(),j=b.includes("\\.rapidkit\\rapidkit"),A=b.includes("\\.rapidkit\\rapidkit.cmd")||b.includes("\\.rapidkit\\rapidkit.exe")||b.includes("\\.venv\\scripts\\rapidkit.exe");return j&&!A}catch{return false}},e=process.cwd(),r=process.argv.slice(2),o=r[0],n=o==="init",i$1=new Set(["dev","start","build","test"]),c=!o||o==="--help"||o==="-h"||o==="help",a$2=at(e),l=v.existsSync(y__default.join(e,".rapidkit","project.json")),f=ge(e),p=ce(f,e)||le(f,e),d=!!o&&i$1.has(o)&&p;if(jt(r[0])||r[0]==="create"||r[0]==="init"&&a$2&&!l)return false;try{let w=o==="shell"&&r[1]==="activate",S=o==="create",b=await Zr(e,{cwd:e,timeoutMs:1200});if(b.ok&&b.data?.isRapidkitProject&&b.data.engine==="python"){let j=S||jt(o);if(!c&&!w&&!j&&!n&&!d){if(o&&gn.includes(o)){let D=await Sn(e).catch(()=>[]);if(D.length>0){process.stderr.write(s.red("\u274C Strict policy violations prevent running this command:")+`
194
+ `);for(let me of D)process.stderr.write(s.red(` \u2022 ${me}`)+`
195
+ `);process.exit(1);}}let A=await e$1(process.argv.slice(2),{cwd:e});process.exit(A);}}}catch{}let m=On(e),g=a(),u=i(e),h=null;for(let w of u)if(await ___default.pathExists(w)){if(await t(w)){a$1.warn(`Skipping legacy/broken Windows launcher candidate: ${w}. Falling back to core bridge.`);continue}h=w;break}let k=o==="create";if(o==="init"&&a$2&&!l)return false;if(o&&gn.includes(o)){let w=await Sn(e);if(w.length>0){process.stderr.write(s.red("\u274C Strict policy violations prevent running this command:")+`
196
+ `);for(let S of w)process.stderr.write(s.red(` \u2022 ${S}`)+`
197
+ `);process.exit(1);}}if(h&&o&&fn.includes(o)&&!k&&!n&&!d){a$1.debug(`Delegating to local CLI: ${h} ${r.join(" ")}`);let w=o==="init"?dn():process.env,S=spawn(h,r,{stdio:"inherit",cwd:e,shell:g,env:w});return S.on("close",b=>{process.exit(b??0);}),S.on("error",b=>{a$1.error(`Failed to run local rapidkit: ${b.message}`),process.exit(1);}),true}if(m&&await ___default.pathExists(m))try{if((await ___default.readJson(m)).engine==="pip"){let S=r[0],b=i(e),j=null;for(let A of b)if(await ___default.pathExists(A)){if(await t(A)){a$1.warn(`Skipping legacy/broken Windows launcher candidate: ${A}. Falling back to core bridge.`);continue}j=A;break}if(j&&S&&fn.includes(S)&&S!=="init"&&!d){a$1.debug(`Delegating to local CLI (early detection): ${j} ${r.join(" ")}`);let A=S==="init"?dn():process.env,D=spawn(j,r,{stdio:"inherit",cwd:e,env:A});return D.on("close",me=>process.exit(me??0)),D.on("error",me=>{a$1.error(`Failed to run local rapidkit: ${me.message}`),process.exit(1);}),true}if(S==="shell"&&r[1]==="activate"){let A=a()?`# RapidKit: activation snippet (PowerShell)
188
198
  $venv = ".venv"
189
199
  if (Test-Path "$venv\\Scripts\\Activate.ps1") { . "$venv\\Scripts\\Activate.ps1" }
190
200
  $env:RAPIDKIT_PROJECT_ROOT = (Get-Location).Path
@@ -202,16 +212,17 @@ elif [ -f "$VENV/bin/activate.fish" ]; then
202
212
  fi
203
213
  export RAPIDKIT_PROJECT_ROOT="$(pwd)"
204
214
  export PATH="$(pwd)/.rapidkit:$(pwd):$PATH"
205
- `;console.log(a$4.green.bold(`
215
+ `;console.log(s.green.bold(`
206
216
  \u2705 Activation snippet \u2014 run the following to activate this project in your current shell:
207
- `)),console.log(I),console.log(a$4.gray(`
217
+ `)),console.log(A),console.log(s.gray(`
208
218
  \u{1F4A1} After activation you can run: rapidkit dev
209
- `)),process.exit(0);}if(!i$1&&!qt(j)&&j!=="init"&&!p){let I=await e$1(t,{cwd:e});process.exit(I);}}}catch{}return false}var Fe=null,Gt=false,ue=new Command,bi=process.env.RAPIDKIT_SHOW_LEGACY==="1"||process.env.RAPIDKIT_SHOW_LEGACY?.toLowerCase()==="true";async function ji(r){if(r.length===0)return false;let e=r[0],t=r[1];if(ti.includes(e))return false;if(mn.includes(e))return true;if(qt(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(s=>o.has(s)))return false;let n=await i$1();return n?n.has(e):!!(a$5.has(e)||r.length>1)}ue.name("rapidkit").description("Create RapidKit workspaces and projects").version(b());var xi=a()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";ue.addHelpText("beforeAll",`RapidKit NPM CLI
219
+ `)),process.exit(0);}if(!c&&!jt(S)&&S!=="init"&&!d){let A=await e$1(r,{cwd:e});process.exit(A);}}}catch{}return false}var Ke=null,zt=false,ie=new Command,Vi=process.env.RAPIDKIT_SHOW_LEGACY==="1"||process.env.RAPIDKIT_SHOW_LEGACY?.toLowerCase()==="true";async function Hi(t){if(t.length===0)return false;let e=t[0],r=t[1];if(Ai.includes(e))return false;if(In.includes(e))return true;if(jt(e)||e==="shell"&&r==="activate")return false;if(t.includes("--tui"))return true;if(e==="--help"||e==="-h"||e==="help"||e==="--version"||e==="-V"||t.includes("--template")||t.includes("-t"))return false;let o=new Set(["--yes","-y","--skip-git","--skip-install","--debug","--dry-run","--no-update-check","--create-workspace","--no-workspace"]);if(t.some(i=>o.has(i)))return false;let n=await i$1();return n?n.has(e):!!(a$4.has(e)||t.length>1)}ie.name("rapidkit").description("Create RapidKit workspaces and projects").version(b());var zi=a()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";ie.addHelpText("beforeAll",`RapidKit NPM CLI
210
220
 
211
221
  Create workspaces, scaffold projects, and manage your development toolchain.
212
- `);ue.addHelpText("afterAll",`
222
+ `);ie.addHelpText("afterAll",`
213
223
  Workspace Setup Commands
214
224
  rapidkit bootstrap Bootstrap projects in workspace (--profile java-only|python-only|node-only|go-only|polyglot|enterprise)
225
+ rapidkit analyze Analyze workspace/project health and generate enterprise evidence
215
226
  rapidkit setup <runtime> Set up runtime toolchain (runtime: python | node | go | java)
216
227
  rapidkit readiness Build release-readiness evidence (use --json for CI)
217
228
  rapidkit autopilot release Run end-to-end release gate orchestration (audit|safe-fix|enforce)
@@ -234,46 +245,47 @@ Quick start:
234
245
  npx rapidkit my-workspace # Create + bootstrap workspace
235
246
  cd my-workspace
236
247
  npx rapidkit create project # Interactive kit picker
237
- ${xi} # Install deps + run
248
+ ${zi} # Install deps + run
238
249
 
239
250
  Notes:
240
251
  --skip-install (npm wrapper) enables fast-path for lock/dependency steps.
241
252
  It is different from core --skip-essentials (essential module installation).
242
253
 
243
254
  Use "rapidkit help <command>" for more information.
244
- `);ue.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(a$4.blue.bold(`
255
+ `);ie.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(t,e$2)=>{try{e$2.debug&&(a$1.setDebug(true),a$1.debug("Debug mode enabled"));let r=await a$2();a$1.debug("User config loaded",r);let o=await b$1();a$1.debug("RapidKit config loaded",o);let n=c(r,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(s.blue.bold(`
245
256
  \u{1F680} Welcome to RapidKit NPM CLI!
246
- `)),r||(vn(),process.exit(0));try{Ve(r);}catch(c){throw c instanceof e&&(a$1.error(`
247
- \u274C ${c.message}`),c.details&&a$1.warn(`\u{1F4A1} ${c.details}
248
- `),process.exit(1)),c}let s=f__default.resolve(process.cwd(),r);Fe=s,await ___default.pathExists(s)&&(a$1.error(`
249
- \u274C Directory "${r}" already exists`),console.log(a$4.cyan(`
257
+ `)),t||(Fn(),process.exit(0));try{Qe(t);}catch(a){throw a instanceof e&&(a$1.error(`
258
+ \u274C ${a.message}`),a.details&&a$1.warn(`\u{1F4A1} ${a.details}
259
+ `),process.exit(1)),a}let i=y__default.resolve(process.cwd(),t);Ke=i,await ___default.pathExists(i)&&(a$1.error(`
260
+ \u274C Directory "${t}" already exists`),console.log(s.cyan(`
250
261
  \u{1F4A1} Choose a different name or delete the existing directory.
251
- `)),process.exit(1));let i=!!e$2.template;if(e$2.dryRun){console.log(a$4.cyan(`
262
+ `)),process.exit(1));let c$1=!!e$2.template;if(e$2.dryRun){console.log(s.cyan(`
252
263
  \u{1F50D} Dry-run mode - showing what would be created:
253
- `)),console.log(a$4.white("\u{1F4C2} Path:"),s),console.log(a$4.white("\u{1F4E6} Type:"),i?`Project (${e$2.template})`:"Workspace"),console.log();return}if(!e$2.yes&&!i?await Ae.prompt([{type:"input",name:"author",message:"Author name:",default:process.env.USER||"RapidKit User"}]):e$2.yes&&console.log(a$4.gray(`Using default values (--yes flag)
254
- `)),i){let c=String(e$2.template||"").trim(),l=c.toLowerCase(),d=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":c;if(Jt(d)){let j=f__default.resolve(process.cwd(),r),{generateGoFiberKit:b}=await import('./gofiber-standard-TFPNBIMS.js');await b(j,{project_name:r,module_path:r,skipGit:e$2.skipGit});return}if(gt(d)){let j=f__default.resolve(process.cwd(),r),{generateGoGinKit:b}=await import('./gogin-standard-7UJ2OBYL.js');await b(j,{project_name:r,module_path:r,skipGit:e$2.skipGit});return}if(ht(d)){let j=f__default.resolve(process.cwd(),r),{generateSpringBootKit:b}=await import('./springboot-standard-H6GYMH3P.js');await b(j,{project_name:r,artifact_id:r,skipGit:e$2.skipGit});return}if(!!!Cr(process.cwd())){let{registerWorkspaceAtPath:j}=await import('./create-RDLT34XT.js');if(e$2.createWorkspace)await j(process.cwd(),{skipGit:e$2.skipGit,yes:e$2.yes,userConfig:t});else if(!e$2.noWorkspace)if(e$2.yes)await j(process.cwd(),{skipGit:e$2.skipGit,yes:true,userConfig:t});else {let{createWs:b}=await Ae.prompt([{type:"confirm",name:"createWs",message:"This project will be created outside a RapidKit workspace. Create and register a workspace here?",default:true}]);b&&await j(process.cwd(),{skipGit:e$2.skipGit,yes:false,userConfig:t});}}let p=["create","project",d,r,"--output",process.cwd()];e$2.yes&&p.push("--yes");let u=Y(process.cwd()),h=!!e$2.skipInstall,g=h||!!u;h&&p.push("--skip-essentials");let y=g?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0,P=await f$1(p,{cwd:process.cwd(),env:y});P!==0&&process.exit(P),u&&!e$2.skipInstall&&(console.log(a$4.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(a$4.white(" Next: cd <project-name> && npx rapidkit init")));let w=Cr(process.cwd());if(w){let j=f__default.dirname(w),b=f__default.join(j,".python-version"),E=f__default.join(s,".python-version");try{if(await ___default.pathExists(b)){let I=k.readFileSync(b,"utf-8");k.writeFileSync(E,I.trim()+`
255
- `),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 j=await e$1(["init",s],{cwd:process.cwd()});if(j!==0&&process.exit(j),w){let b=f__default.dirname(w),E=f__default.join(b,".python-version"),I=f__default.join(s,".python-version");try{if(await ___default.pathExists(E)){let D=k.readFileSync(E,"utf-8");k.writeFileSync(I,D.trim()+`
256
- `),a$1.debug(`Re-synced Python version ${D.trim()} after init`);}}catch(D){a$1.debug("Could not re-sync Python version after init:",D);}}}}else {let{createProject:c}=await import('./create-RDLT34XT.js');await c(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(`
257
- \u274C ${t.message}`),t.details&&a$1.warn(`\u{1F4A1} ${t.details}`),a$1.debug("Error code:",t.code)):(a$1.error(`
258
- \u274C An unexpected error occurred:`),console.error(t)),process.exit(1);}finally{Fe=null;}});wo(ue);zr(ue);ue.command("shell <action>").description("Shell helpers (activate virtualenv in current shell)").action(async r=>{r!=="activate"&&(console.log(a$4.red(`Unknown shell command: ${r}`)),process.exit(1));let e=process.cwd();function t(l){let d=l;for(;;){let m=f__default.join(d,".rapidkit","context.json");if(k.existsSync(m))return m;let p=f__default.dirname(d);if(p===d)break;d=p;}return null}let o=t(e);function n(l){let d=l;for(;;){let m=f__default.join(d,".venv"),p=f__default.join(d,".rapidkit","activate");if(k.existsSync(p)||k.existsSync(m))return {venv:m,activateFile:p};let u=f__default.dirname(d);if(u===d)break;d=u;}return null}let s=n(e);!o&&!s&&(console.log(a$4.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(a$4.yellow("No virtual environment found")),process.exit(1));let c=a();console.log(c?`call "${i}"`:`. "${i}"`);});ue.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 xo(r);});ue.command("autopilot <action>").description("Run end-to-end release autopilot workflows").option("--mode <mode>","Autopilot mode: audit | safe-fix | enforce","audit").option("--json","Emit machine-readable JSON output").option("--output <file>","Write autopilot report to an additional output path").option("--since <ref>","Git ref for affected project selection (default: HEAD~1)").option("--parallel","Run workspace stage execution in parallel").option("--max-workers <count>","Maximum parallel workers").action(async(r,e)=>{r!=="release"&&(console.log(a$4.red(`Unknown autopilot action: ${r}`)),console.log(a$4.gray("Available: release")),process.exit(1));let t=String(e.mode||"audit").trim().toLowerCase();["audit","safe-fix","enforce"].includes(t)||(console.log(a$4.red(`Invalid autopilot mode: ${e.mode}`)),console.log(a$4.gray("Allowed modes: audit | safe-fix | enforce")),process.exit(1));let o=Number(e.maxWorkers??""),n=Number.isFinite(o)?Math.max(1,Math.trunc(o)):void 0,{runAutopilotRelease:s}=await import('./autopilot-release-SPJQ5ISJ.js'),i;try{i=await s({workspacePath:process.cwd(),mode:t,since:e.since,parallel:e.parallel===true,maxWorkers:n,json:e.json===true,output:e.output});}catch(c){let l=c instanceof Error?c.message:String(c);console.log(a$4.red(`Autopilot release failed: ${l}`)),process.exit(3);}e.json&&console.log(JSON.stringify(i,null,2)),i.summary.exitCode!==0&&process.exit(i.summary.exitCode);});ue.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 di(r,e);t!==0&&process.exit(t);});var Ut=ue.command("snapshot").description("Create, list, and restore RapidKit workspace snapshots");Ut.command("create [name]").description("Create a recoverable workspace snapshot").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--reason <text>","Reason recorded in the snapshot manifest").option("--include-projects","Include project source files in the snapshot").option("--json","Emit machine-readable JSON output").action(async(r,e)=>{try{let t=await rt({workspacePath:e.workspace,name:r,reason:e.reason,includeProjects:e.includeProjects===true});if(e.json){console.log(JSON.stringify(t,null,2));return}console.log(a$4.green(`\u2714 Workspace snapshot created: ${t.manifest.name}`)),console.log(a$4.gray(` Mode: ${t.manifest.mode}`)),console.log(a$4.gray(` Path: ${t.snapshotPath}`));}catch(t){console.log(a$4.red(`\u274C Snapshot create failed: ${t.message}`)),process.exit(1);}});Ut.command("list").description("List workspace snapshots").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--json","Emit machine-readable JSON output").action(async r=>{try{let e=await Ko({workspacePath:r.workspace});if(r.json){console.log(JSON.stringify({snapshots:e},null,2));return}if(e.length===0){console.log(a$4.yellow("No workspace snapshots found."));return}for(let t of e)console.log(a$4.cyan(t.name)),console.log(a$4.gray(` ${t.createdAt} | ${t.mode} | ${t.projects.length} project(s)`)),console.log(a$4.gray(` ${t.snapshotPath}`));}catch(e){console.log(a$4.red(`\u274C Snapshot list failed: ${e.message}`)),process.exit(1);}});Ut.command("inspect <name>").description("Inspect snapshot manifest and estimated payload size").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--json","Emit machine-readable JSON output").action(async(r,e)=>{try{let t=await Lo({workspacePath:e.workspace,name:r});if(e.json){console.log(JSON.stringify(t,null,2));return}console.log(a$4.cyan(`Snapshot: ${t.manifest.name}`)),console.log(a$4.gray(` Mode: ${t.manifest.mode}`)),console.log(a$4.gray(` Created: ${t.manifest.createdAt}`)),console.log(a$4.gray(` Projects: ${t.manifest.projects.length}`)),console.log(a$4.gray(` Files: ${t.estimatedFileCount}`)),console.log(a$4.gray(` Bytes: ${t.estimatedBytes}`)),console.log(a$4.gray(` Path: ${t.snapshotPath}`));}catch(t){console.log(a$4.red(`\u274C Snapshot inspect failed: ${t.message}`)),process.exit(1);}});Ut.command("restore <name>").description("Restore a workspace snapshot").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--reason <text>","Reason recorded in the audit log").option("--dry-run","Show what would be restored without changing files").option("--force","Required to apply a restore").option("--no-safety-snapshot","Do not create a pre-restore metadata snapshot").option("--json","Emit machine-readable JSON output").action(async(r,e)=>{try{let t=await Go({workspacePath:e.workspace,name:r,reason:e.reason,dryRun:e.dryRun===true,force:e.force===true,safetySnapshot:e.safetySnapshot});if(e.json){console.log(JSON.stringify(t,null,2));return}t.dryRun?console.log(a$4.cyan(`Snapshot restore dry-run: ${r}`)):console.log(a$4.green(`\u2714 Workspace snapshot restored: ${r}`)),console.log(a$4.gray(` Snapshot: ${t.snapshotPath}`)),console.log(a$4.gray(` Restored paths: ${t.restoredPaths.join(", ")}`)),t.safetySnapshotPath&&console.log(a$4.gray(` Safety snapshot: ${t.safetySnapshotPath}`));}catch(t){console.log(a$4.red(`\u274C Snapshot restore failed: ${t.message}`)),process.exit(1);}});var Bt=ue.command("project").description("Safe workspace project lifecycle operations");Bt.command("archives").description("List archived workspace projects").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--json","Emit machine-readable JSON output").action(async r=>{try{let e=await yr({workspacePath:r.workspace});if(r.json){console.log(JSON.stringify({archives:e},null,2));return}if(e.length===0){console.log(a$4.yellow("No archived projects found."));return}for(let t of e)console.log(a$4.cyan(t.projectName)),console.log(a$4.gray(` Archived: ${t.archivedAt}`)),console.log(a$4.gray(` Path: ${t.archivePath}`)),t.reason&&console.log(a$4.gray(` Reason: ${t.reason}`));}catch(e){console.log(a$4.red(`\u274C Project archive list failed: ${e.message}`)),process.exit(1);}});Bt.command("archive <project>").description("Move a project into .rapidkit/archive with a safety snapshot").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--reason <text>","Reason recorded in the archive manifest").option("--dry-run","Show what would be archived without changing files").option("--json","Emit machine-readable JSON output").action(async(r,e)=>{try{let t=await wr({workspacePath:e.workspace,project:r,reason:e.reason,dryRun:e.dryRun===true});if(e.json){console.log(JSON.stringify(t,null,2));return}console.log(t.dryRun?a$4.cyan(`Project archive dry-run: ${t.projectName}`):a$4.green(`\u2714 Project archived: ${t.projectName}`)),console.log(a$4.gray(` From: ${t.projectPath}`)),t.archivePath&&console.log(a$4.gray(` To: ${t.archivePath}`)),t.safetySnapshotPath&&console.log(a$4.gray(` Safety snapshot: ${t.safetySnapshotPath}`));}catch(t){console.log(a$4.red(`\u274C Project archive failed: ${t.message}`)),process.exit(1);}});Bt.command("restore <archive>").description("Restore an archived project back into the workspace").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--name <projectName>","Restore using a new project folder name").option("--reason <text>","Reason recorded in the audit log").option("--force","Overwrite an existing restore target").option("--dry-run","Show what would be restored without changing files").option("--json","Emit machine-readable JSON output").action(async(r,e)=>{try{let t=await Ho({workspacePath:e.workspace,archive:r,targetName:e.name,reason:e.reason,force:e.force===true,dryRun:e.dryRun===true});if(e.json){console.log(JSON.stringify(t,null,2));return}console.log(t.dryRun?a$4.cyan(`Project restore dry-run: ${t.projectName}`):a$4.green(`\u2714 Project restored: ${t.projectName}`)),console.log(a$4.gray(` From: ${t.archivePath}`)),console.log(a$4.gray(` To: ${t.projectPath}`)),t.safetySnapshotPath&&console.log(a$4.gray(` Safety snapshot: ${t.safetySnapshotPath}`));}catch(t){console.log(a$4.red(`\u274C Project restore failed: ${t.message}`)),process.exit(1);}});Bt.command("delete <project>").description("Archive by default; permanently delete only with --permanent and exact --confirm").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--reason <text>","Reason recorded in the safety snapshot/archive manifest").option("--permanent","Permanently delete the project directory").option("--confirm <projectName>","Required exact project name for --permanent").option("--dry-run","Show what would be deleted without changing files").option("--json","Emit machine-readable JSON output").action(async(r,e)=>{try{let t=await Bo({workspacePath:e.workspace,project:r,reason:e.reason,permanent:e.permanent===true,confirm:e.confirm,dryRun:e.dryRun===true});if(e.json){console.log(JSON.stringify(t,null,2));return}let o=t.action==="archive"?"archived":"deleted";console.log(t.dryRun?a$4.cyan(`Project ${o} dry-run: ${t.projectName}`):a$4.green(`\u2714 Project ${o}: ${t.projectName}`)),console.log(a$4.gray(` Path: ${t.projectPath}`)),t.archivePath&&console.log(a$4.gray(` Archive: ${t.archivePath}`)),t.safetySnapshotPath&&console.log(a$4.gray(` Safety snapshot: ${t.safetySnapshotPath}`));}catch(t){console.log(a$4.red(`\u274C Project delete failed: ${t.message}`)),process.exit(1);}});ue.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)").option("--plan","Generate remediation plan without applying changes").option("--apply","Apply remediation plan non-interactively").action(async(r,e)=>{r&&r!=="workspace"&&r!=="project"&&(console.log(a$4.red(`Unknown doctor scope: ${r}`)),console.log(a$4.gray("Available: workspace, project")),console.log(a$4.gray("Usage: npx rapidkit doctor | npx rapidkit doctor workspace | npx rapidkit doctor project")),process.exit(1)),e.plan&&(e.fix||e.apply)&&(console.log(a$4.red("Invalid doctor flags: --plan cannot be combined with --fix or --apply")),process.exit(1));let t=await oi({scope:r,workspaceFlag:e.workspace});t.detected&&!e.json&&(console.log(a$4.yellow("\u26A0\uFE0F Local launcher shadow detected for doctor workspace checks.")),t.candidatePath&&console.log(a$4.gray(` Candidate: ${t.candidatePath}`)),console.log(a$4.gray(" Running npm-wrapper doctor workflow directly as safe fallback to avoid ambiguous rapidkit binary resolution.")),console.log(a$4.gray(" If this happens in a shell call, run: npx --yes --package rapidkit rapidkit doctor workspace")));let{runDoctor:o}=await import('./doctor-DDIR7LBO.js');await o({...e,workspace:e.workspace||r==="workspace",project:e.project||r==="project"});});ue.command("workspace <action> [subaction] [key] [value]").description(`Manage RapidKit workspaces (list, sync, policy, share, run)
264
+ `)),console.log(s.white("\u{1F4C2} Path:"),i),console.log(s.white("\u{1F4E6} Type:"),c$1?`Project (${e$2.template})`:"Workspace"),console.log();return}if(!e$2.yes&&!c$1?await $e.prompt([{type:"input",name:"author",message:"Author name:",default:process.env.USER||"RapidKit User"}]):e$2.yes&&console.log(s.gray(`Using default values (--yes flag)
265
+ `)),c$1){let a=String(e$2.template||"").trim(),l=a.toLowerCase(),f$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(Yt(f$1)){let S=y__default.resolve(process.cwd(),t),{generateGoFiberKit:b}=await import('./gofiber-standard-TFPNBIMS.js');await b(S,{project_name:t,module_path:t,skipGit:e$2.skipGit});return}if(vt(f$1)){let S=y__default.resolve(process.cwd(),t),{generateGoGinKit:b}=await import('./gogin-standard-7UJ2OBYL.js');await b(S,{project_name:t,module_path:t,skipGit:e$2.skipGit});return}if(Pt(f$1)){let S=y__default.resolve(process.cwd(),t),{generateSpringBootKit:b}=await import('./springboot-standard-H6GYMH3P.js');await b(S,{project_name:t,artifact_id:t,skipGit:e$2.skipGit});return}if(!!!Mr(process.cwd())){let{registerWorkspaceAtPath:S}=await import('./create-KZYI3QRI.js');if(e$2.createWorkspace)await S(process.cwd(),{skipGit:e$2.skipGit,yes:e$2.yes,userConfig:r});else if(!e$2.noWorkspace)if(e$2.yes)await S(process.cwd(),{skipGit:e$2.skipGit,yes:true,userConfig:r});else {let{createWs:b}=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}]);b&&await S(process.cwd(),{skipGit:e$2.skipGit,yes:false,userConfig:r});}}let d=["create","project",f$1,t,"--output",process.cwd()];e$2.yes&&d.push("--yes");let m=K(process.cwd()),g=!!e$2.skipInstall,u=g||!!m;g&&d.push("--skip-essentials");let h=u?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0,k=await f(d,{cwd:process.cwd(),env:h});k!==0&&process.exit(k),m&&!e$2.skipInstall&&(console.log(s.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(s.white(" Next: cd <project-name> && npx rapidkit init")));let w=Mr(process.cwd());if(w){let S=y__default.dirname(w),b=y__default.join(S,".python-version"),j=y__default.join(i,".python-version");try{if(await ___default.pathExists(b)){let A=v.readFileSync(b,"utf-8");v.writeFileSync(j,A.trim()+`
266
+ `),a$1.debug(`Synced Python version ${A.trim()} from workspace to project`);}}catch(A){a$1.debug("Could not sync Python version from workspace:",A);}}if(!e$2.skipInstall){let S=await e$1(["init",i],{cwd:process.cwd()});if(S!==0&&process.exit(S),w){let b=y__default.dirname(w),j=y__default.join(b,".python-version"),A=y__default.join(i,".python-version");try{if(await ___default.pathExists(j)){let D=v.readFileSync(j,"utf-8");v.writeFileSync(A,D.trim()+`
267
+ `),a$1.debug(`Re-synced Python version ${D.trim()} after init`);}}catch(D){a$1.debug("Could not re-sync Python version after init:",D);}}}}else {let{createProject:a}=await import('./create-KZYI3QRI.js');await a(t,{skipGit:e$2.skipGit,dryRun:e$2.dryRun,yes:e$2.yes,userConfig:n,installMethod:e$2.installMethod,profile:e$2.profile});}}catch(r){r instanceof e?(a$1.error(`
268
+ \u274C ${r.message}`),r.details&&a$1.warn(`\u{1F4A1} ${r.details}`),a$1.debug("Error code:",r.code)):(a$1.error(`
269
+ \u274C An unexpected error occurred:`),console.error(r)),process.exit(1);}finally{Ke=null;}});Ro(ie);Io(ie);ie.command("analyze").description("Analyze workspace/project health and generate enterprise-ready evidence").option("--workspace <path>","Workspace/root path to analyze").option("--json","Output as JSON").option("--output <file>","Write JSON report to a file").option("--strict","Treat warnings as blocking in the verdict").action(async t=>{try{let{runAnalyze:e,printAnalyzeReport:r}=await import('./analyze-NVQUHK5V.js'),o=await e({workspacePath:t.workspace,json:t.json===true,output:t.output,strict:t.strict===true});t.json?console.log(JSON.stringify(o,null,2)):r(o),o.summary.verdict==="blocked"&&process.exit(2);}catch(e){let r=e instanceof Error?e.message:String(e);t.json?console.log(JSON.stringify({schemaVersion:"rapidkit-analyze-error-v1",ok:false,error:{message:r}},null,2)):console.error(s.red(`Analyze failed: ${r}`)),process.exit(1);}});no(ie);ie.command("shell <action>").description("Shell helpers (activate virtualenv in current shell)").action(async t=>{t!=="activate"&&(console.log(s.red(`Unknown shell command: ${t}`)),process.exit(1));let e=process.cwd();function r(l){let f=l;for(;;){let p=y__default.join(f,".rapidkit","context.json");if(v.existsSync(p))return p;let d=y__default.dirname(f);if(d===f)break;f=d;}return null}let o=r(e);function n(l){let f=l;for(;;){let p=y__default.join(f,".venv"),d=y__default.join(f,".rapidkit","activate");if(v.existsSync(d)||v.existsSync(p))return {venv:p,activateFile:d};let m=y__default.dirname(f);if(m===f)break;f=m;}return null}let i=n(e);!o&&!i&&(console.log(s.yellow("No RapidKit project found in this directory")),process.exit(1));let c;i&&v.existsSync(i.activateFile)?c=i.activateFile:i&&v.existsSync(i.venv)?c=h(i.venv):(console.log(s.yellow("No virtual environment found")),process.exit(1));let a$1=a();console.log(a$1?`call "${c}"`:`. "${c}"`);});ie.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 t=>{await Wo(t);});ie.command("autopilot <action>").description("Run end-to-end release autopilot workflows").option("--mode <mode>","Autopilot mode: audit | safe-fix | enforce","audit").option("--json","Emit machine-readable JSON output").option("--output <file>","Write autopilot report to an additional output path").option("--since <ref>","Git ref for affected project selection (default: HEAD~1)").option("--parallel","Run workspace stage execution in parallel").option("--max-workers <count>","Maximum parallel workers").action(async(t,e)=>{t!=="release"&&(console.log(s.red(`Unknown autopilot action: ${t}`)),console.log(s.gray("Available: release")),process.exit(1));let r=String(e.mode||"audit").trim().toLowerCase();["audit","safe-fix","enforce"].includes(r)||(console.log(s.red(`Invalid autopilot mode: ${e.mode}`)),console.log(s.gray("Allowed modes: audit | safe-fix | enforce")),process.exit(1));let o=Number(e.maxWorkers??""),n=Number.isFinite(o)?Math.max(1,Math.trunc(o)):void 0,{runAutopilotRelease:i}=await import('./autopilot-release-T4N4KHO6.js'),c;try{c=await i({workspacePath:process.cwd(),mode:r,since:e.since,parallel:e.parallel===true,maxWorkers:n,json:e.json===true,output:e.output});}catch(a){let l=a instanceof Error?a.message:String(a);console.log(s.red(`Autopilot release failed: ${l}`)),process.exit(3);}e.json&&console.log(JSON.stringify(c,null,2)),c.summary.exitCode!==0&&process.exit(c.summary.exitCode);});ie.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(t,e)=>{let r=await Fi(t,e);r!==0&&process.exit(r);});var Qt=ie.command("snapshot").description("Create, list, and restore RapidKit workspace snapshots");Qt.command("create [name]").description("Create a recoverable workspace snapshot").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--reason <text>","Reason recorded in the snapshot manifest").option("--include-projects","Include project source files in the snapshot").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let r=await it({workspacePath:e.workspace,name:t,reason:e.reason,includeProjects:e.includeProjects===true});if(e.json){console.log(JSON.stringify(r,null,2));return}console.log(s.green(`\u2714 Workspace snapshot created: ${r.manifest.name}`)),console.log(s.gray(` Mode: ${r.manifest.mode}`)),console.log(s.gray(` Path: ${r.snapshotPath}`));}catch(r){console.log(s.red(`\u274C Snapshot create failed: ${r.message}`)),process.exit(1);}});Qt.command("list").description("List workspace snapshots").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--json","Emit machine-readable JSON output").action(async t=>{try{let e=await tn({workspacePath:t.workspace});if(t.json){console.log(JSON.stringify({snapshots:e},null,2));return}if(e.length===0){console.log(s.yellow("No workspace snapshots found."));return}for(let r of e)console.log(s.cyan(r.name)),console.log(s.gray(` ${r.createdAt} | ${r.mode} | ${r.projects.length} project(s)`)),console.log(s.gray(` ${r.snapshotPath}`));}catch(e){console.log(s.red(`\u274C Snapshot list failed: ${e.message}`)),process.exit(1);}});Qt.command("inspect <name>").description("Inspect snapshot manifest and estimated payload size").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let r=await en({workspacePath:e.workspace,name:t});if(e.json){console.log(JSON.stringify(r,null,2));return}console.log(s.cyan(`Snapshot: ${r.manifest.name}`)),console.log(s.gray(` Mode: ${r.manifest.mode}`)),console.log(s.gray(` Created: ${r.manifest.createdAt}`)),console.log(s.gray(` Projects: ${r.manifest.projects.length}`)),console.log(s.gray(` Files: ${r.estimatedFileCount}`)),console.log(s.gray(` Bytes: ${r.estimatedBytes}`)),console.log(s.gray(` Path: ${r.snapshotPath}`));}catch(r){console.log(s.red(`\u274C Snapshot inspect failed: ${r.message}`)),process.exit(1);}});Qt.command("restore <name>").description("Restore a workspace snapshot").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--reason <text>","Reason recorded in the audit log").option("--dry-run","Show what would be restored without changing files").option("--force","Required to apply a restore").option("--no-safety-snapshot","Do not create a pre-restore metadata snapshot").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let r=await rn({workspacePath:e.workspace,name:t,reason:e.reason,dryRun:e.dryRun===true,force:e.force===true,safetySnapshot:e.safetySnapshot});if(e.json){console.log(JSON.stringify(r,null,2));return}r.dryRun?console.log(s.cyan(`Snapshot restore dry-run: ${t}`)):console.log(s.green(`\u2714 Workspace snapshot restored: ${t}`)),console.log(s.gray(` Snapshot: ${r.snapshotPath}`)),console.log(s.gray(` Restored paths: ${r.restoredPaths.join(", ")}`)),r.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(s.red(`\u274C Snapshot restore failed: ${r.message}`)),process.exit(1);}});var Zt=ie.command("project").description("Safe workspace project lifecycle operations");Zt.command("archives").description("List archived workspace projects").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--json","Emit machine-readable JSON output").action(async t=>{try{let e=await xr({workspacePath:t.workspace});if(t.json){console.log(JSON.stringify({archives:e},null,2));return}if(e.length===0){console.log(s.yellow("No archived projects found."));return}for(let r of e)console.log(s.cyan(r.projectName)),console.log(s.gray(` Archived: ${r.archivedAt}`)),console.log(s.gray(` Path: ${r.archivePath}`)),r.reason&&console.log(s.gray(` Reason: ${r.reason}`));}catch(e){console.log(s.red(`\u274C Project archive list failed: ${e.message}`)),process.exit(1);}});Zt.command("archive <project>").description("Move a project into .rapidkit/archive with a safety snapshot").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--reason <text>","Reason recorded in the archive manifest").option("--dry-run","Show what would be archived without changing files").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let r=await Sr({workspacePath:e.workspace,project:t,reason:e.reason,dryRun:e.dryRun===true});if(e.json){console.log(JSON.stringify(r,null,2));return}console.log(r.dryRun?s.cyan(`Project archive dry-run: ${r.projectName}`):s.green(`\u2714 Project archived: ${r.projectName}`)),console.log(s.gray(` From: ${r.projectPath}`)),r.archivePath&&console.log(s.gray(` To: ${r.archivePath}`)),r.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(s.red(`\u274C Project archive failed: ${r.message}`)),process.exit(1);}});Zt.command("restore <archive>").description("Restore an archived project back into the workspace").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--name <projectName>","Restore using a new project folder name").option("--reason <text>","Reason recorded in the audit log").option("--force","Overwrite an existing restore target").option("--dry-run","Show what would be restored without changing files").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let r=await cn({workspacePath:e.workspace,archive:t,targetName:e.name,reason:e.reason,force:e.force===true,dryRun:e.dryRun===true});if(e.json){console.log(JSON.stringify(r,null,2));return}console.log(r.dryRun?s.cyan(`Project restore dry-run: ${r.projectName}`):s.green(`\u2714 Project restored: ${r.projectName}`)),console.log(s.gray(` From: ${r.archivePath}`)),console.log(s.gray(` To: ${r.projectPath}`)),r.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(s.red(`\u274C Project restore failed: ${r.message}`)),process.exit(1);}});Zt.command("delete <project>").description("Archive by default; permanently delete only with --permanent and exact --confirm").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--reason <text>","Reason recorded in the safety snapshot/archive manifest").option("--permanent","Permanently delete the project directory").option("--confirm <projectName>","Required exact project name for --permanent").option("--dry-run","Show what would be deleted without changing files").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let r=await an({workspacePath:e.workspace,project:t,reason:e.reason,permanent:e.permanent===true,confirm:e.confirm,dryRun:e.dryRun===true});if(e.json){console.log(JSON.stringify(r,null,2));return}let o=r.action==="archive"?"archived":"deleted";console.log(r.dryRun?s.cyan(`Project ${o} dry-run: ${r.projectName}`):s.green(`\u2714 Project ${o}: ${r.projectName}`)),console.log(s.gray(` Path: ${r.projectPath}`)),r.archivePath&&console.log(s.gray(` Archive: ${r.archivePath}`)),r.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(s.red(`\u274C Project delete failed: ${r.message}`)),process.exit(1);}});ie.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)").option("--plan","Generate remediation plan without applying changes").option("--apply","Apply remediation plan non-interactively").action(async(t,e)=>{t&&t!=="workspace"&&t!=="project"&&(console.log(s.red(`Unknown doctor scope: ${t}`)),console.log(s.gray("Available: workspace, project")),console.log(s.gray("Usage: npx rapidkit doctor | npx rapidkit doctor workspace | npx rapidkit doctor project")),process.exit(1)),e.plan&&(e.fix||e.apply)&&(console.log(s.red("Invalid doctor flags: --plan cannot be combined with --fix or --apply")),process.exit(1));let r=await Ii({scope:t,workspaceFlag:e.workspace});r.detected&&!e.json&&(console.log(s.yellow("\u26A0\uFE0F Local launcher shadow detected for doctor workspace checks.")),r.candidatePath&&console.log(s.gray(` Candidate: ${r.candidatePath}`)),console.log(s.gray(" Running npm-wrapper doctor workflow directly as safe fallback to avoid ambiguous rapidkit binary resolution.")),console.log(s.gray(" If this happens in a shell call, run: npx --yes --package rapidkit rapidkit doctor workspace")));let{runDoctor:o}=await import('./doctor-DDIR7LBO.js');await o({...e,workspace:e.workspace||t==="workspace",project:e.project||t==="project"});});ie.command("workspace <action> [subaction] [key] [value]").description(`Manage RapidKit workspaces (list, sync, policy, share, export, hydrate, run)
259
270
  workspace run <stage> \u2014 fleet stage execution across discovered projects
260
- 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(),s=i=>{let c=Y(process.cwd());c||(console.log(a$4.red("\u274C Not inside a RapidKit workspace")),console.log(a$4.gray("\u{1F4A1} Run this command from within a workspace directory")),process.exit(1));let l=f__default.resolve(process.cwd()),d=f__default.resolve(c);return l!==d&&(console.log(a$4.red(`\u274C Workspace action "${i}" must be run from workspace root.`)),console.log(a$4.gray(`\u{1F4A1} Workspace root: ${c}`)),console.log(a$4.white(` cd ${c}`)),(i==="run init"||i==="init")&&console.log(a$4.gray(" For project-only init in the current directory, run: npx rapidkit init")),process.exit(1)),c};if(r==="list"){let{listWorkspaces:i}=await import('./workspace-2JHFIZ3J.js');await i();}else if(r==="sync"){let i=s("sync"),{syncWorkspaceProjects:c}=await import('./workspace-2JHFIZ3J.js');console.log(a$4.cyan(`\u{1F4C2} Scanning workspace: ${f__default.basename(i)}`)),await c(i);}else if(r==="policy"){let i=s("policy"),c=await ki(i,e,t,o);c!==0&&process.exit(c);}else if(r==="share"){let i=s("share"),c=n.output||e,{createWorkspaceShareBundle:l}=await import('./workspace-2JHFIZ3J.js'),d=await l(i,{outputPath:c,includePaths:n.includePaths===true,includeDoctorEvidence:n.doctor!==false});console.log(a$4.green(`\u2714 Workspace share bundle exported: ${d}`)),console.log(a$4.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(a$4.red(`Unknown workspace run stage: ${e||"(none provided)"}`)),console.log(a$4.gray("Available stages: init | test | build | start")),console.log(a$4.gray(" \u2022 init \u2014 run install/bootstrap across the project fleet")),console.log(a$4.gray(" \u2022 test \u2014 run test suite across selected projects")),console.log(a$4.gray(" \u2022 build \u2014 compile/package across selected projects")),console.log(a$4.gray(" \u2022 start \u2014 start services (smoke/e2e scenarios)")),console.log(a$4.gray(" Note: dev is excluded \u2014 it is a local-only primitive, not a CI stage")),process.exit(2));let c=Number(n.maxWorkers??""),l=Number.isFinite(c)?Math.max(1,Math.trunc(c)):void 0;if(e==="init"){let p=await Rr(i);p!==0&&process.exit(p);}let{runWorkspaceStage:d}=await import('./workspace-run-F2VKW3ZK.js'),m=await d({workspacePath:i,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(a$4.yellow("\u2139 workspace init is an alias of: npx rapidkit workspace run init")),console.log(a$4.gray(` Equivalent full-init aliases at workspace root:
271
+ 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("--no-blueprint","Exclude reproducibility blueprint from workspace share bundle").option("--include-env","Include .env/private key files in workspace export archive").option("--force","Overwrite an existing hydrate output directory").option("--dry-run","Preview hydrate without writing files").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(t,e,r,o){let n=this.opts(),i=a=>{let l=K(process.cwd());l||(console.log(s.red("\u274C Not inside a RapidKit workspace")),console.log(s.gray("\u{1F4A1} Run this command from within a workspace directory")),process.exit(1));let f=y__default.resolve(process.cwd()),p=y__default.resolve(l);return f!==p&&(console.log(s.red(`\u274C Workspace action "${a}" must be run from workspace root.`)),console.log(s.gray(`\u{1F4A1} Workspace root: ${l}`)),console.log(s.white(` cd ${l}`)),(a==="run init"||a==="init")&&console.log(s.gray(" For project-only init in the current directory, run: npx rapidkit init")),process.exit(1)),l},c=a=>process.argv.includes(a);if(t==="list"){let{listWorkspaces:a}=await import('./workspace-YLFC25EZ.js');await a();}else if(t==="sync"){let a=i("sync"),{syncWorkspaceProjects:l}=await import('./workspace-YLFC25EZ.js');console.log(s.cyan(`\u{1F4C2} Scanning workspace: ${y__default.basename(a)}`)),await l(a),await Ve(a);}else if(t==="policy"){let a=i("policy"),l=await Bi(a,e,r,o);l!==0&&process.exit(l);}else if(t==="contract"){let a=i("contract"),{buildWorkspaceContractGraph:l,readWorkspaceContract:f,verifyWorkspaceContract:p,writeWorkspaceContract:d,WORKSPACE_CONTRACT_PATH:m}=await import('./workspace-contract-4UCEM44I.js'),g=e||"inspect",u=n.output;try{if(g==="init"){let h=await d({workspacePath:a,outputPath:u,force:n.force===true||c("--force")});if(n.json){console.log(JSON.stringify(h,null,2));return}console.log(s.green(`\u2714 Workspace contract initialized: ${h.contractPath}`)),console.log(s.gray(` Projects: ${h.contract.projects.length}`));return}if(g==="inspect"){let h=await f({workspacePath:a,contractPath:u});if(n.json){console.log(JSON.stringify(h,null,2));return}console.log(s.green(`\u2714 Workspace contract: ${h.contractPath}`)),console.log(s.gray(` Workspace: ${h.contract.workspace.name}`)),console.log(s.gray(` Projects: ${h.contract.projects.length}`)),console.log(s.gray(` Schema: v${h.contract.schemaVersion}`));return}if(g==="verify"){let h=await p({workspacePath:a,contractPath:u});if(n.json)console.log(JSON.stringify(h,null,2));else {let k=h.status==="passed"?s.green:s.red;console.log(k(`\u2714 Workspace contract verification ${h.status}: ${h.contractPath}`)),console.log(s.gray(` Projects: ${h.projectCount}`));for(let w of h.checks){let S=w.status==="passed"?"\u2714":"\u2718";console.log(s.gray(` ${S} ${w.id}: ${w.message}`));}for(let w of h.violations)console.log(s.gray(` Violation: ${w}`));}(h.status==="failed"||h.status!=="passed"&&n.strict)&&process.exit(1);return}if(g==="graph"){let h=await l({workspacePath:a,contractPath:u});if(n.json){console.log(JSON.stringify(h,null,2));return}console.log(s.green(`\u2714 Workspace contract graph: ${h.contractPath}`)),console.log(s.gray(` Workspace: ${h.graph.workspace.name}`)),console.log(s.gray(` Projects: ${h.graph.summary.projectCount}`)),console.log(s.gray(` Dependencies: ${h.graph.summary.dependencyEdges}`)),console.log(s.gray(` Event links: ${h.graph.summary.eventEdges}`)),console.log(s.gray(` Ports: ${h.graph.summary.portCount}`));for(let k of h.graph.nodes){let w=k.ports.map(S=>`${S.name}:${S.port}`).join(", ")||"none";console.log(s.gray(` \u2022 ${k.id} (${k.runtime||"unknown"}${k.framework?`/${k.framework}`:""}) ports=${w}`));}for(let k of h.graph.edges){let w=k.type==="event"?`event:${k.label}`:k.label;console.log(s.gray(` ${k.from} -> ${k.to} [${w}]`));}return}console.log(s.red(`\u274C Unknown workspace contract action: ${g}`)),console.log(s.white(` npx rapidkit workspace contract init|inspect|verify|graph [--output ${m}]`)),process.exit(1);}catch(h){console.log(s.red(`\u274C Workspace contract ${g} failed: ${h.message}`)),process.exit(1);}}else if(t==="share"){let a=i("share"),l=n.output||e,{createWorkspaceShareBundle:f}=await import('./workspace-YLFC25EZ.js'),p=await f(a,{outputPath:l,includePaths:n.includePaths===true,includeDoctorEvidence:n.doctor!==false,includeBlueprint:n.blueprint!==false});console.log(s.green(`\u2714 Workspace share bundle exported: ${p}`)),console.log(s.gray("Share this JSON with your team for reproducible workspace/project diagnostics."));}else if(t==="export"){let a=i("export"),{exportWorkspaceArchive:l}=await import('./workspace-archive-LVP3EMGI.js'),f=await l({workspacePath:a,outputPath:n.output||e,includeEnv:n.includeEnv===true||c("--include-env")});if(n.json){console.log(JSON.stringify(f,null,2));return}let p=(f.bytesWritten/(1024*1024)).toFixed(2);console.log(s.green(`\u2714 Workspace archive exported: ${f.archivePath}`)),console.log(s.gray(` Files: ${f.manifest.files.length}`)),console.log(s.gray(` Size: ${p} MB`)),f.manifest.security.envFilesIncluded||console.log(s.gray(" Secrets: excluded (.env, private keys, logs, dependency caches)"));}else if(t==="archive"&&(e==="inspect"||e==="verify"||e==="doctor")){let a=r;a||(console.log(s.red(`\u274C workspace archive ${e} requires an archive path or URL.`)),console.log(s.white(` npx rapidkit workspace archive ${e} team.rapidkit-archive.zip`)),process.exit(1));let{doctorWorkspaceArchive:l,inspectWorkspaceArchive:f,verifyWorkspaceArchive:p}=await import('./workspace-archive-LVP3EMGI.js');try{if(e==="inspect"){let m=await f({archivePathOrUrl:a});if(n.json){console.log(JSON.stringify(m,null,2));return}let g=(m.totalBytes/(1024*1024)).toFixed(2);console.log(s.green(`\u2714 Workspace archive: ${m.archivePath}`)),console.log(s.gray(` Workspace: ${m.manifest.workspaceName}`)),console.log(s.gray(` Exported: ${m.manifest.exportedAt}`)),console.log(s.gray(` Exporter: ${m.manifest.exportedBy||"unknown"}`)),console.log(s.gray(` Files: ${m.fileCount}`)),console.log(s.gray(` Payload: ${g} MB`));return}if(e==="doctor"){let m=await l({archivePathOrUrl:a,strict:n.strict===true||c("--strict")});if(n.json)console.log(JSON.stringify(m,null,2));else {let g=m.status==="passed"?s.green:m.status==="warning"?s.yellow:s.red;console.log(g(`\u2714 Workspace archive doctor ${m.status}: ${m.archivePath}`)),console.log(s.gray(` Workspace: ${m.workspaceName}`)),console.log(s.gray(` Files: ${m.fileCount}`));for(let u of m.checks){let h=u.status==="passed"?"\u2714":u.status==="warning"?"\u26A0":"\u2718";console.log(s.gray(` ${h} ${u.id}: ${u.message}`));}for(let u of m.recommendedActions)console.log(s.gray(` Next: ${u}`));}(m.status==="failed"||m.status==="warning"&&n.strict)&&process.exit(1);return}let d=await p({archivePathOrUrl:a,requireChecksums:n.strict===true||c("--strict")});if(n.json)console.log(JSON.stringify(d,null,2));else if(d.status==="passed")console.log(s.green(`\u2714 Workspace archive verified: ${d.archivePath}`)),console.log(s.gray(` Files: ${d.verifiedFiles}/${d.fileCount}`));else {let m=d.status==="failed"?s.red:s.yellow;console.log(m(`\u274C Workspace archive verification ${d.status}: ${d.archivePath}`)),d.missingArchiveEntries.length&&console.log(s.gray(` Missing entries: ${d.missingArchiveEntries.join(", ")}`)),d.extraArchiveEntries.length&&console.log(s.gray(` Unexpected entries: ${d.extraArchiveEntries.join(", ")}`)),d.mismatches.length&&console.log(s.gray(` Mismatches: ${d.mismatches.map(g=>g.path).join(", ")}`)),d.missingChecksumFiles.length&&console.log(s.gray(` Missing checksums: ${d.missingChecksumFiles.join(", ")}`));}(d.status==="failed"||d.status==="warning"&&n.strict)&&process.exit(1);}catch(d){console.log(s.red(`\u274C Workspace archive ${e} failed: ${d.message}`)),process.exit(1);}}else if(t==="hydrate"||t==="import"){let a=e;a||(console.log(s.red(`\u274C workspace ${t} requires an archive path or URL.`)),console.log(s.white(` npx rapidkit workspace ${t} team.rapidkit-archive.zip --output ./team`)),process.exit(1));let{hydrateWorkspaceArchive:l}=await import('./workspace-archive-LVP3EMGI.js');try{let f=await l({archivePathOrUrl:a,outputPath:n.output,force:n.force===true||c("--force"),dryRun:n.dryRun===true||c("--dry-run"),strict:n.strict===true||c("--strict")});if(n.json){console.log(JSON.stringify(f,null,2));return}console.log(s.green(f.dryRun?`\u2714 Workspace archive hydrate preview: ${f.outputPath}`:`\u2714 Workspace archive hydrated: ${f.outputPath}`)),console.log(s.gray(` Files: ${f.files.length}`)),f.manifest?.workspaceName&&console.log(s.gray(` Workspace: ${f.manifest.workspaceName}`));}catch(f){console.log(s.red(`\u274C Workspace ${t} failed: ${f.message}`)),process.exit(1);}}else if(t==="run"){let a=i(`run ${e||""}`.trim());(!e||!["init","test","build","start"].includes(e))&&(console.log(s.red(`Unknown workspace run stage: ${e||"(none provided)"}`)),console.log(s.gray("Available stages: init | test | build | start")),console.log(s.gray(" \u2022 init \u2014 run install/bootstrap across the project fleet")),console.log(s.gray(" \u2022 test \u2014 run test suite across selected projects")),console.log(s.gray(" \u2022 build \u2014 compile/package across selected projects")),console.log(s.gray(" \u2022 start \u2014 start services (smoke/e2e scenarios)")),console.log(s.gray(" Note: dev is excluded \u2014 it is a local-only primitive, not a CI stage")),process.exit(2));let l=Number(n.maxWorkers??""),f=Number.isFinite(l)?Math.max(1,Math.trunc(l)):void 0;if(e==="init"){let m=await Or(a);m!==0&&process.exit(m);}let{runWorkspaceStage:p}=await import('./workspace-run-TGNMTL2V.js'),d=await p({workspacePath:a,stage:e,affected:n.affected===true,blastRadius:n.blastRadius===true,since:n.since,parallel:n.parallel===true,maxWorkers:f,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 if(t==="init"){console.log(s.yellow("\u2139 workspace init is an alias of: npx rapidkit workspace run init")),console.log(s.gray(` Equivalent full-init aliases at workspace root:
261
272
  npx rapidkit init | npx rapidkit workspace init | npx rapidkit workspace run init
262
- `));let i=s("init"),c=Number(n.maxWorkers??""),l=Number.isFinite(c)?Math.max(1,Math.trunc(c)):void 0,d=await Rr(i);d!==0&&process.exit(d);let{runWorkspaceStage:m}=await import('./workspace-run-F2VKW3ZK.js'),p=await m({workspacePath:i,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(p,null,2)),p.summary.exitCode!==0&&process.exit(p.summary.exitCode);}else console.log(a$4.red(`Unknown workspace action: ${r}`)),console.log(a$4.gray("Available: list, sync, policy, share, run")),process.exit(1);});function vn(){let r=a()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";console.log(a$4.white(`Usage:
263
- `)),console.log(a$4.cyan(` npx rapidkit <workspace-name> [options]
264
- `)),console.log(a$4.bold("Quick start \u2014 workspace workflow:")),console.log(a$4.cyan(" npx rapidkit my-workspace ")+a$4.gray("# Create workspace (interactive profile picker)")),console.log(a$4.cyan(" cd my-workspace")),console.log(a$4.cyan(" npx rapidkit bootstrap ")+a$4.gray("# Bootstrap all runtime toolchains")),console.log(a$4.cyan(" npx rapidkit create project ")+a$4.gray("# Interactive kit picker")),console.log(a$4.cyan(" cd my-api")),console.log(a$4.cyan(` ${r}
265
- `)),console.log(a$4.bold("Workspace profiles (asked during creation):")),console.log(a$4.gray(" minimal Foundation files only \u2014 fastest bootstrap (default)")),console.log(a$4.gray(" java-only Java runtime (Spring Boot services)")),console.log(a$4.gray(" python-only Python + Poetry (FastAPI, Django, ML)")),console.log(a$4.gray(" node-only Node.js runtime (NestJS, Express, Next.js)")),console.log(a$4.gray(" go-only Go runtime (Fiber, Gin, gRPC)")),console.log(a$4.gray(" polyglot Python + Node.js + Go + Java multi-runtime")),console.log(a$4.gray(` enterprise Polyglot + governance + Sigstore
266
- `)),console.log(a$4.bold("Workspace commands (inside a workspace):")),console.log(a$4.gray(" npx rapidkit bootstrap [--profile <p>] Re-bootstrap toolchains")),console.log(a$4.gray(" npx rapidkit workspace list List registered workspaces")),console.log(a$4.gray(" npx rapidkit import <path|git-url> Copy or clone a backend project into this workspace")),console.log(a$4.gray(" npx rapidkit snapshot create [name] Create a recoverable workspace snapshot")),console.log(a$4.gray(" npx rapidkit snapshot restore <name> Restore snapshot metadata with safety guard")),console.log(a$4.gray(" npx rapidkit snapshot inspect <name> Inspect snapshot manifest and size")),console.log(a$4.gray(" npx rapidkit project archive <name> Archive a project with a safety snapshot")),console.log(a$4.gray(" npx rapidkit project restore <archive> Restore an archived project safely")),console.log(a$4.gray(" npx rapidkit workspace share [--output <file>] Export collaboration bundle")),console.log(a$4.gray(" npx rapidkit workspace policy show Show effective workspace policies")),console.log(a$4.gray(" npx rapidkit workspace policy set <k> <v> Update workspace policy values")),console.log(a$4.gray(" npx rapidkit setup python|node|go|java [--warm-deps] Set up runtime (+ optional deps warm-up)")),console.log(a$4.gray(" npx rapidkit mirror [status|sync|verify|rotate] Registry mirror management")),console.log(a$4.gray(` npx rapidkit cache [status|clear|prune|repair] Package cache management
267
- `)),console.log(a$4.bold("Options (workspace creation):")),console.log(a$4.gray(" -y, --yes Skip prompts and use defaults")),console.log(a$4.gray(" --author <name> Author/team name for workspace metadata")),console.log(a$4.gray(" --skip-git Skip git initialization")),console.log(a$4.gray(" --debug Enable debug logging")),console.log(a$4.gray(" --dry-run Show what would be created")),console.log(a$4.gray(" --create-workspace When creating a project outside a workspace: create and register a workspace in the current directory")),console.log(a$4.gray(" --no-workspace When creating a project outside a workspace: do not create a workspace")),console.log(a$4.gray(` --no-update-check Skip checking for updates
268
- `)),console.log(a$4.bold("Project commands (inside a project):")),console.log(a$4.gray(" npx rapidkit create project Scaffold a new project")),console.log(a$4.gray(" cd my-api Change directory to the new project")),console.log(a$4.gray(" npx rapidkit init Install project dependencies")),console.log(a$4.gray(" npx rapidkit dev Start dev server")),console.log(a$4.gray(" npx rapidkit build Build for production")),console.log(a$4.gray(` npx rapidkit test Run tests
269
- `)),console.log(a$4.bold("Flags clarification:")),console.log(a$4.gray(" --skip-install npm fast-path for lock/dependency steps")),console.log(a$4.gray(` --skip-essentials core flag for skipping essential module installation
270
- `)),bi?(console.log(a$4.bold("Legacy (shown because RAPIDKIT_SHOW_LEGACY=1):")),console.log(a$4.gray(" npx rapidkit my-project --template fastapi")),console.log(a$4.gray(" npx rapidkit my-project --template nestjs")),console.log(a$4.gray(" npx rapidkit my-project --template springboot")),console.log(a$4.gray(" npx rapidkit my-project --template gofiber")),console.log(a$4.gray(" npx rapidkit my-project --template gogin")),console.log(a$4.gray(` --skip-install Fast-path lock/deps (legacy template mode) \u2014 not same as --skip-essentials
271
- `))):console.log(a$4.gray(`Tip: set RAPIDKIT_SHOW_LEGACY=1 to show legacy template flags in help.
272
- `));}var an="__rapidkit_signal_handlers_registered__",cn=globalThis;cn[an]||(cn[an]=true,process.on("SIGINT",async()=>{if(!Gt){if(Gt=true,console.log(a$4.yellow(`
273
+ `));let a=i("init"),l=Number(n.maxWorkers??""),f=Number.isFinite(l)?Math.max(1,Math.trunc(l)):void 0,p=await Or(a);p!==0&&process.exit(p);let{runWorkspaceStage:d}=await import('./workspace-run-TGNMTL2V.js'),m=await d({workspacePath:a,stage:"init",affected:n.affected===true,blastRadius:n.blastRadius===true,since:n.since,parallel:n.parallel===true,maxWorkers:f,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 console.log(s.red(`Unknown workspace action: ${t}`)),console.log(s.gray("Available: list, sync, policy, share, export, hydrate, import, run")),process.exit(1);});function Fn(){let t=a()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";console.log(s.white(`Usage:
274
+ `)),console.log(s.cyan(` npx rapidkit <workspace-name> [options]
275
+ `)),console.log(s.bold("Quick start \u2014 workspace workflow:")),console.log(s.cyan(" npx rapidkit my-workspace ")+s.gray("# Create workspace (interactive profile picker)")),console.log(s.cyan(" cd my-workspace")),console.log(s.cyan(" npx rapidkit bootstrap ")+s.gray("# Bootstrap all runtime toolchains")),console.log(s.cyan(" npx rapidkit create project ")+s.gray("# Interactive kit picker")),console.log(s.cyan(" cd my-api")),console.log(s.cyan(` ${t}
276
+ `)),console.log(s.bold("Workspace profiles (asked during creation):")),console.log(s.gray(" minimal Foundation files only \u2014 fastest bootstrap (default)")),console.log(s.gray(" java-only Java runtime (Spring Boot services)")),console.log(s.gray(" python-only Python + Poetry (FastAPI, Django, ML)")),console.log(s.gray(" node-only Node.js runtime (NestJS, Express, Next.js)")),console.log(s.gray(" go-only Go runtime (Fiber, Gin, gRPC)")),console.log(s.gray(" polyglot Python + Node.js + Go + Java multi-runtime")),console.log(s.gray(` enterprise Polyglot + governance + Sigstore
277
+ `)),console.log(s.bold("Workspace commands (inside a workspace):")),console.log(s.gray(" npx rapidkit bootstrap [--profile <p>] Re-bootstrap toolchains")),console.log(s.gray(" npx rapidkit analyze [--json --strict] Analyze workspace health and gaps")),console.log(s.gray(" npx rapidkit workspace list List registered workspaces")),console.log(s.gray(" npx rapidkit import <path|git-url> Copy or clone a backend project into this workspace")),console.log(s.gray(" npx rapidkit snapshot create [name] Create a recoverable workspace snapshot")),console.log(s.gray(" npx rapidkit snapshot restore <name> Restore snapshot metadata with safety guard")),console.log(s.gray(" npx rapidkit snapshot inspect <name> Inspect snapshot manifest and size")),console.log(s.gray(" npx rapidkit project archive <name> Archive a project with a safety snapshot")),console.log(s.gray(" npx rapidkit project restore <archive> Restore an archived project safely")),console.log(s.gray(" npx rapidkit workspace share [--output <file>] Export collaboration bundle")),console.log(s.gray(" npx rapidkit workspace contract init Create workspace service contract")),console.log(s.gray(" npx rapidkit workspace contract verify Verify service ports/dependencies")),console.log(s.gray(" npx rapidkit workspace contract graph Show service dependency graph")),console.log(s.gray(" npx rapidkit workspace export --output <file> Export portable workspace archive")),console.log(s.gray(" npx rapidkit workspace archive verify <file> Verify archive integrity")),console.log(s.gray(" npx rapidkit workspace archive doctor <file> Diagnose archive readiness")),console.log(s.gray(" npx rapidkit workspace hydrate <archive> --output <dir> Hydrate workspace archive")),console.log(s.gray(" npx rapidkit workspace policy show Show effective workspace policies")),console.log(s.gray(" npx rapidkit workspace policy set <k> <v> Update workspace policy values")),console.log(s.gray(" npx rapidkit setup python|node|go|java [--warm-deps] Set up runtime (+ optional deps warm-up)")),console.log(s.gray(" npx rapidkit mirror [status|sync|verify|rotate] Registry mirror management")),console.log(s.gray(` npx rapidkit cache [status|clear|prune|repair] Package cache management
278
+ `)),console.log(s.bold("Options (workspace creation):")),console.log(s.gray(" -y, --yes Skip prompts and use defaults")),console.log(s.gray(" --author <name> Author/team name for workspace metadata")),console.log(s.gray(" --skip-git Skip git initialization")),console.log(s.gray(" --debug Enable debug logging")),console.log(s.gray(" --dry-run Show what would be created")),console.log(s.gray(" --create-workspace When creating a project outside a workspace: create and register a workspace in the current directory")),console.log(s.gray(" --no-workspace When creating a project outside a workspace: do not create a workspace")),console.log(s.gray(` --no-update-check Skip checking for updates
279
+ `)),console.log(s.bold("Project commands (inside a project):")),console.log(s.gray(" npx rapidkit create project Scaffold a new project")),console.log(s.gray(" cd my-api Change directory to the new project")),console.log(s.gray(" npx rapidkit init Install project dependencies")),console.log(s.gray(" npx rapidkit dev Start dev server")),console.log(s.gray(" npx rapidkit build Build for production")),console.log(s.gray(` npx rapidkit test Run tests
280
+ `)),console.log(s.bold("Flags clarification:")),console.log(s.gray(" --skip-install npm fast-path for lock/dependency steps")),console.log(s.gray(` --skip-essentials core flag for skipping essential module installation
281
+ `)),Vi?(console.log(s.bold("Legacy (shown because RAPIDKIT_SHOW_LEGACY=1):")),console.log(s.gray(" npx rapidkit my-project --template fastapi")),console.log(s.gray(" npx rapidkit my-project --template nestjs")),console.log(s.gray(" npx rapidkit my-project --template springboot")),console.log(s.gray(" npx rapidkit my-project --template gofiber")),console.log(s.gray(" npx rapidkit my-project --template gogin")),console.log(s.gray(` --skip-install Fast-path lock/deps (legacy template mode) \u2014 not same as --skip-essentials
282
+ `))):console.log(s.gray(`Tip: set RAPIDKIT_SHOW_LEGACY=1 to show legacy template flags in help.
283
+ `));}var Cn="__rapidkit_signal_handlers_registered__",Rn=globalThis;Rn[Cn]||(Rn[Cn]=true,process.on("SIGINT",async()=>{if(!zt){if(zt=true,console.log(s.yellow(`
273
284
 
274
- \u26A0\uFE0F Interrupted by user`)),Fe&&await ___default.pathExists(Fe)){console.log(a$4.gray("Cleaning up partial installation..."));try{await ___default.remove(Fe),console.log(a$4.green("\u2713 Cleanup complete"));}catch(r){a$1.debug("Cleanup failed:",r);}}process.exit(130);}}),process.on("SIGTERM",async()=>{if(!Gt){if(Gt=true,a$1.debug("Received SIGTERM"),Fe&&await ___default.pathExists(Fe))try{await ___default.remove(Fe);}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",Ci=(()=>{let r=process.argv[1];if(!r)return false;let e=r.replace(/\\/g,"/"),t=e.endsWith("/dist/index.js")||e.endsWith("/src/index.ts");try{return k.realpathSync(r)===k.realpathSync(fileURLToPath(import.meta.url))||t}catch{return f__default.resolve(r)===f__default.resolve(fileURLToPath(import.meta.url))||t}})(),Ri=!Si||Ci;function _i(){for(let r of [process.stdout,process.stderr])r._handle?.setBlocking?.(true);}if(Ri){_i();let r=process.argv.slice(2),e=r[0],t=process.cwd(),o=ot(t),n=k.existsSync(f__default.join(t,".rapidkit","project.json")),s=tn(e),i=e==="init"&&o&&!n;(r.length===0||r.length===1&&(e==="--help"||e==="-h"||e==="help"))&&(console.log(a$4.blue.bold(`
285
+ \u26A0\uFE0F Interrupted by user`)),Ke&&await ___default.pathExists(Ke)){console.log(s.gray("Cleaning up partial installation..."));try{await ___default.remove(Ke),console.log(s.green("\u2713 Cleanup complete"));}catch(t){a$1.debug("Cleanup failed:",t);}}process.exit(130);}}),process.on("SIGTERM",async()=>{if(!zt){if(zt=true,a$1.debug("Received SIGTERM"),Ke&&await ___default.pathExists(Ke))try{await ___default.remove(Ke);}catch(t){a$1.debug("Cleanup failed:",t);}process.exit(143);}}));var Yi=process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test",Qi=(()=>{let t=process.argv[1];if(!t)return false;let e=t.replace(/\\/g,"/"),r=e.endsWith("/dist/index.js")||e.endsWith("/src/index.ts");try{return v.realpathSync(t)===v.realpathSync(fileURLToPath(import.meta.url))||r}catch{return y__default.resolve(t)===y__default.resolve(fileURLToPath(import.meta.url))||r}})(),Zi=!Yi||Qi;function Xi(){for(let t of [process.stdout,process.stderr])t._handle?.setBlocking?.(true);}if(Zi){Xi();let t=process.argv.slice(2),e=t[0],r=process.cwd(),o=at(r),n=v.existsSync(y__default.join(r,".rapidkit","project.json")),i=$i(),c=hn(e),a=i&&jt(e),l=e==="init"&&o&&!n;(t.length===0||t.length===1&&(e==="--help"||e==="-h"||e==="help"))&&(console.log(s.blue.bold(`
275
286
  \u{1F680} Welcome to RapidKit NPM CLI!
276
- `)),vn(),process.exit(0)),s?ue.parse():i?_r(r).then(l=>process.exit(l)).catch(l=>{process.stderr.write(`RapidKit (npm) failed to run workspace init: ${l?.message??l}
277
- `),process.exit(1);}):Pi().then(async l=>{if(!l){let d=process.argv.slice(2);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] argv=${JSON.stringify(d)}
278
- `),tn(d[0])){ue.parse();return}if(d[0]==="create"){let p=await un(d);process.exit(p);}if(d[0]==="init"){let p=await _r(d);process.exit(p);}if(ri(d[0])){if(d[0]==="bootstrap"){let u=await gi(d);process.exit(u);}if(d[0]==="setup"){let u=await hi(d);process.exit(u);}if(d[0]==="cache"){let u=await wi(d);process.exit(u);}let p=await vi(d);process.exit(p);}if(fn.includes(d[0])){let p=d[0],u=ge(process.cwd()),h=Y(process.cwd()),g=false;if(h){let j=f__default.join(h,".rapidkit","policies.yml");if(await ___default.pathExists(j))try{let b=await k.promises.readFile(j,"utf-8");if(g=((b.match(/^\s*enforcement_mode:\s*(warn|strict)\s*(?:#.*)?$/m)??b.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m))?.[1]??"warn")==="strict",g){let D=f__default.join(h,".rapidkit","toolchain.lock"),F=[];if(!await ___default.pathExists(D))F.push("toolchain.lock is missing \u2014 run `rapidkit bootstrap` first (strict mode requires a reproducible toolchain).");else try{let X=JSON.parse(await k.promises.readFile(D,"utf-8")).runtime??{};ie(u,process.cwd())&&!X.go?.version&&F.push("Go runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."),ae(u,process.cwd())&&!X.node?.version&&F.push("Node runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."),ce(u,process.cwd())&&!X.java?.version&&F.push("Java runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup java` first."),pe(u,process.cwd())&&!X.python?.version&&F.push("Python runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");}catch{F.push("toolchain.lock is invalid JSON \u2014 regenerate it with `rapidkit bootstrap` before running commands in strict mode.");}let G=f__default.join(h,".rapidkit","workspace.json");if(await ___default.pathExists(G))try{let X=JSON.parse(await k.promises.readFile(G,"utf-8")).profile??"";X==="python-only"&&(ie(u,process.cwd())||ae(u,process.cwd())||ce(u,process.cwd()))&&F.push('Workspace profile is "python-only" but this project is not Python. Update the workspace profile or use a polyglot workspace.'),X==="node-only"&&(ie(u,process.cwd())||pe(u,process.cwd())||ce(u,process.cwd()))&&F.push('Workspace profile is "node-only" but this project is not Node. Update the workspace profile or use a polyglot workspace.'),X==="go-only"&&(pe(u,process.cwd())||ae(u,process.cwd())||ce(u,process.cwd()))&&F.push('Workspace profile is "go-only" but this project is not Go. Update the workspace profile or use a polyglot workspace.'),X==="java-only"&&(pe(u,process.cwd())||ae(u,process.cwd())||ie(u,process.cwd()))&&F.push('Workspace profile is "java-only" but this project is not Java. Update the workspace profile or use a polyglot workspace.');}catch{}if(F.length>0){console.log(a$4.red(`\u274C Strict policy violations block \`${p}\`:`));for(let L of F)console.log(a$4.red(` \u2022 ${L}`));console.log(a$4.gray("\u{1F4A1} Fix violations or switch to warn mode: set mode: warn in .rapidkit/policies.yml")),process.exit(1);}}}catch{}}let y=await ar({startPath:process.cwd(),action:p,writeReport:true}),P=g||process.env.RAPIDKIT_LIFECYCLE_ENFORCE_READINESS==="1"||process.env.RAPIDKIT_ENFORCE_READINESS==="1";if(y.blocking&&P){console.log(a$4.red(`\u274C Release readiness blocks \`${p}\`:`));for(let j of y.blockingReasons)console.log(a$4.red(` \u2022 ${j}`));y.evidencePath&&console.log(a$4.gray(`\u2139\uFE0F Readiness evidence: ${y.evidencePath}`)),process.exit(1);}y.overallStatus!=="pass"&&!P&&(console.log(a$4.yellow(`\u26A0\uFE0F Release readiness is ${y.overallStatus}. Command continues in warn mode.`)),y.evidencePath&&console.log(a$4.gray(` Evidence: ${y.evidencePath} (set RAPIDKIT_LIFECYCLE_ENFORCE_READINESS=1 to block)`)));let w=await kn(process.cwd(),async()=>{if(ie(u,process.cwd())){let j=Oe("go",{runCommandInCwd:K,runCoreRapidkit:e$1}),b=p==="dev"?await j.runDev(process.cwd()):p==="test"?await j.runTest(process.cwd()):p==="build"?await j.runBuild(process.cwd()):await j.runStart(process.cwd());return b.message&&console.log(a$4.red(`\u274C ${b.message}`)),b.exitCode}if(ce(u,process.cwd()))return p==="dev"?await Be("dev",process.cwd()):p==="test"?await Be("test",process.cwd()):p==="build"?await Be("build",process.cwd()):await Be("start",process.cwd());if(ae(u,process.cwd()))return p==="dev"?await yt("dev",process.cwd()):p==="test"?await yt("test",process.cwd()):p==="build"?await yt("build",process.cwd()):await yt("start",process.cwd());if(pe(u,process.cwd())){let j=Oe("python",{runCommandInCwd:K,runCoreRapidkit:e$1});return p==="dev"?(await j.runDev(process.cwd())).exitCode:p==="test"?(await j.runTest(process.cwd())).exitCode:p==="build"?(await j.runBuild(process.cwd())).exitCode:(await j.runStart(process.cwd())).exitCode}return -1});w.ok||process.exit(w.code),w.value>=0&&process.exit(w.value);}if(d[0]==="add"||d[0]==="module"&&d[1]==="add"){let p=ge(process.cwd());if(p?.module_support===false){let u=p?.runtime==="java"?"Spring Boot":"Go";console.error(a$4.red(`\u274C RapidKit modules are not available for ${u} npm-level kits.`)),console.error(a$4.gray(" The module system requires Python and is currently only supported for FastAPI and NestJS projects.")),process.exit(1);}}let m=await ji(d);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] shouldForwardToCore=${m}
279
- `),m){let p=await e$1(d,{cwd:process.cwd()});process.exit(p);}ue.parse();}});}export{Zs as NPM_ONLY_TOP_LEVEL_COMMANDS,ti as WRAPPER_ORCHESTRATED_PROJECT_COMMANDS,oi as detectWindowsDoctorWorkspaceShadow,gi as handleBootstrapCommand,wi as handleCacheCommand,un as handleCreateOrFallback,di as handleImportCommand,_r as handleInitCommand,vi as handleMirrorCommand,hi as handleSetupCommand,Rr as installWorkspaceDependencies,ji as shouldForwardToCore};
287
+ `)),Fn(),process.exit(0)),a&&yn(e)?(async()=>{e==="bootstrap"&&process.exit(await Pn(t)),e==="setup"&&process.exit(await bn(t)),e==="cache"&&process.exit(await jn(t)),process.exit(await xn(t));})().catch(p=>{process.stderr.write(`RapidKit (npm) failed to run ${e}: ${p?.message??p}
288
+ `),process.exit(1);}):c||a?ie.parse():l?Nr(t).then(p=>process.exit(p)).catch(p=>{process.stderr.write(`RapidKit (npm) failed to run workspace init: ${p?.message??p}
289
+ `),process.exit(1);}):Ui().then(async p=>{if(!p){let d=process.argv.slice(2);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] argv=${JSON.stringify(d)}
290
+ `),hn(d[0])){ie.parse();return}if(d[0]==="create"){let g=await $n(d);process.exit(g);}if(d[0]==="init"){let g=await Nr(d);process.exit(g);}if(yn(d[0])){if(d[0]==="bootstrap"){let u=await Pn(d);process.exit(u);}if(d[0]==="setup"){let u=await bn(d);process.exit(u);}if(d[0]==="cache"){let u=await jn(d);process.exit(u);}let g=await xn(d);process.exit(g);}if(Mn.includes(d[0])){let g=d[0],u=ge(process.cwd()),h=K(process.cwd()),k=false;if(h){let j=y__default.join(h,".rapidkit","policies.yml");if(await ___default.pathExists(j))try{let A=await v.promises.readFile(j,"utf-8");if(k=((A.match(/^\s*enforcement_mode:\s*(warn|strict)\s*(?:#.*)?$/m)??A.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m))?.[1]??"warn")==="strict",k){let G=y__default.join(h,".rapidkit","toolchain.lock"),M=[];if(!await ___default.pathExists(G))M.push("toolchain.lock is missing \u2014 run `rapidkit bootstrap` first (strict mode requires a reproducible toolchain).");else try{let q=JSON.parse(await v.promises.readFile(G,"utf-8")).runtime??{};ce(u,process.cwd())&&!q.go?.version&&M.push("Go runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."),le(u,process.cwd())&&!q.node?.version&&M.push("Node runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."),de(u,process.cwd())&&!q.java?.version&&M.push("Java runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup java` first."),ue(u,process.cwd())&&!q.python?.version&&M.push("Python runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");}catch{M.push("toolchain.lock is invalid JSON \u2014 regenerate it with `rapidkit bootstrap` before running commands in strict mode.");}let Pe=y__default.join(h,".rapidkit","workspace.json");if(await ___default.pathExists(Pe))try{let q=JSON.parse(await v.promises.readFile(Pe,"utf-8")).profile??"";q==="python-only"&&(ce(u,process.cwd())||le(u,process.cwd())||de(u,process.cwd()))&&M.push('Workspace profile is "python-only" but this project is not Python. Update the workspace profile or use a polyglot workspace.'),q==="node-only"&&(ce(u,process.cwd())||ue(u,process.cwd())||de(u,process.cwd()))&&M.push('Workspace profile is "node-only" but this project is not Node. Update the workspace profile or use a polyglot workspace.'),q==="go-only"&&(ue(u,process.cwd())||le(u,process.cwd())||de(u,process.cwd()))&&M.push('Workspace profile is "go-only" but this project is not Go. Update the workspace profile or use a polyglot workspace.'),q==="java-only"&&(ue(u,process.cwd())||le(u,process.cwd())||ce(u,process.cwd()))&&M.push('Workspace profile is "java-only" but this project is not Java. Update the workspace profile or use a polyglot workspace.');}catch{}if(M.length>0){console.log(s.red(`\u274C Strict policy violations block \`${g}\`:`));for(let Q of M)console.log(s.red(` \u2022 ${Q}`));console.log(s.gray("\u{1F4A1} Fix violations or switch to warn mode: set mode: warn in .rapidkit/policies.yml")),process.exit(1);}}}catch{}}let w=await fr({startPath:process.cwd(),action:g,writeReport:true}),S=k||process.env.RAPIDKIT_LIFECYCLE_ENFORCE_READINESS==="1"||process.env.RAPIDKIT_ENFORCE_READINESS==="1";if(w.blocking&&S){console.log(s.red(`\u274C Release readiness blocks \`${g}\`:`));for(let j of w.blockingReasons)console.log(s.red(` \u2022 ${j}`));w.evidencePath&&console.log(s.gray(`\u2139\uFE0F Readiness evidence: ${w.evidencePath}`)),process.exit(1);}w.overallStatus!=="pass"&&!S&&(console.log(s.yellow(`\u26A0\uFE0F Release readiness is ${w.overallStatus}. Command continues in warn mode.`)),w.evidencePath&&console.log(s.gray(` Evidence: ${w.evidencePath} (set RAPIDKIT_LIFECYCLE_ENFORCE_READINESS=1 to block)`)));let b=await Wn(process.cwd(),async()=>{if(ce(u,process.cwd())){let j=De("go",{runCommandInCwd:J,runCoreRapidkit:e$1}),A=g==="dev"?await j.runDev(process.cwd()):g==="test"?await j.runTest(process.cwd()):g==="build"?await j.runBuild(process.cwd()):await j.runStart(process.cwd());return A.message&&console.log(s.red(`\u274C ${A.message}`)),A.exitCode}if(de(u,process.cwd()))return g==="dev"?await ze("dev",process.cwd()):g==="test"?await ze("test",process.cwd()):g==="build"?await ze("build",process.cwd()):await ze("start",process.cwd());if(le(u,process.cwd()))return g==="dev"?await bt("dev",process.cwd()):g==="test"?await bt("test",process.cwd()):g==="build"?await bt("build",process.cwd()):await bt("start",process.cwd());if(ue(u,process.cwd())){let j=De("python",{runCommandInCwd:J,runCoreRapidkit:e$1});return g==="dev"?(await j.runDev(process.cwd())).exitCode:g==="test"?(await j.runTest(process.cwd())).exitCode:g==="build"?(await j.runBuild(process.cwd())).exitCode:(await j.runStart(process.cwd())).exitCode}return -1});b.ok||process.exit(b.code),b.value>=0&&process.exit(b.value);}if(d[0]==="add"||d[0]==="module"&&d[1]==="add"){let g=ge(process.cwd());if(g?.module_support===false){let u=g?.runtime==="java"?"Spring Boot":"Go";console.error(s.red(`\u274C RapidKit modules are not available for ${u} npm-level kits.`)),console.error(s.gray(" The module system requires Python and is currently only supported for FastAPI and NestJS projects.")),process.exit(1);}}let m=await Hi(d);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] shouldForwardToCore=${m}
291
+ `),m){let g=await e$1(d,{cwd:process.cwd()});process.exit(g);}ie.parse();}});}export{Ri as NPM_ONLY_TOP_LEVEL_COMMANDS,Ai as WRAPPER_ORCHESTRATED_PROJECT_COMMANDS,Ii as detectWindowsDoctorWorkspaceShadow,Pn as handleBootstrapCommand,jn as handleCacheCommand,$n as handleCreateOrFallback,Fi as handleImportCommand,Nr as handleInitCommand,xn as handleMirrorCommand,bn as handleSetupCommand,Or as installWorkspaceDependencies,$i as isNpmExecInvocation,Hi as shouldForwardToCore};