rapidkit 0.33.1 → 0.34.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,66 +1,66 @@
1
1
  #!/usr/bin/env node
2
- import {a as a$4,b as b$2,c as c$1,d,e as e$2,f as f$1,i as i$1,k,j as j$1,l,g as g$1,h as h$1}from'./chunk-QCZGNOTH.js';import {e as e$3}from'./chunk-KXTXQODI.js';import {f,e as e$1,d as d$1,i as i$3,a as a$5,g}from'./chunk-W62Q2D3K.js';import {a as a$2,b as b$1,c,e,j}from'./chunk-7OGOVP5U.js';import {b as b$3,d as d$2}from'./chunk-RV6HBTFC.js';import {a as a$6}from'./chunk-VKLL63TL.js';import {c as c$4}from'./chunk-NFUXULIF.js';import {a,h,i as i$2,f as f$2,b as b$4,d as d$3,c as c$2}from'./chunk-Z5LKRG57.js';import {c as c$3}from'./chunk-Y3UKTEZO.js';import {b,a as a$3}from'./chunk-AC6KIKII.js';import {a as a$1}from'./chunk-VM2TOHNX.js';import {c as c$5}from'./chunk-2FIX2MDC.js';import {Command,Option}from'commander';import i from'chalk';import Ge from'inquirer';import*as y from'path';import y__default from'path';import {fileURLToPath}from'url';import {spawn,spawnSync}from'child_process';import zs from'validate-npm-package-name';import*as _ from'fs-extra';import ___default from'fs-extra';import P,{promises,createWriteStream}from'fs';import Go,{tmpdir,homedir}from'os';import {execa}from'execa';import yi from'ora';import Tr,{createVerify,createHash,createHmac}from'crypto';import ls from'http';import ds from'https';function Ut(t){let e=zs(t);if(!e.validForNewPackages){let o=e.errors||[],n=e.warnings||[],s=[...o,...n];throw new j(t,`NPM validation failed: ${s.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 Qs(){return d$3()}function Zs(t,e){return t==="py"?["-3",...e]:e}function Xs(t){return typeof t=="object"&&t!==null}async function ei(t,e,r,o=c$5()){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 ti(t,e){let r=["-m","rapidkit",...t],o=Qs();for(let n of o){let s=await ei(n,Zs(n,r),e?.cwd,e?.timeoutMs);if(!s.ok)continue;let a=(s.stdout??"").trim();try{let c=JSON.parse(a);return Xs(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 Wo(t,e){let r=await ti(["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 Fo=new Set(["create"]),Sr=new Set(["--yes","-y","--skip-git","--skip-install","--debug","--dry-run","--no-update-check","--create-workspace","--no-workspace"]),ri=new Set(["pip","poetry","venv","pipx","python"]);function Ko(t){return typeof t=="string"&&ri.has(t)}function xr(t,e){return !t||Fo.has(t)?false:a$5.has(t)?true:e?.has(t)??false}function Cr(t,e=null){let r=t[0];return !r||r.startsWith("-")||Fo.has(r)||r==="init"?false:xr(r,e)?true:t.filter(n=>!n.startsWith("-")&&!Sr.has(n)).length<=1?false:t.length>1}var ct=y__default.join(Go.homedir(),".rapidkitrc.json"),oi=y__default.join(Go.homedir(),".rapidkit","config.json");function Lo(t){try{if(!P.existsSync(t))return {};let e=P.readFileSync(t,"utf-8"),r=JSON.parse(e);return !r||typeof r!="object"||Array.isArray(r)?{}:r}catch{return {}}}function Bo(t){if(process.platform!=="win32")try{P.chmodSync(t,384);}catch{}}function lt(){let t=Lo(ct),e=Lo(oi);return P.existsSync(ct)&&Bo(ct),{...t,openaiApiKey:t.openaiApiKey??e.openaiApiKey,aiEnabled:t.aiEnabled??e.aiEnabled,telemetry:t.telemetry??e.telemetry}}function Ht(t){let r={...lt(),...t};P.writeFileSync(ct,JSON.stringify(r,null,2),{encoding:"utf-8",mode:384}),Bo(ct);}function St(){return process.env.OPENAI_API_KEY||lt().openaiApiKey||null}function Rr(){return lt().aiEnabled!==false}function Er(){return ct}async function Vo(){return (await import('inquirer')).default}function qo(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(i.red(`
2
+ import {b as b$2,a as a$5}from'./chunk-JIECGCLV.js';import {a as a$4,b as b$3,c as c$1,d,e as e$2,f as f$1,i as i$1,k,j as j$1,l,g as g$1,h as h$1}from'./chunk-QCZGNOTH.js';import {e as e$3}from'./chunk-KXTXQODI.js';import {f,e as e$1,d as d$1,i as i$3,a as a$6,g}from'./chunk-GX7UU7LL.js';import {a as a$2,b as b$1,c,e,j}from'./chunk-IATULVMR.js';import {b as b$4,d as d$2}from'./chunk-RV6HBTFC.js';import {a as a$7}from'./chunk-VKLL63TL.js';import {a,h,i as i$2,f as f$2,b as b$5,d as d$3,c as c$2}from'./chunk-Z5LKRG57.js';import {c as c$3}from'./chunk-Y3UKTEZO.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 i from'chalk';import Ke from'inquirer';import*as y from'path';import y__default from'path';import {fileURLToPath}from'url';import {spawn,spawnSync}from'child_process';import Vs from'validate-npm-package-name';import*as E from'fs-extra';import E__default from'fs-extra';import v,{promises,createWriteStream}from'fs';import Ko,{tmpdir,homedir}from'os';import {execa}from'execa';import mi from'ora';import Nr,{createVerify,createHash,createHmac}from'crypto';import ns from'http';import ss from'https';function Vt(t){let e=Vs(t);if(!e.validForNewPackages){let o=e.errors||[],n=e.warnings||[],s=[...o,...n];throw new j(t,`NPM validation failed: ${s.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 Us(){return d$3()}function Hs(t,e){return t==="py"?["-3",...e]:e}function zs(t){return typeof t=="object"&&t!==null}async function Ys(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 Qs(t,e){let r=["-m","rapidkit",...t],o=Us();for(let n of o){let s=await Ys(n,Hs(n,r),e?.cwd,e?.timeoutMs);if(!s.ok)continue;let a=(s.stdout??"").trim();try{let c=JSON.parse(a);return zs(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 Mo(t,e){let r=await Qs(["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 Do=new Set(["create"]),Pr=new Set(["--yes","-y","--skip-git","--skip-install","--debug","--dry-run","--no-update-check","--create-workspace","--no-workspace"]),Zs=new Set(["pip","poetry","venv","pipx","python"]);function To(t){return typeof t=="string"&&Zs.has(t)}function br(t,e){return !t||Do.has(t)?false:a$6.has(t)?true:e?.has(t)??false}function jr(t,e=null){let r=t[0];return !r||r.startsWith("-")||Do.has(r)||r==="init"?false:br(r,e)?true:t.filter(n=>!n.startsWith("-")&&!Pr.has(n)).length<=1?false:t.length>1}var at=y__default.join(Ko.homedir(),".rapidkitrc.json"),Xs=y__default.join(Ko.homedir(),".rapidkit","config.json");function Wo(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 Lo(t){if(process.platform!=="win32")try{v.chmodSync(t,384);}catch{}}function ct(){let t=Wo(at),e=Wo(Xs);return v.existsSync(at)&&Lo(at),{...t,openaiApiKey:t.openaiApiKey??e.openaiApiKey,aiEnabled:t.aiEnabled??e.aiEnabled,telemetry:t.telemetry??e.telemetry}}function qt(t){let r={...ct(),...t};v.writeFileSync(at,JSON.stringify(r,null,2),{encoding:"utf-8",mode:384}),Lo(at);}function jt(){return process.env.OPENAI_API_KEY||ct().openaiApiKey||null}function Sr(){return ct().aiEnabled!==false}function xr(){return at}async function Jo(){return (await import('inquirer')).default}function Go(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(i.red(`
3
3
  \u274C Invalid API key format (should start with sk-)
4
- `)),process.exit(1)):o=(await(await Vo()).prompt([{type:"password",name:"apiKey",message:"Enter your OpenAI API key:",validate:a=>a?a.startsWith("sk-")?a.length<20?"API key seems too short":true:"Invalid API key format (should start with sk-)":"API key is required"}])).apiKey,Ht({openaiApiKey:o}),console.log(i.green(`
4
+ `)),process.exit(1)):o=(await(await Jo()).prompt([{type:"password",name:"apiKey",message:"Enter your OpenAI API key:",validate:a=>a?a.startsWith("sk-")?a.length<20?"API key seems too short":true:"Invalid API key format (should start with sk-)":"API key is required"}])).apiKey,qt({openaiApiKey:o}),console.log(i.green(`
5
5
  \u2705 OpenAI API key saved successfully!
6
- `)),console.log(i.gray(`Stored in: ${Er()}`)),console.log(i.cyan(`
6
+ `)),console.log(i.gray(`Stored in: ${xr()}`)),console.log(i.cyan(`
7
7
  \u{1F389} You can now use AI features:`)),console.log(i.white(' rapidkit ai recommend "I need user authentication"')),console.log(i.gray(`
8
8
  \u{1F4A1} To generate module embeddings (one-time):`)),console.log(i.white(" cd rapidkit-npm")),console.log(i.white(` npx tsx src/ai/generate-embeddings.ts
9
- `));}),e.command("show").description("Show current configuration").action(()=>{let r=lt();if(console.log(i.bold(`
9
+ `));}),e.command("show").description("Show current configuration").action(()=>{let r=ct();if(console.log(i.bold(`
10
10
  \u2699\uFE0F RapidKit Configuration
11
11
  `)),r.openaiApiKey){let o=r.openaiApiKey.substring(0,8)+"..."+r.openaiApiKey.slice(-4);console.log(i.cyan("OpenAI API Key:"),i.white(o));}else console.log(i.cyan("OpenAI API Key:"),i.red("Not set")),console.log(i.gray(" Set with: rapidkit config set-api-key"));console.log(i.cyan("AI Features:"),r.aiEnabled!==false?i.green("Enabled"):i.red("Disabled")),console.log(i.gray(`
12
- \u{1F4C1} Config file: ${Er()}
13
- `));}),e.command("remove-api-key").description("Remove stored OpenAI API key").action(async()=>{if(!lt().openaiApiKey){console.log(i.yellow(`
12
+ \u{1F4C1} Config file: ${xr()}
13
+ `));}),e.command("remove-api-key").description("Remove stored OpenAI API key").action(async()=>{if(!ct().openaiApiKey){console.log(i.yellow(`
14
14
  \u26A0\uFE0F No API key is currently stored
15
- `));return}(await(await Vo()).prompt([{type:"confirm",name:"confirm",message:"Are you sure you want to remove your OpenAI API key?",default:false}])).confirm?(Ht({openaiApiKey:void 0}),console.log(i.green(`
15
+ `));return}(await(await Jo()).prompt([{type:"confirm",name:"confirm",message:"Are you sure you want to remove your OpenAI API key?",default:false}])).confirm?(qt({openaiApiKey:void 0}),console.log(i.green(`
16
16
  \u2705 API key removed successfully
17
17
  `))):console.log(i.gray(`
18
18
  Cancelled
19
19
  `));}),e.command("ai <action>").description("Enable or disable AI features (enable|disable)").action(r=>{r!=="enable"&&r!=="disable"&&(console.log(i.red(`
20
20
  \u274C Invalid action: ${r}`)),console.log(i.gray(`Use: rapidkit config ai enable|disable
21
- `)),process.exit(1));let o=r==="enable";Ht({aiEnabled:o}),console.log(i.green(`
21
+ `)),process.exit(1));let o=r==="enable";qt({aiEnabled:o}),console.log(i.green(`
22
22
  \u2705 AI features ${o?"enabled":"disabled"}
23
- `));});}var zt=null,Yt=false,_r=null;async function ni(){return _r||(_r=(await import('openai')).default),_r}function Uo(){Yt=true;}function Ho(t){let r=new Array(1536),o=0;for(let s=0;s<t.length;s++)o=(o<<5)-o+t.charCodeAt(s),o=o&o;for(let s=0;s<1536;s++)o=o*1664525+1013904223&4294967295,r[s]=o/4294967295*2-1;let n=Math.sqrt(r.reduce((s,a)=>s+a*a,0));return r.map(s=>s/n)}async function Qt(t){let e=await ni();zt=new e({apiKey:t});}function zo(){if(!zt)throw new Error("OpenAI client not initialized. Call initOpenAI() first with your API key.");return zt}async function Ir(t){return Yt?Ho(t):(await zo().embeddings.create({model:"text-embedding-3-small",input:t,encoding_format:"float"})).data[0].embedding}async function Yo(t){return Yt?t.map(Ho):(await zo().embeddings.create({model:"text-embedding-3-small",input:t,encoding_format:"float"})).data.map(o=>o.embedding)}function Qo(){return zt!==null}function dt(){return Yt}function Ar(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"):[]}function si(t){return !t||typeof t!="object"?{}:t}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"]}],Ve=null,$r=0,ii=300*1e3;function ai(t){let e=si(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:ci(e.category||"infrastructure"),description:e.description||e.summary||"",longDescription:e.long_description||e.description||"",keywords:o.map(n=>n.toLowerCase()),framework:li(e.framework),dependencies:Ar(e.dependencies),useCases:Ar(e.use_cases??e.useCases)}}function ci(t){return {auth:"auth",authentication:"auth",database:"database",payment:"payment",billing:"payment",communication:"communication",infrastructure:"infrastructure",security:"security",analytics:"analytics"}[t.toLowerCase()]||"infrastructure"}function li(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 di(){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(ai).filter(s=>s.id&&s.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)"),Or}}async function Zt(){let t=Date.now();return dt()?(Ve=Or,$r=t,Ve):(Ve&&t-$r<ii||(Ve=await di(),$r=t,Ve.length===0&&(console.warn("\u26A0\uFE0F No modules found, using fallback catalog"),Ve=Or)),Ve)}var ui=fileURLToPath(import.meta.url),Xo=y__default.dirname(ui),pt=null,en=new Map;function mi(t){return [t.name,t.description,t.longDescription,...t.keywords,...t.useCases].filter(Boolean).join(" ")}async function fi(t){let e=en.get(t.id);if(e)return e;let r=await Ir(mi(t));return en.set(t.id,r),r}function gi(){if(pt)return pt;let t=[y__default.join(Xo,"../../data/modules-embeddings.json"),y__default.join(Xo,"../data/modules-embeddings.json"),y__default.join(process.cwd(),"data/modules-embeddings.json")],e=null;for(let n of t)if(P.existsSync(n)){e=n;break}if(!e)throw new Error("embeddings file not found");let r=P.readFileSync(e,"utf-8"),o=JSON.parse(r);if(Array.isArray(o)?pt={model:"mock-or-text-embedding-3-small",dimension:o[0]?.embedding?.length||1536,generated_at:new Date().toISOString(),modules:o}:pt=o,!pt)throw new Error("failed to load embeddings data");return pt}function tn(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 a=0;a<t.length;a++)r+=t[a]*e[a],o+=t[a]*t[a],n+=e[a]*e[a];let s=Math.sqrt(o)*Math.sqrt(n);return s===0?0:r/s}function rn(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 on(t,e=5){let r=await Zt(),o=await Ir(t);if(dt()){let a=await Promise.all(r.map(async c=>{let l=await fi(c);return {module:c,score:tn(o,l),reason:rn(c,t)}}));return a.sort((c,l)=>l.score-c.score),a.slice(0,e)}let s=gi().modules.map(a=>{let c=r.find(u=>u.id===a.id);if(!c)return null;let l=tn(o,a.embedding);return {module:c,score:l,reason:rn(c,t)}}).filter(a=>a!==null);return s.sort((a,c)=>c.score-a.score),s.slice(0,e)}var wi=fileURLToPath(import.meta.url),nn=y__default.dirname(wi);async function an(){return (await import('inquirer')).default}function sn(t){return t instanceof Error?t.message:String(t)}function ki(){return [y__default.join(nn,"../../data/modules-embeddings.json"),y__default.join(nn,"../data/modules-embeddings.json"),y__default.join(process.cwd(),"data/modules-embeddings.json")]}function cn(){let t=ki();for(let e of t)if(P.existsSync(e))try{let r=JSON.parse(P.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 er(t=true,e){try{if(!Qo()&&!dt())return console.log(i.red(`
23
+ `));});}var Ut=null,Ht=false,Cr=null;async function ei(){return Cr||(Cr=(await import('openai')).default),Cr}function Bo(){Ht=true;}function Vo(t){let r=new Array(1536),o=0;for(let s=0;s<t.length;s++)o=(o<<5)-o+t.charCodeAt(s),o=o&o;for(let s=0;s<1536;s++)o=o*1664525+1013904223&4294967295,r[s]=o/4294967295*2-1;let n=Math.sqrt(r.reduce((s,a)=>s+a*a,0));return r.map(s=>s/n)}async function zt(t){let e=await ei();Ut=new e({apiKey:t});}function qo(){if(!Ut)throw new Error("OpenAI client not initialized. Call initOpenAI() first with your API key.");return Ut}async function Rr(t){return Ht?Vo(t):(await qo().embeddings.create({model:"text-embedding-3-small",input:t,encoding_format:"float"})).data[0].embedding}async function Uo(t){return Ht?t.map(Vo):(await qo().embeddings.create({model:"text-embedding-3-small",input:t,encoding_format:"float"})).data.map(o=>o.embedding)}function Ho(){return Ut!==null}function lt(){return Ht}function Er(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"):[]}function ti(t){return !t||typeof t!="object"?{}:t}var Ir=[{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"]}],Je=null,_r=0,ri=300*1e3;function oi(t){let e=ti(t),r=e.slug||e.name||e.id||e.module_id||"",o=Er(e.keywords??e.tags);return {id:r,name:e.display_name||e.name||"",category:ni(e.category||"infrastructure"),description:e.description||e.summary||"",longDescription:e.long_description||e.description||"",keywords:o.map(n=>n.toLowerCase()),framework:si(e.framework),dependencies:Er(e.dependencies),useCases:Er(e.use_cases??e.useCases)}}function ni(t){return {auth:"auth",authentication:"auth",database:"database",payment:"payment",billing:"payment",communication:"communication",infrastructure:"infrastructure",security:"security",analytics:"analytics"}[t.toLowerCase()]||"infrastructure"}function si(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 ii(){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(oi).filter(s=>s.id&&s.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)"),Ir}}async function Yt(){let t=Date.now();return lt()?(Je=Ir,_r=t,Je):(Je&&t-_r<ri||(Je=await ii(),_r=t,Je.length===0&&(console.warn("\u26A0\uFE0F No modules found, using fallback catalog"),Je=Ir)),Je)}var ci=fileURLToPath(import.meta.url),Yo=y__default.dirname(ci),dt=null,Qo=new Map;function li(t){return [t.name,t.description,t.longDescription,...t.keywords,...t.useCases].filter(Boolean).join(" ")}async function di(t){let e=Qo.get(t.id);if(e)return e;let r=await Rr(li(t));return Qo.set(t.id,r),r}function pi(){if(dt)return dt;let t=[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")],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)?dt={model:"mock-or-text-embedding-3-small",dimension:o[0]?.embedding?.length||1536,generated_at:new Date().toISOString(),modules:o}:dt=o,!dt)throw new Error("failed to load embeddings data");return dt}function Zo(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 a=0;a<t.length;a++)r+=t[a]*e[a],o+=t[a]*t[a],n+=e[a]*e[a];let s=Math.sqrt(o)*Math.sqrt(n);return s===0?0:r/s}function Xo(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 en(t,e=5){let r=await Yt(),o=await Rr(t);if(lt()){let a=await Promise.all(r.map(async c=>{let l=await di(c);return {module:c,score:Zo(o,l),reason:Xo(c,t)}}));return a.sort((c,l)=>l.score-c.score),a.slice(0,e)}let s=pi().modules.map(a=>{let c=r.find(u=>u.id===a.id);if(!c)return null;let l=Zo(o,a.embedding);return {module:c,score:l,reason:Xo(c,t)}}).filter(a=>a!==null);return s.sort((a,c)=>c.score-a.score),s.slice(0,e)}var fi=fileURLToPath(import.meta.url),tn=y__default.dirname(fi);async function on(){return (await import('inquirer')).default}function rn(t){return t instanceof Error?t.message:String(t)}function gi(){return [y__default.join(tn,"../../data/modules-embeddings.json"),y__default.join(tn,"../data/modules-embeddings.json"),y__default.join(process.cwd(),"data/modules-embeddings.json")]}function nn(){let t=gi();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 Zt(t=true,e){try{if(!Ho()&&!lt())return console.log(i.red(`
24
24
  \u274C OpenAI not initialized`)),console.log(i.yellow("Please set your API key:")),console.log(i.white(" rapidkit config set-api-key")),console.log(i.gray(` OR set: export OPENAI_API_KEY="sk-..."
25
25
  `)),false;console.log(i.blue(`
26
26
  \u{1F916} Generating AI embeddings for RapidKit modules...
27
- `)),console.log(i.gray("\u{1F4E1} Fetching modules from RapidKit..."));let r=await Zt();console.log(i.green(`\u2713 Found ${r.length} modules
27
+ `)),console.log(i.gray("\u{1F4E1} Fetching modules from RapidKit..."));let r=await Yt();console.log(i.green(`\u2713 Found ${r.length} modules
28
28
  `));let o=r.length*50/1e6*.02;if(console.log(i.cyan(`\u{1F4B0} Estimated cost: ~$${o.toFixed(3)}`)),console.log(i.gray(` (Based on ${r.length} modules at $0.02/1M tokens)
29
- `)),t){let a=await an(),{confirm:c}=await a.prompt([{type:"confirm",name:"confirm",message:"Generate embeddings now?",default:true}]);if(!c)return console.log(i.yellow(`
29
+ `)),t){let a=await on(),{confirm:c}=await a.prompt([{type:"confirm",name:"confirm",message:"Generate embeddings now?",default:true}]);if(!c)return console.log(i.yellow(`
30
30
  \u26A0\uFE0F Embeddings generation cancelled
31
- `)),false}let n=r.map(a=>`${a.name}. ${a.description}. ${a.longDescription}. Keywords: ${a.keywords.join(", ")}. Use cases: ${a.useCases.join(", ")}.`),s=yi(`Generating embeddings for ${r.length} modules...`).start();try{let a=await Yo(n);s.succeed(`Generated embeddings for ${r.length} modules`);let c={model:"text-embedding-3-small",dimension:a[0].length,generated_at:new Date().toISOString(),modules:r.map((d,p)=>({id:d.id,name:d.name,embedding:a[p]}))},l=e||y__default.join(process.cwd(),"data","modules-embeddings.json"),u=y__default.dirname(l);return P.existsSync(u)||P.mkdirSync(u,{recursive:true}),P.writeFileSync(l,JSON.stringify(c,null,2)),console.log(i.green(`
31
+ `)),false}let n=r.map(a=>`${a.name}. ${a.description}. ${a.longDescription}. Keywords: ${a.keywords.join(", ")}. Use cases: ${a.useCases.join(", ")}.`),s=mi(`Generating embeddings for ${r.length} modules...`).start();try{let a=await Uo(n);s.succeed(`Generated embeddings for ${r.length} modules`);let c={model:"text-embedding-3-small",dimension:a[0].length,generated_at:new Date().toISOString(),modules:r.map((p,d)=>({id:p.id,name:p.name,embedding:a[d]}))},l=e||y__default.join(process.cwd(),"data","modules-embeddings.json"),u=y__default.dirname(l);return v.existsSync(u)||v.mkdirSync(u,{recursive:true}),v.writeFileSync(l,JSON.stringify(c,null,2)),console.log(i.green(`
32
32
  \u2705 Embeddings generated successfully!`)),console.log(i.gray(`\u{1F4C1} Saved to: ${l}`)),console.log(i.gray(`\u{1F4CA} Size: ${r.length} modules, ${a[0].length} dimensions
33
- `)),true}catch(a){s.fail("Failed to generate embeddings");let c=sn(a);return c.includes("429")?(console.log(i.red(`
33
+ `)),true}catch(a){s.fail("Failed to generate embeddings");let c=rn(a);return c.includes("429")?(console.log(i.red(`
34
34
  \u274C OpenAI API quota exceeded`)),console.log(i.yellow(`Please check your billing: https://platform.openai.com/account/billing
35
35
  `))):c.includes("401")?(console.log(i.red(`
36
36
  \u274C Invalid API key`)),console.log(i.yellow("Please set a valid API key:")),console.log(i.white(` rapidkit config set-api-key
37
37
  `))):console.log(i.red(`
38
38
  \u274C Error: ${c}
39
39
  `)),false}}catch(r){return console.log(i.red(`
40
- \u274C Failed to generate embeddings: ${sn(r)}
41
- `)),false}}async function ln(t=true){if(cn().exists)return true;if(console.log(i.yellow(`
40
+ \u274C Failed to generate embeddings: ${rn(r)}
41
+ `)),false}}async function sn(t=true){if(nn().exists)return true;if(console.log(i.yellow(`
42
42
  \u26A0\uFE0F Module embeddings not found`)),console.log(i.gray(`AI recommendations require embeddings to be generated.
43
43
  `)),!t)return console.log(i.red("\u274C Cannot generate embeddings in non-interactive mode")),console.log(i.white(`Run: rapidkit ai generate-embeddings
44
- `)),false;let r=await an(),{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 er(true):(o==="manual"&&(console.log(i.cyan(`
44
+ `)),false;let r=await on(),{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 Zt(true):(o==="manual"&&(console.log(i.cyan(`
45
45
  \u{1F4DD} To generate embeddings manually:
46
46
  `)),console.log(i.white("1. Get OpenAI API key from: https://platform.openai.com/api-keys")),console.log(i.white("2. Set the API key:")),console.log(i.gray(" rapidkit config set-api-key")),console.log(i.gray(` OR: export OPENAI_API_KEY="sk-..."
47
47
  `)),console.log(i.white("3. Generate embeddings:")),console.log(i.gray(` rapidkit ai generate-embeddings
48
48
  `)),console.log(i.cyan(`\u{1F4B0} Cost: ~$0.50 one-time
49
- `))),false)}async function dn(){let t=cn();return t.exists?(console.log(i.blue(`
49
+ `))),false)}async function an(){let t=nn();return t.exists?(console.log(i.blue(`
50
50
  \u{1F504} Updating embeddings...`)),console.log(i.gray(`Current: ${t.moduleCount} modules`)),console.log(i.gray(`Generated: ${t.generatedAt||"unknown"}
51
- `)),t.path?await er(true,t.path):false):(console.log(i.yellow(`
51
+ `)),t.path?await Zt(true,t.path):false):(console.log(i.yellow(`
52
52
  \u26A0\uFE0F No existing embeddings found`)),console.log(i.gray(`Use: rapidkit ai generate-embeddings
53
- `)),false)}async function pn(){return (await import('inquirer')).default}function Nr(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 un(t,e=0){console.log(JSON.stringify(t,null,2)),e!==0&&process.exit(e);}function mn(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{Rr()||(o.json&&un({ok:false,error:{code:"AI_DISABLED",message:"AI features are disabled",remediation:"rapidkit config ai enable"}},1),console.log(i.yellow(`
53
+ `)),false)}async function cn(){return (await import('inquirer')).default}function Ar(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 ln(t,e=0){console.log(JSON.stringify(t,null,2)),e!==0&&process.exit(e);}function dn(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{Sr()||(o.json&&ln({ok:false,error:{code:"AI_DISABLED",message:"AI features are disabled",remediation:"rapidkit config ai enable"}},1),console.log(i.yellow(`
54
54
  \u26A0\uFE0F AI features are disabled`)),console.log(i.gray(`Enable with: rapidkit config ai enable
55
- `)),process.exit(1));let n=St();n?await Qt(n):(o.json||(console.log(i.yellow(`
55
+ `)),process.exit(1));let n=jt();n?await zt(n):(o.json||(console.log(i.yellow(`
56
56
  \u26A0\uFE0F OpenAI API key not configured - using MOCK MODE for testing
57
57
  `)),console.log(i.gray("\u{1F4DD} Note: Mock embeddings provide approximate results for testing.")),console.log(i.gray(` For production, configure your OpenAI API key:
58
58
  `)),console.log(i.white(" 1. Get your key from: https://platform.openai.com/api-keys")),console.log(i.white(" 2. Configure it: rapidkit config set-api-key")),console.log(i.gray(` OR set: export OPENAI_API_KEY="sk-proj-..."
59
- `))),Uo());let s=r;s||(s=(await(await pn()).prompt([{type:"input",name:"query",message:"\u{1F916} What do you want to build?",validate:f=>f.length===0?"Please enter a description":f.length<3?"Please be more specific (at least 3 characters)":true}])).query),o.json||console.log(i.blue(`
59
+ `))),Bo());let s=r;s||(s=(await(await cn()).prompt([{type:"input",name:"query",message:"\u{1F916} What do you want to build?",validate:m=>m.length===0?"Please enter a description":m.length<3?"Please be more specific (at least 3 characters)":true}])).query),o.json||console.log(i.blue(`
60
60
  \u{1F916} Analyzing your request...
61
- `)),(n?await ln(!o.json):true)||(o.json&&un({ok:false,query:s,error:{code:"EMBEDDINGS_MISSING",message:"Module embeddings are not available",remediation:"rapidkit ai generate-embeddings"}},1),console.log(i.yellow(`
61
+ `)),!n||await sn(!o.json)||(o.json&&ln({ok:false,query:s,error:{code:"EMBEDDINGS_MISSING",message:"Module embeddings are not available",remediation:"rapidkit ai generate-embeddings"}},1),console.log(i.yellow(`
62
62
  \u26A0\uFE0F Cannot proceed without embeddings
63
- `)),process.exit(1));let c=parseInt(o.number,10),l=await on(s,c);if(l.length===0||l[0].score<.3)if(console.log(i.yellow(`
63
+ `)),process.exit(1));let c=parseInt(o.number,10),l=await en(s,c);if(l.length===0||l[0].score<.3)if(console.log(i.yellow(`
64
64
  \u26A0\uFE0F No matching modules found in RapidKit registry.
65
65
  `)),console.log(i.cyan(`\u{1F4A1} Options:
66
66
  `)),console.log(i.white("1. Create custom module:")),console.log(i.gray(" rapidkit modules scaffold <name> --category <category>")),console.log(i.gray(` Example: rapidkit modules scaffold blockchain-integration --category integrations
@@ -68,23 +68,23 @@ Cancelled
68
68
  `)),console.log(i.white("3. Request feature:")),console.log(i.gray(` https://github.com/rapidkitlabs/rapidkit/issues
69
69
  `)),l.length>0)console.log(i.yellow(`\u26A0\uFE0F Low confidence matches found:
70
70
  `));else return;if(o.json){console.log(JSON.stringify({query:s,recommendations:l},null,2));return}console.log(i.green.bold(`\u{1F4E6} Recommended Modules:
71
- `)),l.forEach((m,g)=>{let f=(m.score*100).toFixed(1),h=m.score>.8?" \u2B50":"";console.log(i.bold(`${g+1}. ${m.module.name}${h}`)),console.log(i.gray(` ${m.module.description}`)),console.log(i.cyan(` Match: ${f}%`)+i.gray(` - ${m.reason}`)),console.log(i.yellow(` Category: ${m.module.category}`)),m.module.dependencies.length>0&&console.log(i.magenta(` Requires: ${m.module.dependencies.join(", ")}`)),console.log();});let u=l.slice(0,3).map(m=>m.module.id);console.log(i.cyan("\u{1F4A1} Quick install (top 3):")),console.log(i.white(` rapidkit add module ${u.join(" ")}
72
- `));let d=await pn(),{shouldInstall:p}=await d.prompt([{type:"confirm",name:"shouldInstall",message:"Would you like to install these modules now?",default:false}]);if(p){let{selectedModules:m}=await d.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(i.blue(`
73
- \u{1F4E6} Installing ${m.length} modules...
74
- `)),console.log(i.gray(`Command: rapidkit add module ${m.join(" ")}`));let g=a$4(process.cwd());if(g?.module_support===false){let h=g?.runtime==="java"?"Spring Boot":"Go";console.log(i.red(`
71
+ `)),l.forEach((f,g)=>{let m=(f.score*100).toFixed(1),h=f.score>.8?" \u2B50":"";console.log(i.bold(`${g+1}. ${f.module.name}${h}`)),console.log(i.gray(` ${f.module.description}`)),console.log(i.cyan(` Match: ${m}%`)+i.gray(` - ${f.reason}`)),console.log(i.yellow(` Category: ${f.module.category}`)),f.module.dependencies.length>0&&console.log(i.magenta(` Requires: ${f.module.dependencies.join(", ")}`)),console.log();});let u=l.slice(0,3).map(f=>f.module.id);console.log(i.cyan("\u{1F4A1} Quick install (top 3):")),console.log(i.white(` rapidkit add module ${u.join(" ")}
72
+ `));let p=await cn(),{shouldInstall:d}=await p.prompt([{type:"confirm",name:"shouldInstall",message:"Would you like to install these modules now?",default:false}]);if(d){let{selectedModules:f$1}=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(f$1.length>0){console.log(i.blue(`
73
+ \u{1F4E6} Installing ${f$1.length} modules...
74
+ `)),console.log(i.gray(`Command: rapidkit add module ${f$1.join(" ")}`));let g=a$4(process.cwd());if(g?.module_support===false){let h=g?.runtime==="java"?"Spring Boot":"Go";console.log(i.red(`
75
75
  \u274C RapidKit modules are not available for ${h} npm-level kits.`)),console.log(i.gray(` The module system requires Python and is currently only supported for FastAPI and NestJS projects.
76
- `));return}let f$1=await f(["add","module",...m],{cwd:process.cwd()});console.log(f$1===0?i.green(`
76
+ `));return}let m=await f(["add","module",...f$1],{cwd:process.cwd()});console.log(m===0?i.green(`
77
77
  \u2705 Selected modules installed successfully
78
78
  `):i.red(`
79
- \u274C Module installation failed (exit code: ${f$1})
79
+ \u274C Module installation failed (exit code: ${m})
80
80
  `));}else console.log(i.gray(`
81
81
  No modules selected
82
- `));}}catch(n){let s=Nr(n);a$1.error(`
82
+ `));}}catch(n){let s=Ar(n);a$1.error(`
83
83
  \u274C Error:`,s.message),s.code==="invalid_api_key"?(console.log(i.yellow(`
84
84
  \u{1F4A1} Your API key may be invalid or expired`)),console.log(i.cyan(` Update it: rapidkit config set-api-key
85
85
  `))):s.message.includes("embeddings file not found")&&(console.log(i.yellow(`
86
86
  \u{1F4A1} Module embeddings not generated yet`)),console.log(i.cyan(" Generate them (one-time):")),console.log(i.white(" cd rapidkit-npm")),console.log(i.white(' export OPENAI_API_KEY="sk-proj-..."')),console.log(i.white(` npx tsx src/ai/generate-embeddings.ts
87
- `))),process.exit(1);}}),e.command("info").description("Show AI features information").action(()=>{let r=St(),o=Rr();console.log(i.bold(`
87
+ `))),process.exit(1);}}),e.command("info").description("Show AI features information").action(()=>{let r=jt(),o=Sr();console.log(i.bold(`
88
88
  \u{1F916} RapidKit AI Features
89
89
  `)),console.log(i.cyan("Status:"),o?i.green("Enabled"):i.red("Disabled")),console.log(i.cyan("API Key:"),r?i.green("Configured \u2713"):i.red("Not configured \u2717")),console.log(i.bold(`
90
90
  \u{1F4E6} Available Features:
@@ -92,128 +92,125 @@ No modules selected
92
92
  \u{1F4B0} Pricing:
93
93
  `)),console.log(i.white("\u2022 Per query: ~$0.0002")+i.gray(" (practically free)")),console.log(i.white("\u2022 100 queries: ~$0.02")+i.gray(" (2 cents)")),console.log(i.white("\u2022 1000 queries: ~$0.20")+i.gray(" (20 cents)")),console.log(i.bold(`
94
94
  \u{1F680} Getting Started:
95
- `)),r?(console.log(i.green("\u2713 You're all set!")),console.log(i.white(' Try: rapidkit ai recommend "user authentication"'))):(console.log(i.white("1. Get OpenAI API key: https://platform.openai.com/api-keys")),console.log(i.white("2. Configure: rapidkit config set-api-key")),console.log(i.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=St();r||(console.log(i.red(`
95
+ `)),r?(console.log(i.green("\u2713 You're all set!")),console.log(i.white(' Try: rapidkit ai recommend "user authentication"'))):(console.log(i.white("1. Get OpenAI API key: https://platform.openai.com/api-keys")),console.log(i.white("2. Configure: rapidkit config set-api-key")),console.log(i.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=jt();r||(console.log(i.red(`
96
96
  \u274C OpenAI API key not configured
97
97
  `)),console.log(i.cyan(`To generate embeddings, you need an OpenAI API key:
98
98
  `)),console.log(i.white("1. Get your key from: https://platform.openai.com/api-keys")),console.log(i.white("2. Configure it: rapidkit config set-api-key")),console.log(i.gray(`
99
99
  OR set environment variable:`)),console.log(i.white(` export OPENAI_API_KEY="sk-proj-..."
100
- `)),process.exit(1)),Qt(r);let o=await er(true);o&&(console.log(i.green("\u2705 Ready to use AI recommendations!")),console.log(i.cyan(`Try: rapidkit ai recommend "authentication"
101
- `))),process.exit(o?0:1);}catch(r){let o=Nr(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=St();r||(console.log(i.red(`
100
+ `)),process.exit(1)),zt(r);let o=await Zt(true);o&&(console.log(i.green("\u2705 Ready to use AI recommendations!")),console.log(i.cyan(`Try: rapidkit ai recommend "authentication"
101
+ `))),process.exit(o?0:1);}catch(r){let o=Ar(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=jt();r||(console.log(i.red(`
102
102
  \u274C OpenAI API key not configured
103
103
  `)),console.log(i.white(`Set your API key: rapidkit config set-api-key
104
- `)),process.exit(1)),Qt(r);let o=await dn();process.exit(o?0:1);}catch(r){let o=Nr(r);a$1.error("Failed to update embeddings:",o.message),process.exit(1);}});}var Pi="rapidkit.product-factory-plan.v1",bi="rapidkit.private-product-manifest.v1";function Ct(t,e=""){return typeof t=="string"&&t.trim()?t.trim():e}function Dr(t){return typeof t=="string"&&t.trim()?t.trim():null}function ji(t,e){return typeof t=="number"&&Number.isFinite(t)?t:e}function fn(t){return Array.isArray(t)?[...new Set(t.filter(e=>typeof e=="string").map(e=>e.trim()).filter(Boolean))]:[]}function hn(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 Si(t,e,r){let o=Ct(t.slug);if(!o)throw new Error(`Backlog product at index ${e} is missing slug.`);hn(o);let n=fn(t.modules),s=fn(t.moduleGaps);return {rank:ji(t.rank,e+1),slug:o,title:Ct(t.title,o),category:Ct(t.category,"Uncategorized"),tier:Ct(t.tier,"pro"),summary:Ct(t.summary),modules:n,moduleGaps:s,recommendedKit:r,workspaceProfile:"enterprise",readiness:{status:s.length>0?"blocked-by-module-gaps":"ready-for-private-manifest",blockingGaps:s}}}function xi(t){if(!t||typeof t!="object"||Array.isArray(t))throw new Error("Backlog must be a JSON object.");return t}async function Ci(t){let e=y__default.resolve(process.cwd(),t),r=xi(await ___default.readJson(e));if(!Array.isArray(r.products))throw new Error("Backlog must contain a products array.");return {absolutePath:e,payload:r}}function Ri(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 yn(t){let e=t.kit?.trim()||"fastapi.standard",{absolutePath:r,payload:o}=await Ci(t.backlogPath),n=o.products,s=n.map((d,p)=>Si(d,p,e)),a=Ri(s,t),c=new Set(a.flatMap(d=>d.modules)),l=a.flatMap(d=>d.moduleGaps),u=a.filter(d=>d.readiness.status==="ready-for-private-manifest").length;return {schemaVersion:Pi,generatedAt:(t.now??new Date).toISOString(),source:{backlogPath:r,backlogSchemaVersion:Dr(o.schemaVersion),purpose:Dr(o.purpose),publicationRule:Dr(o.publicationRule)},defaults:{kit:e,workspaceProfile:"enterprise",projectSlug:"api"},stats:{totalProducts:n.length,plannedProducts:a.length,readyProducts:u,blockedProducts:a.length-u,uniqueModules:c.size,knownModuleGaps:l.length},products:a}}function mt(t){return JSON.stringify(t,null,2)}function Ei(t){return `sha256:${Tr.createHash("sha256").update(mt(t)).digest("hex")}`}async function _i(t){let e=await yn({backlogPath:t.backlogPath,kit:t.kit,now:t.now}),r=e.products.find(s=>s.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:bi,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:Ei({...n,factory:{...n.factory,manifestChecksum:""}})}}}async function gn(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,`${mt(e)}
105
- `,"utf-8");}function Ii(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 Ai(t,e){console.log(i.bold(`
104
+ `)),process.exit(1)),zt(r);let o=await an();process.exit(o?0:1);}catch(r){let o=Ar(r);a$1.error("Failed to update embeddings:",o.message),process.exit(1);}});}var yi="rapidkit.product-factory-plan.v1",wi="rapidkit.private-product-manifest.v1";function xt(t,e=""){return typeof t=="string"&&t.trim()?t.trim():e}function $r(t){return typeof t=="string"&&t.trim()?t.trim():null}function ki(t,e){return typeof t=="number"&&Number.isFinite(t)?t:e}function pn(t){return Array.isArray(t)?[...new Set(t.filter(e=>typeof e=="string").map(e=>e.trim()).filter(Boolean))]:[]}function mn(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 vi(t,e,r){let o=xt(t.slug);if(!o)throw new Error(`Backlog product at index ${e} is missing slug.`);mn(o);let n=pn(t.modules),s=pn(t.moduleGaps);return {rank:ki(t.rank,e+1),slug:o,title:xt(t.title,o),category:xt(t.category,"Uncategorized"),tier:xt(t.tier,"pro"),summary:xt(t.summary),modules:n,moduleGaps:s,recommendedKit:r,workspaceProfile:"enterprise",readiness:{status:s.length>0?"blocked-by-module-gaps":"ready-for-private-manifest",blockingGaps:s}}}function Pi(t){if(!t||typeof t!="object"||Array.isArray(t))throw new Error("Backlog must be a JSON object.");return t}async function bi(t){let e=y__default.resolve(process.cwd(),t),r=Pi(await E__default.readJson(e));if(!Array.isArray(r.products))throw new Error("Backlog must contain a products array.");return {absolutePath:e,payload:r}}function ji(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 fn(t){let e=t.kit?.trim()||"fastapi.standard",{absolutePath:r,payload:o}=await bi(t.backlogPath),n=o.products,s=n.map((p,d)=>vi(p,d,e)),a=ji(s,t),c=new Set(a.flatMap(p=>p.modules)),l=a.flatMap(p=>p.moduleGaps),u=a.filter(p=>p.readiness.status==="ready-for-private-manifest").length;return {schemaVersion:yi,generatedAt:(t.now??new Date).toISOString(),source:{backlogPath:r,backlogSchemaVersion:$r(o.schemaVersion),purpose:$r(o.purpose),publicationRule:$r(o.publicationRule)},defaults:{kit:e,workspaceProfile:"enterprise",projectSlug:"api"},stats:{totalProducts:n.length,plannedProducts:a.length,readyProducts:u,blockedProducts:a.length-u,uniqueModules:c.size,knownModuleGaps:l.length},products:a}}function ut(t){return JSON.stringify(t,null,2)}function Si(t){return `sha256:${Nr.createHash("sha256").update(ut(t)).digest("hex")}`}async function xi(t){let e=await fn({backlogPath:t.backlogPath,kit:t.kit,now:t.now}),r=e.products.find(s=>s.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:wi,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:Si({...n,factory:{...n.factory,manifestChecksum:""}})}}}async function un(t,e,r=false){let o=y__default.resolve(process.cwd(),t);if(!r&&await E__default.pathExists(o))throw new Error(`Refusing to overwrite existing file: ${o}. Use --force.`);await E__default.ensureDir(y__default.dirname(o)),await E__default.writeFile(o,`${ut(e)}
105
+ `,"utf-8");}function Ci(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 Ri(t,e){console.log(i.bold(`
106
106
  RapidKit Product Factory Plan
107
107
  `)),console.log(i.cyan("Products:"),i.white(String(t.stats.plannedProducts))),console.log(i.cyan("Ready:"),i.green(String(t.stats.readyProducts))),console.log(i.cyan("Blocked:"),i.yellow(String(t.stats.blockedProducts))),console.log(i.cyan("Unique modules:"),i.white(String(t.stats.uniqueModules))),console.log(i.cyan("Known gaps:"),i.yellow(String(t.stats.knownModuleGaps))),e&&console.log(i.gray(`
108
108
  Wrote plan: ${y__default.resolve(process.cwd(),e)}`)),console.log(i.gray(`
109
109
  Next: npx rapidkit product manifest create <slug> --from-backlog <file>
110
- `));}function $i(t,e){console.log(i.bold(`
110
+ `));}function Ei(t,e){console.log(i.bold(`
111
111
  RapidKit Private Product Manifest
112
112
  `)),console.log(i.cyan("Product:"),i.white(t.product.slug)),console.log(i.cyan("Kit:"),i.white(t.projects[0].kit)),console.log(i.cyan("Modules:"),i.white(String(t.projects[0].modules.length))),console.log(i.cyan("Module gaps:"),i.yellow(String(t.projects[0].moduleGaps.length))),console.log(i.cyan("Checksum:"),i.white(t.factory.manifestChecksum)),console.log(i.gray(`
113
113
  Wrote manifest: ${y__default.resolve(process.cwd(),e)}
114
- `));}function wn(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 yn({backlogPath:r,kit:o.kit,tier:o.tier,category:o.category,limit:o.limit});o.output&&await gn(o.output,n,true),o.json?console.log(mt(n)):Ai(n,o.output);}catch(n){let s=n instanceof Error?n.message:String(n);o.json?console.log(mt({ok:false,error:{message:s}})):console.error(i.red(`Product plan failed: ${s}`)),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{hn(r);let n=await _i({backlogPath:o.fromBacklog,slug:r,kit:o.kit,outputRoot:o.workspaceOutput}),s=Ii(o.output,r);await gn(s,n,o.force===true),o.json?console.log(mt(n)):$i(n,s);}catch(n){let s=n instanceof Error?n.message:String(n);o.json?console.log(mt({ok:false,error:{message:s}})):console.error(i.red(`Product manifest create failed: ${s}`)),process.exit(1);}});}function Mr(t){return y.join(t,".rapidkit","imported-projects.json")}async function kn(t){let e=Mr(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 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 vn(t,e){if(e.length===0)return;let r=await kn(t),o=new Map;for(let c of r)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},a=Mr(t);await ___default.ensureDir(y.dirname(a)),await ___default.writeJSON(a,s,{spaces:2});}async function Rt(t,e){if(e.length===0)return;let r=await kn(t),o=new Set(e.map(c=>y.resolve(c))),n=r.filter(c=>!o.has(y.resolve(c.path))),s={version:1,updatedAt:new Date().toISOString(),projects:n},a=Mr(t);await ___default.ensureDir(y.dirname(a)),await ___default.writeJSON(a,s,{spaces:2});}var bn="rapidkit-workspace-snapshot-v1",jn="rapidkit-project-archive-v1",Oi=[".rapidkit/workspace.json",".rapidkit-workspace","rapidkit.config.json","rapidkit.config.js","rapidkit.config.cjs","rapidkit.config.mjs","package.json"],Ni=new Set([".git","node_modules",".venv","dist","build","target","coverage","htmlcov",".next"]),Et={requireReasonForDestructiveOps:false,requireSafetySnapshotForDestructiveOps:true,allowPermanentDelete:true};function gt(t=new Date){return t.toISOString().replace(/[:.]/g,"-")}function Wr(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 Di(t){try{let e=await ___default.readJson(t);return e&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}function Mi(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 Ti(t){let e=y__default.join(t,".rapidkit","policies.yml");if(!await ___default.pathExists(e))return {...Et};try{let r=await ___default.readFile(e,"utf-8"),o=(n,s)=>{let a=r.match(new RegExp(`^\\s*${n}:\\s*([^#\\n]+)`,"m"));return Mi(a?.[1],s)};return {requireReasonForDestructiveOps:o("require_reason_for_destructive_ops",Et.requireReasonForDestructiveOps),requireSafetySnapshotForDestructiveOps:o("require_safety_snapshot_for_destructive_ops",Et.requireSafetySnapshotForDestructiveOps),allowPermanentDelete:o("allow_permanent_delete",Et.allowPermanentDelete)}}catch{return {...Et}}}function Wi(t){return y__default.join(t,".rapidkit","audit","events.jsonl")}async function Fe(t,e){let r={schema:"rapidkit-workspace-audit-event-v1",id:Tr.randomUUID(),timestamp:new Date().toISOString(),workspacePath:t,...e},o=Wi(t);return await ___default.ensureDir(y__default.dirname(o)),await ___default.appendFile(o,`${JSON.stringify(r)}
115
- `,"utf-8"),r}async function rr(t,e,r){let o=await Ti(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 Fr(t=process.cwd()){let e=y__default.resolve(t),r=y__default.resolve(Go.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 He(t){let e=t?y__default.resolve(t):Fr(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 Fi(t){let e=await Di(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 or(t){return y__default.join(t,".rapidkit","snapshots")}function _t(t){return y__default.join(t,".rapidkit","archive","projects")}function Kr(t){return y__default.join(t,"files")}function Ki(t){return y__default.join(Go.tmpdir(),`rapidkit-workspace-snapshot-${process.pid}-${t}-${Tr.randomBytes(4).toString("hex")}`)}function Lr(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=>Ni.has(n))}async function Li(t){return (await a$6(t,{descendIntoMatchedProjects:false})).map(r=>({name:y__default.basename(r),relativePath:y__default.relative(t,r)}))}async function Ji(t,e){let r=[];for(let o of Oi){let n=y__default.join(t,o);if(!await ___default.pathExists(n))continue;let s=y__default.join(e,o);await ___default.copy(n,s,{filter:a=>Lr(t,a)}),r.push(o);}return r}async function Gi(t,e){await ___default.writeJson(y__default.join(t,"snapshot.json"),e,{spaces:2});}async function Jr(t){let e=y__default.join(t,"snapshot.json"),r=await ___default.readJson(e);if(!r||typeof r!="object"||r.schema!==bn)throw new Error(`Invalid RapidKit workspace snapshot manifest: ${e}`);return r}async function Bi(t){let e=0,r=0,o=[t];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 a of s){let c=y__default.join(n,a.name);if(a.isDirectory()){o.push(c);continue}if(a.isFile())try{let l=await ___default.stat(c);e+=1,r+=l.size;}catch{}}}return {files:e,bytes:r}}async function ht(t={}){let e=He(t.workspacePath),r=t.name?t.name:`snapshot-${gt()}`,o=Wr(r),n=y__default.join(or(e),o),s=Ki(o);if(await ___default.pathExists(n))throw new Error(`Snapshot already exists: ${o}`);let a=Kr(s);try{await ___default.ensureDir(a);let c=t.includeProjects?"full":"metadata",l=c==="full"?["."]:await Ji(e,a);c==="full"&&await ___default.copy(e,a,{filter:d=>Lr(e,d)});let u={schema:bn,name:o,mode:c,reason:t.reason,createdAt:new Date().toISOString(),workspaceName:await Fi(e),workspacePath:e,copiedPaths:l,projects:await Li(e)};return await Gi(s,u),await ___default.ensureDir(y__default.dirname(n)),await ___default.move(s,n,{overwrite:false}),await Fe(e,{action:"snapshot.create",target:o,status:"succeeded",reason:t.reason,details:{mode:c,copiedPaths:l,snapshotPath:n,projectCount:u.projects.length}}),{manifest:u,snapshotPath:n}}catch(c){throw await ___default.remove(s),await Fe(e,{action:"snapshot.create",target:o,status:"failed",reason:t.reason,details:{error:c instanceof Error?c.message:String(c)}}),c}}async function Sn(t){let e=He(t.workspacePath),r=y__default.join(or(e),Wr(t.name));if(!await ___default.pathExists(r))throw new Error(`Snapshot not found: ${t.name}`);let o=await Jr(r),n=Kr(r),s=await Bi(n);return {manifest:o,snapshotPath:r,filesRoot:n,estimatedFileCount:s.files,estimatedBytes:s.bytes}}async function xn(t={}){let e=He(t.workspacePath),r=or(e);if(!await ___default.pathExists(r))return [];let o=await ___default.readdir(r,{withFileTypes:true}),n=[];for(let s of o){if(!s.isDirectory())continue;let a=y__default.join(r,s.name);try{n.push({...await Jr(a),snapshotPath:a});}catch{}}return n.sort((s,a)=>a.createdAt.localeCompare(s.createdAt))}async function Cn(t){let e=He(t.workspacePath),r=y__default.join(or(e),Wr(t.name));if(!await ___default.pathExists(r))throw new Error(`Snapshot not found: ${t.name}`);let o=await Jr(r),n=Kr(r),s=o.mode==="full"?["."]:Array.from(new Set(o.copiedPaths.map(l=>l.startsWith(".rapidkit/")?".rapidkit":l)));if(t.dryRun)return await Fe(e,{action:"snapshot.restore",target:o.name,status:"planned",reason:t.reason,details:{restoredPaths:s}}),{workspacePath:e,snapshotPath:r,restoredPaths:s,dryRun:true};if(!t.force)throw new Error("Restore is destructive. Re-run with --force after reviewing --dry-run output.");await rr(e,"snapshot.restore",{reason:t.reason,safetySnapshot:t.safetySnapshot});let a;if(t.safetySnapshot!==false&&(a=(await ht({workspacePath:e,name:`pre-restore-${o.name}-${gt()}`,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=>Lr(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 c={workspacePath:e,snapshotPath:r,restoredPaths:s,dryRun:false,safetySnapshotPath:a};return await Fe(e,{action:"snapshot.restore",target:o.name,status:"succeeded",reason:t.reason,details:{restoredPaths:s,safetySnapshotPath:a}}),c}function Rn(t){let e=t.trim();if(!e)throw new Error("Project name/path is required.");return e}async function En(t,e){let r=Rn(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 s=(await a$6(t,{descendIntoMatchedProjects:false})).filter(a=>{let c=y__default.relative(t,a);return y__default.basename(a)===r||c===r});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 Gr(t){try{let{syncWorkspaceProjects:e}=await import('./workspace-4VGM2NPS.js');await e(t,true);}catch{}}function Vi(t,e){let r=Tr.randomBytes(4).toString("hex");return y__default.join(_t(t),`${e}-${gt()}-${r}`)}async function _n(t){let e=y__default.join(t,"rapidkit-archive.json"),r=await ___default.readJson(e);if(!r||typeof r!="object"||r.schema!==jn)throw new Error(`Invalid RapidKit archive manifest: ${e}`);return r}async function Br(t={}){let e=He(t.workspacePath),r=_t(e);if(!await ___default.pathExists(r))return [];let o=await ___default.readdir(r,{withFileTypes:true}),n=[];for(let s of o){if(!s.isDirectory())continue;let a=y__default.join(r,s.name),c=y__default.join(a,"rapidkit-archive.json");try{n.push({...await _n(a),archivePath:a,manifestPath:c});}catch{}}return n.sort((s,a)=>a.archivedAt.localeCompare(s.archivedAt))}async function qi(t,e){let r=Rn(e),o=y__default.isAbsolute(r)?y__default.resolve(r):y__default.resolve(_t(t),r);if(o.startsWith(`${y__default.resolve(_t(t))}${y__default.sep}`)&&await ___default.pathExists(y__default.join(o,"rapidkit-archive.json")))return o;let s=(await Br({workspacePath:t})).filter(a=>y__default.basename(a.archivePath)===r||a.projectName===r||y__default.relative(_t(t),a.archivePath)===r);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 Vr(t){let e=He(t.workspacePath),r=await En(e,t.project),o=y__default.basename(r),n=Vi(e,o),s=y__default.join(n,"rapidkit-archive.json");if(t.dryRun)return await Fe(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:s,dryRun:true};await rr(e,"project.archive",{reason:t.reason,safetySnapshot:true});let a=await ht({workspacePath:e,name:`pre-archive-${o}-${gt()}`,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 c={schema:jn,projectName:o,originalPath:r,archivedPath:n,reason:t.reason,archivedAt:new Date().toISOString(),safetySnapshotPath:a.snapshotPath};return await ___default.writeJson(s,c,{spaces:2}),await Rt(e,[r]),await Gr(e),await Fe(e,{action:"project.archive",target:o,status:"succeeded",reason:t.reason,details:{projectPath:r,archivePath:n,manifestPath:s,safetySnapshotPath:a.snapshotPath}}),{workspacePath:e,projectName:o,projectPath:r,action:"archive",archivePath:n,manifestPath:s,safetySnapshotPath:a.snapshotPath,dryRun:false}}async function In(t){if(!t.permanent)return Vr(t);let e=He(t.workspacePath),r=await En(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 Fe(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 rr(e,"project.delete",{reason:t.reason,permanent:true,safetySnapshot:true});let n=await ht({workspacePath:e,name:`pre-delete-${o}-${gt()}`,reason:t.reason||`Automatic safety snapshot before deleting ${o}`,includeProjects:false});return await ___default.remove(r),await Rt(e,[r]),await Gr(e),await Fe(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 An(t){let e=He(t.workspacePath),r=await qi(e,t.archive),o=await _n(r),n=t.targetName?.trim()||o.projectName,s=y__default.join(e,n);if(!s.startsWith(`${y__default.resolve(e)}${y__default.sep}`))throw new Error(`Archive restore target escapes workspace: ${n}`);if(await ___default.pathExists(s)&&!t.force)throw new Error(`Project path already exists. Re-run with --force to overwrite: ${s}`);if(t.dryRun)return await Fe(e,{action:"project.restore",target:n,status:"planned",reason:t.reason,details:{archivePath:r,projectPath:s}}),{workspacePath:e,projectName:n,projectPath:s,action:"restore",archivePath:r,manifestPath:y__default.join(r,"rapidkit-archive.json"),dryRun:true};await rr(e,"project.restore",{reason:t.reason,safetySnapshot:true});let a=await ht({workspacePath:e,name:`pre-restore-project-${n}-${gt()}`,reason:t.reason||`Automatic safety snapshot before restoring ${n}`,includeProjects:false});return await ___default.move(r,s,{overwrite:t.force===true}),await Gr(e),await Fe(e,{action:"project.restore",target:n,status:"succeeded",reason:t.reason,details:{archivePath:r,projectPath:s,safetySnapshotPath:a.snapshotPath}}),{workspacePath:e,projectName:n,projectPath:s,action:"restore",archivePath:r,manifestPath:y__default.join(s,"rapidkit-archive.json"),safetySnapshotPath:a.snapshotPath,dryRun:false}}var Hi="rapidkit.infra-stack.v1",On="rapidkit.infra-plan.v1",yt=".rapidkit/infra/docker-compose.yml",wt=".rapidkit/reports/infra-plan.json",Hr=".rapidkit/infra/.env.example";function zi(){let t=y__default.dirname(fileURLToPath(import.meta.url)),e=[y__default.join(t,"../../contracts/infra-stack.v1.json"),y__default.join(t,"../contracts/infra-stack.v1.json")];for(let r of e)if(P.existsSync(r))return r;throw new Error(`Infra stack contract not found. Expected contracts/infra-stack.v1.json beside the rapidkit package root. Checked: ${e.join(", ")}`)}var Ur=null;function rt(t){if(Ur)return Ur;let e=zi(),r=P.readFileSync(e,"utf-8"),o=JSON.parse(r);if(o.schemaVersion!==Hi)throw new Error(`Unsupported infra stack schema: ${o.schemaVersion}`);return Yi(o),(Ur=o),o}function Yi(t){let e=new Set(Object.keys(t.services));for(let[r,o]of Object.entries(t.moduleMappings)){if(!Array.isArray(o))throw new Error(`Invalid moduleMappings entry for ${r}`);for(let n of o)if(!e.has(n))throw new Error(`moduleMappings/${r} references unknown service '${n}'`)}for(let[r,o]of Object.entries(t.envVarMappings)){if(!Array.isArray(o))throw new Error(`Invalid envVarMappings entry for ${r}`);for(let n of o)if(!e.has(n))throw new Error(`envVarMappings/${r} references unknown service '${n}'`)}}function Nn(t,e){let r=e.startsWith("free/")?e:`free/${e}`;return t.moduleMappings[r]||[]}function kt(t,e){return t.envVarMappings[e.toUpperCase()]||[]}function Dn(t,e){let r={};for(let o of e){let n=t.services[o];n&&Object.assign(r,n.connectionEnv);}return r}async function Qi(t){let e=y__default.join(t,"registry.json");if(!await ___default.pathExists(e))return [];try{let o=(await ___default.readJson(e)).installed_modules||[];return [...new Set(o.map(n=>typeof n.slug=="string"?n.slug.trim():"").filter(Boolean))]}catch{return []}}async function Zi(t){let e=y__default.join(t,".env.example");if(!await ___default.pathExists(e))return [];try{let r=await ___default.readFile(e,"utf-8"),o=[];for(let n of r.split(`
116
- `)){let s=n.trim();if(!s||s.startsWith("#"))continue;let a=s.match(/^([A-Z0-9_]+)=/);a?.[1]&&o.push(a[1]);}return o}catch{return []}}async function Xi(t){let e=y__default.join(t,".rapidkit","infra","overrides.json");if(!await ___default.pathExists(e))return [];try{let r=await ___default.readJson(e);return Array.isArray(r.services)?[...new Set(r.services.filter(o=>typeof o=="string"&&o.trim().length>0))]:[]}catch{return []}}async function ea(t){let e=y__default.join(t,".rapidkit","workspace.contract.json");if(!await ___default.pathExists(e))return [];try{let r=await ___default.readJson(e),o=[];for(let n of r.projects||[]){let s=typeof n.slug=="string"?n.slug:"unknown";for(let a of n.contracts?.env||[])typeof a=="string"&&a.trim()&&o.push({project:s,env:a.trim().toUpperCase()});}return o}catch{return []}}function nr(t,e,r,o){t.add(r),e.push(o);}async function Mn(t){let e=y__default.resolve(t.workspacePath),r=t.contract||rt(),o=new Set,n=[],s=new Set,a=new Set,c=new Set,l=await c$3(e);for(let u of l){let d=y__default.dirname(y__default.dirname(u)),p=y__default.basename(d);for(let m of await Qi(d)){s.add(m);for(let g of Nn(r,m))nr(o,n,g,{kind:"module",value:m,project:p});}for(let m of await Zi(d)){a.add(m);for(let g of kt(r,m))nr(o,n,g,{kind:"env-var",value:m,project:p});}}for(let u of await ea(e)){a.add(u.env);for(let d of kt(r,u.env))nr(o,n,d,{kind:"contract-env",value:u.env,project:u.project});}for(let u of await Xi(e))c.add(u),nr(o,n,u,{kind:"override",value:u});return {modules:[...s].sort(),envVars:[...a].sort(),overrides:[...c].sort(),sources:n,serviceIds:[...o].sort()}}function ta(t){let e=t.trim();if(!e||e.startsWith("#"))return null;let r=e.indexOf("=");if(r<=0)return null;let o=e.slice(0,r).trim();if(!/^[A-Z0-9_]+$/.test(o))return null;let n=e.slice(r+1).trim();(n.startsWith('"')&&n.endsWith('"')||n.startsWith("'")&&n.endsWith("'"))&&(n=n.slice(1,-1));let s=n.match(/^\$\{[A-Z0-9_]+:-([^}]+)\}$/),a=(s?s[1]:n).trim();return a?{key:o,value:a}:null}async function ra(t){if(!await ___default.pathExists(t))return {};try{let e=await ___default.readFile(t,"utf-8"),r={};for(let o of e.split(`
117
- `)){let n=ta(o);n&&(r[n.key]=n.value);}return r}catch{return {}}}async function Wn(t){let e={},r=await c$3(t.workspacePath);for(let o of r){let n=y__default.dirname(y__default.dirname(o)),s=await ra(y__default.join(n,".env.example"));for(let[a,c]of Object.entries(s))kt(t.contract,a).length>0&&(e[a]=c);}return e}function Fn(t,e){return t.filter(r=>kt(e,r).length>0).sort()}function Kn(t){let e=t.RAPIDKIT_DB_POSTGRES_URL||t.DATABASE_URL;if(e?.startsWith("postgresql://"))try{let r=new URL(e),o=r.pathname.replace(/^\//,"");return {POSTGRES_USER:decodeURIComponent(r.username||"postgres"),POSTGRES_PASSWORD:decodeURIComponent(r.password||"postgres"),POSTGRES_DB:o||"postgres"}}catch{return}}function Ln(t){let e=t.POSTGRES_USER||"postgres",r=t.POSTGRES_DB||"postgres";return ["CMD-SHELL",`pg_isready -U ${e} -d ${r}`]}function oa(t){return /[:#{}[\],&*!|>'"%@`]/.test(t)||t.includes(`
118
- `)?JSON.stringify(t):t}function Jn(t,e){return Object.entries(t).map(([r,o])=>`${e}${r}: ${oa(o)}`).join(`
119
- `)}function na(t,e){let r=t.test.map(o=>JSON.stringify(o)).join(", ");return [`${e}healthcheck:`,`${e} test: [${r}]`,`${e} interval: ${t.interval}`,`${e} timeout: ${t.timeout}`,`${e} retries: ${t.retries}`].join(`
120
- `)}function Gn(t){let e=["# Generated by RapidKit infra plan \u2014 do not edit manually.",`# Workspace: ${t.workspaceName}`,`# Generated at: ${t.plan.generatedAt}`,"name: rapidkit-infra"],r=new Set;if(t.plan.services.length===0)return e.push("services: {}"),e.push(""),e.join(`
121
- `);e.push("services:");for(let o of t.plan.services){let n=t.contract.services[o.id];if(n){if(e.push(` ${o.id}:`),e.push(` image: ${n.image}`),e.push(` container_name: rapidkit-${o.id}`),n.command?.length){let s=n.command.map(a=>JSON.stringify(a)).join(", ");e.push(` command: [${s}]`);}if(n.env&&Object.keys(n.env).length>0){e.push(" environment:");let s={...n.env,...t.plan.serviceEnvOverrides?.[o.id]||{}};e.push(Jn(s," "));}else t.plan.serviceEnvOverrides?.[o.id]&&(e.push(" environment:"),e.push(Jn(t.plan.serviceEnvOverrides[o.id]," ")));if(n.ports.length>0){e.push(" ports:");for(let s of n.ports)e.push(` - "${s.host}:${s.container}"`);}if(n.volumes?.length){e.push(" volumes:");for(let s of n.volumes){e.push(` - ${s}`);let a=s.split(":")[0];a&&!a.startsWith("/")&&r.add(a);}}if(n.healthcheck){let s=t.plan.serviceEnvOverrides?.[o.id];if(o.id==="postgres"&&s){let a=Ln(s).map(c=>JSON.stringify(c)).join(", ");e.push(" healthcheck:"),e.push(` test: [${a}]`),e.push(` interval: ${n.healthcheck.interval}`),e.push(` timeout: ${n.healthcheck.timeout}`),e.push(` retries: ${n.healthcheck.retries}`);}else e.push(na(n.healthcheck," "));}e.push(" restart: unless-stopped");}}if(r.size>0){e.push("volumes:");for(let o of [...r].sort())e.push(` ${o}:`),e.push(" driver: local");}return e.push(""),e.join(`
122
- `)}function sa(t,e,r){return t.kind==="override"?t.value===e:t.kind==="module"?r.moduleMappings[t.value]?.includes(e)??false:r.envVarMappings[t.value.toUpperCase()]?.includes(e)??false}function ia(t){let e=new Map,r=[];for(let o of t)for(let n of o.ports){let s=e.get(n.host);s&&s!==o.id?r.push(`Port collision on host ${n.host} between services '${s}' and '${o.id}'`):e.set(n.host,o.id);}return r}async function aa(t){let e=y__default.join(t,".rapidkit","workspace.json");if(await ___default.pathExists(e))try{let r=await ___default.readJson(e);return r.workspace_name||r.name}catch{return}}async function Yr(t){let e=y__default.resolve(t.workspacePath),r=rt(),o=await Mn({workspacePath:e,contract:r}),n=o.serviceIds.map(m=>{let g=r.services[m];return g?{id:m,displayName:g.displayName,category:g.category,image:g.image,ports:g.ports,sources:o.sources.filter(f=>sa(f,m,r))}:null}).filter(m=>m!==null),s=ia(n);n.length===0&&s.push("No infrastructure services detected. Install modules with infra dependencies or add .rapidkit/infra/overrides.json");for(let m of o.overrides)r.services[m]||s.push(`Override references unknown service '${m}'`);let a=await ___default.pathExists(y__default.join(e,".rapidkit","workspace.contract.json"))?".rapidkit/workspace.contract.json":void 0,c=Dn(r,o.serviceIds),l=await Wn({workspacePath:e,contract:r}),u={...c,...l};l.RAPIDKIT_DB_POSTGRES_URL&&(u.DATABASE_URL=l.RAPIDKIT_DB_POSTGRES_URL);let d={},p=Kn(u);return p&&o.serviceIds.includes("postgres")&&(d.postgres=p),{schemaVersion:On,generatedAt:(t.now||(()=>new Date))().toISOString(),workspacePath:e,workspaceName:await aa(e),contractPath:a,strategy:"sidecar",composePath:yt,envExamplePath:Hr,services:n,connectionEnv:u,serviceEnvOverrides:Object.keys(d).length>0?d:void 0,sources:{modules:o.modules,envVars:o.envVars,overrides:o.overrides},warnings:s}}async function Qr(t){let e=y__default.resolve(t.workspacePath),r=y__default.join(e,yt),o=y__default.join(e,wt),n=y__default.join(e,Hr),s=rt(),a=Gn({plan:t.plan,contract:s,workspaceName:t.plan.workspaceName||y__default.basename(e)}),c=["# Generated by: npx rapidkit infra plan","# Copy values into project .env files as needed.",...Object.entries(t.plan.connectionEnv).map(([l,u])=>`${l}=${u}`),""].join(`
123
- `);return t.dryRun?{composePath:r,planPath:o,envExamplePath:n}:(await ___default.ensureDir(y__default.dirname(r)),await ___default.ensureDir(y__default.dirname(o)),await ___default.writeFile(r,a,"utf-8"),await ___default.writeFile(o,`${JSON.stringify(t.plan,null,2)}
124
- `,"utf-8"),await ___default.writeFile(n,c,"utf-8"),{composePath:r,planPath:o,envExamplePath:n})}function ca(t){return y__default.resolve(t).split(y__default.sep).join("/")}async function Vn(){if((await execa("docker",["compose","version"],{reject:false,timeout:5e3})).exitCode===0)return {command:"docker",prefixArgs:["compose"]};if((await execa("docker-compose",["version"],{reject:false,timeout:5e3})).exitCode===0)return {command:"docker-compose",prefixArgs:[]};throw new Error("Docker Compose is not available. Install Docker Desktop or the docker-compose plugin, then verify with: docker compose version")}async function la(){if((await execa("docker",["version"],{reject:false,timeout:5e3})).exitCode!==0)throw new Error("Docker is not available in PATH. Install Docker and ensure the daemon is running before using rapidkit infra.");await Vn();}function qn(t){let e=t.toLowerCase();return e.includes("no space left on device")?"Docker failed because the disk is full. Free space with: docker system prune -f (or docker system prune -a --volumes -f).":e.includes("address already in use")||e.includes("bind")?"Docker failed to bind a host port. Stop the conflicting service or adjust ports in contracts/infra-stack.v1.json via .rapidkit/infra/overrides.json.":e.includes("cannot connect to the docker daemon")?"Docker daemon is not running. Start Docker Desktop or the docker service, then retry.":null}async function Un(t){await la();let e=await Vn(),r=ca(t.composePath),o=await execa(e.command,[...e.prefixArgs,"-f",r,...t.args],{cwd:t.workspacePath,reject:false});return {exitCode:o.exitCode??1,stdout:o.stdout,stderr:o.stderr}}function ir(t){let e=t?y__default.resolve(t):Fr(process.cwd());if(!e)throw new Error("Not inside a RapidKit workspace. Run from workspace root or pass --workspace.");return e}function da(t){return y__default.join(t,yt)}async function Zr(t){let e=y__default.join(t,wt);if(!await ___default.pathExists(e))throw new Error(`Infra plan not found at ${wt}. Run: npx rapidkit infra plan`);return await ___default.readJson(e)}async function Xr(t){let e=da(t.workspacePath);if(!await ___default.pathExists(e))throw new Error(`Compose file not found at ${yt}. Run: npx rapidkit infra plan`);return Un({composePath:e,workspacePath:t.workspacePath,args:t.args})}function pa(t,e={}){if(console.log(i.bold(`
114
+ `));}function gn(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 fn({backlogPath:r,kit:o.kit,tier:o.tier,category:o.category,limit:o.limit});o.output&&await un(o.output,n,true),o.json?console.log(ut(n)):Ri(n,o.output);}catch(n){let s=n instanceof Error?n.message:String(n);o.json?console.log(ut({ok:false,error:{message:s}})):console.error(i.red(`Product plan failed: ${s}`)),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{mn(r);let n=await xi({backlogPath:o.fromBacklog,slug:r,kit:o.kit,outputRoot:o.workspaceOutput}),s=Ci(o.output,r);await un(s,n,o.force===true),o.json?console.log(ut(n)):Ei(n,s);}catch(n){let s=n instanceof Error?n.message:String(n);o.json?console.log(ut({ok:false,error:{message:s}})):console.error(i.red(`Product manifest create failed: ${s}`)),process.exit(1);}});}function Or(t){return y.join(t,".rapidkit","imported-projects.json")}async function hn(t){let e=Or(t);if(!await E__default.pathExists(e))return [];try{let r=await E__default.readJSON(e);return (Array.isArray(r?.projects)?r.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 yn(t,e){if(e.length===0)return;let r=await hn(t),o=new Map;for(let c of r)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},a=Or(t);await E__default.ensureDir(y.dirname(a)),await E__default.writeJSON(a,s,{spaces:2});}async function Ct(t,e){if(e.length===0)return;let r=await hn(t),o=new Set(e.map(c=>y.resolve(c))),n=r.filter(c=>!o.has(y.resolve(c.path))),s={version:1,updatedAt:new Date().toISOString(),projects:n},a=Or(t);await E__default.ensureDir(y.dirname(a)),await E__default.writeJSON(a,s,{spaces:2});}var kn="rapidkit-workspace-snapshot-v1",vn="rapidkit-project-archive-v1",_i=[".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"]),Rt={requireReasonForDestructiveOps:false,requireSafetySnapshotForDestructiveOps:true,allowPermanentDelete:true};function ft(t=new Date){return t.toISOString().replace(/[:.]/g,"-")}function Mr(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 E__default.readJson(t);return e&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}function $i(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 Oi(t){let e=y__default.join(t,".rapidkit","policies.yml");if(!await E__default.pathExists(e))return {...Rt};try{let r=await E__default.readFile(e,"utf-8"),o=(n,s)=>{let a=r.match(new RegExp(`^\\s*${n}:\\s*([^#\\n]+)`,"m"));return $i(a?.[1],s)};return {requireReasonForDestructiveOps:o("require_reason_for_destructive_ops",Rt.requireReasonForDestructiveOps),requireSafetySnapshotForDestructiveOps:o("require_safety_snapshot_for_destructive_ops",Rt.requireSafetySnapshotForDestructiveOps),allowPermanentDelete:o("allow_permanent_delete",Rt.allowPermanentDelete)}}catch{return {...Rt}}}function Ni(t){return y__default.join(t,".rapidkit","audit","events.jsonl")}async function De(t,e){let r={schema:"rapidkit-workspace-audit-event-v1",id:Nr.randomUUID(),timestamp:new Date().toISOString(),workspacePath:t,...e},o=Ni(t);return await E__default.ensureDir(y__default.dirname(o)),await E__default.appendFile(o,`${JSON.stringify(r)}
115
+ `,"utf-8"),r}async function er(t,e,r){let o=await Oi(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 Dr(t=process.cwd()){let e=y__default.resolve(t),r=y__default.resolve(Ko.tmpdir());for(;;){if(e!==r&&(E__default.existsSync(y__default.join(e,".rapidkit-workspace"))||E__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 Ve(t){let e=t?y__default.resolve(t):Dr(process.cwd());if(!e)throw new Error("Not inside a RapidKit workspace. Run from workspace root or pass --workspace.");if(!E__default.existsSync(y__default.join(e,".rapidkit-workspace"))&&!E__default.existsSync(y__default.join(e,".rapidkit","workspace.json")))throw new Error(`Workspace path is not a RapidKit workspace: ${e}`);return e}async function Mi(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 tr(t){return y__default.join(t,".rapidkit","snapshots")}function Et(t){return y__default.join(t,".rapidkit","archive","projects")}function Tr(t){return y__default.join(t,"files")}function Di(t){return y__default.join(Ko.tmpdir(),`rapidkit-workspace-snapshot-${process.pid}-${t}-${Nr.randomBytes(4).toString("hex")}`)}function Wr(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 Ti(t){return (await a$7(t,{descendIntoMatchedProjects:false})).map(r=>({name:y__default.basename(r),relativePath:y__default.relative(t,r)}))}async function Wi(t,e){let r=[];for(let o of _i){let n=y__default.join(t,o);if(!await E__default.pathExists(n))continue;let s=y__default.join(e,o);await E__default.copy(n,s,{filter:a=>Wr(t,a)}),r.push(o);}return r}async function Fi(t,e){await E__default.writeJson(y__default.join(t,"snapshot.json"),e,{spaces:2});}async function Fr(t){let e=y__default.join(t,"snapshot.json"),r=await E__default.readJson(e);if(!r||typeof r!="object"||r.schema!==kn)throw new Error(`Invalid RapidKit workspace snapshot manifest: ${e}`);return r}async function Ki(t){let e=0,r=0,o=[t];for(;o.length>0;){let n=o.shift();if(!n)continue;let s=[];try{s=await E__default.readdir(n,{withFileTypes:true});}catch{continue}for(let a of s){let c=y__default.join(n,a.name);if(a.isDirectory()){o.push(c);continue}if(a.isFile())try{let l=await E__default.stat(c);e+=1,r+=l.size;}catch{}}}return {files:e,bytes:r}}async function gt(t={}){let e=Ve(t.workspacePath),r=t.name?t.name:`snapshot-${ft()}`,o=Mr(r),n=y__default.join(tr(e),o),s=Di(o);if(await E__default.pathExists(n))throw new Error(`Snapshot already exists: ${o}`);let a=Tr(s);try{await E__default.ensureDir(a);let c=t.includeProjects?"full":"metadata",l=c==="full"?["."]:await Wi(e,a);c==="full"&&await E__default.copy(e,a,{filter:p=>Wr(e,p)});let u={schema:kn,name:o,mode:c,reason:t.reason,createdAt:new Date().toISOString(),workspaceName:await Mi(e),workspacePath:e,copiedPaths:l,projects:await Ti(e)};return await Fi(s,u),await E__default.ensureDir(y__default.dirname(n)),await E__default.move(s,n,{overwrite:false}),await De(e,{action:"snapshot.create",target:o,status:"succeeded",reason:t.reason,details:{mode:c,copiedPaths:l,snapshotPath:n,projectCount:u.projects.length}}),{manifest:u,snapshotPath:n}}catch(c){throw await E__default.remove(s),await De(e,{action:"snapshot.create",target:o,status:"failed",reason:t.reason,details:{error:c instanceof Error?c.message:String(c)}}),c}}async function Pn(t){let e=Ve(t.workspacePath),r=y__default.join(tr(e),Mr(t.name));if(!await E__default.pathExists(r))throw new Error(`Snapshot not found: ${t.name}`);let o=await Fr(r),n=Tr(r),s=await Ki(n);return {manifest:o,snapshotPath:r,filesRoot:n,estimatedFileCount:s.files,estimatedBytes:s.bytes}}async function bn(t={}){let e=Ve(t.workspacePath),r=tr(e);if(!await E__default.pathExists(r))return [];let o=await E__default.readdir(r,{withFileTypes:true}),n=[];for(let s of o){if(!s.isDirectory())continue;let a=y__default.join(r,s.name);try{n.push({...await Fr(a),snapshotPath:a});}catch{}}return n.sort((s,a)=>a.createdAt.localeCompare(s.createdAt))}async function jn(t){let e=Ve(t.workspacePath),r=y__default.join(tr(e),Mr(t.name));if(!await E__default.pathExists(r))throw new Error(`Snapshot not found: ${t.name}`);let o=await Fr(r),n=Tr(r),s=o.mode==="full"?["."]:Array.from(new Set(o.copiedPaths.map(l=>l.startsWith(".rapidkit/")?".rapidkit":l)));if(t.dryRun)return await De(e,{action:"snapshot.restore",target:o.name,status:"planned",reason:t.reason,details:{restoredPaths:s}}),{workspacePath:e,snapshotPath:r,restoredPaths:s,dryRun:true};if(!t.force)throw new Error("Restore is destructive. Re-run with --force after reviewing --dry-run output.");await er(e,"snapshot.restore",{reason:t.reason,safetySnapshot:t.safetySnapshot});let a;if(t.safetySnapshot!==false&&(a=(await gt({workspacePath:e,name:`pre-restore-${o.name}-${ft()}`,reason:`Automatic safety snapshot before restoring ${o.name}`,includeProjects:false})).snapshotPath),o.mode==="full")await E__default.copy(n,e,{overwrite:true,errorOnExist:false,filter:l=>Wr(n,l)});else for(let l of o.copiedPaths)await E__default.copy(y__default.join(n,l),y__default.join(e,l),{overwrite:true,errorOnExist:false});let c={workspacePath:e,snapshotPath:r,restoredPaths:s,dryRun:false,safetySnapshotPath:a};return await De(e,{action:"snapshot.restore",target:o.name,status:"succeeded",reason:t.reason,details:{restoredPaths:s,safetySnapshotPath:a}}),c}function Sn(t){let e=t.trim();if(!e)throw new Error("Project name/path is required.");return e}async function xn(t,e){let r=Sn(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 E__default.pathExists(o))return o;let s=(await a$7(t,{descendIntoMatchedProjects:false})).filter(a=>{let c=y__default.relative(t,a);return y__default.basename(a)===r||c===r});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 Kr(t){try{let{syncWorkspaceProjects:e}=await import('./workspace-AG2MQFTY.js');await e(t,true);}catch{}}function Li(t,e){let r=Nr.randomBytes(4).toString("hex");return y__default.join(Et(t),`${e}-${ft()}-${r}`)}async function Cn(t){let e=y__default.join(t,"rapidkit-archive.json"),r=await E__default.readJson(e);if(!r||typeof r!="object"||r.schema!==vn)throw new Error(`Invalid RapidKit archive manifest: ${e}`);return r}async function Lr(t={}){let e=Ve(t.workspacePath),r=Et(e);if(!await E__default.pathExists(r))return [];let o=await E__default.readdir(r,{withFileTypes:true}),n=[];for(let s of o){if(!s.isDirectory())continue;let a=y__default.join(r,s.name),c=y__default.join(a,"rapidkit-archive.json");try{n.push({...await Cn(a),archivePath:a,manifestPath:c});}catch{}}return n.sort((s,a)=>a.archivedAt.localeCompare(s.archivedAt))}async function Ji(t,e){let r=Sn(e),o=y__default.isAbsolute(r)?y__default.resolve(r):y__default.resolve(Et(t),r);if(o.startsWith(`${y__default.resolve(Et(t))}${y__default.sep}`)&&await E__default.pathExists(y__default.join(o,"rapidkit-archive.json")))return o;let s=(await Lr({workspacePath:t})).filter(a=>y__default.basename(a.archivePath)===r||a.projectName===r||y__default.relative(Et(t),a.archivePath)===r);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 Jr(t){let e=Ve(t.workspacePath),r=await xn(e,t.project),o=y__default.basename(r),n=Li(e,o),s=y__default.join(n,"rapidkit-archive.json");if(t.dryRun)return await De(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:s,dryRun:true};await er(e,"project.archive",{reason:t.reason,safetySnapshot:true});let a=await gt({workspacePath:e,name:`pre-archive-${o}-${ft()}`,reason:t.reason||`Automatic safety snapshot before archiving ${o}`,includeProjects:false});await E__default.ensureDir(y__default.dirname(n)),await E__default.move(r,n,{overwrite:false});let c={schema:vn,projectName:o,originalPath:r,archivedPath:n,reason:t.reason,archivedAt:new Date().toISOString(),safetySnapshotPath:a.snapshotPath};return await E__default.writeJson(s,c,{spaces:2}),await Ct(e,[r]),await Kr(e),await De(e,{action:"project.archive",target:o,status:"succeeded",reason:t.reason,details:{projectPath:r,archivePath:n,manifestPath:s,safetySnapshotPath:a.snapshotPath}}),{workspacePath:e,projectName:o,projectPath:r,action:"archive",archivePath:n,manifestPath:s,safetySnapshotPath:a.snapshotPath,dryRun:false}}async function Rn(t){if(!t.permanent)return Jr(t);let e=Ve(t.workspacePath),r=await xn(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 De(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 er(e,"project.delete",{reason:t.reason,permanent:true,safetySnapshot:true});let n=await gt({workspacePath:e,name:`pre-delete-${o}-${ft()}`,reason:t.reason||`Automatic safety snapshot before deleting ${o}`,includeProjects:false});return await E__default.remove(r),await Ct(e,[r]),await Kr(e),await De(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 En(t){let e=Ve(t.workspacePath),r=await Ji(e,t.archive),o=await Cn(r),n=t.targetName?.trim()||o.projectName,s=y__default.join(e,n);if(!s.startsWith(`${y__default.resolve(e)}${y__default.sep}`))throw new Error(`Archive restore target escapes workspace: ${n}`);if(await E__default.pathExists(s)&&!t.force)throw new Error(`Project path already exists. Re-run with --force to overwrite: ${s}`);if(t.dryRun)return await De(e,{action:"project.restore",target:n,status:"planned",reason:t.reason,details:{archivePath:r,projectPath:s}}),{workspacePath:e,projectName:n,projectPath:s,action:"restore",archivePath:r,manifestPath:y__default.join(r,"rapidkit-archive.json"),dryRun:true};await er(e,"project.restore",{reason:t.reason,safetySnapshot:true});let a=await gt({workspacePath:e,name:`pre-restore-project-${n}-${ft()}`,reason:t.reason||`Automatic safety snapshot before restoring ${n}`,includeProjects:false});return await E__default.move(r,s,{overwrite:t.force===true}),await Kr(e),await De(e,{action:"project.restore",target:n,status:"succeeded",reason:t.reason,details:{archivePath:r,projectPath:s,safetySnapshotPath:a.snapshotPath}}),{workspacePath:e,projectName:n,projectPath:s,action:"restore",archivePath:r,manifestPath:y__default.join(s,"rapidkit-archive.json"),safetySnapshotPath:a.snapshotPath,dryRun:false}}var Bi="rapidkit.infra-stack.v1",In="rapidkit.infra-plan.v1",ht=".rapidkit/infra/docker-compose.yml",yt=".rapidkit/reports/infra-plan.json",Vr=".rapidkit/infra/.env.example";function Vi(){let t=y__default.dirname(fileURLToPath(import.meta.url)),e=[y__default.join(t,"../../contracts/infra-stack.v1.json"),y__default.join(t,"../contracts/infra-stack.v1.json")];for(let r of e)if(v.existsSync(r))return r;throw new Error(`Infra stack contract not found. Expected contracts/infra-stack.v1.json beside the rapidkit package root. Checked: ${e.join(", ")}`)}var Br=null;function et(t){if(Br)return Br;let e=Vi(),r=v.readFileSync(e,"utf-8"),o=JSON.parse(r);if(o.schemaVersion!==Bi)throw new Error(`Unsupported infra stack schema: ${o.schemaVersion}`);return qi(o),(Br=o),o}function qi(t){let e=new Set(Object.keys(t.services));for(let[r,o]of Object.entries(t.moduleMappings)){if(!Array.isArray(o))throw new Error(`Invalid moduleMappings entry for ${r}`);for(let n of o)if(!e.has(n))throw new Error(`moduleMappings/${r} references unknown service '${n}'`)}for(let[r,o]of Object.entries(t.envVarMappings)){if(!Array.isArray(o))throw new Error(`Invalid envVarMappings entry for ${r}`);for(let n of o)if(!e.has(n))throw new Error(`envVarMappings/${r} references unknown service '${n}'`)}}function An(t,e){let r=e.startsWith("free/")?e:`free/${e}`;return t.moduleMappings[r]||[]}function wt(t,e){return t.envVarMappings[e.toUpperCase()]||[]}function $n(t,e){let r={};for(let o of e){let n=t.services[o];n&&Object.assign(r,n.connectionEnv);}return r}async function Ui(t){let e=y__default.join(t,"registry.json");if(!await E__default.pathExists(e))return [];try{let o=(await E__default.readJson(e)).installed_modules||[];return [...new Set(o.map(n=>typeof n.slug=="string"?n.slug.trim():"").filter(Boolean))]}catch{return []}}async function Hi(t){let e=y__default.join(t,".env.example");if(!await E__default.pathExists(e))return [];try{let r=await E__default.readFile(e,"utf-8"),o=[];for(let n of r.split(`
116
+ `)){let s=n.trim();if(!s||s.startsWith("#"))continue;let a=s.match(/^([A-Z0-9_]+)=/);a?.[1]&&o.push(a[1]);}return o}catch{return []}}async function zi(t){let e=y__default.join(t,".rapidkit","infra","overrides.json");if(!await E__default.pathExists(e))return [];try{let r=await E__default.readJson(e);return Array.isArray(r.services)?[...new Set(r.services.filter(o=>typeof o=="string"&&o.trim().length>0))]:[]}catch{return []}}async function Yi(t){let e=y__default.join(t,".rapidkit","workspace.contract.json");if(!await E__default.pathExists(e))return [];try{let r=await E__default.readJson(e),o=[];for(let n of r.projects||[]){let s=typeof n.slug=="string"?n.slug:"unknown";for(let a of n.contracts?.env||[])typeof a=="string"&&a.trim()&&o.push({project:s,env:a.trim().toUpperCase()});}return o}catch{return []}}function rr(t,e,r,o){t.add(r),e.push(o);}async function On(t){let e=y__default.resolve(t.workspacePath),r=t.contract||et(),o=new Set,n=[],s=new Set,a=new Set,c=new Set,l=await c$3(e);for(let u of l){let p=y__default.dirname(y__default.dirname(u)),d=y__default.basename(p);for(let f of await Ui(p)){s.add(f);for(let g of An(r,f))rr(o,n,g,{kind:"module",value:f,project:d});}for(let f of await Hi(p)){a.add(f);for(let g of wt(r,f))rr(o,n,g,{kind:"env-var",value:f,project:d});}}for(let u of await Yi(e)){a.add(u.env);for(let p of wt(r,u.env))rr(o,n,p,{kind:"contract-env",value:u.env,project:u.project});}for(let u of await zi(e))c.add(u),rr(o,n,u,{kind:"override",value:u});return {modules:[...s].sort(),envVars:[...a].sort(),overrides:[...c].sort(),sources:n,serviceIds:[...o].sort()}}function Qi(t){let e=t.trim();if(!e||e.startsWith("#"))return null;let r=e.indexOf("=");if(r<=0)return null;let o=e.slice(0,r).trim();if(!/^[A-Z0-9_]+$/.test(o))return null;let n=e.slice(r+1).trim();(n.startsWith('"')&&n.endsWith('"')||n.startsWith("'")&&n.endsWith("'"))&&(n=n.slice(1,-1));let s=n.match(/^\$\{[A-Z0-9_]+:-([^}]+)\}$/),a=(s?s[1]:n).trim();return a?{key:o,value:a}:null}async function Zi(t){if(!await E__default.pathExists(t))return {};try{let e=await E__default.readFile(t,"utf-8"),r={};for(let o of e.split(`
117
+ `)){let n=Qi(o);n&&(r[n.key]=n.value);}return r}catch{return {}}}async function Mn(t){let e={},r=await c$3(t.workspacePath);for(let o of r){let n=y__default.dirname(y__default.dirname(o)),s=await Zi(y__default.join(n,".env.example"));for(let[a,c]of Object.entries(s))wt(t.contract,a).length>0&&(e[a]=c);}return e}function Dn(t,e){return t.filter(r=>wt(e,r).length>0).sort()}function Tn(t){let e=t.RAPIDKIT_DB_POSTGRES_URL||t.DATABASE_URL;if(e?.startsWith("postgresql://"))try{let r=new URL(e),o=r.pathname.replace(/^\//,"");return {POSTGRES_USER:decodeURIComponent(r.username||"postgres"),POSTGRES_PASSWORD:decodeURIComponent(r.password||"postgres"),POSTGRES_DB:o||"postgres"}}catch{return}}function Wn(t){let e=t.POSTGRES_USER||"postgres",r=t.POSTGRES_DB||"postgres";return ["CMD-SHELL",`pg_isready -U ${e} -d ${r}`]}function Xi(t){return /[:#{}[\],&*!|>'"%@`]/.test(t)||t.includes(`
118
+ `)?JSON.stringify(t):t}function Fn(t,e){return Object.entries(t).map(([r,o])=>`${e}${r}: ${Xi(o)}`).join(`
119
+ `)}function ea(t,e){let r=t.test.map(o=>JSON.stringify(o)).join(", ");return [`${e}healthcheck:`,`${e} test: [${r}]`,`${e} interval: ${t.interval}`,`${e} timeout: ${t.timeout}`,`${e} retries: ${t.retries}`].join(`
120
+ `)}function Kn(t){let e=["# Generated by RapidKit infra plan \u2014 do not edit manually.",`# Workspace: ${t.workspaceName}`,`# Generated at: ${t.plan.generatedAt}`,"name: rapidkit-infra"],r=new Set;if(t.plan.services.length===0)return e.push("services: {}"),e.push(""),e.join(`
121
+ `);e.push("services:");for(let o of t.plan.services){let n=t.contract.services[o.id];if(n){if(e.push(` ${o.id}:`),e.push(` image: ${n.image}`),e.push(` container_name: rapidkit-${o.id}`),n.command?.length){let s=n.command.map(a=>JSON.stringify(a)).join(", ");e.push(` command: [${s}]`);}if(n.env&&Object.keys(n.env).length>0){e.push(" environment:");let s={...n.env,...t.plan.serviceEnvOverrides?.[o.id]||{}};e.push(Fn(s," "));}else t.plan.serviceEnvOverrides?.[o.id]&&(e.push(" environment:"),e.push(Fn(t.plan.serviceEnvOverrides[o.id]," ")));if(n.ports.length>0){e.push(" ports:");for(let s of n.ports)e.push(` - "${s.host}:${s.container}"`);}if(n.volumes?.length){e.push(" volumes:");for(let s of n.volumes){e.push(` - ${s}`);let a=s.split(":")[0];a&&!a.startsWith("/")&&r.add(a);}}if(n.healthcheck){let s=t.plan.serviceEnvOverrides?.[o.id];if(o.id==="postgres"&&s){let a=Wn(s).map(c=>JSON.stringify(c)).join(", ");e.push(" healthcheck:"),e.push(` test: [${a}]`),e.push(` interval: ${n.healthcheck.interval}`),e.push(` timeout: ${n.healthcheck.timeout}`),e.push(` retries: ${n.healthcheck.retries}`);}else e.push(ea(n.healthcheck," "));}e.push(" restart: unless-stopped");}}if(r.size>0){e.push("volumes:");for(let o of [...r].sort())e.push(` ${o}:`),e.push(" driver: local");}return e.push(""),e.join(`
122
+ `)}function ta(t,e,r){return t.kind==="override"?t.value===e:t.kind==="module"?r.moduleMappings[t.value]?.includes(e)??false:r.envVarMappings[t.value.toUpperCase()]?.includes(e)??false}function ra(t){let e=new Map,r=[];for(let o of t)for(let n of o.ports){let s=e.get(n.host);s&&s!==o.id?r.push(`Port collision on host ${n.host} between services '${s}' and '${o.id}'`):e.set(n.host,o.id);}return r}async function oa(t){let e=y__default.join(t,".rapidkit","workspace.json");if(await E__default.pathExists(e))try{let r=await E__default.readJson(e);return r.workspace_name||r.name}catch{return}}async function Ur(t){let e=y__default.resolve(t.workspacePath),r=et(),o=await On({workspacePath:e,contract:r}),n=o.serviceIds.map(f=>{let g=r.services[f];return g?{id:f,displayName:g.displayName,category:g.category,image:g.image,ports:g.ports,sources:o.sources.filter(m=>ta(m,f,r))}:null}).filter(f=>f!==null),s=ra(n);n.length===0&&s.push("No infrastructure services detected. Install modules with infra dependencies or add .rapidkit/infra/overrides.json");for(let f of o.overrides)r.services[f]||s.push(`Override references unknown service '${f}'`);let a=await E__default.pathExists(y__default.join(e,".rapidkit","workspace.contract.json"))?".rapidkit/workspace.contract.json":void 0,c=$n(r,o.serviceIds),l=await Mn({workspacePath:e,contract:r}),u={...c,...l};l.RAPIDKIT_DB_POSTGRES_URL&&(u.DATABASE_URL=l.RAPIDKIT_DB_POSTGRES_URL);let p={},d=Tn(u);return d&&o.serviceIds.includes("postgres")&&(p.postgres=d),{schemaVersion:In,generatedAt:(t.now||(()=>new Date))().toISOString(),workspacePath:e,workspaceName:await oa(e),contractPath:a,strategy:"sidecar",composePath:ht,envExamplePath:Vr,services:n,connectionEnv:u,serviceEnvOverrides:Object.keys(p).length>0?p:void 0,sources:{modules:o.modules,envVars:o.envVars,overrides:o.overrides},warnings:s}}async function Hr(t){let e=y__default.resolve(t.workspacePath),r=y__default.join(e,ht),o=y__default.join(e,yt),n=y__default.join(e,Vr),s=et(),a=Kn({plan:t.plan,contract:s,workspaceName:t.plan.workspaceName||y__default.basename(e)}),c=["# Generated by: npx rapidkit infra plan","# Copy values into project .env files as needed.",...Object.entries(t.plan.connectionEnv).map(([l,u])=>`${l}=${u}`),""].join(`
123
+ `);return t.dryRun?{composePath:r,planPath:o,envExamplePath:n}:(await E__default.ensureDir(y__default.dirname(r)),await E__default.ensureDir(y__default.dirname(o)),await E__default.writeFile(r,a,"utf-8"),await E__default.writeFile(o,`${JSON.stringify(t.plan,null,2)}
124
+ `,"utf-8"),await E__default.writeFile(n,c,"utf-8"),{composePath:r,planPath:o,envExamplePath:n})}function na(t){return y__default.resolve(t).split(y__default.sep).join("/")}async function Jn(){if((await execa("docker",["compose","version"],{reject:false,timeout:5e3})).exitCode===0)return {command:"docker",prefixArgs:["compose"]};if((await execa("docker-compose",["version"],{reject:false,timeout:5e3})).exitCode===0)return {command:"docker-compose",prefixArgs:[]};throw new Error("Docker Compose is not available. Install Docker Desktop or the docker-compose plugin, then verify with: docker compose version")}async function sa(){if((await execa("docker",["version"],{reject:false,timeout:5e3})).exitCode!==0)throw new Error("Docker is not available in PATH. Install Docker and ensure the daemon is running before using rapidkit infra.");await Jn();}function Gn(t){let e=t.toLowerCase();return e.includes("no space left on device")?"Docker failed because the disk is full. Free space with: docker system prune -f (or docker system prune -a --volumes -f).":e.includes("address already in use")||e.includes("bind")?"Docker failed to bind a host port. Stop the conflicting service or adjust ports in contracts/infra-stack.v1.json via .rapidkit/infra/overrides.json.":e.includes("cannot connect to the docker daemon")?"Docker daemon is not running. Start Docker Desktop or the docker service, then retry.":null}async function Bn(t){await sa();let e=await Jn(),r=na(t.composePath),o=await execa(e.command,[...e.prefixArgs,"-f",r,...t.args],{cwd:t.workspacePath,reject:false});return {exitCode:o.exitCode??1,stdout:o.stdout,stderr:o.stderr}}function nr(t){let e=t?y__default.resolve(t):Dr(process.cwd());if(!e)throw new Error("Not inside a RapidKit workspace. Run from workspace root or pass --workspace.");return e}function ia(t){return y__default.join(t,ht)}async function zr(t){let e=y__default.join(t,yt);if(!await E__default.pathExists(e))throw new Error(`Infra plan not found at ${yt}. Run: npx rapidkit infra plan`);return await E__default.readJson(e)}async function Yr(t){let e=ia(t.workspacePath);if(!await E__default.pathExists(e))throw new Error(`Compose file not found at ${ht}. Run: npx rapidkit infra plan`);return Bn({composePath:e,workspacePath:t.workspacePath,args:t.args})}function aa(t,e={}){if(console.log(i.bold(`
125
125
  RapidKit infra plan
126
- `)),console.log(i.gray(`Workspace: ${t.workspacePath}`)),t.workspaceName&&console.log(i.gray(`Name: ${t.workspaceName}`)),console.log(i.gray(`Strategy: ${t.strategy} (sidecar compose)`)),console.log(i.gray(`Compose: ${t.composePath}`)),console.log(i.gray(`Plan report: ${wt}`)),console.log(i.gray(`Env example: ${t.envExamplePath}`)),console.log(""),t.services.length===0)console.log(i.yellow("No infrastructure services detected."));else {console.log(i.bold("Services:"));for(let r of t.services){let o=r.ports.map(n=>`${n.host}:${n.container}`).join(", ");console.log(i.cyan(` ${r.id}`),i.gray(`(${r.displayName})`),o?i.white(`ports ${o}`):"");}}if(t.sources.modules.length>0&&(console.log(""),console.log(i.bold("Detected from modules:")),console.log(i.gray(` ${t.sources.modules.join(", ")}`))),t.sources.envVars.length>0){let r=rt(),o=Fn(t.sources.envVars,r);console.log(i.bold("Detected from env vars (infra-mapped):")),o.length>0?console.log(i.gray(` ${o.join(", ")}`)):console.log(i.gray(" none"));let n=t.sources.envVars.length-o.length;if(n>0&&!e.verbose)console.log(i.gray(` (${n} other project env vars scanned \u2014 use --verbose to list all)`));else if(e.verbose){let s=t.sources.envVars.filter(a=>!o.includes(a));s.length>0&&console.log(i.gray(` Other scanned env vars: ${s.join(", ")}`));}}if(t.sources.overrides.length>0&&(console.log(i.bold("Overrides:")),console.log(i.gray(` ${t.sources.overrides.join(", ")}`))),Object.keys(t.connectionEnv).length>0){console.log(""),console.log(i.bold("Connection env (preview):"));for(let[r,o]of Object.entries(t.connectionEnv))console.log(i.gray(` ${r}=${o}`));}if(t.warnings.length>0){console.log(""),console.log(i.yellow("Warnings:"));for(let r of t.warnings)console.log(i.yellow(` - ${r}`));}console.log("");}function Hn(t){let e=t.command("infra").description("Plan and manage workspace infrastructure (Docker sidecar stack)");e.command("plan").description("Discover infra needs and generate compose plan artifacts").option("--workspace <path>","Workspace root path").option("--json","Print plan as JSON").option("--dry-run","Compute plan without writing artifacts").option("--verbose","Show all scanned project env vars").action(async r=>{try{let o=ir(r.workspace),n=await Yr({workspacePath:o}),s=await Qr({workspacePath:o,plan:n,dryRun:r.dryRun});if(r.json){console.log(JSON.stringify({...n,artifacts:r.dryRun?{composePath:s.composePath,planPath:s.planPath,envExamplePath:s.envExamplePath,dryRun:true}:{composePath:s.composePath,planPath:s.planPath,envExamplePath:s.envExamplePath}},null,2));return}pa(n,{verbose:r.verbose}),r.dryRun?console.log(i.yellow(`Dry run \u2014 no files written.
126
+ `)),console.log(i.gray(`Workspace: ${t.workspacePath}`)),t.workspaceName&&console.log(i.gray(`Name: ${t.workspaceName}`)),console.log(i.gray(`Strategy: ${t.strategy} (sidecar compose)`)),console.log(i.gray(`Compose: ${t.composePath}`)),console.log(i.gray(`Plan report: ${yt}`)),console.log(i.gray(`Env example: ${t.envExamplePath}`)),console.log(""),t.services.length===0)console.log(i.yellow("No infrastructure services detected."));else {console.log(i.bold("Services:"));for(let r of t.services){let o=r.ports.map(n=>`${n.host}:${n.container}`).join(", ");console.log(i.cyan(` ${r.id}`),i.gray(`(${r.displayName})`),o?i.white(`ports ${o}`):"");}}if(t.sources.modules.length>0&&(console.log(""),console.log(i.bold("Detected from modules:")),console.log(i.gray(` ${t.sources.modules.join(", ")}`))),t.sources.envVars.length>0){let r=et(),o=Dn(t.sources.envVars,r);console.log(i.bold("Detected from env vars (infra-mapped):")),o.length>0?console.log(i.gray(` ${o.join(", ")}`)):console.log(i.gray(" none"));let n=t.sources.envVars.length-o.length;if(n>0&&!e.verbose)console.log(i.gray(` (${n} other project env vars scanned \u2014 use --verbose to list all)`));else if(e.verbose){let s=t.sources.envVars.filter(a=>!o.includes(a));s.length>0&&console.log(i.gray(` Other scanned env vars: ${s.join(", ")}`));}}if(t.sources.overrides.length>0&&(console.log(i.bold("Overrides:")),console.log(i.gray(` ${t.sources.overrides.join(", ")}`))),Object.keys(t.connectionEnv).length>0){console.log(""),console.log(i.bold("Connection env (preview):"));for(let[r,o]of Object.entries(t.connectionEnv))console.log(i.gray(` ${r}=${o}`));}if(t.warnings.length>0){console.log(""),console.log(i.yellow("Warnings:"));for(let r of t.warnings)console.log(i.yellow(` - ${r}`));}console.log("");}function Vn(t){let e=t.command("infra").description("Plan and manage workspace infrastructure (Docker sidecar stack)");e.command("plan").description("Discover infra needs and generate compose plan artifacts").option("--workspace <path>","Workspace root path").option("--json","Print plan as JSON").option("--dry-run","Compute plan without writing artifacts").option("--verbose","Show all scanned project env vars").action(async r=>{try{let o=nr(r.workspace),n=await Ur({workspacePath:o}),s=await Hr({workspacePath:o,plan:n,dryRun:r.dryRun});if(r.json){console.log(JSON.stringify({...n,artifacts:r.dryRun?{composePath:s.composePath,planPath:s.planPath,envExamplePath:s.envExamplePath,dryRun:true}:{composePath:s.composePath,planPath:s.planPath,envExamplePath:s.envExamplePath}},null,2));return}aa(n,{verbose:r.verbose}),r.dryRun?console.log(i.yellow(`Dry run \u2014 no files written.
127
127
  `)):(console.log(i.green("Artifacts written:")),console.log(i.gray(` ${s.composePath}`)),console.log(i.gray(` ${s.planPath}`)),console.log(i.gray(` ${s.envExamplePath}
128
128
  `)));}catch(o){console.error(i.red(`
129
129
  \u274C ${o instanceof Error?o.message:String(o)}
130
- `)),process.exit(1);}}),e.command("up").description("Start planned infrastructure services via Docker Compose").option("--workspace <path>","Workspace root path").option("--detach","Run containers in background",true).option("--build","Build images before starting").option("--no-plan","Skip refreshing plan artifacts before starting").action(async r=>{try{let o=ir(r.workspace);if(r.plan!==false){let c=await Yr({workspacePath:o});await Qr({workspacePath:o,plan:c});}if((await Zr(o)).services.length===0)throw new Error("Infra plan has no services. Run: npx rapidkit infra plan (from a workspace with .env.example, core modules, or .rapidkit/infra/overrides.json)");let s=["up"];r.detach!==false&&s.push("-d"),r.build&&s.push("--build");let a=await Xr({workspacePath:o,args:s});if(a.stdout&&process.stdout.write(a.stdout),a.stderr&&process.stderr.write(a.stderr),a.exitCode!==0){let c=qn(a.stderr);c&&console.error(i.yellow(`
130
+ `)),process.exit(1);}}),e.command("up").description("Start planned infrastructure services via Docker Compose").option("--workspace <path>","Workspace root path").option("--detach","Run containers in background",true).option("--build","Build images before starting").option("--no-plan","Skip refreshing plan artifacts before starting").action(async r=>{try{let o=nr(r.workspace);if(r.plan!==false){let c=await Ur({workspacePath:o});await Hr({workspacePath:o,plan:c});}if((await zr(o)).services.length===0)throw new Error("Infra plan has no services. Run: npx rapidkit infra plan (from a workspace with .env.example, core modules, or .rapidkit/infra/overrides.json)");let s=["up"];r.detach!==false&&s.push("-d"),r.build&&s.push("--build");let a=await Yr({workspacePath:o,args:s});if(a.stdout&&process.stdout.write(a.stdout),a.stderr&&process.stderr.write(a.stderr),a.exitCode!==0){let c=Gn(a.stderr);c&&console.error(i.yellow(`
131
131
  \u26A0\uFE0F ${c}
132
132
  `)),process.exit(a.exitCode);}r.detach!==false&&(console.log(i.green(`
133
133
  \u2705 Infrastructure stack started.
134
134
  `)),console.log(i.gray(`Check status: npx rapidkit infra status
135
135
  `)));}catch(o){console.error(i.red(`
136
136
  \u274C ${o instanceof Error?o.message:String(o)}
137
- `)),process.exit(1);}}),e.command("down").description("Stop planned infrastructure services").option("--workspace <path>","Workspace root path").option("--volumes","Remove named volumes").action(async r=>{try{let o=ir(r.workspace);await Zr(o);let n=["down"];r.volumes&&n.push("-v");let s=await Xr({workspacePath:o,args:n});s.stdout&&process.stdout.write(s.stdout),s.stderr&&process.stderr.write(s.stderr),s.exitCode!==0&&process.exit(s.exitCode),console.log(i.green(`
137
+ `)),process.exit(1);}}),e.command("down").description("Stop planned infrastructure services").option("--workspace <path>","Workspace root path").option("--volumes","Remove named volumes").action(async r=>{try{let o=nr(r.workspace);await zr(o);let n=["down"];r.volumes&&n.push("-v");let s=await Yr({workspacePath:o,args:n});s.stdout&&process.stdout.write(s.stdout),s.stderr&&process.stderr.write(s.stderr),s.exitCode!==0&&process.exit(s.exitCode),console.log(i.green(`
138
138
  \u2705 Infrastructure stack stopped.
139
139
  `));}catch(o){console.error(i.red(`
140
140
  \u274C ${o instanceof Error?o.message:String(o)}
141
- `)),process.exit(1);}}),e.command("status").description("Show Docker Compose status for planned infrastructure").option("--workspace <path>","Workspace root path").option("--json","Print docker compose ps JSON output").option("--strict","Exit non-zero when any container is not healthy/running").action(async r=>{try{let o=ir(r.workspace),n=await Zr(o),s=r.json?["ps","--format","json"]:["ps"],a=await Xr({workspacePath:o,args:s});if(r.json){a.stdout&&process.stdout.write(a.stdout),a.exitCode!==0&&process.exit(a.exitCode);return}console.log(i.bold(`
141
+ `)),process.exit(1);}}),e.command("status").description("Show Docker Compose status for planned infrastructure").option("--workspace <path>","Workspace root path").option("--json","Print docker compose ps JSON output").option("--strict","Exit non-zero when any container is not healthy/running").action(async r=>{try{let o=nr(r.workspace),n=await zr(o),s=r.json?["ps","--format","json"]:["ps"],a=await Yr({workspacePath:o,args:s});if(r.json){a.stdout&&process.stdout.write(a.stdout),a.exitCode!==0&&process.exit(a.exitCode);return}console.log(i.bold(`
142
142
  RapidKit infra status
143
143
  `)),console.log(i.gray(`Workspace: ${o}`)),console.log(i.gray(`Planned services: ${n.services.map(c=>c.id).join(", ")||"none"}`)),console.log(""),a.stdout.trim()?process.stdout.write(a.stdout):(console.log(i.yellow("No running containers found for the infra stack.")),console.log(i.gray(`Start with: npx rapidkit infra up
144
144
  `))),a.exitCode!==0&&(a.stderr&&process.stderr.write(a.stderr),process.exit(a.exitCode)),r.strict&&/Restarting|Exit|unhealthy/i.test(a.stdout)&&(console.log(""),console.log(i.red("One or more infra containers are not healthy.")),console.log(i.gray(`Inspect logs with: docker logs rapidkit-postgres (or redis/mailpit)
145
145
  `)),process.exit(1));}catch(o){console.error(i.red(`
146
146
  \u274C ${o instanceof Error?o.message:String(o)}
147
- `)),process.exit(1);}});}var ar=class{constructor(e){this.runCommand=e;}runtime="dotnet";async run(e,r,o){return {exitCode:await this.runCommand(e,r,o)}}async ensureDotnetInstalled(e){return (await this.run("dotnet",["--version"],e)).exitCode===0?null:{exitCode:1,message:".NET SDK is not installed or not available on PATH. Install .NET 8+ from https://dotnet.microsoft.com/download and retry."}}findFilesBySuffix(e,r,o=3){let n=[],s=[{dir:e,depth:0}],a=new Set(["bin","obj",".git","node_modules",".rapidkit"]);for(;s.length>0;){let c=s.shift();if(!c||c.depth>o)continue;let l=[];try{l=P.readdirSync(c.dir,{withFileTypes:true});}catch{continue}for(let u of l){let d=y__default.join(c.dir,u.name);if(u.isDirectory()){a.has(u.name)||s.push({dir:d,depth:c.depth+1});continue}u.name.toLowerCase().endsWith(r.toLowerCase())&&n.push(d);}}return n.sort()}findProjectFile(e){let r=this.findFilesBySuffix(e,".csproj");return r.find(o=>!o.toLowerCase().includes(".tests.csproj"))||r[0]||null}findTestProjectFile(e){return this.findFilesBySuffix(e,".csproj").find(o=>o.toLowerCase().includes(".tests.csproj"))||null}async checkPrereqs(){return this.run("dotnet",["--version"],process.cwd())}async warmSetupCache(e){let r=await this.ensureDotnetInstalled(e);return r||this.run("dotnet",["nuget","locals","all","--list"],e)}async initProject(e){let r=await this.ensureDotnetInstalled(e);if(r)return r;let o=this.findProjectFile(e),n=await this.run("dotnet",o?["restore",o]:["restore"],e);return n.exitCode===0?n:{exitCode:n.exitCode,message:"dotnet restore failed. Check NuGet connectivity, package references, and .NET SDK workload availability, then retry."}}async runDev(e){let r=await this.ensureDotnetInstalled(e);if(r)return r;let o=this.findProjectFile(e),n=o?["watch","--project",o,"run"]:["watch","run"];return this.run("dotnet",n,e)}async runTest(e){let r=await this.ensureDotnetInstalled(e);if(r)return r;let o=this.findTestProjectFile(e)||this.findProjectFile(e);return this.run("dotnet",o?["test",o]:["test"],e)}async runBuild(e){let r=await this.ensureDotnetInstalled(e);if(r)return r;let o=this.findProjectFile(e);return this.run("dotnet",o?["build",o,"-c","Release"]:["build","-c","Release"],e)}async runStart(e){let r=await this.ensureDotnetInstalled(e);if(r)return r;let o=this.findProjectFile(e);return this.run("dotnet",o?["run","--project",o]:["run"],e)}async doctorHints(e){return ["Install .NET 8+ SDK and ensure dotnet is on PATH.","Run dotnet restore after changing package references.","Use dotnet format --verify-no-changes in CI for deterministic code style."]}};var cr=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."}}findGoRunTarget(e){let r=y__default.join(e,"main.go");if(P.existsSync(r))return "./main.go";let o=y__default.join(e,"cmd");try{let n=P.readdirSync(o,{withFileTypes:true}).filter(s=>s.isDirectory()).map(s=>s.name).sort();for(let s of n)if(P.existsSync(y__default.join(o,s,"main.go")))return `./cmd/${s}`}catch{}return "./."}findWorkspaceRoot(e){let r=e;for(;;){if(P.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(!P.existsSync(n))return "isolated";try{let c=P.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,r){let o=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),s=o==="shared-runtime-caches"?y__default.join(n||e,".rapidkit","cache","go"):y__default.join(e,".rapidkit","cache","go"),a=process.env.GOMODCACHE,c=process.env.GOCACHE;return process.env.GOMODCACHE=y__default.join(s,"mod"),process.env.GOCACHE=y__default.join(s,"build"),r().finally(()=>{typeof a>"u"?delete process.env.GOMODCACHE:process.env.GOMODCACHE=a,typeof c>"u"?delete process.env.GOCACHE:process.env.GOCACHE=c;})}async checkPrereqs(){return this.run("go",["version"],process.cwd())}async warmSetupCache(e){return this.withGoCacheEnv(e,async()=>{try{return process.env.GOMODCACHE&&P.mkdirSync(process.env.GOMODCACHE,{recursive:true}),process.env.GOCACHE&&P.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 P.existsSync(o)?this.run("make",["run"],e):this.run("go",["run",this.findGoRunTarget(e)],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","-buildvcs=false","./..."],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(s=>P.existsSync(s));if(o)return this.run(o,[],e);let n=await this.ensureGoInstalled(e);return n||this.run("go",["run",this.findGoRunTarget(e)],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 lr=class{constructor(e){this.runCommand=e;}runtime="java";isExecutable(e){if(process.platform==="win32")return true;try{return (P.statSync(e).mode&73)!==0}catch{return false}}ensureWrapperExecutable(e){if(process.platform==="win32"||this.isExecutable(e))return true;try{return P.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 P.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(!P.existsSync(r))return 21;try{let n=P.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||""}
147
+ `)),process.exit(1);}});}var sr=class{constructor(e){this.runCommand=e;}runCommand;runtime="dotnet";async run(e,r,o){return {exitCode:await this.runCommand(e,r,o)}}async ensureDotnetInstalled(e){return (await this.run("dotnet",["--version"],e)).exitCode===0?null:{exitCode:1,message:".NET SDK is not installed or not available on PATH. Install .NET 8+ from https://dotnet.microsoft.com/download and retry."}}findFilesBySuffix(e,r,o=3){let n=[],s=[{dir:e,depth:0}],a=new Set(["bin","obj",".git","node_modules",".rapidkit"]);for(;s.length>0;){let c=s.shift();if(!c||c.depth>o)continue;let l=[];try{l=v.readdirSync(c.dir,{withFileTypes:true});}catch{continue}for(let u of l){let p=y__default.join(c.dir,u.name);if(u.isDirectory()){a.has(u.name)||s.push({dir:p,depth:c.depth+1});continue}u.name.toLowerCase().endsWith(r.toLowerCase())&&n.push(p);}}return n.sort()}findProjectFile(e){let r=this.findFilesBySuffix(e,".csproj");return r.find(o=>!o.toLowerCase().includes(".tests.csproj"))||r[0]||null}findTestProjectFile(e){return this.findFilesBySuffix(e,".csproj").find(o=>o.toLowerCase().includes(".tests.csproj"))||null}async checkPrereqs(){return this.run("dotnet",["--version"],process.cwd())}async warmSetupCache(e){let r=await this.ensureDotnetInstalled(e);return r||this.run("dotnet",["nuget","locals","all","--list"],e)}async initProject(e){let r=await this.ensureDotnetInstalled(e);if(r)return r;let o=this.findProjectFile(e),n=await this.run("dotnet",o?["restore",o]:["restore"],e);return n.exitCode===0?n:{exitCode:n.exitCode,message:"dotnet restore failed. Check NuGet connectivity, package references, and .NET SDK workload availability, then retry."}}async runDev(e){let r=await this.ensureDotnetInstalled(e);if(r)return r;let o=this.findProjectFile(e),n=o?["watch","--project",o,"run"]:["watch","run"];return this.run("dotnet",n,e)}async runTest(e){let r=await this.ensureDotnetInstalled(e);if(r)return r;let o=this.findTestProjectFile(e)||this.findProjectFile(e);return this.run("dotnet",o?["test",o]:["test"],e)}async runBuild(e){let r=await this.ensureDotnetInstalled(e);if(r)return r;let o=this.findProjectFile(e);return this.run("dotnet",o?["build",o,"-c","Release"]:["build","-c","Release"],e)}async runStart(e){let r=await this.ensureDotnetInstalled(e);if(r)return r;let o=this.findProjectFile(e);return this.run("dotnet",o?["run","--project",o]:["run"],e)}async doctorHints(e){return ["Install .NET 8+ SDK and ensure dotnet is on PATH.","Run dotnet restore after changing package references.","Use dotnet format --verify-no-changes in CI for deterministic code style."]}};var ir=class{constructor(e){this.runCommand=e;}runCommand;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."}}findGoRunTarget(e){let r=y__default.join(e,"main.go");if(v.existsSync(r))return "./main.go";let o=y__default.join(e,"cmd");try{let n=v.readdirSync(o,{withFileTypes:true}).filter(s=>s.isDirectory()).map(s=>s.name).sort();for(let s of n)if(v.existsSync(y__default.join(o,s,"main.go")))return `./cmd/${s}`}catch{}return "./."}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 c=v.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,r){let o=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),s=o==="shared-runtime-caches"?y__default.join(n||e,".rapidkit","cache","go"):y__default.join(e,".rapidkit","cache","go"),a=process.env.GOMODCACHE,c=process.env.GOCACHE;return process.env.GOMODCACHE=y__default.join(s,"mod"),process.env.GOCACHE=y__default.join(s,"build"),r().finally(()=>{typeof a>"u"?delete process.env.GOMODCACHE:process.env.GOMODCACHE=a,typeof c>"u"?delete process.env.GOCACHE:process.env.GOCACHE=c;})}async checkPrereqs(){return this.run("go",["version"],process.cwd())}async warmSetupCache(e){return this.withGoCacheEnv(e,async()=>{try{return process.env.GOMODCACHE&&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",this.findGoRunTarget(e)],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","-buildvcs=false","./..."],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(s=>v.existsSync(s));if(o)return this.run(o,[],e);let n=await this.ensureGoInstalled(e);return n||this.run("go",["run",this.findGoRunTarget(e)],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 ar=class{constructor(e){this.runCommand=e;}runCommand;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||""}
148
148
  ${o.stderr||""}`,s=n.match(/version\s+"([^"]+)"/i);if(s?.[1])return this.parseMajorJavaVersion(s[1]);let a=n.match(/(?:openjdk|java)\s+(\d+(?:[._]\d+)?)/i);return a?.[1]?this.parseMajorJavaVersion(a[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||""}
149
- ${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=P.existsSync(y__default.join(e,"pom.xml")),o=P.existsSync(y__default.join(e,"mvnw"))||P.existsSync(y__default.join(e,"mvnw.cmd")),n=P.existsSync(y__default.join(e,"build.gradle"))||P.existsSync(y__default.join(e,"build.gradle.kts"))||P.existsSync(y__default.join(e,"settings.gradle"))||P.existsSync(y__default.join(e,"settings.gradle.kts")),s=P.existsSync(y__default.join(e,"gradlew"))||P.existsSync(y__default.join(e,"gradlew.bat"));return {hasMavenProject:r||o,hasMavenWrapper:o,hasGradleProject:n||s,hasGradleWrapper:s}}findWorkspaceRoot(e){let r=e;for(;;){if(P.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(!P.existsSync(n))return "isolated";try{let c=P.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 r=y__default.join(e,"mvnw.cmd");if(process.platform==="win32"&&P.existsSync(r))return {command:r,baseArgs:[]};let o=y__default.join(e,"mvnw");return P.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"&&P.existsSync(r))return {command:r,baseArgs:[]};let o=y__default.join(e,"gradlew");return P.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 s=n.shift();if(!s||o.has(s))continue;o.add(s);let a=[];try{a=P.readdirSync(s,{withFileTypes:true});}catch{continue}for(let c of a){if(!c.isDirectory()||c.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(c.name))continue;let l=y__default.join(s,c.name),u=this.inspectJavaProject(l);(u.hasMavenProject||u.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),s=o==="shared-runtime-caches"?y__default.join(n||e,".rapidkit","cache","java","m2"):y__default.join(e,".rapidkit","cache","java","m2"),a=o==="shared-runtime-caches"?y__default.join(n||e,".rapidkit","cache","java","gradle"):y__default.join(e,".rapidkit","cache","java","gradle"),c=process.env.MAVEN_OPTS,l=process.env.GRADLE_USER_HOME,u=`-Dmaven.repo.local=${s}`;return process.env.MAVEN_OPTS=c?`${c} ${u}`:u,process.env.GRADLE_USER_HOME=a,r().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,r,o=true){return this.withJavaCacheEnv(e,async()=>{try{let{command:n,baseArgs:s}=this.buildToolCommand(e),a=await this.runCommand(n,[...s,...r],e);if(a===0||!o)return {exitCode:a};let c=P.existsSync(y__default.join(e,"pom.xml")),l=P.existsSync(y__default.join(e,"build.gradle"))||P.existsSync(y__default.join(e,"build.gradle.kts"));return {exitCode:a,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 r=[y__default.join(e,"target"),y__default.join(e,"build","libs")];for(let o of r){if(!P.existsSync(o))continue;let s=P.readdirSync(o).filter(a=>a.toLowerCase().endsWith(".jar")).find(a=>!a.toLowerCase().endsWith("-sources.jar")&&!a.toLowerCase().endsWith("-javadoc.jar")&&!a.toLowerCase().endsWith("-plain.jar"));if(s)return y__default.join(o,s)}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 c=this.readRequiredJavaMajor(e),l=await this.detectInstalledJavaMajor(r,e);if(l!==null&&l<c)return {exitCode:1,message:`Detected Java ${l}, but project requires Java ${c}+.`};let u=y__default.join(process.env.JAVA_HOME||"","release");if(process.env.JAVA_HOME&&P.existsSync(u))try{let p=P.readFileSync(u,"utf-8").match(/^JAVA_VERSION="([^"]+)"/m),m=this.parseMajorJavaVersion(p?.[1]);if(m!==null&&m<c)return {exitCode:1,message:`Detected JAVA_HOME version ${m}, but project requires Java ${c}+.`}}catch{}}if(this.isMavenProject(e)||this.isGradleProject(e)){let c=this.detectBuildTool(e),l=c==="gradle"?["--version"]:["-version"],u=await this.runBuildTool(e,l);return u.exitCode!==0?u:c==="maven"&&!this.inspectJavaProject(e).hasMavenWrapper?this.checkSystemMavenVersion(e):u}let n=this.findWorkspaceRoot(e);if(n&&n===e){let c=this.discoverWorkspaceJavaProjects(n);if(c.length>0){let l=c.reduce((p,m)=>Math.max(p,this.readRequiredJavaMajor(m)),0);if(l>0){let p=await this.detectInstalledJavaMajor(r,e);if(p!==null&&p<l){let m=c.filter(g=>this.readRequiredJavaMajor(g)>p).map(g=>y__default.relative(e,g)).join(", ");return {exitCode:1,message:`Detected Java ${p}, but workspace project(s) [${m}] require Java ${l}+.`}}}let u=false,d=false;for(let p of c){let m=this.inspectJavaProject(p);m.hasMavenProject&&!m.hasMavenWrapper&&(u=true),m.hasGradleProject&&!m.hasGradleWrapper&&(d=true);}if(u){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 m=await this.checkSystemMavenVersion(e);if(m.exitCode!==0)return m}if(d){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 a=await this.withJavaCacheEnv(e,async()=>this.runCommand("gradle",["--version"],e));return a===0?{exitCode:0}:{exitCode:s||a||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&&P.mkdirSync(r,{recursive:true}),process.env.GRADLE_USER_HOME&&P.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 dr=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(P.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(!P.existsSync(n))return "isolated";try{let c=P.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,r,o){let n=this.resolveDependencyMode(e),s=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),a=n==="isolated"?y__default.join(e,".rapidkit","cache","node"):y__default.join(s||e,".rapidkit","cache","node"),c=process.env.npm_config_cache,l=process.env.npm_config_store_dir,u=process.env.RAPIDKIT_DEP_SHARING_MODE,d=process.env.RAPIDKIT_WORKSPACE_PATH;return process.env.RAPIDKIT_DEP_SHARING_MODE=n,s&&(process.env.RAPIDKIT_WORKSPACE_PATH=s),r==="pnpm"?(process.env.npm_config_store_dir=y__default.join(a,"pnpm-store"),process.env.npm_config_cache=y__default.join(a,"pnpm-cache")):r==="yarn"?process.env.npm_config_cache=y__default.join(a,"yarn-cache"):process.env.npm_config_cache=y__default.join(a,"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,typeof u>"u"?delete process.env.RAPIDKIT_DEP_SHARING_MODE:process.env.RAPIDKIT_DEP_SHARING_MODE=u,typeof d>"u"?delete process.env.RAPIDKIT_WORKSPACE_PATH:process.env.RAPIDKIT_WORKSPACE_PATH=d;})}detectPackageManager(e){if(P.existsSync(y__default.join(e,"package-lock.json")))return "npm";if(P.existsSync(y__default.join(e,"pnpm-lock.yaml")))return "pnpm";if(P.existsSync(y__default.join(e,"yarn.lock")))return "yarn";if(!this.commandAvailable("npm")){if(this.commandAvailable("pnpm"))return "pnpm";if(this.commandAvailable("yarn"))return "yarn"}return "npm"}hasPinnedPackageManager(e){return P.existsSync(y__default.join(e,"package-lock.json"))||P.existsSync(y__default.join(e,"pnpm-lock.yaml"))||P.existsSync(y__default.join(e,"yarn.lock"))}availablePackageManagers(e){let r=this.detectPackageManager(e);return this.hasPinnedPackageManager(e)?[r]:[r,...["npm","pnpm","yarn"].filter(n=>n!==r&&this.commandAvailable(n))]}commandAvailable(e){return spawnSync(e,["--version"],{stdio:"ignore",shell:process.platform==="win32"}).status===0}scriptArgs(e,r){return e==="npm"?["run",r]:["run",r]}async runScriptWithFallback(e,r){let o={exitCode:1};for(let n of this.availablePackageManagers(e))if(o=await this.withDependencyEnv(e,n,()=>this.run(n,this.scriptArgs(n,r),e)),o.exitCode===0)return o;return o}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&&P.mkdirSync(process.env.npm_config_cache,{recursive:true}),r==="pnpm"&&process.env.npm_config_store_dir&&P.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){return this.runScriptWithFallback(e,"dev")}async runTest(e){return this.runScriptWithFallback(e,"test")}async runBuild(e){return this.runScriptWithFallback(e,"build")}async runStart(e){return this.runScriptWithFallback(e,"start")}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 pr=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(P.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(!P.existsSync(n))return "isolated";try{let c=P.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,r){let o=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),s=o==="shared-runtime-caches"?y__default.join(n||e,".rapidkit","cache","python"):y__default.join(e,".rapidkit","cache","python"),a=process.env.PIP_CACHE_DIR,c=process.env.POETRY_CACHE_DIR;return process.env.PIP_CACHE_DIR=y__default.join(s,"pip"),process.env.POETRY_CACHE_DIR=y__default.join(s,"poetry"),r().finally(()=>{typeof a>"u"?delete process.env.PIP_CACHE_DIR:process.env.PIP_CACHE_DIR=a,typeof c>"u"?delete process.env.POETRY_CACHE_DIR:process.env.POETRY_CACHE_DIR=c;})}async checkPrereqs(){let e=process.cwd(),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 ga(){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$2(),typeof t.RAPIDKIT_SKIP_LOCK_SYNC>"u"&&(t.RAPIDKIT_SKIP_LOCK_SYNC="1"),t}function Je(t,e){return t==="go"?new cr((r,o,n)=>e.runCommandInCwd(r,o,n)):t==="node"?new dr((r,o,n)=>e.runCommandInCwd(r,o,n)):t==="java"?new lr((r,o,n)=>e.runCommandInCwd(r,o,n)):t==="dotnet"?new ar((r,o,n)=>e.runCommandInCwd(r,o,n)):new pr((r,o)=>e.runCoreRapidkit(r,{cwd:o,env:ga()}))}var Qn=y__default.join(Go.homedir(),".rapidkit","cache"),Zn=1440*60*1e3;function oo(){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(Qn,`vitest-${e}`):Qn}var mr=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(oo(),`${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<Zn)return a$1.debug(`Cache hit (memory): ${e}`),o.data;try{let n=this.getCachePath(e),s=await promises.readFile(n,"utf-8"),a=JSON.parse(s);if(a.version===r&&Date.now()-a.timestamp<Zn)return a$1.debug(`Cache hit (disk): ${e}`),this.memoryCache.set(e,a),a.data;await promises.unlink(n).catch(()=>{});}catch{a$1.debug(`Cache miss: ${e}`);}return null}async set(e,r,o="1.0"){let n={data:r,timestamp:Date.now(),version:o};this.memoryCache.set(e,n);try{await promises.mkdir(oo(),{recursive:true});let s=this.getCachePath(e),a=this.getTempCachePath(s);await promises.writeFile(a,JSON.stringify(n),"utf-8"),await promises.rename(a,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 r=this.getCachePath(e);await promises.unlink(r),a$1.debug(`Cache invalidated: ${e}`);}catch{}}async clear(){this.memoryCache.clear();try{let e=oo(),r=await promises.readdir(e);await Promise.all(r.map(o=>promises.unlink(y__default.join(e,o)))),a$1.debug("Cache cleared");}catch{}}};var Xn=[{id:"fastapi.standard",aliases:["fastapi","fastapi.standard"],label:"fastapi \u2014 FastAPI Standard Kit",description:"Core-backed FastAPI service scaffold.",owner:"core",runtime:"python",framework:"fastapi",moduleSupport:true,stability:"stable"},{id:"fastapi.ddd",aliases:["fastapi.ddd","fastapi-ddd"],label:"fastapi \u2014 FastAPI DDD Kit",description:"Core-backed FastAPI DDD service scaffold.",owner:"core",runtime:"python",framework:"fastapi",moduleSupport:true,stability:"stable"},{id:"nestjs.standard",aliases:["nestjs","nest","nestjs.standard"],label:"nestjs \u2014 NestJS Standard Kit",description:"Core-backed NestJS service scaffold.",owner:"core",runtime:"node",framework:"nestjs",moduleSupport:true,stability:"stable"},{id:"springboot.standard",aliases:["spring","springboot","springboot.standard","java"],label:"spring \u2014 Spring Boot Standard Kit",description:"npm-backed Spring Boot service scaffold.",owner:"npm",runtime:"java",framework:"springboot",moduleSupport:false,stability:"stable",generator:"springboot",createUsage:"rapidkit create project springboot.standard <name> [--java-version <major>] [--spring-boot-version <semver>] [--group-id <com.example>] [--package-name <com.example.app>] [--port <number>]"},{id:"gofiber.standard",aliases:["go","go.standard","fiber","gofiber","gofiber.standard","go/fiber"],label:"go/fiber \u2014 Go Fiber Standard Kit",description:"npm-backed Go Fiber service scaffold.",owner:"npm",runtime:"go",framework:"gofiber",moduleSupport:false,stability:"stable",generator:"gofiber",createUsage:"rapidkit create project gofiber.standard <name> [--output <dir>]"},{id:"gogin.standard",aliases:["gin","gogin","gogin.standard","go/gin"],label:"go/gin \u2014 Go Gin Standard Kit",description:"npm-backed Go Gin service scaffold.",owner:"npm",runtime:"go",framework:"gogin",moduleSupport:false,stability:"stable",generator:"gogin",createUsage:"rapidkit create project gogin.standard <name> [--output <dir>]"},{id:"dotnet.webapi.clean",aliases:["dotnet","dotnet.webapi","dotnet.webapi.clean","aspnet","aspnetcore","asp.net","asp.net-core","csharp","c#"],label:"dotnet \u2014 ASP.NET Core Clean Web API",description:"npm-backed ASP.NET Core Web API with clean architecture boundaries.",owner:"npm",runtime:"dotnet",framework:"dotnet",moduleSupport:false,stability:"preview",generator:"dotnet-webapi-clean",createUsage:"rapidkit create project dotnet.webapi.clean <name> [--target-framework net8.0] [--root-namespace <Company.Product>] [--port <number>]"}],no=new Map;for(let t of Xn){no.set(t.id.toLowerCase(),t);for(let e of t.aliases)no.set(e.toLowerCase(),t);}function It(t){return t?no.get(t.trim().toLowerCase())??null:null}function es(t){return It(t)?.id??t}function ts(){return Xn.filter(t=>t.owner==="core"||t.generator)}function At(t){return It(t)?.owner==="npm"}async function rs(t,e){if(!t.generator)throw new Error(`Kit is not backed by an npm generator: ${t.id}`);if(t.generator==="gofiber"){let{generateGoFiberKit:r}=await import('./gofiber-standard-NDCBY6OM.js');await r(e.projectPath,{project_name:e.projectName,module_path:e.projectName,skipGit:e.skipGit,skipInstall:e.skipInstall});return}if(t.generator==="gogin"){let{generateGoGinKit:r}=await import('./gogin-standard-WUOMIHDR.js');await r(e.projectPath,{project_name:e.projectName,module_path:e.projectName,skipGit:e.skipGit,skipInstall:e.skipInstall});return}if(t.generator==="springboot"){let{generateSpringBootKit:r}=await import('./springboot-standard-WQWB5E24.js');await r(e.projectPath,{project_name:e.projectName,artifact_id:e.projectName,java_version:Ne(e.args,"--java-version")?.trim(),spring_boot_version:Ne(e.args,"--spring-boot-version")?.trim(),springdoc_version:Ne(e.args,"--springdoc-version")?.trim(),group_id:Ne(e.args,"--group-id")?.trim(),package_name:Ne(e.args,"--package-name")?.trim(),description:Ne(e.args,"--description")?.trim(),port:Ne(e.args,"--port")?.trim(),skipGit:e.skipGit,skipInstall:e.skipInstall});return}if(t.generator==="dotnet-webapi-clean"){let{generateDotnetWebApiCleanKit:r}=await import('./dotnet-webapi-clean-TPQMNFSD.js');await r(e.projectPath,{project_name:e.projectName,target_framework:Ne(e.args,"--target-framework")?.trim(),root_namespace:Ne(e.args,"--root-namespace")?.trim(),description:Ne(e.args,"--description")?.trim(),port:Ne(e.args,"--port")?.trim(),skipGit:e.skipGit,skipInstall:e.skipInstall});return}throw new Error(`Unhandled npm kit generator: ${t.generator}`)}function Ne(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}=`));return o?o.slice(e.length+1):void 0}function wa(t){let e=t;for(;;){if(P.existsSync(y__default.join(e,".rapidkit-workspace"))||P.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 ka(t){let e=a$4(t);return b$2(e,t)?"go":d(e,t)?"java":c$1(e,t)?"node":f$1(e,t)?"python":"unknown"}function va(t,e){if(!P.existsSync(t))return null;let r=P.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)=>P.statSync(n).mtimeMs-P.statSync(o).mtimeMs),r[0])}function $t(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}function Pa(t,e){let r=y__default.join(t,".rapidkit","toolchain.lock");if(!P.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(P.readFileSync(r,"utf-8")),n=$t(o.runtime),a=["python","node","go","java"].filter(c=>{let l=$t(n[c]);return typeof l.version=="string"&&l.version.trim().length>0});if(a.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 c=$t(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:r}}return {gate:"env",status:"pass",summary:`Pinned runtimes: ${a.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 ba(t){let e=y__default.join(t,".rapidkit","reports","doctor-last-run.json");if(!P.existsSync(e))return {payload:null,path:e};try{let r=JSON.parse(P.readFileSync(e,"utf-8"));return c$4(r,"workspace")?{payload:r,path:e}:{payload:null,path:e}}catch{return {payload:null,path:e}}}function ja(t){let e=ba(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=$t(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 Sa(t){let e=y__default.join(t,".rapidkit","reports"),r=va(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(P.readFileSync(r,"utf-8")),n=String(o.status??"").toLowerCase(),s=$t(o.summary),a=Number(s.failedChecks??0);return n==="fail"||a>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 xa(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((a,c)=>{let l=Number(c.vulnerabilities??0);return Number.isFinite(l)?a+Math.max(0,l):a},0),s=o.filter(a=>a.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}:s>0?{gate:"dependency",status:"warn",summary:`${s} 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 Ca(t){return t.some(e=>e.status==="fail")?"fail":t.some(e=>e.status==="warn")?"warn":"pass"}async function Ra(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 so(t={}){let e=y__default.resolve(t.startPath??process.cwd()),r=wa(e)??e,o=ka(e),n=Pa(r,o),s=ja(r),a=Sa(r),c=xa(s.payload,r),l=[n,s.gate,a,c],u=Ca(l),d={schemaVersion:"v1",generatedAt:new Date().toISOString(),workspacePath:r,projectPath:e,action:t.action,overallStatus:u,blocking:u==="fail",blockingReasons:l.filter(p=>p.status==="fail").map(p=>`${p.gate}: ${p.summary}`),gates:l};return t.writeReport!==false&&(d.evidencePath=await Ra(r,d)),d}function Ea(t){return t==="pass"?i.green("PASS"):t==="warn"?i.yellow("WARN"):i.red("FAIL")}function _a(t){return t==="pass"?i.green("PASS"):t==="warn"?i.yellow("WARN"):i.red("FAIL")}async function ns(t){let e=await so({writeReport:true});if(t.json)console.log(JSON.stringify(e,null,2));else {console.log(i.bold.cyan(`
150
- \u{1F6A6} RapidKit Release Readiness
151
- `)),console.log(i.bold(`Workspace: ${i.cyan(y__default.basename(e.workspacePath))}`)),console.log(i.gray(`Path: ${e.workspacePath}`)),console.log(`Overall: ${_a(e.overallStatus)}`);for(let r of e.gates){console.log(` - ${r.gate}: ${Ea(r.status)} ${r.summary}`);for(let o of r.details)console.log(i.gray(` ${o}`));r.evidencePath&&console.log(i.gray(` evidence: ${r.evidencePath}`));}e.evidencePath&&console.log(i.gray(`
152
- Evidence saved: ${e.evidencePath}`));}t.strict&&e.overallStatus!=="pass"&&process.exit(1);}async function Oa(t){let e=await promises.readFile(t);return createHash("sha256").update(e).digest("hex")}async function ss(t,e){await _.outputFile(t,`${JSON.stringify(e,null,2)}
153
- `,"utf-8");}function Me(t,e){return y__default.isAbsolute(e)?e:y__default.join(t,e)}function Na(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 Da(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(s=>s.trim()).filter(s=>s.length>0&&!s.startsWith("#"));for(let s of n)r.add(s.toLowerCase());}catch{}return r}async function Ma(t,e,r){await _.ensureDir(y__default.dirname(e)),await new Promise((o,n)=>{let a=(t.startsWith("https://")?ds:ls).get(t,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",u=>{n(u);});});a.setTimeout(r,()=>{a.destroy(new Error(`Request timeout after ${r}ms`));}),a.on("error",c=>{n(c);});});}async function Ta(t,e,r,o,n){let s=new URL(t),a=JSON.stringify(e),c=s.protocol==="https:"?ds:ls;await new Promise((l,u)=>{let d=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(a),...o?{Authorization:`Bearer ${o}`}:{},...n||{}}},p=>{if(!p.statusCode||p.statusCode<200||p.statusCode>=300){u(new Error(`HTTP ${p.statusCode||"unknown"}`)),p.resume();return}p.resume(),l();});d.setTimeout(r,()=>{d.destroy(new Error(`Request timeout after ${r}ms`));}),d.on("error",p=>{u(p);}),d.write(a),d.end();});}function is(t){return new Promise(e=>setTimeout(e,t))}async function Wa(t,e,r,o){let n=Me(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})}
154
- `,"utf-8"),n}function Fa(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",s=createHmac(o,r).update(JSON.stringify(t)).digest("hex");return {headers:{[n]:s,"x-rapidkit-evidence-signature-alg":o}}}async function Ka(t,e,r){let o=(r.algorithm||"sha256").toLowerCase(),n=Me(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 s=await promises.readFile(n,"utf-8"),a=await promises.readFile(e),c=createVerify(o);c.update(a),c.end();let l=Buffer.from(r.signature,"base64"),u=c.verify(s,l),d=createHash("sha256").update(s).digest("hex");return {verified:u,algorithm:o,publicKeyPath:n,publicKeyFingerprint:d,signature:r.signature,message:u?"Attestation verified.":"Attestation signature verification failed."}}catch(s){return {verified:false,algorithm:o,publicKeyPath:n,publicKeyFingerprint:"",signature:r.signature,message:`Attestation verification error: ${s.message}`}}}async function La(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 s=r.signaturePath?Me(t,r.signaturePath):null;if(!s||!await _.pathExists(s))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:s};let a=["verify-blob",e,"--signature",s],c=r.certificatePath?Me(t,r.certificatePath):null;c&&a.push("--certificate",c);let l=r.bundlePath?Me(t,r.bundlePath):null;l&&a.push("--bundle",l);let u=r.keyPath?Me(t,r.keyPath):null;u&&a.push("--key",u),r.identity&&a.push("--certificate-identity",r.identity),r.issuer&&a.push("--certificate-oidc-issuer",r.issuer),r.rekorUrl&&a.push("--rekor-url",r.rekorUrl),o.requireTransparencyLog||a.push("--insecure-ignore-tlog");try{let d=await execa("cosign",a,{reject:false});return d.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:c,signaturePath:s}:{verified:false,tlogVerified:false,message:`Sigstore verification failed: ${d.stderr||d.stdout||"unknown error"}`,identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:l,certificatePath:c,signaturePath:s}}catch(d){return {verified:false,tlogVerified:false,message:`Sigstore verification error: ${d.message}`,identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:l,certificatePath:c,signaturePath:s}}}async function Ja(t,e){let r=e.algorithm||"sha256",o=Me(t,e.policyPath),n=Me(t,e.signaturePath),s=Me(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(s))return {verified:false,message:`Governance policy public key not found: ${s}`,policies:null};try{let a=await promises.readFile(o,"utf-8"),c=(await promises.readFile(n,"utf-8")).trim(),l=await promises.readFile(s,"utf-8"),u=createVerify(r);return u.update(a),u.end(),u.verify(l,Buffer.from(c,"base64"))?{verified:true,message:"Governance policy bundle verified.",policies:JSON.parse(a).policies||{}}:{verified:false,message:"Governance policy bundle signature verification failed.",policies:null}}catch(a){return {verified:false,message:`Governance policy bundle verification error: ${a.message}`,policies:null}}}async function io(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"),s=y__default.join(n,"mirror-config.json"),a=y__default.join(n,"mirror.lock"),c=y__default.join(n,"mirror","artifacts"),l=y__default.join(n,"reports"),u=await Da(t);if(!await _.pathExists(s))return r.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: .rapidkit/mirror-config.json not found."}),{checks:r,details:o};let d={};try{d=JSON.parse(await promises.readFile(s,"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||d.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(c);let m=Math.max(0,d.prefetch?.retries??2),g=Math.max(0,d.prefetch?.backoffMs??250),f=Math.max(1e3,d.prefetch?.timeoutMs??15e3),h=d.security?.requireAttestation===true,b=d.security?.requireSigstore===true,w=d.security?.requireTransparencyLog===true,k=d.security?.requireSignedGovernance===true,C=d.security?.evidenceExport,x=(process.env.RAPIDKIT_ENV||d.security?.governance?.environment||"dev").toLowerCase(),E=d.security?.governance?.policies||{};if(d.security?.governanceBundle){let T=await Ja(t,d.security.governanceBundle);if(r.push({id:"governance.bundle.verify",status:T.verified?"passed":"failed",message:T.message}),T.verified&&T.policies)E=T.policies,o.governanceBundleVerified=true;else if(k)return {checks:r,details:o}}let W=E[x],de=w||W?.requireTransparencyLog===true,he=[],Z=Array.isArray(d.artifacts)?d.artifacts:[],N=[];for(let T=0;T<Z.length;T+=1){let $=Z[T],S=$.id||`artifact-${T+1}`,ae=$.source?Me(t,$.source):null,Pe=Na($,S),U=y__default.join(c,Pe),fe=false,be={sourceType:"path",source:ae||$.url||"unknown",host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true};if(ae&&await _.pathExists(ae))await _.ensureDir(y__default.dirname(U)),await _.copyFile(ae,U),o.syncedArtifacts+=1,fe=true,be={sourceType:"path",source:ae,host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true},r.push({id:`mirror.sync.${S}`,status:"passed",message:`Mirrored artifact ${S} from source path.`});else if($.url){let F="";try{F=new URL($.url).hostname.toLowerCase();}catch{r.push({id:`mirror.prefetch.${S}`,status:"failed",message:`Invalid URL for ${S}: ${$.url}`});continue}if(!(process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||u.has(F))){r.push({id:`mirror.prefetch.trust.${S}`,status:"failed",message:`Untrusted mirror host for ${S}: ${F}. Add host to .rapidkit/trusted-sources.lock or set RAPIDKIT_TRUSTED_SOURCES=1.`});continue}if(e.offlineMode&&(await _.pathExists(U)?(fe=true,be={sourceType:"url",source:$.url,host:F,fetchedAt:new Date().toISOString(),attempts:0,trusted:true},r.push({id:`mirror.prefetch.${S}`,status:"passed",message:`Offline mode reused existing mirrored artifact ${S}.`})):r.push({id:`mirror.prefetch.${S}`,status:"failed",message:`Offline mode cannot prefetch remote artifact ${S} without an existing mirrored copy.`}),!fe))continue;if(!fe){let Y=null,_e=0;for(let $e=1;$e<=m+1;$e+=1){_e=$e;try{await Ma($.url,U,f),o.syncedArtifacts+=1,fe=true,be={sourceType:"url",source:$.url,host:F,fetchedAt:new Date().toISOString(),attempts:_e,trusted:true},r.push({id:`mirror.prefetch.${S}`,status:"passed",message:_e>1?`Prefetched artifact ${S} from ${F} after ${_e} attempts.`:`Prefetched artifact ${S} from ${F}.`});break}catch(yr){if(Y=yr,$e<=m){await is(g*$e);continue}}}if(!fe){r.push({id:`mirror.prefetch.${S}`,status:"failed",message:`Failed to prefetch ${S} after ${m+1} attempt(s): ${Y?.message||"unknown error"}`});continue}}if(!fe){r.push({id:`mirror.prefetch.${S}`,status:"failed",message:`Failed to prefetch ${S}.`});continue}}if(!fe){$.required||e.offlineMode?r.push({id:`mirror.sync.${S}`,status:"failed",message:`Mirror source missing for ${S}${ae?`: ${ae}`:""}`}):r.push({id:`mirror.sync.${S}`,status:"skipped",message:`Mirror source not found for optional artifact ${S}.`});continue}let Be=await Oa(U);if($.sha256&&$.sha256.toLowerCase()!==Be.toLowerCase()){r.push({id:`mirror.verify.${S}`,status:"failed",message:`Checksum mismatch for ${S}.`});continue}o.verifiedArtifacts+=1,r.push({id:`mirror.verify.${S}`,status:"passed",message:`Checksum verified for ${S}.`});let ge=$.attestation?await Ka(t,U,$.attestation):null;if($.attestation){if(r.push({id:`mirror.attest.${S}`,status:ge?.verified?"passed":"failed",message:ge?.message||"Attestation verification failed."}),!ge?.verified)continue}else if(h){r.push({id:`mirror.attest.${S}`,status:"failed",message:`Attestation is required but missing for ${S}.`});continue}else r.push({id:`mirror.attest.${S}`,status:"skipped",message:`No attestation provided for ${S}.`});let we=$.attestation?.sigstore,v=we?await La(t,U,we,{requireTransparencyLog:de}):null;if(we){if(r.push({id:`mirror.sigstore.${S}`,status:v?.verified?"passed":"failed",message:v?.message||"Sigstore verification failed."}),he.push({artifactId:S,verified:!!v?.verified,tlogVerified:!!v?.tlogVerified,identity:v?.identity||null,issuer:v?.issuer||null,rekorUrl:v?.rekorUrl||null,timestamp:new Date().toISOString(),environment:x}),!v?.verified)continue}else if(b){r.push({id:`mirror.sigstore.${S}`,status:"failed",message:`Sigstore attestation is required but missing for ${S}.`});continue}else r.push({id:`mirror.sigstore.${S}`,status:"skipped",message:`No Sigstore attestation provided for ${S}.`});if(we&&v?.verified&&W){let F=W.allowedIdentities||[];if(F.length>0){let Y=!!v.identity&&F.includes(v.identity);if(r.push({id:`mirror.sigstore.policy.identity.${S}`,status:Y?"passed":"failed",message:Y?`Sigstore identity policy passed for ${S} in ${x}.`:`Sigstore identity policy failed for ${S} in ${x}.`}),!Y)continue}let Ae=W.allowedIssuers||[];if(Ae.length>0){let Y=!!v.issuer&&Ae.includes(v.issuer);if(r.push({id:`mirror.sigstore.policy.issuer.${S}`,status:Y?"passed":"failed",message:Y?`Sigstore issuer policy passed for ${S} in ${x}.`:`Sigstore issuer policy failed for ${S} in ${x}.`}),!Y)continue}let ke=W.allowedRekorUrls||[];if(ke.length>0){let Y=!!v.rekorUrl&&ke.includes(v.rekorUrl);if(r.push({id:`mirror.sigstore.policy.rekor.${S}`,status:Y?"passed":"failed",message:Y?`Sigstore Rekor policy passed for ${S} in ${x}.`:`Sigstore Rekor policy failed for ${S} in ${x}.`}),!Y)continue}}else W&&r.push({id:`mirror.sigstore.policy.${S}`,status:"skipped",message:`Sigstore governance policy configured for ${x} but no verified Sigstore attestation for ${S}.`});let O=await promises.stat(U);N.push({id:S,path:y__default.relative(t,U),sha256:Be,size:O.size,provenance:be,attestation:{detached:{provided:!!$.attestation,verified:ge?.verified||false,algorithm:ge?.algorithm||null,publicKeyPath:ge?.publicKeyPath||null,publicKeyFingerprint:ge?.publicKeyFingerprint||null,signature:ge?.signature||null,verifiedAt:ge?.verified?new Date().toISOString():null},sigstore:{provided:!!we,verified:v?.verified||false,tlogVerified:v?.tlogVerified||false,identity:v?.identity||null,issuer:v?.issuer||null,rekorUrl:v?.rekorUrl||null,bundlePath:v?.bundlePath||null,certificatePath:v?.certificatePath||null,signaturePath:v?.signaturePath||null,verifiedAt:v?.verified?new Date().toISOString():null}}});}let ye=d.retention?.keepLast;if(typeof ye=="number"&&ye>0){let $=(await promises.readdir(c,{withFileTypes:true})).filter(S=>S.isFile()).map(S=>y__default.join(c,S.name));if($.length>ye){let S=await Promise.all($.map(async Pe=>({filePath:Pe,stat:await promises.stat(Pe)})));S.sort((Pe,U)=>U.stat.mtimeMs-Pe.stat.mtimeMs);let ae=S.slice(ye);for(let Pe of ae)await promises.unlink(Pe.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 xe={schemaVersion:"1.0",generatedAt:new Date().toISOString(),mode:d.mode||null,environment:x,artifacts:N};if(await promises.writeFile(a,`${JSON.stringify(xe,null,2)}
155
- `,"utf-8"),o.lockWritten=true,r.push({id:"mirror.lock.write",status:"passed",message:`Mirror lock updated at ${y__default.relative(t,a)}.`}),o.transparencyEvidenceRecords=he.length,he.length>0){let T={schemaVersion:"1.0",generatedAt:new Date().toISOString(),environment:x,records:he},$=new Date().toISOString().replace(/[:.]/g,"-"),S=y__default.join(l,`transparency-evidence-${$}.json`),ae=y__default.join(l,"transparency-evidence.latest.json");if(await _.ensureDir(l),await ss(S,T),await ss(ae,T),o.transparencyEvidenceWritten=true,r.push({id:"sigstore.evidence.write",status:"passed",message:`Transparency evidence written to ${y__default.relative(t,ae)}.`}),C?.enabled){let Pe=Math.max(1e3,C.timeoutMs??1e4);if(C.target==="file")if(!C.filePath)r.push({id:"sigstore.evidence.export.file",status:"failed",message:"Evidence export target=file requires security.evidenceExport.filePath."});else try{let U=Me(t,C.filePath);await _.ensureDir(y__default.dirname(U)),await promises.appendFile(U,`${JSON.stringify(T)}
156
- `,"utf-8"),o.evidenceExported=true,o.evidenceExportTarget=U,r.push({id:"sigstore.evidence.export.file",status:"passed",message:`Transparency evidence exported to file sink ${U}.`});}catch(U){r.push({id:"sigstore.evidence.export.file",status:"failed",message:`Evidence file export failed: ${U.message}`});}else if(C.target==="http")if(!C.endpoint)r.push({id:"sigstore.evidence.export.http",status:"failed",message:"Evidence export target=http requires security.evidenceExport.endpoint."});else {let U=Math.max(0,C.retries??0),fe=Math.max(0,C.backoffMs??500),be=Fa(T,C.signing);be.error&&r.push({id:"sigstore.evidence.export.http",status:"failed",message:be.error});try{let Be=C.authTokenEnv?process.env[C.authTokenEnv]:void 0,ge=false,we=null;for(let v=1;v<=U+1;v+=1)try{if(be.error)throw new Error(be.error);await Ta(C.endpoint,T,Pe,Be,be.headers),o.evidenceExported=true,o.evidenceExportTarget=C.endpoint,r.push({id:"sigstore.evidence.export.http",status:"passed",message:v>1?`Transparency evidence exported to HTTP endpoint ${C.endpoint} after ${v} attempts.`:`Transparency evidence exported to HTTP endpoint ${C.endpoint}.`}),ge=true;break}catch(O){we=O,v<=U&&await is(fe*v);}if(!ge)throw we||new Error("unknown evidence export error")}catch(Be){let ge=`Evidence HTTP export failed: ${Be.message}`;r.push({id:"sigstore.evidence.export.http",status:"failed",message:ge});try{let we=await Wa(t,C.deadLetterPath,T,ge);r.push({id:"sigstore.evidence.export.deadletter",status:"passed",message:`Evidence export failure persisted to dead-letter sink ${we}.`});}catch(we){r.push({id:"sigstore.evidence.export.deadletter",status:"failed",message:`Evidence dead-letter write failed: ${we.message}`});}}}if(C.failOnError&&r.some(fe=>fe.status==="failed"&&(fe.id==="sigstore.evidence.export.file"||fe.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 ps(t){let e=g$1(t.detection.runtime),r=h$1({runtime:t.detection.runtime,moduleSupport:t.moduleSupport}),o=[];o.push({id:"framework-detection",status:t.detection.key==="unknown"?"warn":"pass",message:t.detection.key==="unknown"?"RapidKit could not confidently identify the backend framework.":`Detected ${t.detection.displayName} with ${t.detection.confidence} confidence.`,recommendation:t.detection.key==="unknown"?"Add .rapidkit/project.json metadata or import a project with recognizable runtime manifests.":void 0}),o.push({id:"runtime-support",status:e.tier==="observed"?"warn":"pass",message:`${e.displayName} is supported at ${e.tier} tier.`,recommendation:e.tier==="observed"?"Observed runtimes are contract-aware but may need manual commands until a first-class kit exists.":void 0}),o.push({id:"module-mutation-policy",status:t.moduleSupport?"pass":"warn",message:t.moduleSupport?"RapidKit module mutation is enabled for this project.":"RapidKit module mutation is disabled for this imported project.",recommendation:t.moduleSupport?void 0:"Use project lifecycle and workspace governance commands; enable module_support only after validating a compatible module generator."}),o.push({id:"lifecycle-commands",status:r.lifecycleCommands.length>1?"pass":"warn",message:r.lifecycleCommands.length>1?`Lifecycle commands available: ${r.lifecycleCommands.join(", ")}.`:"Only help-level lifecycle support is available for this runtime today.",recommendation:r.lifecycleCommands.length>1?void 0:"Add runtime scripts or a RapidKit runtime adapter before relying on dev/test/build/start."});let n=o.some(a=>a.status==="fail"),s=o.some(a=>a.status==="warn");return {schemaVersion:1,kind:"rapidkit.import_readiness",generatedAt:(t.generatedAt??new Date).toISOString(),status:n?"blocked":s?"review":"ready",project:{name:t.projectName,relativePath:t.relativePath,source:t.source},detection:{runtime:t.detection.runtime,framework:t.detection.key,frameworkDisplayName:t.detection.displayName,confidence:t.detection.confidence,supportTier:t.detection.supportTier,importStack:t.detection.importStack},commandSupport:{lifecycleCommands:r.lifecycleCommands,unsupportedLifecycleCommands:r.unsupportedLifecycleCommands,moduleCommands:r.moduleCommands},checks:o}}function us(t){return t.trim().toLowerCase().replace(/\.git$/i,"").replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,64)}function Ba(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(":"),s=(n[n.length-1]||o).replace(/\.git$/i,"");return us(s)||"imported-project"}function ao(t){let e=t.trim();return e.includes("://")||e.startsWith("git@")}function Va(t){return ao(t)?"git-url":"local-folder"}async function qa(t,e){let r=us(e)||"imported-project",o=0;for(;;){let n=o===0?r:o===1?`${r}-imported`:`${r}-imported-${o}`,s=y__default.join(t,n);if(!await ___default.pathExists(s))return s;o+=1;}}function Ua(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 Ha(t,e){if(Ua(t,e))throw new Error("Import source must be outside the current workspace root.")}function ms(t){return t.replace(/\\/g,"/")}function za(t){return t.startsWith(".env")?![".env.example",".env.sample",".env.template",".env.defaults",".env.dist"].includes(t):false}function Ya(t){let e=y__default.basename(t);return !([".git","node_modules",".venv","venv","__pycache__",".pytest_cache",".mypy_cache",".ruff_cache",".next",".turbo",".cache","dist","build","target","bin","obj","vendor","packages"].includes(e)||za(e)||e.endsWith(".pem")||e.endsWith(".key"))}function Qa(t){return t?.module_support===true}async function Za(t){let e=y__default.join(t,".rapidkit","project.json");if(!await ___default.pathExists(e))return null;try{return await ___default.readJson(e)}catch{return null}}async function Xa(t){let e=new Date().toISOString(),r=ms(y__default.relative(t.workspacePath,t.projectPath)),o=y__default.join(t.projectPath,".rapidkit","project.json"),n=y__default.join(t.projectPath,".rapidkit","import.json"),s=y__default.join(t.projectPath,".rapidkit","import-readiness.json"),a=Qa(t.existingProjectJson),c=Array.isArray(t.existingProjectJson?.modules)?t.existingProjectJson.modules:[],l=t.existingProjectJson?.contracts&&typeof t.existingProjectJson.contracts=="object"&&!Array.isArray(t.existingProjectJson.contracts)?t.existingProjectJson.contracts:{owns:[],apis:[],publishes:[],consumes:[],dependsOn:[],env:[]},u={...t.existingProjectJson||{},schema_version:typeof t.existingProjectJson?.schema_version=="string"?t.existingProjectJson.schema_version:"1.0",name:typeof t.existingProjectJson?.name=="string"?t.existingProjectJson.name:y__default.basename(t.projectPath),slug:typeof t.existingProjectJson?.slug=="string"?t.existingProjectJson.slug:y__default.basename(t.projectPath),runtime:t.detection.runtime,framework:t.detection.key,kit:typeof t.existingProjectJson?.kit=="string"?t.existingProjectJson.kit:`imported.${t.detection.key}`,kit_name:typeof t.existingProjectJson?.kit_name=="string"?t.existingProjectJson.kit_name:`imported.${t.detection.key}`,engine:typeof t.existingProjectJson?.engine=="string"?t.existingProjectJson.engine:"npm",module_support:a,modules:c,contracts:l,import:{managed_by:"rapidkit-npm",source_type:t.sourceType,imported_at:e,relative_path:r,detection:{framework:t.detection.key,runtime:t.detection.runtime,confidence:t.detection.confidence,support_tier:t.detection.supportTier,source:t.detection.source}}},d={schema_version:"1.0",kind:"rapidkit.imported_project",imported_at:e,managed_by:"rapidkit-npm",source:{type:t.sourceType,name:y__default.basename(t.projectPath)},project:{name:u.name,slug:u.slug,relative_path:r,module_support:a},detection:{framework:t.detection.key,framework_display_name:t.detection.displayName,runtime:t.detection.runtime,confidence:t.detection.confidence,support_tier:t.detection.supportTier,import_stack:t.detection.importStack,source:t.detection.source},policy:{copied_secrets:false,copied_dependency_caches:false,module_mutation_enabled:a}},p=ps({projectName:String(u.name),relativePath:r,source:t.sourceType,detection:t.detection,moduleSupport:a,generatedAt:new Date(e)});return await ___default.ensureDir(y__default.dirname(o)),await ___default.writeJson(o,u,{spaces:2}),await ___default.writeJson(n,d,{spaces:2}),await ___default.writeJson(s,p,{spaces:2}),{projectJsonPath:o,importJsonPath:n,importReadinessPath:s,moduleSupport:a}}async function ec(t,e){let r={name:e.name,path:e.path,relativePath:e.relativePath,stack:e.stack,runtime:e.runtime,framework:e.framework,frameworkDisplayName:e.frameworkDisplayName,supportTier:e.supportTier,moduleSupport:e.moduleSupport,confidence:e.confidence,source:e.source,importedAt:new Date().toISOString()};await vn(t,[r]);}async function fs(t){await ___default.pathExists(t)&&await ___default.remove(t);}async function gs(t,e){await fs(e),await Rt(t,[e]);}async function hs(t){let e=y__default.resolve(t.workspacePath),r=t.source.trim(),o=t.sourceType??Va(r),n=t.name??(o==="git-url"?Ba(r):y__default.basename(r)),s=await qa(e,n),a=false;try{if(o==="local-folder"){let p=y__default.resolve(r),m=await ___default.stat(p).catch(()=>null);if(!m||!m.isDirectory())throw new Error("Import source is not a directory.");Ha(e,p),a=true,await ___default.copy(p,s,{overwrite:false,errorOnExist:true,filter:Ya});}else a=true,await execa("git",["clone","--depth","1",r,s],{timeout:12e4});let c=await Za(s),l=e$3(s,c),u=await Xa({workspacePath:e,projectPath:s,sourceType:o,detection:l,existingProjectJson:c}),d={name:y__default.basename(s),path:s,relativePath:ms(y__default.relative(e,s)),stack:l.importStack,runtime:l.runtime,framework:l.key,frameworkDisplayName:l.displayName,supportTier:l.supportTier,moduleSupport:u.moduleSupport,confidence:l.confidence,source:o,projectJsonPath:u.projectJsonPath,importJsonPath:u.importJsonPath,importReadinessPath:u.importReadinessPath};return await ec(e,d),d}catch(c){if(a)try{await fs(s);}catch(l){let u=c instanceof Error?c.message:String(c),d=l instanceof Error?l.message:String(l);throw new Error(`Import failed: ${u}. Rollback also failed: ${d}`)}throw c}}function co(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 oc(t){let e=t.trim().toLowerCase();return e?e.startsWith("fastapi")?"fastapi":e.startsWith("nestjs")?"nestjs":null:null}function Ie(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 ko(){return d$3()}function ws(){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$2()),t.RAPIDKIT_SKIP_LOCK_SYNC||(t.RAPIDKIT_SKIP_LOCK_SYNC="1"),t.POETRY_KEYRING_ENABLED||(t.POETRY_KEYRING_ENABLED="false"),t.PYTHON_KEYRING_BACKEND||(t.PYTHON_KEYRING_BACKEND="keyring.backends.null.Keyring"),t.POETRY_NO_INTERACTION||(t.POETRY_NO_INTERACTION="1"),t}function nc(t){return f$2(y__default.join(t,".venv"))}async function Ns(t,e){return await V(t,["--version"],e)===0}async function Dt(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";if((await ___default.pathExists(t)?await P.promises.readdir(t,{withFileTypes:true}):[]).some(p=>p.isFile()&&p.name.toLowerCase().endsWith(".sln")))return "dotnet";let a=y__default.join(t,"src");if(await ___default.pathExists(a)&&(await P.promises.readdir(a,{withFileTypes:true})).some(m=>m.isFile()&&m.name.toLowerCase().endsWith(".csproj")))return "dotnet";let c=y__default.join(t,"package.json");if(await ___default.pathExists(c))return "node";let l=y__default.join(t,"pyproject.toml"),u=y__default.join(t,"requirements.txt"),d=y__default.join(t,"poetry.lock");return await ___default.pathExists(l)||await ___default.pathExists(u)||await ___default.pathExists(d)?"python":null}async function sc(t){for(let e of ko())if(await V(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function Ds(t){for(let e of ko())if(await V(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function ic(t){let e=f$2(y__default.join(t,".venv"));if(!await ___default.pathExists(e)){let s=await Ds(t);if(s!==0)return s}if(!await Ns("poetry",t))return 0;let o=await V("poetry",["config","virtualenvs.in-project","true","--local"],t);if(o!==0)return o;let n=await V("poetry",["env","use",e],t);return n!==0?n:0}async function ac(t){let e=f$2(y__default.join(t,".venv"));if(!await ___default.pathExists(e)){let n=await Ds(t);if(n!==0)return n}await V(e,["-m","pip","install","--upgrade","pip","setuptools","wheel"],t);let r=y__default.join(t,"requirements.txt");if(await ___default.pathExists(r)&&await V(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 V(e,["-m","pip","install","-e","."],t)===0||await V(e,["-m","pip","install","."],t)===0)?0:1}async function lo(t,e){return await ic(t)!==0&&console.log(i.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(i.yellow("\u26A0\uFE0F Python init fallback: installing dependencies directly into project .venv")),await ac(t))}async function po(t){let e=await Nt("init",t);if(e===0)return 0;let r=["npm","pnpm","yarn"];for(let o of r){if(!await Ns(o,t))continue;if(await V(o,["install"],t)===0)return console.log(i.green(`\u2705 Node init fallback succeeded with ${o} install`)),0}return e}function cc(t,e){let r=n=>/^\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?$/.test(n),o=Ie([...e],"--port");if(o&&!/^\d+$/.test(o.trim()))return "Invalid --port. Expected numeric TCP port, e.g. 8080";if(t==="springboot.standard"){let n=Ie([...e],"--java-version"),s=Ie([...e],"--spring-boot-version"),a=Ie([...e],"--springdoc-version"),c=Ie([...e],"--group-id"),l=Ie([...e],"--package-name");if(n&&!/^\d+$/.test(n.trim()))return "Invalid --java-version. Expected major version number, e.g. 21";if(s&&!r(s.trim()))return "Invalid --spring-boot-version. Expected semantic version, e.g. 3.5.0";if(a&&!r(a.trim()))return "Invalid --springdoc-version. Expected semantic version, e.g. 2.8.9";if(c&&!/^[A-Za-z0-9_.-]+$/.test(c.trim()))return "Invalid --group-id. Use dot-separated Java package identifiers only.";if(l&&!/^[A-Za-z0-9_.-]+$/.test(l.trim()))return "Invalid --package-name. Use dot-separated Java package identifiers only."}if(t==="dotnet.webapi.clean"){let n=Ie([...e],"--target-framework"),s=Ie([...e],"--root-namespace");if(n&&!/^net\d+\.\d+$/.test(n.trim()))return "Invalid --target-framework. Expected .NET target framework, e.g. net8.0";if(s&&!/^[A-Za-z0-9_.]+$/.test(s.trim()))return "Invalid --root-namespace. Use dot-separated .NET namespace identifiers only."}return null}async function gr(t){if(t[0]!=="create"||t[1]!=="project")return 1;let e=t[2],r=It(e),o=t[3];if(!r||r.owner!=="npm")return 1;if(!o)return process.stderr.write(`Usage: ${r.createUsage??"rapidkit create project <kit> <name> [--output <dir>]"}
157
- `),1;try{Ut(o);}catch(u){let d=u instanceof Error?u.message:String(u);return process.stderr.write(`${d}
158
- `),1}let n=cc(r.id,t);if(n)return process.stderr.write(`${n}
159
- `),1;let s=Ie(t,"--output")||process.cwd(),a=y__default.resolve(s,o),c=t.includes("--skip-git")||t.includes("--no-git"),l=t.includes("--skip-install");try{let{default:u}=await import('fs-extra');if(await u.ensureDir(y__default.dirname(a)),await u.pathExists(a))return process.stderr.write(`\u274C Directory "${a}" already exists
160
- `),1;await u.ensureDir(a),await rs(r,{projectName:o,projectPath:a,args:t,skipGit:c,skipInstall:l});let d=Q(process.cwd());if(d){let{syncWorkspaceProjects:p}=await import('./workspace-4VGM2NPS.js');await p(d,true);}return 0}catch(u){return process.stderr.write(`RapidKit ${r.id} generator failed: ${u?.message??u}
161
- `),1}}async function uo(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\`.
149
+ ${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")),s=v.existsSync(y__default.join(e,"gradlew"))||v.existsSync(y__default.join(e,"gradlew.bat"));return {hasMavenProject:r||o,hasMavenWrapper:o,hasGradleProject:n||s,hasGradleWrapper:s}}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 c=v.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 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 s=n.shift();if(!s||o.has(s))continue;o.add(s);let a=[];try{a=v.readdirSync(s,{withFileTypes:true});}catch{continue}for(let c of a){if(!c.isDirectory()||c.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(c.name))continue;let l=y__default.join(s,c.name),u=this.inspectJavaProject(l);(u.hasMavenProject||u.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),s=o==="shared-runtime-caches"?y__default.join(n||e,".rapidkit","cache","java","m2"):y__default.join(e,".rapidkit","cache","java","m2"),a=o==="shared-runtime-caches"?y__default.join(n||e,".rapidkit","cache","java","gradle"):y__default.join(e,".rapidkit","cache","java","gradle"),c=process.env.MAVEN_OPTS,l=process.env.GRADLE_USER_HOME,u=`-Dmaven.repo.local=${s}`;return process.env.MAVEN_OPTS=c?`${c} ${u}`:u,process.env.GRADLE_USER_HOME=a,r().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,r,o=true){return this.withJavaCacheEnv(e,async()=>{try{let{command:n,baseArgs:s}=this.buildToolCommand(e),a=await this.runCommand(n,[...s,...r],e);if(a===0||!o)return {exitCode:a};let c=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:a,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 r=[y__default.join(e,"target"),y__default.join(e,"build","libs")];for(let o of r){if(!v.existsSync(o))continue;let s=v.readdirSync(o).filter(a=>a.toLowerCase().endsWith(".jar")).find(a=>!a.toLowerCase().endsWith("-sources.jar")&&!a.toLowerCase().endsWith("-javadoc.jar")&&!a.toLowerCase().endsWith("-plain.jar"));if(s)return y__default.join(o,s)}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 c=this.readRequiredJavaMajor(e),l=await this.detectInstalledJavaMajor(r,e);if(l!==null&&l<c)return {exitCode:1,message:`Detected Java ${l}, but project requires Java ${c}+.`};let u=y__default.join(process.env.JAVA_HOME||"","release");if(process.env.JAVA_HOME&&v.existsSync(u))try{let d=v.readFileSync(u,"utf-8").match(/^JAVA_VERSION="([^"]+)"/m),f=this.parseMajorJavaVersion(d?.[1]);if(f!==null&&f<c)return {exitCode:1,message:`Detected JAVA_HOME version ${f}, but project requires Java ${c}+.`}}catch{}}if(this.isMavenProject(e)||this.isGradleProject(e)){let c=this.detectBuildTool(e),l=c==="gradle"?["--version"]:["-version"],u=await this.runBuildTool(e,l);return u.exitCode!==0?u:c==="maven"&&!this.inspectJavaProject(e).hasMavenWrapper?this.checkSystemMavenVersion(e):u}let n=this.findWorkspaceRoot(e);if(n&&n===e){let c=this.discoverWorkspaceJavaProjects(n);if(c.length>0){let l=c.reduce((d,f)=>Math.max(d,this.readRequiredJavaMajor(f)),0);if(l>0){let d=await this.detectInstalledJavaMajor(r,e);if(d!==null&&d<l){let f=c.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) [${f}] require Java ${l}+.`}}}let u=false,p=false;for(let d of c){let f=this.inspectJavaProject(d);f.hasMavenProject&&!f.hasMavenWrapper&&(u=true),f.hasGradleProject&&!f.hasGradleWrapper&&(p=true);}if(u){let d=await this.withJavaCacheEnv(e,async()=>this.runCommand("mvn",["-version"],e));if(d!==0)return {exitCode:d,message:"Maven is required for one or more workspace Java projects without Maven Wrapper. Install Maven 3.9+, or add mvnw/mvnw.cmd to those projects."};let f=await this.checkSystemMavenVersion(e);if(f.exitCode!==0)return f}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 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 a=await this.withJavaCacheEnv(e,async()=>this.runCommand("gradle",["--version"],e));return a===0?{exitCode:0}:{exitCode:s||a||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 cr=class{constructor(e){this.runCommand=e;}runCommand;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 c=v.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,r,o){let n=this.resolveDependencyMode(e),s=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),a=n==="isolated"?y__default.join(e,".rapidkit","cache","node"):y__default.join(s||e,".rapidkit","cache","node"),c=process.env.npm_config_cache,l=process.env.npm_config_store_dir,u=process.env.RAPIDKIT_DEP_SHARING_MODE,p=process.env.RAPIDKIT_WORKSPACE_PATH;return process.env.RAPIDKIT_DEP_SHARING_MODE=n,s&&(process.env.RAPIDKIT_WORKSPACE_PATH=s),r==="pnpm"?(process.env.npm_config_store_dir=y__default.join(a,"pnpm-store"),process.env.npm_config_cache=y__default.join(a,"pnpm-cache")):r==="yarn"?process.env.npm_config_cache=y__default.join(a,"yarn-cache"):process.env.npm_config_cache=y__default.join(a,"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,typeof u>"u"?delete process.env.RAPIDKIT_DEP_SHARING_MODE:process.env.RAPIDKIT_DEP_SHARING_MODE=u,typeof p>"u"?delete process.env.RAPIDKIT_WORKSPACE_PATH:process.env.RAPIDKIT_WORKSPACE_PATH=p;})}detectPackageManager(e){if(v.existsSync(y__default.join(e,"package-lock.json")))return "npm";if(v.existsSync(y__default.join(e,"pnpm-lock.yaml")))return "pnpm";if(v.existsSync(y__default.join(e,"yarn.lock")))return "yarn";if(!this.commandAvailable("npm")){if(this.commandAvailable("pnpm"))return "pnpm";if(this.commandAvailable("yarn"))return "yarn"}return "npm"}hasPinnedPackageManager(e){return v.existsSync(y__default.join(e,"package-lock.json"))||v.existsSync(y__default.join(e,"pnpm-lock.yaml"))||v.existsSync(y__default.join(e,"yarn.lock"))}availablePackageManagers(e){let r=this.detectPackageManager(e);return this.hasPinnedPackageManager(e)?[r]:[r,...["npm","pnpm","yarn"].filter(n=>n!==r&&this.commandAvailable(n))]}commandAvailable(e){return spawnSync(e,["--version"],{stdio:"ignore",shell:process.platform==="win32"}).status===0}scriptArgs(e,r){return e==="npm"?["run",r]:["run",r]}async runScriptWithFallback(e,r){let o={exitCode:1};for(let n of this.availablePackageManagers(e))if(o=await this.withDependencyEnv(e,n,()=>this.run(n,this.scriptArgs(n,r),e)),o.exitCode===0)return o;return o}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){return this.runScriptWithFallback(e,"dev")}async runTest(e){return this.runScriptWithFallback(e,"test")}async runBuild(e){return this.runScriptWithFallback(e,"build")}async runStart(e){return this.runScriptWithFallback(e,"start")}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 lr=class{constructor(e){this.runCore=e;}runCore;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 c=v.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,r){let o=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),s=o==="shared-runtime-caches"?y__default.join(n||e,".rapidkit","cache","python"):y__default.join(e,".rapidkit","cache","python"),a=process.env.PIP_CACHE_DIR,c=process.env.POETRY_CACHE_DIR;return process.env.PIP_CACHE_DIR=y__default.join(s,"pip"),process.env.POETRY_CACHE_DIR=y__default.join(s,"poetry"),r().finally(()=>{typeof a>"u"?delete process.env.PIP_CACHE_DIR:process.env.PIP_CACHE_DIR=a,typeof c>"u"?delete process.env.POETRY_CACHE_DIR:process.env.POETRY_CACHE_DIR=c;})}async checkPrereqs(){let e=process.cwd(),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 pa(){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$2(),typeof t.RAPIDKIT_SKIP_LOCK_SYNC>"u"&&(t.RAPIDKIT_SKIP_LOCK_SYNC="1"),t}function Fe(t,e){return t==="go"?new ir((r,o,n)=>e.runCommandInCwd(r,o,n)):t==="node"?new cr((r,o,n)=>e.runCommandInCwd(r,o,n)):t==="java"?new ar((r,o,n)=>e.runCommandInCwd(r,o,n)):t==="dotnet"?new sr((r,o,n)=>e.runCommandInCwd(r,o,n)):new lr((r,o)=>e.runCoreRapidkit(r,{cwd:o,env:pa()}))}var Hn=y__default.join(Ko.homedir(),".rapidkit","cache"),zn=1440*60*1e3;function eo(){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(Hn,`vitest-${e}`):Hn}var pr=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(eo(),`${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<zn)return a$1.debug(`Cache hit (memory): ${e}`),o.data;try{let n=this.getCachePath(e),s=await promises.readFile(n,"utf-8"),a=JSON.parse(s);if(a.version===r&&Date.now()-a.timestamp<zn)return a$1.debug(`Cache hit (disk): ${e}`),this.memoryCache.set(e,a),a.data;await promises.unlink(n).catch(()=>{});}catch{a$1.debug(`Cache miss: ${e}`);}return null}async set(e,r,o="1.0"){let n={data:r,timestamp:Date.now(),version:o};this.memoryCache.set(e,n);try{await promises.mkdir(eo(),{recursive:true});let s=this.getCachePath(e),a=this.getTempCachePath(s);await promises.writeFile(a,JSON.stringify(n),"utf-8"),await promises.rename(a,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 r=this.getCachePath(e);await promises.unlink(r),a$1.debug(`Cache invalidated: ${e}`);}catch{}}async clear(){this.memoryCache.clear();try{let e=eo(),r=await promises.readdir(e);await Promise.all(r.map(o=>promises.unlink(y__default.join(e,o)))),a$1.debug("Cache cleared");}catch{}}};var Yn=[{id:"fastapi.standard",aliases:["fastapi","fastapi.standard"],label:"fastapi \u2014 FastAPI Standard Kit",description:"Core-backed FastAPI service scaffold.",owner:"core",runtime:"python",framework:"fastapi",moduleSupport:true,stability:"stable"},{id:"fastapi.ddd",aliases:["fastapi.ddd","fastapi-ddd"],label:"fastapi \u2014 FastAPI DDD Kit",description:"Core-backed FastAPI DDD service scaffold.",owner:"core",runtime:"python",framework:"fastapi",moduleSupport:true,stability:"stable"},{id:"nestjs.standard",aliases:["nestjs","nest","nestjs.standard"],label:"nestjs \u2014 NestJS Standard Kit",description:"Core-backed NestJS service scaffold.",owner:"core",runtime:"node",framework:"nestjs",moduleSupport:true,stability:"stable"},{id:"springboot.standard",aliases:["spring","springboot","springboot.standard","java"],label:"spring \u2014 Spring Boot Standard Kit",description:"npm-backed Spring Boot service scaffold.",owner:"npm",runtime:"java",framework:"springboot",moduleSupport:false,stability:"stable",generator:"springboot",createUsage:"rapidkit create project springboot.standard <name> [--java-version <major>] [--spring-boot-version <semver>] [--group-id <com.example>] [--package-name <com.example.app>] [--port <number>]"},{id:"gofiber.standard",aliases:["go","go.standard","fiber","gofiber","gofiber.standard","go/fiber"],label:"go/fiber \u2014 Go Fiber Standard Kit",description:"npm-backed Go Fiber service scaffold.",owner:"npm",runtime:"go",framework:"gofiber",moduleSupport:false,stability:"stable",generator:"gofiber",createUsage:"rapidkit create project gofiber.standard <name> [--output <dir>]"},{id:"gogin.standard",aliases:["gin","gogin","gogin.standard","go/gin"],label:"go/gin \u2014 Go Gin Standard Kit",description:"npm-backed Go Gin service scaffold.",owner:"npm",runtime:"go",framework:"gogin",moduleSupport:false,stability:"stable",generator:"gogin",createUsage:"rapidkit create project gogin.standard <name> [--output <dir>]"},{id:"dotnet.webapi.clean",aliases:["dotnet","dotnet.webapi","dotnet.webapi.clean","aspnet","aspnetcore","asp.net","asp.net-core","csharp","c#"],label:"dotnet \u2014 ASP.NET Core Clean Web API",description:"npm-backed ASP.NET Core Web API with clean architecture boundaries.",owner:"npm",runtime:"dotnet",framework:"dotnet",moduleSupport:false,stability:"preview",generator:"dotnet-webapi-clean",createUsage:"rapidkit create project dotnet.webapi.clean <name> [--target-framework net8.0] [--root-namespace <Company.Product>] [--port <number>]"}],to=new Map;for(let t of Yn){to.set(t.id.toLowerCase(),t);for(let e of t.aliases)to.set(e.toLowerCase(),t);}function _t(t){return t?to.get(t.trim().toLowerCase())??null:null}function Qn(t){return _t(t)?.id??t}function Zn(){return Yn.filter(t=>t.owner==="core"||t.generator)}function It(t){return _t(t)?.owner==="npm"}async function Xn(t,e){if(!t.generator)throw new Error(`Kit is not backed by an npm generator: ${t.id}`);if(t.generator==="gofiber"){let{generateGoFiberKit:r}=await import('./gofiber-standard-NDCBY6OM.js');await r(e.projectPath,{project_name:e.projectName,module_path:e.projectName,skipGit:e.skipGit,skipInstall:e.skipInstall});return}if(t.generator==="gogin"){let{generateGoGinKit:r}=await import('./gogin-standard-WUOMIHDR.js');await r(e.projectPath,{project_name:e.projectName,module_path:e.projectName,skipGit:e.skipGit,skipInstall:e.skipInstall});return}if(t.generator==="springboot"){let{generateSpringBootKit:r}=await import('./springboot-standard-WQWB5E24.js');await r(e.projectPath,{project_name:e.projectName,artifact_id:e.projectName,java_version:Ae(e.args,"--java-version")?.trim(),spring_boot_version:Ae(e.args,"--spring-boot-version")?.trim(),springdoc_version:Ae(e.args,"--springdoc-version")?.trim(),group_id:Ae(e.args,"--group-id")?.trim(),package_name:Ae(e.args,"--package-name")?.trim(),description:Ae(e.args,"--description")?.trim(),port:Ae(e.args,"--port")?.trim(),skipGit:e.skipGit,skipInstall:e.skipInstall});return}if(t.generator==="dotnet-webapi-clean"){let{generateDotnetWebApiCleanKit:r}=await import('./dotnet-webapi-clean-TPQMNFSD.js');await r(e.projectPath,{project_name:e.projectName,target_framework:Ae(e.args,"--target-framework")?.trim(),root_namespace:Ae(e.args,"--root-namespace")?.trim(),description:Ae(e.args,"--description")?.trim(),port:Ae(e.args,"--port")?.trim(),skipGit:e.skipGit,skipInstall:e.skipInstall});return}throw new Error(`Unhandled npm kit generator: ${t.generator}`)}function Ae(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}=`));return o?o.slice(e.length+1):void 0}async function ya(t){let e=await promises.readFile(t);return createHash("sha256").update(e).digest("hex")}async function es(t,e){await E.outputFile(t,`${JSON.stringify(e,null,2)}
150
+ `,"utf-8");}function $e(t,e){return y__default.isAbsolute(e)?e:y__default.join(t,e)}function wa(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 ka(t){let e=y__default.join(t,".rapidkit","trusted-sources.lock"),r=new Set(["localhost","127.0.0.1"]);if(!await E.pathExists(e))return r;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)r.add(s.toLowerCase());}catch{}return r}async function va(t,e,r){await E.ensureDir(y__default.dirname(e)),await new Promise((o,n)=>{let a=(t.startsWith("https://")?ss:ns).get(t,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",u=>{n(u);});});a.setTimeout(r,()=>{a.destroy(new Error(`Request timeout after ${r}ms`));}),a.on("error",c=>{n(c);});});}async function Pa(t,e,r,o,n){let s=new URL(t),a=JSON.stringify(e),c=s.protocol==="https:"?ss:ns;await new Promise((l,u)=>{let p=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(a),...o?{Authorization:`Bearer ${o}`}:{},...n||{}}},d=>{if(!d.statusCode||d.statusCode<200||d.statusCode>=300){u(new Error(`HTTP ${d.statusCode||"unknown"}`)),d.resume();return}d.resume(),l();});p.setTimeout(r,()=>{p.destroy(new Error(`Request timeout after ${r}ms`));}),p.on("error",d=>{u(d);}),p.write(a),p.end();});}function ts(t){return new Promise(e=>setTimeout(e,t))}async function ba(t,e,r,o){let n=$e(t,e||".rapidkit/reports/evidence-export-dead-letter.ndjson");return await E.ensureDir(y__default.dirname(n)),await promises.appendFile(n,`${JSON.stringify({timestamp:new Date().toISOString(),reason:o,payload:r})}
151
+ `,"utf-8"),n}function ja(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",s=createHmac(o,r).update(JSON.stringify(t)).digest("hex");return {headers:{[n]:s,"x-rapidkit-evidence-signature-alg":o}}}async function Sa(t,e,r){let o=(r.algorithm||"sha256").toLowerCase(),n=$e(t,r.publicKeyPath);if(!await E.pathExists(n))return {verified:false,algorithm:o,publicKeyPath:n,publicKeyFingerprint:"",signature:r.signature,message:`Public key not found: ${n}`};try{let s=await promises.readFile(n,"utf-8"),a=await promises.readFile(e),c=createVerify(o);c.update(a),c.end();let l=Buffer.from(r.signature,"base64"),u=c.verify(s,l),p=createHash("sha256").update(s).digest("hex");return {verified:u,algorithm:o,publicKeyPath:n,publicKeyFingerprint:p,signature:r.signature,message:u?"Attestation verified.":"Attestation signature verification failed."}}catch(s){return {verified:false,algorithm:o,publicKeyPath:n,publicKeyFingerprint:"",signature:r.signature,message:`Attestation verification error: ${s.message}`}}}async function xa(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 s=r.signaturePath?$e(t,r.signaturePath):null;if(!s||!await E.pathExists(s))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:s};let a=["verify-blob",e,"--signature",s],c=r.certificatePath?$e(t,r.certificatePath):null;c&&a.push("--certificate",c);let l=r.bundlePath?$e(t,r.bundlePath):null;l&&a.push("--bundle",l);let u=r.keyPath?$e(t,r.keyPath):null;u&&a.push("--key",u),r.identity&&a.push("--certificate-identity",r.identity),r.issuer&&a.push("--certificate-oidc-issuer",r.issuer),r.rekorUrl&&a.push("--rekor-url",r.rekorUrl),o.requireTransparencyLog||a.push("--insecure-ignore-tlog");try{let p=await execa("cosign",a,{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:c,signaturePath:s}:{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:c,signaturePath:s}}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:c,signaturePath:s}}}async function Ca(t,e){let r=e.algorithm||"sha256",o=$e(t,e.policyPath),n=$e(t,e.signaturePath),s=$e(t,e.publicKeyPath);if(!await E.pathExists(o))return {verified:false,message:`Governance policy bundle not found: ${o}`,policies:null};if(!await E.pathExists(n))return {verified:false,message:`Governance policy signature not found: ${n}`,policies:null};if(!await E.pathExists(s))return {verified:false,message:`Governance policy public key not found: ${s}`,policies:null};try{let a=await promises.readFile(o,"utf-8"),c=(await promises.readFile(n,"utf-8")).trim(),l=await promises.readFile(s,"utf-8"),u=createVerify(r);return u.update(a),u.end(),u.verify(l,Buffer.from(c,"base64"))?{verified:true,message:"Governance policy bundle verified.",policies:JSON.parse(a).policies||{}}:{verified:false,message:"Governance policy bundle signature verification failed.",policies:null}}catch(a){return {verified:false,message:`Governance policy bundle verification error: ${a.message}`,policies:null}}}async function ro(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"),s=y__default.join(n,"mirror-config.json"),a=y__default.join(n,"mirror.lock"),c=y__default.join(n,"mirror","artifacts"),l=y__default.join(n,"reports"),u=await ka(t);if(!await E.pathExists(s))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(s,"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 E.ensureDir(c);let f=Math.max(0,p.prefetch?.retries??2),g=Math.max(0,p.prefetch?.backoffMs??250),m=Math.max(1e3,p.prefetch?.timeoutMs??15e3),h=p.security?.requireAttestation===true,P=p.security?.requireSigstore===true,C=p.security?.requireTransparencyLog===true,w=p.security?.requireSignedGovernance===true,k=p.security?.evidenceExport,x=(process.env.RAPIDKIT_ENV||p.security?.governance?.environment||"dev").toLowerCase(),_=p.security?.governance?.policies||{};if(p.security?.governanceBundle){let T=await Ca(t,p.security.governanceBundle);if(r.push({id:"governance.bundle.verify",status:T.verified?"passed":"failed",message:T.message}),T.verified&&T.policies)_=T.policies,o.governanceBundleVerified=true;else if(w)return {checks:r,details:o}}let $=_[x],ye=C||$?.requireTransparencyLog===true,U=[],Ne=Array.isArray(p.artifacts)?p.artifacts:[],W=[];for(let T=0;T<Ne.length;T+=1){let N=Ne[T],j=N.id||`artifact-${T+1}`,X=N.source?$e(t,N.source):null,Re=wa(N,j),H=y__default.join(c,Re),ge=false,Ce={sourceType:"path",source:X||N.url||"unknown",host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true};if(X&&await E.pathExists(X))await E.ensureDir(y__default.dirname(H)),await E.copyFile(X,H),o.syncedArtifacts+=1,ge=true,Ce={sourceType:"path",source:X,host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true},r.push({id:`mirror.sync.${j}`,status:"passed",message:`Mirrored artifact ${j} from source path.`});else if(N.url){let S="";try{S=new URL(N.url).hostname.toLowerCase();}catch{r.push({id:`mirror.prefetch.${j}`,status:"failed",message:`Invalid URL for ${j}: ${N.url}`});continue}if(!(process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||u.has(S))){r.push({id:`mirror.prefetch.trust.${j}`,status:"failed",message:`Untrusted mirror host for ${j}: ${S}. Add host to .rapidkit/trusted-sources.lock or set RAPIDKIT_TRUSTED_SOURCES=1.`});continue}if(e.offlineMode&&(await E.pathExists(H)?(ge=true,Ce={sourceType:"url",source:N.url,host:S,fetchedAt:new Date().toISOString(),attempts:0,trusted:true},r.push({id:`mirror.prefetch.${j}`,status:"passed",message:`Offline mode reused existing mirrored artifact ${j}.`})):r.push({id:`mirror.prefetch.${j}`,status:"failed",message:`Offline mode cannot prefetch remote artifact ${j} without an existing mirrored copy.`}),!ge))continue;if(!ge){let te=null,he=0;for(let je=1;je<=f+1;je+=1){he=je;try{await va(N.url,H,m),o.syncedArtifacts+=1,ge=true,Ce={sourceType:"url",source:N.url,host:S,fetchedAt:new Date().toISOString(),attempts:he,trusted:true},r.push({id:`mirror.prefetch.${j}`,status:"passed",message:he>1?`Prefetched artifact ${j} from ${S} after ${he} attempts.`:`Prefetched artifact ${j} from ${S}.`});break}catch(Le){if(te=Le,je<=f){await ts(g*je);continue}}}if(!ge){r.push({id:`mirror.prefetch.${j}`,status:"failed",message:`Failed to prefetch ${j} after ${f+1} attempt(s): ${te?.message||"unknown error"}`});continue}}if(!ge){r.push({id:`mirror.prefetch.${j}`,status:"failed",message:`Failed to prefetch ${j}.`});continue}}if(!ge){N.required||e.offlineMode?r.push({id:`mirror.sync.${j}`,status:"failed",message:`Mirror source missing for ${j}${X?`: ${X}`:""}`}):r.push({id:`mirror.sync.${j}`,status:"skipped",message:`Mirror source not found for optional artifact ${j}.`});continue}let Ee=await ya(H);if(N.sha256&&N.sha256.toLowerCase()!==Ee.toLowerCase()){r.push({id:`mirror.verify.${j}`,status:"failed",message:`Checksum mismatch for ${j}.`});continue}o.verifiedArtifacts+=1,r.push({id:`mirror.verify.${j}`,status:"passed",message:`Checksum verified for ${j}.`});let ke=N.attestation?await Sa(t,H,N.attestation):null;if(N.attestation){if(r.push({id:`mirror.attest.${j}`,status:ke?.verified?"passed":"failed",message:ke?.message||"Attestation verification failed."}),!ke?.verified)continue}else if(h){r.push({id:`mirror.attest.${j}`,status:"failed",message:`Attestation is required but missing for ${j}.`});continue}else r.push({id:`mirror.attest.${j}`,status:"skipped",message:`No attestation provided for ${j}.`});let be=N.attestation?.sigstore,F=be?await xa(t,H,be,{requireTransparencyLog:ye}):null;if(be){if(r.push({id:`mirror.sigstore.${j}`,status:F?.verified?"passed":"failed",message:F?.message||"Sigstore verification failed."}),U.push({artifactId:j,verified:!!F?.verified,tlogVerified:!!F?.tlogVerified,identity:F?.identity||null,issuer:F?.issuer||null,rekorUrl:F?.rekorUrl||null,timestamp:new Date().toISOString(),environment:x}),!F?.verified)continue}else if(P){r.push({id:`mirror.sigstore.${j}`,status:"failed",message:`Sigstore attestation is required but missing for ${j}.`});continue}else r.push({id:`mirror.sigstore.${j}`,status:"skipped",message:`No Sigstore attestation provided for ${j}.`});if(be&&F?.verified&&$){let S=$.allowedIdentities||[];if(S.length>0){let te=!!F.identity&&S.includes(F.identity);if(r.push({id:`mirror.sigstore.policy.identity.${j}`,status:te?"passed":"failed",message:te?`Sigstore identity policy passed for ${j} in ${x}.`:`Sigstore identity policy failed for ${j} in ${x}.`}),!te)continue}let O=$.allowedIssuers||[];if(O.length>0){let te=!!F.issuer&&O.includes(F.issuer);if(r.push({id:`mirror.sigstore.policy.issuer.${j}`,status:te?"passed":"failed",message:te?`Sigstore issuer policy passed for ${j} in ${x}.`:`Sigstore issuer policy failed for ${j} in ${x}.`}),!te)continue}let Y=$.allowedRekorUrls||[];if(Y.length>0){let te=!!F.rekorUrl&&Y.includes(F.rekorUrl);if(r.push({id:`mirror.sigstore.policy.rekor.${j}`,status:te?"passed":"failed",message:te?`Sigstore Rekor policy passed for ${j} in ${x}.`:`Sigstore Rekor policy failed for ${j} in ${x}.`}),!te)continue}}else $&&r.push({id:`mirror.sigstore.policy.${j}`,status:"skipped",message:`Sigstore governance policy configured for ${x} but no verified Sigstore attestation for ${j}.`});let Ze=await promises.stat(H);W.push({id:j,path:y__default.relative(t,H),sha256:Ee,size:Ze.size,provenance:Ce,attestation:{detached:{provided:!!N.attestation,verified:ke?.verified||false,algorithm:ke?.algorithm||null,publicKeyPath:ke?.publicKeyPath||null,publicKeyFingerprint:ke?.publicKeyFingerprint||null,signature:ke?.signature||null,verifiedAt:ke?.verified?new Date().toISOString():null},sigstore:{provided:!!be,verified:F?.verified||false,tlogVerified:F?.tlogVerified||false,identity:F?.identity||null,issuer:F?.issuer||null,rekorUrl:F?.rekorUrl||null,bundlePath:F?.bundlePath||null,certificatePath:F?.certificatePath||null,signaturePath:F?.signaturePath||null,verifiedAt:F?.verified?new Date().toISOString():null}}});}let G=p.retention?.keepLast;if(typeof G=="number"&&G>0){let N=(await promises.readdir(c,{withFileTypes:true})).filter(j=>j.isFile()).map(j=>y__default.join(c,j.name));if(N.length>G){let j=await Promise.all(N.map(async Re=>({filePath:Re,stat:await promises.stat(Re)})));j.sort((Re,H)=>H.stat.mtimeMs-Re.stat.mtimeMs);let X=j.slice(G);for(let Re of X)await promises.unlink(Re.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 we={schemaVersion:"1.0",generatedAt:new Date().toISOString(),mode:p.mode||null,environment:x,artifacts:W};if(await promises.writeFile(a,`${JSON.stringify(we,null,2)}
152
+ `,"utf-8"),o.lockWritten=true,r.push({id:"mirror.lock.write",status:"passed",message:`Mirror lock updated at ${y__default.relative(t,a)}.`}),o.transparencyEvidenceRecords=U.length,U.length>0){let T={schemaVersion:"1.0",generatedAt:new Date().toISOString(),environment:x,records:U},N=new Date().toISOString().replace(/[:.]/g,"-"),j=y__default.join(l,`transparency-evidence-${N}.json`),X=y__default.join(l,"transparency-evidence.latest.json");if(await E.ensureDir(l),await es(j,T),await es(X,T),o.transparencyEvidenceWritten=true,r.push({id:"sigstore.evidence.write",status:"passed",message:`Transparency evidence written to ${y__default.relative(t,X)}.`}),k?.enabled){let Re=Math.max(1e3,k.timeoutMs??1e4);if(k.target==="file")if(!k.filePath)r.push({id:"sigstore.evidence.export.file",status:"failed",message:"Evidence export target=file requires security.evidenceExport.filePath."});else try{let H=$e(t,k.filePath);await E.ensureDir(y__default.dirname(H)),await promises.appendFile(H,`${JSON.stringify(T)}
153
+ `,"utf-8"),o.evidenceExported=true,o.evidenceExportTarget=H,r.push({id:"sigstore.evidence.export.file",status:"passed",message:`Transparency evidence exported to file sink ${H}.`});}catch(H){r.push({id:"sigstore.evidence.export.file",status:"failed",message:`Evidence file export failed: ${H.message}`});}else if(k.target==="http")if(!k.endpoint)r.push({id:"sigstore.evidence.export.http",status:"failed",message:"Evidence export target=http requires security.evidenceExport.endpoint."});else {let H=Math.max(0,k.retries??0),ge=Math.max(0,k.backoffMs??500),Ce=ja(T,k.signing);Ce.error&&r.push({id:"sigstore.evidence.export.http",status:"failed",message:Ce.error});try{let Ee=k.authTokenEnv?process.env[k.authTokenEnv]:void 0,ke=false,be=null;for(let F=1;F<=H+1;F+=1)try{if(Ce.error)throw new Error(Ce.error);await Pa(k.endpoint,T,Re,Ee,Ce.headers),o.evidenceExported=true,o.evidenceExportTarget=k.endpoint,r.push({id:"sigstore.evidence.export.http",status:"passed",message:F>1?`Transparency evidence exported to HTTP endpoint ${k.endpoint} after ${F} attempts.`:`Transparency evidence exported to HTTP endpoint ${k.endpoint}.`}),ke=true;break}catch(Ze){be=Ze,F<=H&&await ts(ge*F);}if(!ke)throw be||new Error("unknown evidence export error")}catch(Ee){let ke=`Evidence HTTP export failed: ${Ee.message}`;r.push({id:"sigstore.evidence.export.http",status:"failed",message:ke});try{let be=await ba(t,k.deadLetterPath,T,ke);r.push({id:"sigstore.evidence.export.deadletter",status:"passed",message:`Evidence export failure persisted to dead-letter sink ${be}.`});}catch(be){r.push({id:"sigstore.evidence.export.deadletter",status:"failed",message:`Evidence dead-letter write failed: ${be.message}`});}}}if(k.failOnError&&r.some(ge=>ge.status==="failed"&&(ge.id==="sigstore.evidence.export.file"||ge.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 is(t){let e=g$1(t.detection.runtime),r=h$1({runtime:t.detection.runtime,moduleSupport:t.moduleSupport}),o=[];o.push({id:"framework-detection",status:t.detection.key==="unknown"?"warn":"pass",message:t.detection.key==="unknown"?"RapidKit could not confidently identify the backend framework.":`Detected ${t.detection.displayName} with ${t.detection.confidence} confidence.`,recommendation:t.detection.key==="unknown"?"Add .rapidkit/project.json metadata or import a project with recognizable runtime manifests.":void 0}),o.push({id:"runtime-support",status:e.tier==="observed"?"warn":"pass",message:`${e.displayName} is supported at ${e.tier} tier.`,recommendation:e.tier==="observed"?"Observed runtimes are contract-aware but may need manual commands until a first-class kit exists.":void 0}),o.push({id:"module-mutation-policy",status:t.moduleSupport?"pass":"warn",message:t.moduleSupport?"RapidKit module mutation is enabled for this project.":"RapidKit module mutation is disabled for this imported project.",recommendation:t.moduleSupport?void 0:"Use project lifecycle and workspace governance commands; enable module_support only after validating a compatible module generator."}),o.push({id:"lifecycle-commands",status:r.lifecycleCommands.length>1?"pass":"warn",message:r.lifecycleCommands.length>1?`Lifecycle commands available: ${r.lifecycleCommands.join(", ")}.`:"Only help-level lifecycle support is available for this runtime today.",recommendation:r.lifecycleCommands.length>1?void 0:"Add runtime scripts or a RapidKit runtime adapter before relying on dev/test/build/start."});let n=o.some(a=>a.status==="fail"),s=o.some(a=>a.status==="warn");return {schemaVersion:1,kind:"rapidkit.import_readiness",generatedAt:(t.generatedAt??new Date).toISOString(),status:n?"blocked":s?"review":"ready",project:{name:t.projectName,relativePath:t.relativePath,source:t.source},detection:{runtime:t.detection.runtime,framework:t.detection.key,frameworkDisplayName:t.detection.displayName,confidence:t.detection.confidence,supportTier:t.detection.supportTier,importStack:t.detection.importStack},commandSupport:{lifecycleCommands:r.lifecycleCommands,unsupportedLifecycleCommands:r.unsupportedLifecycleCommands,moduleCommands:r.moduleCommands},checks:o}}function as(t){return t.trim().toLowerCase().replace(/\.git$/i,"").replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,64)}function Ea(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(":"),s=(n[n.length-1]||o).replace(/\.git$/i,"");return as(s)||"imported-project"}function oo(t){let e=t.trim();return e.includes("://")||e.startsWith("git@")}function _a(t){return oo(t)?"git-url":"local-folder"}async function Ia(t,e){let r=as(e)||"imported-project",o=0;for(;;){let n=o===0?r:o===1?`${r}-imported`:`${r}-imported-${o}`,s=y__default.join(t,n);if(!await E__default.pathExists(s))return s;o+=1;}}function Aa(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 $a(t,e){if(Aa(t,e))throw new Error("Import source must be outside the current workspace root.")}function cs(t){return t.replace(/\\/g,"/")}function Oa(t){return t.startsWith(".env")?![".env.example",".env.sample",".env.template",".env.defaults",".env.dist"].includes(t):false}function Na(t){let e=y__default.basename(t);return !([".git","node_modules",".venv","venv","__pycache__",".pytest_cache",".mypy_cache",".ruff_cache",".next",".turbo",".cache","dist","build","target","bin","obj","vendor","packages"].includes(e)||Oa(e)||e.endsWith(".pem")||e.endsWith(".key"))}function Ma(t){return t?.module_support===true}async function Da(t){let e=y__default.join(t,".rapidkit","project.json");if(!await E__default.pathExists(e))return null;try{return await E__default.readJson(e)}catch{return null}}async function Ta(t){let e=new Date().toISOString(),r=cs(y__default.relative(t.workspacePath,t.projectPath)),o=y__default.join(t.projectPath,".rapidkit","project.json"),n=y__default.join(t.projectPath,".rapidkit","import.json"),s=y__default.join(t.projectPath,".rapidkit","import-readiness.json"),a=Ma(t.existingProjectJson),c=Array.isArray(t.existingProjectJson?.modules)?t.existingProjectJson.modules:[],l=t.existingProjectJson?.contracts&&typeof t.existingProjectJson.contracts=="object"&&!Array.isArray(t.existingProjectJson.contracts)?t.existingProjectJson.contracts:{owns:[],apis:[],publishes:[],consumes:[],dependsOn:[],env:[]},u={...t.existingProjectJson||{},schema_version:typeof t.existingProjectJson?.schema_version=="string"?t.existingProjectJson.schema_version:"1.0",name:typeof t.existingProjectJson?.name=="string"?t.existingProjectJson.name:y__default.basename(t.projectPath),slug:typeof t.existingProjectJson?.slug=="string"?t.existingProjectJson.slug:y__default.basename(t.projectPath),runtime:t.detection.runtime,framework:t.detection.key,kit:typeof t.existingProjectJson?.kit=="string"?t.existingProjectJson.kit:`imported.${t.detection.key}`,kit_name:typeof t.existingProjectJson?.kit_name=="string"?t.existingProjectJson.kit_name:`imported.${t.detection.key}`,engine:typeof t.existingProjectJson?.engine=="string"?t.existingProjectJson.engine:"npm",module_support:a,modules:c,contracts:l,import:{managed_by:"rapidkit-npm",source_type:t.sourceType,imported_at:e,relative_path:r,detection:{framework:t.detection.key,runtime:t.detection.runtime,confidence:t.detection.confidence,support_tier:t.detection.supportTier,source:t.detection.source}}},p={schema_version:"1.0",kind:"rapidkit.imported_project",imported_at:e,managed_by:"rapidkit-npm",source:{type:t.sourceType,name:y__default.basename(t.projectPath)},project:{name:u.name,slug:u.slug,relative_path:r,module_support:a},detection:{framework:t.detection.key,framework_display_name:t.detection.displayName,runtime:t.detection.runtime,confidence:t.detection.confidence,support_tier:t.detection.supportTier,import_stack:t.detection.importStack,source:t.detection.source},policy:{copied_secrets:false,copied_dependency_caches:false,module_mutation_enabled:a}},d=is({projectName:String(u.name),relativePath:r,source:t.sourceType,detection:t.detection,moduleSupport:a,generatedAt:new Date(e)});return await E__default.ensureDir(y__default.dirname(o)),await E__default.writeJson(o,u,{spaces:2}),await E__default.writeJson(n,p,{spaces:2}),await E__default.writeJson(s,d,{spaces:2}),{projectJsonPath:o,importJsonPath:n,importReadinessPath:s,moduleSupport:a}}async function Wa(t,e){let r={name:e.name,path:e.path,relativePath:e.relativePath,stack:e.stack,runtime:e.runtime,framework:e.framework,frameworkDisplayName:e.frameworkDisplayName,supportTier:e.supportTier,moduleSupport:e.moduleSupport,confidence:e.confidence,source:e.source,importedAt:new Date().toISOString()};await yn(t,[r]);}async function ls(t){await E__default.pathExists(t)&&await E__default.remove(t);}async function ds(t,e){await ls(e),await Ct(t,[e]);}async function ps(t){let e=y__default.resolve(t.workspacePath),r=t.source.trim(),o=t.sourceType??_a(r),n=t.name??(o==="git-url"?Ea(r):y__default.basename(r)),s=await Ia(e,n),a=false;try{if(o==="local-folder"){let d=y__default.resolve(r),f=await E__default.stat(d).catch(()=>null);if(!f||!f.isDirectory())throw new Error("Import source is not a directory.");$a(e,d),a=true,await E__default.copy(d,s,{overwrite:false,errorOnExist:true,filter:Na});}else a=true,await execa("git",["clone","--depth","1",r,s],{timeout:12e4});let c=await Da(s),l=e$3(s,c),u=await Ta({workspacePath:e,projectPath:s,sourceType:o,detection:l,existingProjectJson:c}),p={name:y__default.basename(s),path:s,relativePath:cs(y__default.relative(e,s)),stack:l.importStack,runtime:l.runtime,framework:l.key,frameworkDisplayName:l.displayName,supportTier:l.supportTier,moduleSupport:u.moduleSupport,confidence:l.confidence,source:o,projectJsonPath:u.projectJsonPath,importJsonPath:u.importJsonPath,importReadinessPath:u.importReadinessPath};return await Wa(e,p),p}catch(c){if(a)try{await ls(s);}catch(l){let u=c instanceof Error?c.message:String(c),p=l instanceof Error?l.message:String(l);throw new Error(`Import failed: ${u}. Rollback also failed: ${p}`)}throw c}}function no(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 La(t){let e=t.trim().toLowerCase();return e?e.startsWith("fastapi")?"fastapi":e.startsWith("nestjs")?"nestjs":null:null}function _e(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 go(){return d$3()}function ms(){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$2()),t.RAPIDKIT_SKIP_LOCK_SYNC||(t.RAPIDKIT_SKIP_LOCK_SYNC="1"),t.POETRY_KEYRING_ENABLED||(t.POETRY_KEYRING_ENABLED="false"),t.PYTHON_KEYRING_BACKEND||(t.PYTHON_KEYRING_BACKEND="keyring.backends.null.Keyring"),t.POETRY_NO_INTERACTION||(t.POETRY_NO_INTERACTION="1"),t}function Ja(t){return f$2(y__default.join(t,".venv"))}async function _s(t,e){return await q(t,["--version"],e)===0}async function Ot(t){let e=y__default.join(t,"go.mod");if(await E__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 E__default.pathExists(r)||await E__default.pathExists(o)||await E__default.pathExists(n))return "java";if((await E__default.pathExists(t)?await v.promises.readdir(t,{withFileTypes:true}):[]).some(d=>d.isFile()&&d.name.toLowerCase().endsWith(".sln")))return "dotnet";let a=y__default.join(t,"src");if(await E__default.pathExists(a)&&(await v.promises.readdir(a,{withFileTypes:true})).some(f=>f.isFile()&&f.name.toLowerCase().endsWith(".csproj")))return "dotnet";let c=y__default.join(t,"package.json");if(await E__default.pathExists(c))return "node";let l=y__default.join(t,"pyproject.toml"),u=y__default.join(t,"requirements.txt"),p=y__default.join(t,"poetry.lock");return await E__default.pathExists(l)||await E__default.pathExists(u)||await E__default.pathExists(p)?"python":null}async function Ga(t){for(let e of go())if(await q(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function Is(t){for(let e of go())if(await q(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function Ba(t){let e=f$2(y__default.join(t,".venv"));if(!await E__default.pathExists(e)){let s=await Is(t);if(s!==0)return s}if(!await _s("poetry",t))return 0;let o=await q("poetry",["config","virtualenvs.in-project","true","--local"],t);if(o!==0)return o;let n=await q("poetry",["env","use",e],t);return n!==0?n:0}async function Va(t){let e=f$2(y__default.join(t,".venv"));if(!await E__default.pathExists(e)){let n=await Is(t);if(n!==0)return n}await q(e,["-m","pip","install","--upgrade","pip","setuptools","wheel"],t);let r=y__default.join(t,"requirements.txt");if(await E__default.pathExists(r)&&await q(e,["-m","pip","install","-r","requirements.txt"],t)===0)return 0;let o=y__default.join(t,"pyproject.toml");return await E__default.pathExists(o)&&(await q(e,["-m","pip","install","-e","."],t)===0||await q(e,["-m","pip","install","."],t)===0)?0:1}async function so(t,e){return await Ba(t)!==0&&console.log(i.yellow("\u26A0\uFE0F Could not fully configure Poetry local venv. Trying fallback installer...")),(await e.initProject(t)).exitCode===0&&await E__default.pathExists(y__default.join(t,".venv"))?0:(console.log(i.yellow("\u26A0\uFE0F Python init fallback: installing dependencies directly into project .venv")),await Va(t))}async function io(t){let e=await $t("init",t);if(e===0)return 0;let r=["npm","pnpm","yarn"];for(let o of r){if(!await _s(o,t))continue;if(await q(o,["install"],t)===0)return console.log(i.green(`\u2705 Node init fallback succeeded with ${o} install`)),0}return e}function qa(t,e){let r=n=>/^\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?$/.test(n),o=_e([...e],"--port");if(o&&!/^\d+$/.test(o.trim()))return "Invalid --port. Expected numeric TCP port, e.g. 8080";if(t==="springboot.standard"){let n=_e([...e],"--java-version"),s=_e([...e],"--spring-boot-version"),a=_e([...e],"--springdoc-version"),c=_e([...e],"--group-id"),l=_e([...e],"--package-name");if(n&&!/^\d+$/.test(n.trim()))return "Invalid --java-version. Expected major version number, e.g. 21";if(s&&!r(s.trim()))return "Invalid --spring-boot-version. Expected semantic version, e.g. 3.5.0";if(a&&!r(a.trim()))return "Invalid --springdoc-version. Expected semantic version, e.g. 2.8.9";if(c&&!/^[A-Za-z0-9_.-]+$/.test(c.trim()))return "Invalid --group-id. Use dot-separated Java package identifiers only.";if(l&&!/^[A-Za-z0-9_.-]+$/.test(l.trim()))return "Invalid --package-name. Use dot-separated Java package identifiers only."}if(t==="dotnet.webapi.clean"){let n=_e([...e],"--target-framework"),s=_e([...e],"--root-namespace");if(n&&!/^net\d+\.\d+$/.test(n.trim()))return "Invalid --target-framework. Expected .NET target framework, e.g. net8.0";if(s&&!/^[A-Za-z0-9_.]+$/.test(s.trim()))return "Invalid --root-namespace. Use dot-separated .NET namespace identifiers only."}return null}async function mr(t){if(t[0]!=="create"||t[1]!=="project")return 1;let e=t[2],r=_t(e),o=t[3];if(!r||r.owner!=="npm")return 1;if(!o)return process.stderr.write(`Usage: ${r.createUsage??"rapidkit create project <kit> <name> [--output <dir>]"}
154
+ `),1;try{Vt(o);}catch(u){let p=u instanceof Error?u.message:String(u);return process.stderr.write(`${p}
155
+ `),1}let n=qa(r.id,t);if(n)return process.stderr.write(`${n}
156
+ `),1;let s=_e(t,"--output")||process.cwd(),a=y__default.resolve(s,o),c=t.includes("--skip-git")||t.includes("--no-git"),l=t.includes("--skip-install");try{let{default:u}=await import('fs-extra');if(await u.ensureDir(y__default.dirname(a)),await u.pathExists(a))return process.stderr.write(`\u274C Directory "${a}" already exists
157
+ `),1;await u.ensureDir(a),await Xn(r,{projectName:o,projectPath:a,args:t,skipGit:c,skipInstall:l});let p=ee(process.cwd());if(p){let{syncWorkspaceProjects:d}=await import('./workspace-AG2MQFTY.js');await d(p,true);}return 0}catch(u){return process.stderr.write(`RapidKit ${r.id} generator failed: ${u?.message??u}
158
+ `),1}}async function ao(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\`.
162
159
  Reason: ${e}.
163
160
  Install Python 3.10+ to use the interactive wizard and full kit catalog.
164
161
  `),1;let n=t[2],s=t[3];if(!n||!s)return process.stderr.write(`Usage: rapidkit create project <kit> <name> [--output <dir>]
165
162
  Tip: offline fallback supports only fastapi* and nestjs* kits.
166
- `),1;let a=oc(n);if(!a)return process.stderr.write(`RapidKit (npm) could not run the Python core engine to create this kit.
163
+ `),1;let a=La(n);if(!a)return process.stderr.write(`RapidKit (npm) could not run the Python core engine to create this kit.
167
164
  Reason: ${e}.
168
165
  Requested kit: ${n}
169
166
  Offline fallback only supports: fastapi.standard, nestjs.standard (and their shorthands).
170
167
  Install Python 3.10+ to access all kits.
171
- `),1;let c=Ie(t,"--output")||process.cwd(),l=y__default.resolve(c,s),u=t.includes("--skip-git")||t.includes("--no-git"),d=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
172
- `),1;let p="pip",m=Q(process.cwd());if(m)try{let{readWorkspaceMarker:f}=await import('./workspace-marker-IOPQ42A7.js'),h=await f(m);h?.metadata?.npm?.installMethod&&(p=h.metadata.npm.installMethod,a$1.debug(`Detected workspace engine: ${p}`));}catch(f){a$1.debug("Failed to read workspace marker",f);}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:s,template:a,kit_name:n,skipGit:u,skipInstall:d,engine:p}),m){let{syncWorkspaceProjects:f}=await import('./workspace-4VGM2NPS.js');await f(m,true),await vt(m,{silent:true});}return 0}catch(p){return process.stderr.write(`RapidKit (npm) offline fallback failed: ${p?.message??p}
173
- `),1}}async function Ms(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(i.gray("\u2139\uFE0F No subcommand provided for `create`; defaulting to `create workspace`."))):n=(await Ge.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 Ms(s)}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"),s=t[2]&&!t[2].startsWith("-")?t[2]:void 0,a=Ie(t,"--install-method"),c=a==="poetry"||a==="venv"||a==="pipx"?a:void 0,l=Ie(t,"--profile"),u=l==="minimal"||l==="java-only"||l==="go-only"||l==="dotnet-only"||l==="python-only"||l==="node-only"||l==="polyglot"||l==="enterprise"?l:void 0,d=s||(r?"my-workspace":(await Ge.prompt([{type:"input",name:"workspaceName",message:"Workspace name:",default:"my-workspace"}])).workspaceName);if(!d||!d.trim())return process.stderr.write(`Workspace name is required.
174
- `),1;try{Ut(d);}catch(h){if(h instanceof e)return process.stderr.write(`${h.message}
175
- `),1;throw h}let p=y__default.resolve(process.cwd(),d);if(!n&&await ___default.pathExists(p))return process.stderr.write(`\u274C Directory "${d}" already exists
176
- `),1;let m=await a$2(),g=m.author||process.env.USER||"RapidKit User";if(!r){let h=await Ge.prompt([{type:"input",name:"author",message:"Author name:",default:g}]);h.author?.trim()&&(g=h.author.trim());}let{createProject:f}=await import('./create-M7LT6WF6.js');return await f(d,{skipGit:o,yes:r,dryRun:n,userConfig:{...m,author:g},installMethod:c,profile:u}),0}catch(r){return process.stderr.write(`RapidKit (npm) failed to create workspace: ${r?.message??r}
177
- `),1}try{if(t[0]==="create"&&t[1]==="project"){if(t.includes("--help")||t.includes("-h"))try{return await d$1(),await e$1(["create","project","--help"],{cwd:process.cwd()})}catch(f){return process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${f?.message??f}
168
+ `),1;let c=_e(t,"--output")||process.cwd(),l=y__default.resolve(c,s),u=t.includes("--skip-git")||t.includes("--no-git"),p=t.includes("--skip-install");try{if(await E__default.ensureDir(y__default.dirname(l)),await E__default.pathExists(l))return process.stderr.write(`\u274C Directory "${l}" already exists
169
+ `),1;let d="pip",f=ee(process.cwd());if(f)try{let{readWorkspaceMarker:m}=await import('./workspace-marker-IOPQ42A7.js'),h=await m(f);h?.metadata?.npm?.installMethod&&(d=h.metadata.npm.installMethod,a$1.debug(`Detected workspace engine: ${d}`));}catch(m){a$1.debug("Failed to read workspace marker",m);}else a$1.debug("No workspace found, using default engine: pip");await E__default.ensureDir(l);let{generateDemoKit:g}=await import('./demo-kit-KTRITRWH.js');if(await g(l,{project_name:s,template:a,kit_name:n,skipGit:u,skipInstall:p,engine:d}),f){let{syncWorkspaceProjects:m}=await import('./workspace-AG2MQFTY.js');await m(f,true),await rt(f,{silent:true});}return 0}catch(d){return process.stderr.write(`RapidKit (npm) offline fallback failed: ${d?.message??d}
170
+ `),1}}async function As(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(i.gray("\u2139\uFE0F No subcommand provided for `create`; defaulting to `create workspace`."))):n=(await Ke.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 As(s)}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"),s=t[2]&&!t[2].startsWith("-")?t[2]:void 0,a=_e(t,"--install-method"),c=a==="poetry"||a==="venv"||a==="pipx"?a:void 0,l=_e(t,"--profile"),u=l==="minimal"||l==="java-only"||l==="go-only"||l==="dotnet-only"||l==="python-only"||l==="node-only"||l==="polyglot"||l==="enterprise"?l:void 0,p=s||(r?"my-workspace":(await Ke.prompt([{type:"input",name:"workspaceName",message:"Workspace name:",default:"my-workspace"}])).workspaceName);if(!p||!p.trim())return process.stderr.write(`Workspace name is required.
171
+ `),1;try{Vt(p);}catch(h){if(h instanceof e)return process.stderr.write(`${h.message}
172
+ `),1;throw h}let d=y__default.resolve(process.cwd(),p);if(!n&&await E__default.pathExists(d))return process.stderr.write(`\u274C Directory "${p}" already exists
173
+ `),1;let f=await a$2(),g=f.author||process.env.USER||"RapidKit User";if(!r){let h=await Ke.prompt([{type:"input",name:"author",message:"Author name:",default:g}]);h.author?.trim()&&(g=h.author.trim());}let{createProject:m}=await import('./create-BO2I3ESU.js');return await m(p,{skipGit:o,yes:r,dryRun:n,userConfig:{...f,author:g},installMethod:c,profile:u}),0}catch(r){return process.stderr.write(`RapidKit (npm) failed to create workspace: ${r?.message??r}
174
+ `),1}try{if(t[0]==="create"&&t[1]==="project"){if(t.includes("--help")||t.includes("-h"))try{return await d$1(),await e$1(["create","project","--help"],{cwd:process.cwd()})}catch(m){return process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${m?.message??m}
178
175
  `),1}if(!t[2]||t[2].startsWith("-")){console.log(i.bold(`
179
176
  \u{1F680} RapidKit
180
- `));let{kitChoice:f}=await Ge.prompt([{type:"rawlist",name:"kitChoice",message:"Select a kit to scaffold:",choices:ts().map(b=>({name:b.label,value:b.id}))}]);if(At(f)){let{projectName:b}=await Ge.prompt([{type:"input",name:"projectName",message:"Project name:",validate:x=>x.trim().length>0||"Project name is required"}]),w=t.slice(2).filter(x=>x.startsWith("-")),k=await gr(["create","project",f,b.trim(),...w]),C=Q(process.cwd());return k===0&&C&&await vt(C),k}let{projectName:h}=await Ge.prompt([{type:"input",name:"projectName",message:"Project name:",validate:b=>b.trim().length>0||"Project name is required"}]);t.splice(2,0,f,h.trim());}{let f=Q(process.cwd()),h=(t[2]||"").toLowerCase();if(f&&h){let b=y__default.join(f,".rapidkit","workspace.json"),w=y__default.join(f,".rapidkit","policies.yml");try{let[k,C]=await Promise.all([___default.pathExists(b).then(S=>S?P.promises.readFile(b,"utf-8"):"{}"),___default.pathExists(w).then(S=>S?P.promises.readFile(w,"utf-8"):"")]),x=JSON.parse(k).profile,W=C.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]??"warn",he=It(h)?.runtime,Z=he==="go",N=he==="java",ye=he==="dotnet",xe=he==="node",T=he==="python"||!he,$=null;if(x==="python-only"&&!T?$=`Kit "${h}" is not a Python kit, but workspace profile is "python-only".`:x==="node-only"&&!xe?$=`Kit "${h}" is not a Node kit, but workspace profile is "node-only".`:x==="go-only"&&!Z?$=`Kit "${h}" is not a Go kit, but workspace profile is "go-only".`:x==="java-only"&&!N?$=`Kit "${h}" is not a Java kit, but workspace profile is "java-only".`:x==="dotnet-only"&&!ye&&($=`Kit "${h}" is not a .NET kit, but workspace profile is "dotnet-only".`),$){if(W==="strict")return console.log(i.red(`\u274C Profile violation (strict mode): ${$}`)),console.log(i.gray("\u{1F4A1} Change workspace profile or use --no-workspace to skip enforcement.")),1;console.log(i.yellow(`\u26A0\uFE0F Profile warning: ${$}`)),console.log(i.gray('\u{1F4A1} Consider using a "polyglot" workspace profile for multi-language projects.'));}}catch{}}}if(At(t[2])){let f=await gr(t),h=Q(process.cwd());return f===0&&h&&await vt(h),f}let o=t.includes("--create-workspace"),n=t.includes("--no-workspace"),s=t.includes("--yes")||t.includes("-y"),a=t.includes("--skip-git")||t.includes("--no-git");if(!!!ho(process.cwd())){let{registerWorkspaceAtPath:f}=await import('./create-M7LT6WF6.js');if(o)await f(process.cwd(),{skipGit:a,yes:s,userConfig:await a$2()});else if(!n)if(s)await f(process.cwd(),{skipGit:a,yes:true,userConfig:await a$2()});else {let{createWs:h}=await Ge.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 f(process.cwd(),{skipGit:a,yes:false,userConfig:await a$2()});}}if(At(t[2])){let f=await gr(t),h=Q(process.cwd());return f===0&&h&&await vt(h,{silent:true}),f}let u=[...t.filter(f=>{let h=f.split("=")[0];return !e$2.has(f)&&!e$2.has(h)})],d=Q(process.cwd()),g=t.includes("--skip-install")||!!d?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0;try{await d$1();let f=await e$1(u,{cwd:process.cwd(),env:g});if(f===0&&d&&!t.includes("--skip-install")&&(console.log(i.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(i.white(" Next: cd <project-name> && npx rapidkit init"))),f===0){let h=d||Q(process.cwd());if(h){try{let w=t[3];if(w){let k=t.indexOf("--output"),C=k>=0?t[k+1]:".",x=y__default.resolve(process.cwd(),C,w),E=y__default.join(h,".python-version"),W=y__default.join(x,".python-version");if(P.existsSync(E)&&P.existsSync(x)){let de=P.readFileSync(E,"utf-8");P.writeFileSync(W,de.trim()+`
181
- `),a$1.debug(`Synced Python version ${de.trim()} from workspace to ${w}`);}}}catch(w){a$1.debug("Could not sync Python version from workspace:",w);}let{syncWorkspaceProjects:b}=await import('./workspace-4VGM2NPS.js');await b(h,true),await vt(h);}}return f}catch(f){let h=co(f);return h?await uo(u,h):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${f?.message??f}
182
- `),1)}}if(t[0]==="create"&&t[1]!=="project")try{await d$1();let r=await e$1(t,{cwd:process.cwd()});if(r===0){let o=Q(process.cwd());if(o){let{syncWorkspaceProjects:n}=await import('./workspace-4VGM2NPS.js');await n(o,true);}}return r}catch(r){let o=co(r);return o?await uo(t,o):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${r?.message??r}
183
- `),1)}return await d$1(),await e$1(t,{cwd:process.cwd()})}catch(r){let o=co(r);return o?await uo(t,o):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${r?.message??r}
184
- `),1)}}var ks=["init","dev","start","build","test","docs","lint","format","create","help","--help","-h"],lc=["analyze","readiness","doctor","autopilot","import","snapshot","workspace","bootstrap","setup","cache","mirror","ai","config","product","infra","shell","commands"],dc=["analyze","readiness","doctor","autopilot","import","snapshot","workspace","ai","config","product","infra","shell","commands"],pc=["bootstrap","setup","cache","mirror"],uc=[["project","commands"],["project","archives"],["project","archive"],["project","restore"],["project","delete"]],Ts=["lint","format","docs"],mc=["init"],Ws=["build","dev","start","test"],vs=[...Ws,...Ts];function fc(t){return !!t&&lc.includes(t)}function Fs(t){let e=t[0],r=t[1];return uc.some(([o,n])=>e!==o?false:r?r===n:true)}function Mt(t){return fc(t[0])||Fs(t)}function gc(t){return !!t&&dc.includes(t)}function Ps(t){return gc(t[0])||Fs(t)}function bs(t){return !!t&&pc.includes(t)}function hc(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 Ks(t={}){let e=i$1(process.cwd());if(t.json){console.log(JSON.stringify(e,null,2));return}console.log(i.bold("RapidKit project command capabilities")),console.log(i.gray(`Project: ${e.projectRoot??"not detected"}`)),console.log(i.gray(`Runtime: ${e.runtime} (${e.runtimeSupportTier}) | Framework: ${e.frameworkDisplayName} (${e.frameworkSupportTier}) | Module support: ${e.moduleSupport?"yes":"no"}`)),console.log(i.gray(`Doctor support: ${e.runtimeDoctorSupport}`)),console.log(""),console.log(i.green(`Supported: ${e.supportedCommands.join(", ")||"none"}`)),console.log(i.yellow(`Global: ${e.globalCommands.join(", ")||"none"}`)),console.log(i.red(`Unsupported: ${e.unsupportedCommands.join(", ")||"none"}`));}function yc(){let t=["analyze","readiness","doctor","autopilot","import","snapshot","workspace","bootstrap","setup","cache","mirror","ai","config","product","infra","shell","project","commands"],e=["version","create","add","list","info","upgrade","diff","merge","optimize","license","checkpoint","reconcile","rollback","uninstall","frameworks","modules"],r=["init","dev","start","build","test","lint","format","help"];return {scope:"global",cli:"rapidkit-npm",version:b(),cwd:process.cwd(),commands:{npmOwned:t,coreBacked:e,projectScoped:r},commandMap:Object.fromEntries([...t.map(o=>[o,{command:o,owner:"npm-wrapper",status:"supported",scope:o==="project"?"project-introspection":"workspace"}]),...e.map(o=>[o,{command:o,owner:"python-core",status:"delegated",scope:"core"}]),...r.map(o=>[o,{command:o,owner:"runtime-adapter",status:o==="help"?"supported":"runtime-dependent",scope:"project"}])])}}function wc(t={}){let e=yc();if(t.json){console.log(JSON.stringify(e,null,2));return}console.log(i.bold("RapidKit command capabilities")),console.log(i.gray(`CLI: ${e.cli} v${e.version}`)),console.log(""),console.log(i.green(`npm wrapper: ${e.commands.npmOwned.join(", ")}`)),console.log(i.cyan(`Python core: ${e.commands.coreBacked.join(", ")}`)),console.log(i.yellow(`Project runtime: ${e.commands.projectScoped.join(", ")}`)),console.log(""),console.log(i.gray("Tip: run `rapidkit project commands --json` inside a project."));}function go(t){return k(t)?(Ks({json:t.includes("--json")||t.includes("--ci")}),true):false}function Ls(t){let e=i$1(process.cwd());if(!e.projectRoot)return false;let r=j$1(t,process.cwd());if(!r||r.status!=="unsupported")return false;console.error(i.red(l(r,e))),process.exit(1);}function it(t){return P.existsSync(y__default.join(t,".rapidkit-workspace"))||P.existsSync(y__default.join(t,".rapidkit","workspace.json"))}function Js(t){let e=t;for(;;){let r=y__default.join(e,".rapidkit","context.json");if(P.existsSync(r))return r;let o=y__default.dirname(e);if(o===e)break;e=o;}return null}function ho(t){let e=t,r=y__default.resolve(tmpdir());for(;;){let o=y__default.join(e,".rapidkit-workspace");if(P.existsSync(o)&&y__default.resolve(e)!==r)return o;let n=y__default.dirname(e);if(n===e)break;e=n;}return null}function Q(t){let e=t,r=y__default.resolve(tmpdir());for(;;){let o=y__default.join(e,".rapidkit-workspace");if(P.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 vt(t,e){try{let{syncWorkspaceContract:r}=await import('./workspace-contract-Z5VYUF3T.js'),o=await r({workspacePath:t});if(!e?.silent&&(o.addedProjects.length>0||o.updatedProjects.length>0)&&console.log(i.gray(`\u2139\uFE0F Workspace contract synced (${o.contract.projects.length} project(s)).`)),o.verification.status!=="passed"){console.log(i.yellow("\u26A0\uFE0F Workspace contract verification failed after project sync."));for(let n of o.verification.violations)console.log(i.gray(` Violation: ${n}`));console.log(i.white(" Next: npx rapidkit workspace contract inspect"));}}catch(r){e?.silent||console.log(i.yellow(`\u26A0\uFE0F Workspace contract sync skipped: ${r.message}`));}}async function kc(t,e=process.cwd(),r=process.platform){if(!(t.workspaceFlag||t.scope==="workspace")||!a(r))return {detected:false};let n=i$2(e,r);for(let s of n){if(!await ___default.pathExists(s))continue;let a=s.toLowerCase();if(a.endsWith("rapidkit.cmd")||a.endsWith("rapidkit.exe"))return {detected:true,candidatePath:s,reason:"Found workspace-local rapidkit launcher on Windows."}}return {detected:false}}function vc(t){let e=t;for(;;){let r=y__default.join(e,".rapidkit-workspace"),o=y__default.join(e,".rapidkit","workspace.json");if(!P.existsSync(r)&&P.existsSync(o))return e;let n=y__default.dirname(e);if(n===e)break;e=n;}return null}var Gs={enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true};function Pc(t){return t&&t.match(/^[\t ]*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]==="strict"?"strict":"warn"}function Ot(t,e){let r=t.match(new RegExp(`^[\\t ]*${e}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return r?r[1]==="true":Gs[e]}function js(t){let e=t??"";return {mode:Pc(e),dependency_sharing_mode:Bs(e),rules:{enforce_workspace_marker:Ot(e,"enforce_workspace_marker"),enforce_toolchain_lock:Ot(e,"enforce_toolchain_lock"),disallow_untrusted_tool_sources:Ot(e,"disallow_untrusted_tool_sources"),enforce_compatibility_matrix:Ot(e,"enforce_compatibility_matrix"),require_mirror_lock_for_offline:Ot(e,"require_mirror_lock_for_offline")}}}function Ss(t,e,r){let o=`${e}: ${r}`,n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),s=new RegExp(`^[\\t ]*${n}:\\s*.*$`,"m");if(s.test(t))return t.replace(s,o);let a=/^[\t ]*rules:\s*(?:#.*)?$/m;return a.test(t)?t.replace(a,`${o}
177
+ `));let{kitChoice:m}=await Ke.prompt([{type:"rawlist",name:"kitChoice",message:"Select a kit to scaffold:",choices:Zn().map(P=>({name:P.label,value:P.id}))}]);if(It(m)){let{projectName:P}=await Ke.prompt([{type:"input",name:"projectName",message:"Project name:",validate:x=>x.trim().length>0||"Project name is required"}]),C=t.slice(2).filter(x=>x.startsWith("-")),w=await mr(["create","project",m,P.trim(),...C]),k=ee(process.cwd());return w===0&&k&&await rt(k),w}let{projectName:h}=await Ke.prompt([{type:"input",name:"projectName",message:"Project name:",validate:P=>P.trim().length>0||"Project name is required"}]);t.splice(2,0,m,h.trim());}{let m=ee(process.cwd()),h=(t[2]||"").toLowerCase();if(m&&h){let P=y__default.join(m,".rapidkit","workspace.json"),C=y__default.join(m,".rapidkit","policies.yml");try{let[w,k]=await Promise.all([E__default.pathExists(P).then(j=>j?v.promises.readFile(P,"utf-8"):"{}"),E__default.pathExists(C).then(j=>j?v.promises.readFile(C,"utf-8"):"")]),x=JSON.parse(w).profile,$=k.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]??"warn",U=_t(h)?.runtime,Ne=U==="go",W=U==="java",G=U==="dotnet",we=U==="node",T=U==="python"||!U,N=null;if(x==="python-only"&&!T?N=`Kit "${h}" is not a Python kit, but workspace profile is "python-only".`:x==="node-only"&&!we?N=`Kit "${h}" is not a Node kit, but workspace profile is "node-only".`:x==="go-only"&&!Ne?N=`Kit "${h}" is not a Go kit, but workspace profile is "go-only".`:x==="java-only"&&!W?N=`Kit "${h}" is not a Java kit, but workspace profile is "java-only".`:x==="dotnet-only"&&!G&&(N=`Kit "${h}" is not a .NET kit, but workspace profile is "dotnet-only".`),N){if($==="strict")return console.log(i.red(`\u274C Profile violation (strict mode): ${N}`)),console.log(i.gray("\u{1F4A1} Change workspace profile or use --no-workspace to skip enforcement.")),1;console.log(i.yellow(`\u26A0\uFE0F Profile warning: ${N}`)),console.log(i.gray('\u{1F4A1} Consider using a "polyglot" workspace profile for multi-language projects.'));}}catch{}}}if(It(t[2])){let m=await mr(t),h=ee(process.cwd());return m===0&&h&&await rt(h),m}let o=t.includes("--create-workspace"),n=t.includes("--no-workspace"),s=t.includes("--yes")||t.includes("-y"),a=t.includes("--skip-git")||t.includes("--no-git");if(!!!uo(process.cwd())){let{registerWorkspaceAtPath:m}=await import('./create-BO2I3ESU.js');if(o)await m(process.cwd(),{skipGit:a,yes:s,userConfig:await a$2()});else if(!n)if(s)await m(process.cwd(),{skipGit:a,yes:true,userConfig:await a$2()});else {let{createWs:h}=await Ke.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 m(process.cwd(),{skipGit:a,yes:false,userConfig:await a$2()});}}if(It(t[2])){let m=await mr(t),h=ee(process.cwd());return m===0&&h&&await rt(h,{silent:true}),m}let u=[...t.filter(m=>{let h=m.split("=")[0];return !e$2.has(m)&&!e$2.has(h)})],p=ee(process.cwd()),g=t.includes("--skip-install")||!!p?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0;try{await d$1();let m=await e$1(u,{cwd:process.cwd(),env:g});if(m===0&&p&&!t.includes("--skip-install")&&(console.log(i.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(i.white(" Next: cd <project-name> && npx rapidkit init"))),m===0){let h=p||ee(process.cwd());if(h){try{let C=t[3];if(C){let w=t.indexOf("--output"),k=w>=0?t[w+1]:".",x=y__default.resolve(process.cwd(),k,C),_=y__default.join(h,".python-version"),$=y__default.join(x,".python-version");if(v.existsSync(_)&&v.existsSync(x)){let ye=v.readFileSync(_,"utf-8");v.writeFileSync($,ye.trim()+`
178
+ `),a$1.debug(`Synced Python version ${ye.trim()} from workspace to ${C}`);}}}catch(C){a$1.debug("Could not sync Python version from workspace:",C);}let{syncWorkspaceProjects:P}=await import('./workspace-AG2MQFTY.js');await P(h,true),await rt(h);}}return m}catch(m){let h=no(m);return h?await ao(u,h):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${m?.message??m}
179
+ `),1)}}if(t[0]==="create"&&t[1]!=="project")try{await d$1();let r=await e$1(t,{cwd:process.cwd()});if(r===0){let o=ee(process.cwd());if(o){let{syncWorkspaceProjects:n}=await import('./workspace-AG2MQFTY.js');await n(o,true);}}return r}catch(r){let o=no(r);return o?await ao(t,o):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${r?.message??r}
180
+ `),1)}return await d$1(),await e$1(t,{cwd:process.cwd()})}catch(r){let o=no(r);return o?await ao(t,o):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${r?.message??r}
181
+ `),1)}}var fs=["init","dev","start","build","test","docs","lint","format","create","help","--help","-h"],Ua=["analyze","readiness","doctor","autopilot","pipeline","import","snapshot","workspace","bootstrap","setup","cache","mirror","ai","config","product","infra","shell","commands"],Ha=["analyze","readiness","doctor","autopilot","pipeline","import","snapshot","workspace","ai","config","product","infra","shell","commands"],za=["bootstrap","setup","cache","mirror"],Ya=[["project","commands"],["project","archives"],["project","archive"],["project","restore"],["project","delete"]],$s=["lint","format","docs"],Qa=["init"],Os=["build","dev","start","test"],gs=[...Os,...$s];function Za(t){return !!t&&Ua.includes(t)}function Ns(t){let e=t[0],r=t[1];return Ya.some(([o,n])=>e!==o?false:r?r===n:true)}function Nt(t){return Za(t[0])||Ns(t)}function Xa(t){return !!t&&Ha.includes(t)}function hs(t){return Xa(t[0])||Ns(t)}function ys(t){return !!t&&za.includes(t)}function ec(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 Ms(t={}){let e=i$1(process.cwd());if(t.json){console.log(JSON.stringify(e,null,2));return}console.log(i.bold("RapidKit project command capabilities")),console.log(i.gray(`Project: ${e.projectRoot??"not detected"}`)),console.log(i.gray(`Runtime: ${e.runtime} (${e.runtimeSupportTier}) | Framework: ${e.frameworkDisplayName} (${e.frameworkSupportTier}) | Module support: ${e.moduleSupport?"yes":"no"}`)),console.log(i.gray(`Doctor support: ${e.runtimeDoctorSupport}`)),console.log(""),console.log(i.green(`Supported: ${e.supportedCommands.join(", ")||"none"}`)),console.log(i.yellow(`Global: ${e.globalCommands.join(", ")||"none"}`)),console.log(i.red(`Unsupported: ${e.unsupportedCommands.join(", ")||"none"}`));}function tc(){let t=["analyze","readiness","doctor","autopilot","import","snapshot","workspace","bootstrap","setup","cache","mirror","ai","config","product","infra","shell","project","commands"],e=["version","create","add","list","info","upgrade","diff","merge","optimize","license","checkpoint","reconcile","rollback","uninstall","frameworks","modules"],r=["init","dev","start","build","test","lint","format","help"];return {scope:"global",cli:"rapidkit-npm",version:b(),cwd:process.cwd(),commands:{npmOwned:t,coreBacked:e,projectScoped:r},commandMap:Object.fromEntries([...t.map(o=>[o,{command:o,owner:"npm-wrapper",status:"supported",scope:o==="project"?"project-introspection":"workspace"}]),...e.map(o=>[o,{command:o,owner:"python-core",status:"delegated",scope:"core"}]),...r.map(o=>[o,{command:o,owner:"runtime-adapter",status:o==="help"?"supported":"runtime-dependent",scope:"project"}])])}}function rc(t={}){let e=tc();if(t.json){console.log(JSON.stringify(e,null,2));return}console.log(i.bold("RapidKit command capabilities")),console.log(i.gray(`CLI: ${e.cli} v${e.version}`)),console.log(""),console.log(i.green(`npm wrapper: ${e.commands.npmOwned.join(", ")}`)),console.log(i.cyan(`Python core: ${e.commands.coreBacked.join(", ")}`)),console.log(i.yellow(`Project runtime: ${e.commands.projectScoped.join(", ")}`)),console.log(""),console.log(i.gray("Tip: run `rapidkit project commands --json` inside a project."));}function po(t){return k(t)?(Ms({json:t.includes("--json")||t.includes("--ci")}),true):false}function Ds(t){let e=i$1(process.cwd());if(!e.projectRoot)return false;let r=j$1(t,process.cwd());if(!r||r.status!=="unsupported")return false;console.error(i.red(l(r,e))),process.exit(1);}function st(t){return v.existsSync(y__default.join(t,".rapidkit-workspace"))||v.existsSync(y__default.join(t,".rapidkit","workspace.json"))}function Ts(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 uo(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 ee(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 rt(t,e){try{let{syncWorkspaceContract:r}=await import('./workspace-contract-Z5VYUF3T.js'),o=await r({workspacePath:t});if(!e?.silent&&(o.addedProjects.length>0||o.updatedProjects.length>0)&&console.log(i.gray(`\u2139\uFE0F Workspace contract synced (${o.contract.projects.length} project(s)).`)),o.verification.status!=="passed"){console.log(i.yellow("\u26A0\uFE0F Workspace contract verification failed after project sync."));for(let n of o.verification.violations)console.log(i.gray(` Violation: ${n}`));console.log(i.white(" Next: npx rapidkit workspace contract inspect"));}}catch(r){e?.silent||console.log(i.yellow(`\u26A0\uFE0F Workspace contract sync skipped: ${r.message}`));}}async function oc(t,e=process.cwd(),r=process.platform){if(!(t.workspaceFlag||t.scope==="workspace")||!a(r))return {detected:false};let n=i$2(e,r);for(let s of n){if(!await E__default.pathExists(s))continue;let a=s.toLowerCase();if(a.endsWith("rapidkit.cmd")||a.endsWith("rapidkit.exe"))return {detected:true,candidatePath:s,reason:"Found workspace-local rapidkit launcher on Windows."}}return {detected:false}}function nc(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 Ws={enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true};function sc(t){return t&&t.match(/^[\t ]*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]==="strict"?"strict":"warn"}function At(t,e){let r=t.match(new RegExp(`^[\\t ]*${e}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return r?r[1]==="true":Ws[e]}function ws(t){let e=t??"";return {mode:sc(e),dependency_sharing_mode:Fs(e),rules:{enforce_workspace_marker:At(e,"enforce_workspace_marker"),enforce_toolchain_lock:At(e,"enforce_toolchain_lock"),disallow_untrusted_tool_sources:At(e,"disallow_untrusted_tool_sources"),enforce_compatibility_matrix:At(e,"enforce_compatibility_matrix"),require_mirror_lock_for_offline:At(e,"require_mirror_lock_for_offline")}}}function ks(t,e,r){let o=`${e}: ${r}`,n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),s=new RegExp(`^[\\t ]*${n}:\\s*.*$`,"m");if(s.test(t))return t.replace(s,o);let a=/^[\t ]*rules:\s*(?:#.*)?$/m;return a.test(t)?t.replace(a,`${o}
185
182
  rules:`):`${t.endsWith(`
186
183
  `)?t:`${t}
187
184
  `}${o}
188
- `}function bc(t,e,r){let o=` ${e}: ${r?"true":"false"}`,n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),s=new RegExp(`^[\\t ]+${n}:\\s*.*$`,"m");if(s.test(t))return t.replace(s,o);let a=/^[\t ]*rules:\s*(?:#.*)?$/m;return a.test(t)?t.replace(a,`rules:
185
+ `}function ic(t,e,r){let o=` ${e}: ${r?"true":"false"}`,n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),s=new RegExp(`^[\\t ]+${n}:\\s*.*$`,"m");if(s.test(t))return t.replace(s,o);let a=/^[\t ]*rules:\s*(?:#.*)?$/m;return a.test(t)?t.replace(a,`rules:
189
186
  ${o}`):`${t.endsWith(`
190
187
  `)?t:`${t}
191
188
  `}rules:
192
189
  ${o}
193
- `}function jc(){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(`
194
- `)}async function xs(t){let e=y__default.join(t,".rapidkit","policies.yml");return await ___default.pathExists(e)?P.promises.readFile(e,"utf-8"):jc()}async function Sc(t,e){let r=y__default.join(t,".rapidkit"),o=y__default.join(r,"policies.yml");await ___default.ensureDir(r);let n=e.endsWith(`
190
+ `}function ac(){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(`
191
+ `)}async function vs(t){let e=y__default.join(t,".rapidkit","policies.yml");return await E__default.pathExists(e)?v.promises.readFile(e,"utf-8"):ac()}async function cc(t,e){let r=y__default.join(t,".rapidkit"),o=y__default.join(r,"policies.yml");await E__default.ensureDir(r);let n=e.endsWith(`
195
192
  `)?e:`${e}
196
- `;await P.promises.writeFile(o,n,"utf-8");}function xc(t){let e=t.trim().toLowerCase();return e==="true"||e==="1"||e==="on"?true:e==="false"||e==="0"||e==="off"?false:null}function Bs(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 Vs(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 qs(t,e){let r=Q(t),o=r?y__default.join(r,".rapidkit","policies.yml"):null,n="isolated";if(o&&await ___default.pathExists(o))try{let c=await P.promises.readFile(o,"utf-8"),l=Vs(c);if(l.status==="failed")return console.log(i.red(`\u274C ${l.message}`)),{ok:false,code:1};n=l.mode;}catch{return console.log(i.red("\u274C Failed to read workspace policy file (.rapidkit/policies.yml).")),{ok:false,code:1}}let s=process.env.RAPIDKIT_DEP_SHARING_MODE,a=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 s>"u"?delete process.env.RAPIDKIT_DEP_SHARING_MODE:process.env.RAPIDKIT_DEP_SHARING_MODE=s,typeof a>"u"?delete process.env.RAPIDKIT_WORKSPACE_PATH:process.env.RAPIDKIT_WORKSPACE_PATH=a;}}async function V(t,e,r){return await new Promise(o=>{let n=spawn(t,e,{stdio:["ignore","pipe","pipe"],cwd:r,shell:b$4()});n.stdout?.on("data",s=>{process.stdout.write(s);}),n.stderr?.on("data",s=>{process.stderr.write(s);}),n.on("close",s=>o(s??1)),n.on("error",()=>o(1));})}async function nt(t,e){await ___default.outputFile(t,`${JSON.stringify(e,null,2)}
197
- `,"utf-8");}async function Cc(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,s=n??Q(process.cwd()),a=false,c=false;if(n){if(!it(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(i.red(`\u274C ${p}`)),1}}else if(!s||!it(s)){let p=await Ic();s=p.workspacePath,a=true,c=p.created;}if(!s||!it(s)){let p="Not inside a RapidKit workspace";return e.json?console.log(JSON.stringify({error:p},null,2)):(console.log(i.red(`\u274C ${p}`)),console.log(i.gray("\u{1F4A1} Run this command from a workspace root or pass --workspace <path>."))),1}let l=`cd ${s}`,u=r?.syncWorkspaceProjects??(async p=>{if(o)throw new Error("forced sync failure for command-level import rollback test");let{syncWorkspaceProjects:m}=await import('./workspace-4VGM2NPS.js');await m(p,true);}),d=r?.rollbackImportedProjectImport??gs;try{let p=await hs({workspacePath:s,source:t,name:e.name,sourceType:e.git===true?"git-url":void 0});try{await u(s);}catch(m){await d(s,p.path);try{await u(s);}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:s,workspaceResolution:a?"default-auto":n?"explicit":"nearest",defaultWorkspaceCreated:a?c:false,suggestedCdCommand:l,importedProject:p},null,2)),0):(a&&console.log(i.yellow(`\u2139 Imported outside a workspace, so RapidKit used the default workspace: ${s}`)),console.log(i.green(`\u2714 Imported project: ${p.name}`)),console.log(i.gray(` Workspace: ${s}`)),console.log(i.gray(` Destination: ${p.path}`)),console.log(i.gray(` Stack: ${p.stack} (${p.confidence})`)),console.log(i.gray(` Source: ${e.git===true||ao(t)?"git-url":"local-folder"}`)),console.log(i.gray(` Next shell step: ${l}`)),0)}catch(p){let m=p instanceof Error?p.message:String(p);return e.json?console.log(JSON.stringify({error:m},null,2)):console.log(i.red(`\u274C Import failed: ${m}`)),1}}async function yo(t){let e=new Set(["python-only","polyglot","enterprise"]),r="minimal";try{let s=y__default.join(t,".rapidkit","workspace.json");r=JSON.parse(await P.promises.readFile(s,"utf-8")).profile??"minimal";}catch{r="minimal";}if(!await(async()=>{if(e.has(r))return true;let s=await vo(t);if(s.length===0)return false;for(let a of s){let c=a$4(a),l=c?.module_support;if(!(b$2(c,a)||d(c,a)||e$2(c,a))&&l!==false)return f$1(c,a)||c$1(c,a),true}return false})())return 0;let n="poetry";try{let{readWorkspaceMarker:s}=await import('./workspace-marker-IOPQ42A7.js'),c=(await s(t))?.metadata?.npm?.installMethod;(c==="poetry"||c==="venv"||c==="pipx"||c==="pip")&&(n=c);}catch{}if(n==="poetry"||n==="venv"){let s=y__default.join(t,"pyproject.toml"),a=false;try{a=(await P.promises.readFile(s,"utf-8")).includes("rapidkit-core");}catch{a=false;}let c=process.env.RAPIDKIT_DEV_PATH,l=c?await ___default.pathExists(c):false;if(a){let u=nc(t);if(!await ___default.pathExists(u)){let m=await sc(t);if(m!==0)return m}let p=await V(u,l&&c?["-m","pip","install",c,"--quiet","--disable-pip-version-check"]:["-m","pip","install","rapidkit-core","--quiet","--disable-pip-version-check"],t);if(p!==0)return p}else {let u=await V("poetry",["install","--no-root"],t);if(u!==0)return u;let d=await V("poetry",["add","rapidkit-core"],t);if(d!==0)return d}try{let{writeWorkspaceLauncher:u}=await import('./create-M7LT6WF6.js');await u(t,n==="venv"?"venv":"poetry");}catch{}return 0}return 0}async function vo(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 s=[];try{s=await P.promises.readdir(n,{withFileTypes:true});}catch{continue}for(let a of s){if(!a.isDirectory()||a.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(a.name))continue;let c=y__default.join(n,a.name),l=y__default.join(c,".rapidkit","context.json"),u=y__default.join(c,".rapidkit","project.json");if(await ___default.pathExists(l)||await ___default.pathExists(u)){e.push(c);continue}o.push(c);}}return e}function Rc(t){let e="my-workspace",r=1;for(;;){let o=r===1?e:`${e}-${r}`,n=y__default.join(t,o);if(!P.existsSync(n))return {name:o,targetPath:n};r+=1;}}var Ec="default-workspace";function _c(){return y__default.join(homedir(),"Workspai","rapidkits",Ec)}async function Ic(){let t=_c(),e=y__default.basename(t),r=it(t);await ___default.ensureDir(y__default.join(t,".rapidkit")),await b$3(t,d$2(e,b()));let o=y__default.join(t,".rapidkit","workspace.json");return await ___default.pathExists(o)||await nt(o,{name:e,workspace_name:e,profile:"minimal",createdAt:new Date().toISOString(),createdBy:"rapidkit-npm-import-fallback"}),{workspacePath:t,created:!r}}async function mo(t){let r=await Je("go",{runCommandInCwd:V,runCoreRapidkit:e$1}).initProject(t);return me(r)}function me(t){return t.message&&console.log(i.red(`\u274C ${t.message}`)),t.exitCode}async function Nt(t,e){let r=Je("node",{runCommandInCwd:V,runCoreRapidkit:e$1});if(t==="init"){let n=await r.initProject(e);return me(n)}if(t==="dev"){let n=await r.runDev(e);return me(n)}if(t==="test"){let n=await r.runTest(e);return me(n)}if(t==="build"){let n=await r.runBuild(e);return me(n)}let o=await r.runStart(e);return me(o)}async function st(t,e){let r=Je("java",{runCommandInCwd:V,runCoreRapidkit:e$1});if(t==="init"){let n=await r.initProject(e);return me(n)}if(t==="dev"){let n=await r.runDev(e);return me(n)}if(t==="test"){let n=await r.runTest(e);return me(n)}if(t==="build"){let n=await r.runBuild(e);return me(n)}let o=await r.runStart(e);return me(o)}async function Cs(t,e=wo){let r=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof r>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let s=function(v){if(!v)return null;let O=v.trim().toLowerCase();return O==="minimal"||O==="java-only"||O==="go-only"||O==="dotnet-only"||O==="python-only"||O==="node-only"||O==="polyglot"||O==="enterprise"?O:null},a=function(v){let Ae=v.match(/^\s*mode:\s*([a-zA-Z]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase()==="strict"?"strict":"warn",ke=(Y,_e)=>{let $e=v.match(new RegExp(`^\\s*${Y}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return $e?$e[1].toLowerCase()==="true":_e};return {mode:Ae,dependency_sharing_mode:Bs(v),rules:{enforce_workspace_marker:ke("enforce_workspace_marker",true),enforce_toolchain_lock:ke("enforce_toolchain_lock",false),disallow_untrusted_tool_sources:ke("disallow_untrusted_tool_sources",false),enforce_compatibility_matrix:ke("enforce_compatibility_matrix",false),require_mirror_lock_for_offline:ke("require_mirror_lock_for_offline",true)}}};let c=["init"],l,u=false,d$1=false,p=false;for(let v=1;v<t.length;v+=1){let O=t[v];if(O==="--ci"){u=true;continue}if(O==="--offline"){d$1=true;continue}if(O==="--json"){p=true;continue}if(O==="--profile"){let F=t[v+1];if(!F||F.startsWith("-"))return console.log(i.yellow("Usage: rapidkit bootstrap [path] [--profile <minimal|java-only|go-only|dotnet-only|python-only|node-only|polyglot|enterprise>] [--ci] [--offline] [--json]")),1;l=F,v+=1;continue}if(O.startsWith("--profile=")){l=O.slice(10);continue}c.push(O);}let m=s(l);if(l&&!m)return console.log(i.red(`Invalid profile: ${l}. Use one of: minimal, java-only, go-only, dotnet-only, python-only, node-only, polyglot, enterprise.`)),1;let g=process.cwd(),f=c.slice(1).filter(v=>!v.startsWith("-"));if(f.length>0){let v=y__default.resolve(g,f[0]),O=a$4(v),F=P.existsSync(v)?await Dt(v):"unknown";if(!it(v)&&(b$2(O,v)||d(O,v)||e$2(O,v)||c$1(O,v)||f$1(O,v)||F!=="unknown"))return await e(c)}let h=y__default.join(g,".rapidkit-workspace"),b=y__default.join(g,".rapidkit","workspace.json"),w;!P.existsSync(h)&&P.existsSync(b)?w=g:(w=Q(g),w||(w=vc(g)));let k=[],C=null,x=null;if(w)try{let v=y__default.join(w,".rapidkit","workspace.json"),O=await P.promises.readFile(v,"utf-8"),F=JSON.parse(O);x=s(F.profile);}catch{x=null;}let E=["minimal","java-only","python-only","node-only","go-only","dotnet-only","polyglot","enterprise"],W={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)","dotnet-only":"dotnet-only \u2014 .NET runtime (ASP.NET Core services)",polyglot:"polyglot \u2014 Python + Node.js + Go + Java + .NET multi-runtime workspace",enterprise:"enterprise \u2014 Polyglot + governance + Sigstore verification"},de=m;if(!!w&&!m&&!u&&!p&&!!process.stdin.isTTY&&!!process.stdout.isTTY){let v=x||"minimal",{chosenProfile:O}=await Ge.prompt([{type:"rawlist",name:"chosenProfile",message:`Select workspace profile for bootstrap (current: ${v})`,choices:E.map(F=>({name:F===v?`${W[F]} \u2190 current`:W[F],value:F})),default:E.indexOf(v)}]);de=O;}let Z=de||x||"minimal";if(w)try{let O=Z==="python-only"||Z==="polyglot"||Z==="enterprise"?"poetry":"venv",F;try{let _e=(await P.promises.readFile(y__default.join(w,".python-version"),"utf-8")).trim();_e&&(F=_e);}catch{}let{syncWorkspaceFoundationFiles:Ae}=await import('./create-M7LT6WF6.js'),ke=await Ae(w,{workspaceName:y__default.basename(w),installMethod:O,pythonVersion:F,profile:Z,writeMarker:true,writeGitignore:true,onlyIfMissing:true});k.push({id:"workspace.legacy.sync",status:ke.length>0?"passed":"skipped",message:ke.length>0?`Legacy workspace foundation synchronized: ${ke.join(", ")}`:"Workspace foundation files are already up to date."});}catch(v){k.push({id:"workspace.legacy.sync",status:"failed",message:`Failed to synchronize legacy workspace foundation files: ${v.message}`});}if(w&&de&&de!==x)try{let v=y__default.join(w,".rapidkit","workspace.json"),O=await P.promises.readFile(v,"utf-8"),F=JSON.parse(O);F.profile=de,await P.promises.writeFile(v,JSON.stringify(F,null,2)+`
198
- `,"utf-8");}catch{}let N={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}},ye=null;if(w)try{let v=await P.promises.readFile(y__default.join(w,".rapidkit","policies.yml"),"utf-8");ye=v,N=a(v);}catch{k.push({id:"policy.file",status:"skipped",message:"No workspace policy file found; using default bootstrap policy."});}else k.push({id:"workspace.detect",status:"skipped",message:"No workspace marker found; bootstrap runs in project/single-path mode."});if(w){let v=Vs(ye);N.dependency_sharing_mode=v.mode,k.push({id:"policy.schema.dependency_sharing_mode",status:v.status,message:v.message}),k.push({id:"policy.dependency_sharing_mode.effective",status:"passed",message:N.dependency_sharing_mode==="isolated"?"Effective dependency mode: isolated (default secure mode).":N.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 O=P.existsSync(y__default.join(w,".rapidkit-workspace"));k.push({id:"policy.enforce_workspace_marker",status:!N.rules.enforce_workspace_marker||O?"passed":"failed",message:!N.rules.enforce_workspace_marker||O?"Workspace marker policy satisfied.":"Workspace marker policy failed: .rapidkit-workspace is missing."});let F=P.existsSync(y__default.join(w,".rapidkit","toolchain.lock"));k.push({id:"policy.enforce_toolchain_lock",status:!N.rules.enforce_toolchain_lock||F?"passed":"failed",message:!N.rules.enforce_toolchain_lock||F?"Toolchain lock policy satisfied.":"Toolchain lock policy failed: .rapidkit/toolchain.lock is missing."});let Ae=process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||P.existsSync(y__default.join(w,".rapidkit","trusted-sources.lock"));k.push({id:"policy.disallow_untrusted_tool_sources",status:!N.rules.disallow_untrusted_tool_sources||Ae?"passed":"failed",message:!N.rules.disallow_untrusted_tool_sources||Ae?"Trusted tool sources policy satisfied.":"Trusted tool sources policy failed: set RAPIDKIT_TRUSTED_SOURCES=1 or provide .rapidkit/trusted-sources.lock."});let ke=y__default.join(w,".rapidkit","compatibility-matrix.json"),Y=P.existsSync(ke),_e=N.rules.enforce_compatibility_matrix;if(k.push({id:"policy.enforce_compatibility_matrix",status:!_e||Y?"passed":"failed",message:!_e||Y?"Compatibility matrix policy satisfied.":"Compatibility matrix policy failed: .rapidkit/compatibility-matrix.json is missing."}),Y)try{let K=await P.promises.readFile(ke,"utf-8"),H=JSON.parse(K),Wt=!!H&&typeof H=="object";k.push({id:"compatibility.matrix.parse",status:Wt?"passed":"failed",message:Wt?"Compatibility matrix parsed successfully.":"Compatibility matrix parse failed: invalid JSON object."});}catch{k.push({id:"compatibility.matrix.parse",status:"failed",message:"Compatibility matrix parse failed: invalid JSON."});}let $e=y__default.join(w,".rapidkit","mirror-config.json"),yr=y__default.join(w,".rapidkit","mirror.lock"),wr=P.existsSync($e),kr=P.existsSync(yr),Po={};if(wr)try{Po=JSON.parse(await P.promises.readFile($e,"utf-8")),k.push({id:"mirror.config.parse",status:"passed",message:"Mirror configuration parsed successfully."});}catch{k.push({id:"mirror.config.parse",status:"failed",message:"Mirror configuration parse failed: invalid JSON in .rapidkit/mirror-config.json."});}let vr=await io(w,{ciMode:u,offlineMode:d$1});if(k.push(...vr.checks.map(K=>({id:K.id,status:K.status,message:K.message}))),C=vr.details,vr.details.lockWritten&&(kr=true),d$1){let K=process.env.RAPIDKIT_MIRROR_ENABLED==="1"||Po.enabled===true;k.push({id:"offline.mirror.enabled",status:K?"passed":"failed",message:K?"Offline mode mirror is enabled.":'Offline mode requires mirror enablement (set RAPIDKIT_MIRROR_ENABLED=1 or .rapidkit/mirror-config.json {"enabled": true}).'});let H=N.rules.require_mirror_lock_for_offline;k.push({id:"offline.mirror.lock",status:!H||kr?"passed":"failed",message:!H||kr?"Offline mode mirror lock policy satisfied.":"Offline mode mirror lock policy failed: .rapidkit/mirror.lock is missing."});}else k.push({id:"offline.mirror.enabled",status:"skipped",message:"Offline mirror checks skipped (offline mode is disabled)."});let Hs=await vo(w),X=new Set;for(let K of Hs){let H=a$4(K);if(b$2(H,K)){X.add("go");continue}if(d(H,K)){X.add("java");continue}if(e$2(H,K)){X.add("dotnet");continue}if(c$1(H,K)){X.add("node");continue}if(f$1(H,K)){X.add("python");continue}X.add("unknown");}if(Z==="go-only"){let K=X.size===0||[...X].every(H=>H==="go");k.push({id:"profile.go-only",status:K?"passed":"failed",message:K?"go-only profile validated for discovered projects.":`go-only profile mismatch: detected runtimes [${[...X].join(", ")}].`});}else if(Z==="java-only"){let K=X.size===0||[...X].every(H=>H==="java");k.push({id:"profile.java-only",status:K?"passed":"failed",message:K?"java-only profile validated for discovered projects.":`java-only profile mismatch: detected runtimes [${[...X].join(", ")}].`});}else if(Z==="dotnet-only"){let K=X.size===0||[...X].every(H=>H==="dotnet");k.push({id:"profile.dotnet-only",status:K?"passed":"failed",message:K?"dotnet-only profile validated for discovered projects.":`dotnet-only profile mismatch: detected runtimes [${[...X].join(", ")}].`});}else if(Z==="python-only"){let K=X.size===0||[...X].every(H=>H==="python");k.push({id:"profile.python-only",status:K?"passed":"failed",message:K?"python-only profile validated for discovered projects.":`python-only profile mismatch: detected runtimes [${[...X].join(", ")}].`});}else if(Z==="node-only"){let K=X.size===0||[...X].every(H=>H==="node");k.push({id:"profile.node-only",status:K?"passed":"failed",message:K?"node-only profile validated for discovered projects.":`node-only profile mismatch: detected runtimes [${[...X].join(", ")}].`});}else if(Z==="minimal"){let K=[...X].filter(Wt=>Wt!=="unknown"),H=K.length<=1;k.push({id:"profile.minimal",status:H?"passed":"failed",message:H?"minimal profile is compatible with detected runtime mix.":`minimal profile mismatch: multiple runtimes detected [${K.join(", ")}].`});}else Z==="enterprise"&&(k.push({id:"profile.enterprise.ci",status:u?"passed":"failed",message:u?"enterprise profile running with --ci.":"enterprise profile expects --ci for deterministic non-interactive mode."}),k.push({id:"profile.enterprise.compatibility-matrix",status:Y?"passed":"failed",message:Y?"enterprise profile has compatibility matrix.":"enterprise profile requires .rapidkit/compatibility-matrix.json."}),k.push({id:"profile.enterprise.mirror-config",status:wr?"passed":"failed",message:wr?"enterprise profile has mirror configuration.":"enterprise profile requires .rapidkit/mirror-config.json."}));}u&&(process.env.RAPIDKIT_BOOTSTRAP_CI="1"),d$1&&(process.env.RAPIDKIT_OFFLINE_MODE="1");let T=k.some(v=>v.id.startsWith("policy.schema.")&&v.status==="failed")||N.mode==="strict"&&k.some(v=>v.status==="failed"),$=w||g,S=y__default.join($,".rapidkit","reports"),ae=new Date().toISOString().replace(/[:.]/g,"-"),Pe=y__default.join(S,`bootstrap-compliance-${ae}.json`),U=y__default.join(S,"bootstrap-compliance.latest.json"),fe={command:"bootstrap",timestamp:new Date().toISOString(),workspacePath:w,profile:Z,options:{ci:u,offline:d$1,strict:N.mode==="strict"},policyMode:N.mode,policyRules:N.rules,mirrorLifecycle:C,checks:k};if(T){let v={...fe,result:"blocked",initExitCode:null};return await ___default.ensureDir(S),await nt(Pe,v),await nt(U,v),p?process.stdout.write(`${JSON.stringify(v,null,2)}
199
- `):(console.log(i.red("\u274C Bootstrap blocked by strict policy checks.")),console.log(i.gray(`Compliance report: ${Pe}`))),1}let be=0;p||(be=await e(c));let Be=k.filter(v=>v.status==="failed").length,ge=be!==0?"failed":Be>0?"ok_with_warnings":"ok",we={...fe,result:ge,initExitCode:be};if(await ___default.ensureDir(S),await nt(Pe,we),await nt(U,we),p)process.stdout.write(`${JSON.stringify(we,null,2)}
200
- `);else {let v=k.filter(O=>O.status==="failed").length;v>0&&console.log(i.yellow(`\u26A0\uFE0F Bootstrap completed with ${v} policy/profile warnings.`)),console.log(i.gray(`Compliance report: ${Pe}`));}return be}finally{typeof r>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=r;}}async function Rs(t){if(t.includes("--help")||t.includes("-h"))return console.log(i.yellow("Usage: rapidkit setup <python|node|go|java|dotnet> [--warm-deps]")),0;let e=(t[1]||"").toLowerCase(),r=t.includes("--warm-deps")||t.includes("--warm-dependencies");if(!e||!["python","node","go","java","dotnet"].includes(e))return console.log(i.yellow("Usage: rapidkit setup <python|node|go|java|dotnet> [--warm-deps]")),1;let o=async(p,m)=>{if(p==="node"){if(!P.existsSync(y__default.join(m,"package.json")))return {exitCode:0,message:"Node warm-up skipped: package.json not found in current directory."};let f=P.existsSync(y__default.join(m,"pnpm-lock.yaml")),h=P.existsSync(y__default.join(m,"yarn.lock"));return f?{exitCode:await V("pnpm",["install","--lockfile-only","--ignore-scripts"],m)}:h?{exitCode:await V("yarn",["install","--ignore-scripts"],m)}:{exitCode:await V("npm",["install","--package-lock-only","--ignore-scripts"],m)}}if(p==="go")return P.existsSync(y__default.join(m,"go.mod"))?{exitCode:await V("go",["mod","download"],m)}:{exitCode:0,message:"Go warm-up skipped: go.mod not found in current directory."};if(p==="java"){let g=P.existsSync(y__default.join(m,"pom.xml")),f=P.existsSync(y__default.join(m,"build.gradle"))||P.existsSync(y__default.join(m,"build.gradle.kts")),h=y__default.join(m,process.platform==="win32"?"gradlew.bat":"gradlew"),b=P.existsSync(h);return !g&&!f?{exitCode:0,message:"Java warm-up skipped: pom.xml or build.gradle not found in current directory."}:g?{exitCode:await V("mvn",["-B","-q","-DskipTests","dependency:go-offline"],m)}:{exitCode:await V(b?h:"gradle",["--no-daemon","dependencies"],m)}}return p==="dotnet"?(()=>{let f=[{dir:m,depth:0}],h=new Set(["bin","obj",".git","node_modules",".rapidkit"]);for(;f.length>0;){let b=f.shift();if(!b||b.depth>3)continue;let w=[];try{w=P.readdirSync(b.dir,{withFileTypes:true});}catch{continue}for(let k of w)if(k.isFile()){let C=k.name.toLowerCase();if(C.endsWith(".sln")||C.endsWith(".csproj"))return true}else k.isDirectory()&&!h.has(k.name)&&f.push({dir:y__default.join(b.dir,k.name),depth:b.depth+1});}return false})()?{exitCode:await V("dotnet",["restore"],m)}:{exitCode:0,message:".NET warm-up skipped: .sln or *.csproj not found in current project tree."}:{exitCode:0,message:"Dependency warm-up currently applies to node/go/java/dotnet runtimes."}},n=Je(e,{runCommandInCwd:V,runCoreRapidkit:(p,m)=>e$1(p,{...m,cwd:void 0})}),s=await n.checkPrereqs(),a=await n.doctorHints(process.cwd()),c=Q(process.cwd()),l=c||process.cwd(),u=null,d$1=async()=>e!=="java"||!c?[]:u||(u=(await vo(c)).filter(m=>{let g=a$4(m);return d(g,m)}),u);if(s.exitCode===0){console.log(i.green(`\u2705 ${e} prerequisites look good.`));let p=["python","node","go","java","dotnet"].filter(m=>m!==e).join("/");if(console.log(i.gray(` Scope: validated ${e} runtime only. ${p} checks are optional unless your workspace profile uses them.`)),e==="python"&&console.log(i.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(i.gray(` ${e} cache warm-up completed.`)):console.log(i.yellow(` ${e} cache warm-up skipped (non-fatal).`))),r)if(e==="java"&&c){let m=await d$1();if(m.length>0){let g=0,f=0,h=0;for(let b of m){let w=await o("java",b),k=/skipped/i.test(w.message||""),C=y__default.relative(c,b)||y__default.basename(b);w.message&&console.log(i.gray(` [${C}] ${w.message}`)),w.exitCode===0&&!k?g+=1:w.exitCode===0&&k?h+=1:f+=1;}g>0&&console.log(i.gray(` java dependency warm-up completed for ${g} project(s) (--warm-deps).`)),f>0&&console.log(i.yellow(` java dependency warm-up failed for ${f} project(s) (non-fatal).`)),g===0&&f===0&&h>0&&console.log(i.gray(" java dependency warm-up skipped for discovered workspace projects."));}else {let g=await o("java",l),f=/skipped/i.test(g.message||"");g.message&&console.log(i.gray(` ${g.message}`)),g.exitCode===0&&!f?console.log(i.gray(` ${e} dependency warm-up completed (--warm-deps).`)):g.exitCode!==0&&console.log(i.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(i.gray(` ${m.message}`)),m.exitCode===0&&!g?console.log(i.gray(` ${e} dependency warm-up completed (--warm-deps).`)):m.exitCode!==0&&console.log(i.yellow(` ${e} dependency warm-up failed (non-fatal).`));}if(c)try{let m=y__default.join(c,".rapidkit","toolchain.lock"),g={};try{g=JSON.parse(await P.promises.readFile(m,"utf-8"));}catch{}(!g.runtime||typeof g.runtime!="object")&&(g.runtime={});let f=g.runtime;if(e==="python"){let h=null;try{let{execa:b}=await import('execa');for(let w of ko()){let C=await b(w,w==="py"?["-3","--version"]:["--version"],{cwd:c,stdio:"pipe",reject:false,timeout:3e3});if(C.exitCode===0){let E=(C.stdout||C.stderr||"").match(/Python\s+(\S+)/);if(h=E?E[1]:null,h)break}}}catch{}f.python={...f.python||{},version:h,last_setup:new Date().toISOString()};}else if(e==="node")f.node={...f.node||{},version:process.version,last_setup:new Date().toISOString()};else if(e==="go"){let h=null;try{let{execa:b}=await import('execa'),k=((await b("go",["version"],{cwd:c,stdio:"pipe"})).stdout||"").match(/go(\d+\.\d+(?:\.\d+)?)/i);h=k?k[1]:null;}catch{}f.go={...f.go||{},version:h,last_setup:new Date().toISOString()};}else if(e==="java"){let h=null,b=null,w=null,k=await d$1(),x=P.existsSync(y__default.join(l,"pom.xml"))||P.existsSync(y__default.join(l,"build.gradle"))||P.existsSync(y__default.join(l,"build.gradle.kts"))?l:k[0]||l;try{let{execa:E}=await import('execa'),W=await E("java",["-version"],{cwd:c,stdio:"pipe",reject:false,timeout:3e3}),he=`${W.stdout||""}
201
- ${W.stderr||""}`.match(/version\s+"([^"]+)"/i);h=he?he[1]:null;let Z=P.existsSync(y__default.join(x,"pom.xml")),N=P.existsSync(y__default.join(x,"build.gradle"))||P.existsSync(y__default.join(x,"build.gradle.kts"));if(Z){b="maven";let ye=(()=>{let S=y__default.join(x,"mvnw.cmd");if(process.platform==="win32"&&P.existsSync(S))return S;let ae=y__default.join(x,"mvnw");return P.existsSync(ae)?ae:"mvn"})(),xe=await E(ye,["-version"],{cwd:x,stdio:"pipe",reject:false,timeout:3e3}),$=`${xe.stdout||""}
202
- ${xe.stderr||""}`.match(/Apache Maven\s+(\S+)/i);w=$?$[1]:null;}else if(N){b="gradle";let ye=(()=>{let S=y__default.join(x,"gradlew.bat");if(process.platform==="win32"&&P.existsSync(S))return S;let ae=y__default.join(x,"gradlew");return P.existsSync(ae)?ae:"gradle"})(),xe=await E(ye,["--version"],{cwd:x,stdio:"pipe",reject:false,timeout:3e3}),$=`${xe.stdout||""}
203
- ${xe.stderr||""}`.match(/Gradle\s+(\S+)/i);w=$?$[1]:null;}}catch{}f.java={...f.java||{},version:h,build_tool:b,build_tool_version:w,last_setup:new Date().toISOString()};}else if(e==="dotnet"){let h=null;try{let{execa:b}=await import('execa'),k=((await b("dotnet",["--version"],{cwd:c,stdio:"pipe",reject:false,timeout:3e3})).stdout||"").trim();h=k.length>0?k:null;}catch{}f.dotnet={...f.dotnet||{},version:h,sdk:h,last_setup:new Date().toISOString()};}g.updated_at=new Date().toISOString(),await P.promises.writeFile(m,JSON.stringify(g,null,2)+`
193
+ `;await v.promises.writeFile(o,n,"utf-8");}function lc(t){let e=t.trim().toLowerCase();return e==="true"||e==="1"||e==="on"?true:e==="false"||e==="0"||e==="off"?false:null}function Fs(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 Ks(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 Ls(t,e){let r=ee(t),o=r?y__default.join(r,".rapidkit","policies.yml"):null,n="isolated";if(o&&await E__default.pathExists(o))try{let c=await v.promises.readFile(o,"utf-8"),l=Ks(c);if(l.status==="failed")return console.log(i.red(`\u274C ${l.message}`)),{ok:false,code:1};n=l.mode;}catch{return console.log(i.red("\u274C Failed to read workspace policy file (.rapidkit/policies.yml).")),{ok:false,code:1}}let s=process.env.RAPIDKIT_DEP_SHARING_MODE,a=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 s>"u"?delete process.env.RAPIDKIT_DEP_SHARING_MODE:process.env.RAPIDKIT_DEP_SHARING_MODE=s,typeof a>"u"?delete process.env.RAPIDKIT_WORKSPACE_PATH:process.env.RAPIDKIT_WORKSPACE_PATH=a;}}async function q(t,e,r){return await new Promise(o=>{let n=spawn(t,e,{stdio:["ignore","pipe","pipe"],cwd:r,shell:b$5()});n.stdout?.on("data",s=>{process.stdout.write(s);}),n.stderr?.on("data",s=>{process.stderr.write(s);}),n.on("close",s=>o(s??1)),n.on("error",()=>o(1));})}async function ot(t,e){await E__default.outputFile(t,`${JSON.stringify(e,null,2)}
194
+ `,"utf-8");}async function dc(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,s=n??ee(process.cwd()),a=false,c=false;if(n){if(!st(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(i.red(`\u274C ${d}`)),1}}else if(!s||!st(s)){let d=await fc();s=d.workspacePath,a=true,c=d.created;}if(!s||!st(s)){let d="Not inside a RapidKit workspace";return e.json?console.log(JSON.stringify({error:d},null,2)):(console.log(i.red(`\u274C ${d}`)),console.log(i.gray("\u{1F4A1} Run this command from a workspace root or pass --workspace <path>."))),1}let l=`cd ${s}`,u=r?.syncWorkspaceProjects??(async d=>{if(o)throw new Error("forced sync failure for command-level import rollback test");let{syncWorkspaceProjects:f}=await import('./workspace-AG2MQFTY.js');await f(d,true);}),p=r?.rollbackImportedProjectImport??ds;try{let d=await ps({workspacePath:s,source:t,name:e.name,sourceType:e.git===true?"git-url":void 0});try{await u(s);}catch(f){await p(s,d.path);try{await u(s);}catch{}throw new Error(`Workspace sync failed after import and the imported project was rolled back: ${f instanceof Error?f.message:String(f)}`)}return e.json?(console.log(JSON.stringify({workspacePath:s,workspaceResolution:a?"default-auto":n?"explicit":"nearest",defaultWorkspaceCreated:a?c:false,suggestedCdCommand:l,importedProject:d},null,2)),0):(a&&console.log(i.yellow(`\u2139 Imported outside a workspace, so RapidKit used the default workspace: ${s}`)),console.log(i.green(`\u2714 Imported project: ${d.name}`)),console.log(i.gray(` Workspace: ${s}`)),console.log(i.gray(` Destination: ${d.path}`)),console.log(i.gray(` Stack: ${d.stack} (${d.confidence})`)),console.log(i.gray(` Source: ${e.git===true||oo(t)?"git-url":"local-folder"}`)),console.log(i.gray(` Next shell step: ${l}`)),0)}catch(d){let f=d instanceof Error?d.message:String(d);return e.json?console.log(JSON.stringify({error:f},null,2)):console.log(i.red(`\u274C Import failed: ${f}`)),1}}async function mo(t){let e=new Set(["python-only","polyglot","enterprise"]),r="minimal";try{let s=y__default.join(t,".rapidkit","workspace.json");r=JSON.parse(await v.promises.readFile(s,"utf-8")).profile??"minimal";}catch{r="minimal";}if(!await(async()=>{if(e.has(r))return true;let s=await ho(t);if(s.length===0)return false;for(let a of s){let c=a$4(a),l=c?.module_support;if(!(b$3(c,a)||d(c,a)||e$2(c,a))&&l!==false)return f$1(c,a)||c$1(c,a),true}return false})())return 0;let n="poetry";try{let{readWorkspaceMarker:s}=await import('./workspace-marker-IOPQ42A7.js'),c=(await s(t))?.metadata?.npm?.installMethod;(c==="poetry"||c==="venv"||c==="pipx"||c==="pip")&&(n=c);}catch{}if(n==="poetry"||n==="venv"){let s=y__default.join(t,"pyproject.toml"),a=false;try{a=(await v.promises.readFile(s,"utf-8")).includes("rapidkit-core");}catch{a=false;}let c=process.env.RAPIDKIT_DEV_PATH,l=c?await E__default.pathExists(c):false;if(a){let u=Ja(t);if(!await E__default.pathExists(u)){let f=await Ga(t);if(f!==0)return f}let d=await q(u,l&&c?["-m","pip","install",c,"--quiet","--disable-pip-version-check"]:["-m","pip","install","rapidkit-core","--quiet","--disable-pip-version-check"],t);if(d!==0)return d}else {let u=await q("poetry",["install","--no-root"],t);if(u!==0)return u;let p=await q("poetry",["add","rapidkit-core"],t);if(p!==0)return p}try{let{writeWorkspaceLauncher:u}=await import('./create-BO2I3ESU.js');await u(t,n==="venv"?"venv":"poetry");}catch{}return 0}return 0}async function ho(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 s=[];try{s=await v.promises.readdir(n,{withFileTypes:true});}catch{continue}for(let a of s){if(!a.isDirectory()||a.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(a.name))continue;let c=y__default.join(n,a.name),l=y__default.join(c,".rapidkit","context.json"),u=y__default.join(c,".rapidkit","project.json");if(await E__default.pathExists(l)||await E__default.pathExists(u)){e.push(c);continue}o.push(c);}}return e}function pc(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 uc="default-workspace";function mc(){return y__default.join(homedir(),"Workspai","rapidkits",uc)}async function fc(){let t=mc(),e=y__default.basename(t),r=st(t);await E__default.ensureDir(y__default.join(t,".rapidkit")),await b$4(t,d$2(e,b()));let o=y__default.join(t,".rapidkit","workspace.json");return await E__default.pathExists(o)||await ot(o,{name:e,workspace_name:e,profile:"minimal",createdAt:new Date().toISOString(),createdBy:"rapidkit-npm-import-fallback"}),{workspacePath:t,created:!r}}async function co(t){let r=await Fe("go",{runCommandInCwd:q,runCoreRapidkit:e$1}).initProject(t);return fe(r)}function fe(t){return t.message&&console.log(i.red(`\u274C ${t.message}`)),t.exitCode}async function $t(t,e){let r=Fe("node",{runCommandInCwd:q,runCoreRapidkit:e$1});if(t==="init"){let n=await r.initProject(e);return fe(n)}if(t==="dev"){let n=await r.runDev(e);return fe(n)}if(t==="test"){let n=await r.runTest(e);return fe(n)}if(t==="build"){let n=await r.runBuild(e);return fe(n)}let o=await r.runStart(e);return fe(o)}async function nt(t,e){let r=Fe("java",{runCommandInCwd:q,runCoreRapidkit:e$1});if(t==="init"){let n=await r.initProject(e);return fe(n)}if(t==="dev"){let n=await r.runDev(e);return fe(n)}if(t==="test"){let n=await r.runTest(e);return fe(n)}if(t==="build"){let n=await r.runBuild(e);return fe(n)}let o=await r.runStart(e);return fe(o)}async function Ps(t,e=fo){let r=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof r>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let s=function(S){if(!S)return null;let O=S.trim().toLowerCase();return O==="minimal"||O==="java-only"||O==="go-only"||O==="dotnet-only"||O==="python-only"||O==="node-only"||O==="polyglot"||O==="enterprise"?O:null},a=function(S){let te=S.match(/^\s*mode:\s*([a-zA-Z]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase()==="strict"?"strict":"warn",he=(je,Le)=>{let kt=S.match(new RegExp(`^\\s*${je}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return kt?kt[1].toLowerCase()==="true":Le};return {mode:te,dependency_sharing_mode:Fs(S),rules:{enforce_workspace_marker:he("enforce_workspace_marker",true),enforce_toolchain_lock:he("enforce_toolchain_lock",false),disallow_untrusted_tool_sources:he("disallow_untrusted_tool_sources",false),enforce_compatibility_matrix:he("enforce_compatibility_matrix",false),require_mirror_lock_for_offline:he("require_mirror_lock_for_offline",true)}}};let c=["init"],l,u=false,p=false,d$1=false,f=false;for(let S=1;S<t.length;S+=1){let O=t[S];if(O==="--ci"){u=true;continue}if(O==="--offline"){p=true;continue}if(O==="--json"){d$1=true;continue}if(O==="--compliance-only"){f=true;continue}if(O==="--profile"){let Y=t[S+1];if(!Y||Y.startsWith("-"))return console.log(i.yellow("Usage: rapidkit bootstrap [path] [--profile <minimal|java-only|go-only|dotnet-only|python-only|node-only|polyglot|enterprise>] [--ci] [--offline] [--json] [--compliance-only]")),1;l=Y,S+=1;continue}if(O.startsWith("--profile=")){l=O.slice(10);continue}c.push(O);}let g=s(l);if(l&&!g)return console.log(i.red(`Invalid profile: ${l}. Use one of: minimal, java-only, go-only, dotnet-only, python-only, node-only, polyglot, enterprise.`)),1;let m=process.cwd(),h=c.slice(1).filter(S=>!S.startsWith("-"));if(h.length>0){let S=y__default.resolve(m,h[0]),O=a$4(S),Y=v.existsSync(S)?await Ot(S):"unknown";if(!st(S)&&(b$3(O,S)||d(O,S)||e$2(O,S)||c$1(O,S)||f$1(O,S)||Y!=="unknown"))return await e(c)}let P=y__default.join(m,".rapidkit-workspace"),C=y__default.join(m,".rapidkit","workspace.json"),w;!v.existsSync(P)&&v.existsSync(C)?w=m:(w=ee(m),w||(w=nc(m)));let k=[],x=null,_=null;if(w)try{let S=y__default.join(w,".rapidkit","workspace.json"),O=await v.promises.readFile(S,"utf-8"),Y=JSON.parse(O);_=s(Y.profile);}catch{_=null;}let $=["minimal","java-only","python-only","node-only","go-only","dotnet-only","polyglot","enterprise"],ye={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)","dotnet-only":"dotnet-only \u2014 .NET runtime (ASP.NET Core services)",polyglot:"polyglot \u2014 Python + Node.js + Go + Java + .NET multi-runtime workspace",enterprise:"enterprise \u2014 Polyglot + governance + Sigstore verification"},U=g;if(!!w&&!g&&!u&&!d$1&&!!process.stdin.isTTY&&!!process.stdout.isTTY){let S=_||"minimal",{chosenProfile:O}=await Ke.prompt([{type:"rawlist",name:"chosenProfile",message:`Select workspace profile for bootstrap (current: ${S})`,choices:$.map(Y=>({name:Y===S?`${ye[Y]} \u2190 current`:ye[Y],value:Y})),default:$.indexOf(S)}]);U=O;}let W=U||_||"minimal";if(w)try{let O=W==="python-only"||W==="polyglot"||W==="enterprise"?"poetry":"venv",Y;try{let Le=(await v.promises.readFile(y__default.join(w,".python-version"),"utf-8")).trim();Le&&(Y=Le);}catch{}let{syncWorkspaceFoundationFiles:te}=await import('./create-BO2I3ESU.js'),he=await te(w,{workspaceName:y__default.basename(w),installMethod:O,pythonVersion:Y,profile:W,writeMarker:true,writeGitignore:true,onlyIfMissing:true});k.push({id:"workspace.legacy.sync",status:he.length>0?"passed":"skipped",message:he.length>0?`Legacy workspace foundation synchronized: ${he.join(", ")}`:"Workspace foundation files are already up to date."});}catch(S){k.push({id:"workspace.legacy.sync",status:"failed",message:`Failed to synchronize legacy workspace foundation files: ${S.message}`});}if(w&&U&&U!==_)try{let S=y__default.join(w,".rapidkit","workspace.json"),O=await v.promises.readFile(S,"utf-8"),Y=JSON.parse(O);Y.profile=U,await v.promises.writeFile(S,JSON.stringify(Y,null,2)+`
195
+ `,"utf-8");}catch{}let G={mode:"warn",dependency_sharing_mode:"isolated",rules:{enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true}},we=null;if(w)try{let S=await v.promises.readFile(y__default.join(w,".rapidkit","policies.yml"),"utf-8");we=S,G=a(S);}catch{k.push({id:"policy.file",status:"skipped",message:"No workspace policy file found; using default bootstrap policy."});}else k.push({id:"workspace.detect",status:"skipped",message:"No workspace marker found; bootstrap runs in project/single-path mode."});if(w){let S=Ks(we);G.dependency_sharing_mode=S.mode,k.push({id:"policy.schema.dependency_sharing_mode",status:S.status,message:S.message}),k.push({id:"policy.dependency_sharing_mode.effective",status:"passed",message:G.dependency_sharing_mode==="isolated"?"Effective dependency mode: isolated (default secure mode).":G.dependency_sharing_mode==="shared-node-deps"?"Effective dependency mode: shared-node-deps (Node projects share workspace-level caches).":"Effective dependency mode: shared-runtime-caches (Node/Python/Go share workspace-level caches)."});let O=v.existsSync(y__default.join(w,".rapidkit-workspace"));k.push({id:"policy.enforce_workspace_marker",status:!G.rules.enforce_workspace_marker||O?"passed":"failed",message:!G.rules.enforce_workspace_marker||O?"Workspace marker policy satisfied.":"Workspace marker policy failed: .rapidkit-workspace is missing."});let Y=v.existsSync(y__default.join(w,".rapidkit","toolchain.lock"));k.push({id:"policy.enforce_toolchain_lock",status:!G.rules.enforce_toolchain_lock||Y?"passed":"failed",message:!G.rules.enforce_toolchain_lock||Y?"Toolchain lock policy satisfied.":"Toolchain lock policy failed: .rapidkit/toolchain.lock is missing."});let te=process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||v.existsSync(y__default.join(w,".rapidkit","trusted-sources.lock"));k.push({id:"policy.disallow_untrusted_tool_sources",status:!G.rules.disallow_untrusted_tool_sources||te?"passed":"failed",message:!G.rules.disallow_untrusted_tool_sources||te?"Trusted tool sources policy satisfied.":"Trusted tool sources policy failed: set RAPIDKIT_TRUSTED_SOURCES=1 or provide .rapidkit/trusted-sources.lock."});let he=y__default.join(w,".rapidkit","compatibility-matrix.json"),je=v.existsSync(he),Le=G.rules.enforce_compatibility_matrix;if(k.push({id:"policy.enforce_compatibility_matrix",status:!Le||je?"passed":"failed",message:!Le||je?"Compatibility matrix policy satisfied.":"Compatibility matrix policy failed: .rapidkit/compatibility-matrix.json is missing."}),je)try{let K=await v.promises.readFile(he,"utf-8"),Q=JSON.parse(K),Dt=!!Q&&typeof Q=="object";k.push({id:"compatibility.matrix.parse",status:Dt?"passed":"failed",message:Dt?"Compatibility matrix parsed successfully.":"Compatibility matrix parse failed: invalid JSON object."});}catch{k.push({id:"compatibility.matrix.parse",status:"failed",message:"Compatibility matrix parse failed: invalid JSON."});}let kt=y__default.join(w,".rapidkit","mirror-config.json"),Gs=y__default.join(w,".rapidkit","mirror.lock"),gr=v.existsSync(kt),hr=v.existsSync(Gs),yo={};if(gr)try{yo=JSON.parse(await v.promises.readFile(kt,"utf-8")),k.push({id:"mirror.config.parse",status:"passed",message:"Mirror configuration parsed successfully."});}catch{k.push({id:"mirror.config.parse",status:"failed",message:"Mirror configuration parse failed: invalid JSON in .rapidkit/mirror-config.json."});}let yr=await ro(w,{ciMode:u,offlineMode:p});if(k.push(...yr.checks.map(K=>({id:K.id,status:K.status,message:K.message}))),x=yr.details,yr.details.lockWritten&&(hr=true),p){let K=process.env.RAPIDKIT_MIRROR_ENABLED==="1"||yo.enabled===true;k.push({id:"offline.mirror.enabled",status:K?"passed":"failed",message:K?"Offline mode mirror is enabled.":'Offline mode requires mirror enablement (set RAPIDKIT_MIRROR_ENABLED=1 or .rapidkit/mirror-config.json {"enabled": true}).'});let Q=G.rules.require_mirror_lock_for_offline;k.push({id:"offline.mirror.lock",status:!Q||hr?"passed":"failed",message:!Q||hr?"Offline mode mirror lock policy satisfied.":"Offline mode mirror lock policy failed: .rapidkit/mirror.lock is missing."});}else k.push({id:"offline.mirror.enabled",status:"skipped",message:"Offline mirror checks skipped (offline mode is disabled)."});let Bs=await ho(w),re=new Set;for(let K of Bs){let Q=a$4(K);if(b$3(Q,K)){re.add("go");continue}if(d(Q,K)){re.add("java");continue}if(e$2(Q,K)){re.add("dotnet");continue}if(c$1(Q,K)){re.add("node");continue}if(f$1(Q,K)){re.add("python");continue}re.add("unknown");}if(W==="go-only"){let K=re.size===0||[...re].every(Q=>Q==="go");k.push({id:"profile.go-only",status:K?"passed":"failed",message:K?"go-only profile validated for discovered projects.":`go-only profile mismatch: detected runtimes [${[...re].join(", ")}].`});}else if(W==="java-only"){let K=re.size===0||[...re].every(Q=>Q==="java");k.push({id:"profile.java-only",status:K?"passed":"failed",message:K?"java-only profile validated for discovered projects.":`java-only profile mismatch: detected runtimes [${[...re].join(", ")}].`});}else if(W==="dotnet-only"){let K=re.size===0||[...re].every(Q=>Q==="dotnet");k.push({id:"profile.dotnet-only",status:K?"passed":"failed",message:K?"dotnet-only profile validated for discovered projects.":`dotnet-only profile mismatch: detected runtimes [${[...re].join(", ")}].`});}else if(W==="python-only"){let K=re.size===0||[...re].every(Q=>Q==="python");k.push({id:"profile.python-only",status:K?"passed":"failed",message:K?"python-only profile validated for discovered projects.":`python-only profile mismatch: detected runtimes [${[...re].join(", ")}].`});}else if(W==="node-only"){let K=re.size===0||[...re].every(Q=>Q==="node");k.push({id:"profile.node-only",status:K?"passed":"failed",message:K?"node-only profile validated for discovered projects.":`node-only profile mismatch: detected runtimes [${[...re].join(", ")}].`});}else if(W==="minimal"){let K=[...re].filter(Dt=>Dt!=="unknown"),Q=K.length<=1;k.push({id:"profile.minimal",status:Q?"passed":"failed",message:Q?"minimal profile is compatible with detected runtime mix.":`minimal profile mismatch: multiple runtimes detected [${K.join(", ")}].`});}else W==="enterprise"&&(k.push({id:"profile.enterprise.ci",status:u?"passed":"failed",message:u?"enterprise profile running with --ci.":"enterprise profile expects --ci for deterministic non-interactive mode."}),k.push({id:"profile.enterprise.compatibility-matrix",status:je?"passed":"failed",message:je?"enterprise profile has compatibility matrix.":"enterprise profile requires .rapidkit/compatibility-matrix.json."}),k.push({id:"profile.enterprise.mirror-config",status:gr?"passed":"failed",message:gr?"enterprise profile has mirror configuration.":"enterprise profile requires .rapidkit/mirror-config.json."}));}u&&(process.env.RAPIDKIT_BOOTSTRAP_CI="1"),p&&(process.env.RAPIDKIT_OFFLINE_MODE="1");let N=k.some(S=>S.id.startsWith("policy.schema.")&&S.status==="failed")||G.mode==="strict"&&k.some(S=>S.status==="failed"),j=w||m,X=y__default.join(j,".rapidkit","reports"),Re=new Date().toISOString().replace(/[:.]/g,"-"),H=y__default.join(X,`bootstrap-compliance-${Re}.json`),ge=y__default.join(X,"bootstrap-compliance.latest.json"),Ce={command:"bootstrap",timestamp:new Date().toISOString(),workspacePath:w,profile:W,options:{ci:u,offline:p,strict:G.mode==="strict"},policyMode:G.mode,policyRules:G.rules,mirrorLifecycle:x,checks:k};if(N){let S={...Ce,result:"blocked",initExitCode:null};return await E__default.ensureDir(X),await ot(H,S),await ot(ge,S),d$1?process.stdout.write(`${JSON.stringify(S,null,2)}
196
+ `):(console.log(i.red("\u274C Bootstrap blocked by strict policy checks.")),console.log(i.gray(`Compliance report: ${H}`))),1}let Ee=0;d$1&&f||(Ee=await e(c));let be=k.filter(S=>S.status==="failed").length,F=Ee!==0?"failed":be>0?"ok_with_warnings":"ok",Ze={...Ce,result:F,initExitCode:Ee,complianceOnly:d$1&&f};if(await E__default.ensureDir(X),await ot(H,Ze),await ot(ge,Ze),w&&Ee===0)try{let{syncWorkspaceProjects:S}=await import('./workspace-AG2MQFTY.js');await S(w,d$1),await rt(w,{silent:d$1});}catch{}if(d$1)process.stdout.write(`${JSON.stringify(Ze,null,2)}
197
+ `);else {let S=k.filter(O=>O.status==="failed").length;S>0&&console.log(i.yellow(`\u26A0\uFE0F Bootstrap completed with ${S} policy/profile warnings.`)),console.log(i.gray(`Compliance report: ${H}`));}return Ee}finally{typeof r>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=r;}}async function bs(t){if(t.includes("--help")||t.includes("-h"))return console.log(i.yellow("Usage: rapidkit setup <python|node|go|java|dotnet> [--warm-deps]")),0;let e=(t[1]||"").toLowerCase(),r=t.includes("--warm-deps")||t.includes("--warm-dependencies");if(!e||!["python","node","go","java","dotnet"].includes(e))return console.log(i.yellow("Usage: rapidkit setup <python|node|go|java|dotnet> [--warm-deps]")),1;let o=async(d,f)=>{if(d==="node"){if(!v.existsSync(y__default.join(f,"package.json")))return {exitCode:0,message:"Node warm-up skipped: package.json not found in current directory."};let m=v.existsSync(y__default.join(f,"pnpm-lock.yaml")),h=v.existsSync(y__default.join(f,"yarn.lock"));return m?{exitCode:await q("pnpm",["install","--lockfile-only","--ignore-scripts"],f)}:h?{exitCode:await q("yarn",["install","--ignore-scripts"],f)}:{exitCode:await q("npm",["install","--package-lock-only","--ignore-scripts"],f)}}if(d==="go")return v.existsSync(y__default.join(f,"go.mod"))?{exitCode:await q("go",["mod","download"],f)}:{exitCode:0,message:"Go warm-up skipped: go.mod not found in current directory."};if(d==="java"){let g=v.existsSync(y__default.join(f,"pom.xml")),m=v.existsSync(y__default.join(f,"build.gradle"))||v.existsSync(y__default.join(f,"build.gradle.kts")),h=y__default.join(f,process.platform==="win32"?"gradlew.bat":"gradlew"),P=v.existsSync(h);return !g&&!m?{exitCode:0,message:"Java warm-up skipped: pom.xml or build.gradle not found in current directory."}:g?{exitCode:await q("mvn",["-B","-q","-DskipTests","dependency:go-offline"],f)}:{exitCode:await q(P?h:"gradle",["--no-daemon","dependencies"],f)}}return d==="dotnet"?(()=>{let m=[{dir:f,depth:0}],h=new Set(["bin","obj",".git","node_modules",".rapidkit"]);for(;m.length>0;){let P=m.shift();if(!P||P.depth>3)continue;let C=[];try{C=v.readdirSync(P.dir,{withFileTypes:true});}catch{continue}for(let w of C)if(w.isFile()){let k=w.name.toLowerCase();if(k.endsWith(".sln")||k.endsWith(".csproj"))return true}else w.isDirectory()&&!h.has(w.name)&&m.push({dir:y__default.join(P.dir,w.name),depth:P.depth+1});}return false})()?{exitCode:await q("dotnet",["restore"],f)}:{exitCode:0,message:".NET warm-up skipped: .sln or *.csproj not found in current project tree."}:{exitCode:0,message:"Dependency warm-up currently applies to node/go/java/dotnet runtimes."}},n=Fe(e,{runCommandInCwd:q,runCoreRapidkit:(d,f)=>e$1(d,{...f,cwd:void 0})}),s=await n.checkPrereqs(),a=await n.doctorHints(process.cwd()),c=ee(process.cwd()),l=c||process.cwd(),u=null,p=async()=>e!=="java"||!c?[]:u||(u=(await ho(c)).filter(f=>{let g=a$4(f);return d(g,f)}),u);if(s.exitCode===0){console.log(i.green(`\u2705 ${e} prerequisites look good.`));let d=["python","node","go","java","dotnet"].filter(f=>f!==e).join("/");if(console.log(i.gray(` Scope: validated ${e} runtime only. ${d} checks are optional unless your workspace profile uses them.`)),e==="python"&&console.log(i.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(i.gray(` ${e} cache warm-up completed.`)):console.log(i.yellow(` ${e} cache warm-up skipped (non-fatal).`))),r)if(e==="java"&&c){let f=await p();if(f.length>0){let g=0,m=0,h=0;for(let P of f){let C=await o("java",P),w=/skipped/i.test(C.message||""),k=y__default.relative(c,P)||y__default.basename(P);C.message&&console.log(i.gray(` [${k}] ${C.message}`)),C.exitCode===0&&!w?g+=1:C.exitCode===0&&w?h+=1:m+=1;}g>0&&console.log(i.gray(` java dependency warm-up completed for ${g} project(s) (--warm-deps).`)),m>0&&console.log(i.yellow(` java dependency warm-up failed for ${m} project(s) (non-fatal).`)),g===0&&m===0&&h>0&&console.log(i.gray(" java dependency warm-up skipped for discovered workspace projects."));}else {let g=await o("java",l),m=/skipped/i.test(g.message||"");g.message&&console.log(i.gray(` ${g.message}`)),g.exitCode===0&&!m?console.log(i.gray(` ${e} dependency warm-up completed (--warm-deps).`)):g.exitCode!==0&&console.log(i.yellow(` ${e} dependency warm-up failed (non-fatal).`));}}else {let f=await o(e,l),g=/skipped/i.test(f.message||"");f.message&&console.log(i.gray(` ${f.message}`)),f.exitCode===0&&!g?console.log(i.gray(` ${e} dependency warm-up completed (--warm-deps).`)):f.exitCode!==0&&console.log(i.yellow(` ${e} dependency warm-up failed (non-fatal).`));}if(c)try{let f=y__default.join(c,".rapidkit","toolchain.lock"),g={};try{g=JSON.parse(await v.promises.readFile(f,"utf-8"));}catch{}(!g.runtime||typeof g.runtime!="object")&&(g.runtime={});let m=g.runtime;if(e==="python"){let h=null;try{let{execa:P}=await import('execa');for(let C of go()){let k=await P(C,C==="py"?["-3","--version"]:["--version"],{cwd:c,stdio:"pipe",reject:false,timeout:3e3});if(k.exitCode===0){let _=(k.stdout||k.stderr||"").match(/Python\s+(\S+)/);if(h=_?_[1]:null,h)break}}}catch{}m.python={...m.python||{},version:h,last_setup:new Date().toISOString()};}else if(e==="node")m.node={...m.node||{},version:process.version,last_setup:new Date().toISOString()};else if(e==="go"){let h=null;try{let{execa:P}=await import('execa'),w=((await P("go",["version"],{cwd:c,stdio:"pipe"})).stdout||"").match(/go(\d+\.\d+(?:\.\d+)?)/i);h=w?w[1]:null;}catch{}m.go={...m.go||{},version:h,last_setup:new Date().toISOString()};}else if(e==="java"){let h=null,P=null,C=null,w=await p(),x=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:w[0]||l;try{let{execa:_}=await import('execa'),$=await _("java",["-version"],{cwd:c,stdio:"pipe",reject:false,timeout:3e3}),U=`${$.stdout||""}
198
+ ${$.stderr||""}`.match(/version\s+"([^"]+)"/i);h=U?U[1]:null;let Ne=v.existsSync(y__default.join(x,"pom.xml")),W=v.existsSync(y__default.join(x,"build.gradle"))||v.existsSync(y__default.join(x,"build.gradle.kts"));if(Ne){P="maven";let G=(()=>{let j=y__default.join(x,"mvnw.cmd");if(process.platform==="win32"&&v.existsSync(j))return j;let X=y__default.join(x,"mvnw");return v.existsSync(X)?X:"mvn"})(),we=await _(G,["-version"],{cwd:x,stdio:"pipe",reject:false,timeout:3e3}),N=`${we.stdout||""}
199
+ ${we.stderr||""}`.match(/Apache Maven\s+(\S+)/i);C=N?N[1]:null;}else if(W){P="gradle";let G=(()=>{let j=y__default.join(x,"gradlew.bat");if(process.platform==="win32"&&v.existsSync(j))return j;let X=y__default.join(x,"gradlew");return v.existsSync(X)?X:"gradle"})(),we=await _(G,["--version"],{cwd:x,stdio:"pipe",reject:false,timeout:3e3}),N=`${we.stdout||""}
200
+ ${we.stderr||""}`.match(/Gradle\s+(\S+)/i);C=N?N[1]:null;}}catch{}m.java={...m.java||{},version:h,build_tool:P,build_tool_version:C,last_setup:new Date().toISOString()};}else if(e==="dotnet"){let h=null;try{let{execa:P}=await import('execa'),w=((await P("dotnet",["--version"],{cwd:c,stdio:"pipe",reject:false,timeout:3e3})).stdout||"").trim();h=w.length>0?w:null;}catch{}m.dotnet={...m.dotnet||{},version:h,sdk:h,last_setup:new Date().toISOString()};}g.updated_at=new Date().toISOString(),await v.promises.writeFile(f,JSON.stringify(g,null,2)+`
204
201
  `,"utf-8"),console.log(i.gray(" toolchain.lock updated (.rapidkit/toolchain.lock)"));}catch{}}else console.log(i.red(`\u274C ${e} prerequisites check failed.`));if(a.length>0){console.log(i.gray(`
205
- Hints:`));for(let p of a)console.log(i.gray(`- ${p}`));}return s.exitCode}function Ac(t){let e={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};for(let r of t.split(`
206
- `)){let o=r.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 a=o.match(/^self_heal:\s*(true|false)/);a&&(e.self_heal=a[1]==="true");let c=o.match(/^verify_integrity:\s*(true|false)/);c&&(e.verify_integrity=c[1]==="true");}return e}async function Es(t){if(t.includes("--help")||t.includes("-h"))return console.log(i.yellow("Usage: rapidkit cache <status|clear|prune|repair>")),0;let e=(t[1]||"status").toLowerCase(),r=mr.getInstance(),o=Q(process.cwd()),n={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};if(o)try{let s=await P.promises.readFile(y__default.join(o,".rapidkit","cache-config.yml"),"utf-8");n=Ac(s);}catch{}return e==="status"?(console.log(i.cyan("RapidKit cache is enabled")),console.log(i.cyan("RapidKit cache status")),o?(console.log(i.gray(` Workspace: ${o}`)),console.log(i.gray(` Strategy: ${n.strategy}`)),console.log(i.gray(` Self-heal: ${n.self_heal}`)),console.log(i.gray(` Prune on bootstrap:${n.prune_on_bootstrap}`)),console.log(i.gray(` Verify integrity: ${n.verify_integrity}`))):console.log(i.gray(" (not inside a workspace \u2014 showing in-memory cache only)")),console.log(i.gray(" In-memory cache: enabled")),console.log(i.gray(" Use: rapidkit cache clear|prune|repair")),0):e==="clear"?(await r.clear(),console.log(i.green("Cache clear completed")),console.log(i.green("\u2705 Cache cleared (all entries removed).")),0):e==="prune"?(await r.clear(),console.log(i.green("\u2705 Cache pruned (stale entries removed).")),n.prune_on_bootstrap||console.log(i.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(i.green("\u2705 Cache repaired (self-heal applied, stale entries evicted).")),n.verify_integrity&&console.log(i.gray(" Integrity verification is enabled in cache-config.yml.")),0):(console.log(i.yellow("\u26A0\uFE0F self_heal is disabled in .rapidkit/cache-config.yml \u2014 skipping repair.")),0):(console.log(i.yellow("Usage: rapidkit cache <status|clear|prune|repair>")),1)}async function $c(t,e,r,o){let n=(e||"show").toLowerCase(),s=y__default.join(t,".rapidkit","policies.yml");if(n==="show"||n==="status"||n==="get"){let d=await xs(t),p=js(d);return console.log(i.cyan(`Policy file: ${s}`)),console.log(i.gray(` mode: ${p.mode}`)),console.log(i.gray(` dependency_sharing_mode: ${p.dependency_sharing_mode}`)),console.log(i.gray(" rules:")),console.log(i.gray(` enforce_workspace_marker: ${p.rules.enforce_workspace_marker}`)),console.log(i.gray(` enforce_toolchain_lock: ${p.rules.enforce_toolchain_lock}`)),console.log(i.gray(` disallow_untrusted_tool_sources: ${p.rules.disallow_untrusted_tool_sources}`)),console.log(i.gray(` enforce_compatibility_matrix: ${p.rules.enforce_compatibility_matrix}`)),console.log(i.gray(` require_mirror_lock_for_offline: ${p.rules.require_mirror_lock_for_offline}`)),console.log(i.gray("Examples:")),console.log(i.gray(" npx rapidkit workspace policy set mode strict")),console.log(i.gray(" npx rapidkit workspace policy set dependency_sharing_mode shared-runtime-caches")),console.log(i.gray(" npx rapidkit workspace policy set rules.enforce_toolchain_lock true")),0}if(n!=="set")return console.log(i.red(`Unknown workspace policy action: ${e||""}`)),console.log(i.gray("Available: show, set")),1;if(!r||typeof o>"u")return console.log(i.yellow("Usage: rapidkit workspace policy set <key> <value>")),console.log(i.gray("Allowed keys:")),console.log(i.gray(" mode (warn|strict)")),console.log(i.gray(" dependency_sharing_mode (isolated|shared-runtime-caches|shared-node-deps)")),console.log(i.gray(" rules.enforce_workspace_marker (true|false)")),console.log(i.gray(" rules.enforce_toolchain_lock (true|false)")),console.log(i.gray(" rules.disallow_untrusted_tool_sources (true|false)")),console.log(i.gray(" rules.enforce_compatibility_matrix (true|false)")),console.log(i.gray(" rules.require_mirror_lock_for_offline (true|false)")),1;let a=r.trim(),l=await xs(t);if(a==="mode"){let d=o.trim().toLowerCase();if(d!=="warn"&&d!=="strict")return console.log(i.red("\u274C Invalid mode. Use: warn | strict")),1;l=Ss(l,"mode",`${d} # "warn" or "strict"`);}else if(a==="dependency_sharing_mode"){let d=o.trim().toLowerCase();if(d!=="isolated"&&d!=="shared-runtime-caches"&&d!=="shared-node-deps")return console.log(i.red("\u274C Invalid dependency_sharing_mode. Use: isolated | shared-runtime-caches | shared-node-deps")),1;l=Ss(l,"dependency_sharing_mode",`${d} # "isolated" or "shared-runtime-caches" or "shared-node-deps"`);}else if(a.startsWith("rules.")){let d=a.slice(6);if(!(d in Gs))return console.log(i.red(`\u274C Unknown policy rule: ${d}`)),1;let p=xc(o);if(p===null)return console.log(i.red("\u274C Rule values must be boolean: true | false")),1;l=bc(l,d,p);}else return console.log(i.red(`\u274C Unknown policy key: ${a}`)),1;await Sc(t,l);let u=js(l);return console.log(i.green(`\u2705 Updated ${a} in .rapidkit/policies.yml`)),console.log(i.gray(` mode: ${u.mode}`)),console.log(i.gray(` dependency_sharing_mode: ${u.dependency_sharing_mode}`)),console.log(i.gray(" Tip: run `npx rapidkit workspace policy show` to inspect all values.")),0}async function _s(t){if(t.includes("--help")||t.includes("-h"))return console.log(i.yellow("Usage: rapidkit mirror <status|sync|verify|rotate> [--json]")),0;let e=(t[1]||"status").toLowerCase(),r=t.includes("--json"),o=Q(process.cwd());if(!o)return console.log(i.red("\u274C Not inside a RapidKit workspace")),console.log(i.gray("\u{1F4A1} Run this command from within a workspace directory")),1;let n=y__default.join(o,".rapidkit"),s=y__default.join(n,"mirror-config.json"),a=y__default.join(n,"mirror.lock"),c=y__default.join(n,"mirror","artifacts"),l=y__default.join(n,"reports");async function u(d){let p=new Date().toISOString().replace(/[:.]/g,"-"),m=y__default.join(l,`mirror-ops-${p}.json`),g=y__default.join(l,"mirror-ops.latest.json");await ___default.ensureDir(l),await nt(m,d),await nt(g,d);}if(e==="status"){if(!await ___default.pathExists(s))try{let b={schema_version:"1.0",enabled:false,strategy:"on-demand",artifacts:[],created_at:new Date().toISOString(),note:"Auto-generated by rapidkit mirror status. Set enabled: true and add artifact entries to activate mirroring."};await ___default.ensureDir(n),await P.promises.writeFile(s,JSON.stringify(b,null,2)+`
207
- `,"utf-8"),console.log(i.gray(" mirror-config.json created with defaults (.rapidkit/mirror-config.json)"));}catch{}let p=await ___default.pathExists(s),m=await ___default.pathExists(c),g=await ___default.pathExists(a),f=m?(await P.promises.readdir(c,{withFileTypes:true})).filter(b=>b.isFile()).length:0,h={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:o,mirror:{configExists:p,lockExists:g,artifactsCount:f}};return await u(h),r?(process.stdout.write(`${JSON.stringify(h,null,2)}
208
- `),0):(console.log(i.cyan("RapidKit mirror status")),console.log(i.gray(`Workspace: ${o}`)),console.log(i.gray(`Config: ${p?"present":"missing"} (${s})`)),console.log(i.gray(`Lock: ${g?"present":"missing"} (${a})`)),console.log(i.gray(`Artifacts: ${f}`)),0)}if(e==="sync"||e==="verify"||e==="rotate"){let d=await io(o,{ciMode:true,offlineMode:e==="verify",forceRun:true}),p=d.checks.filter(f=>f.status==="failed"),m=d.checks.some(f=>f.id.startsWith("mirror.verify.")&&f.status==="failed");if(e==="verify"&&m){let f={command:"mirror",action:e,result:"failed",timestamp:new Date().toISOString(),workspacePath:o,details:d.details,checks:d.checks};if(await u(f),r)return process.stdout.write(`${JSON.stringify(f,null,2)}
209
- `),1;console.log(i.red("\u274C Mirror verify failed."));for(let h of d.checks.filter(b=>b.id.startsWith("mirror.verify.")))console.log(i.gray(`- ${h.id}: ${h.message}`));return 1}if(p.length>0){let f={command:"mirror",action:e,result:"failed",timestamp:new Date().toISOString(),workspacePath:o,details:d.details,checks:d.checks};if(await u(f),r)return process.stdout.write(`${JSON.stringify(f,null,2)}
210
- `),1;console.log(i.yellow(`\u26A0\uFE0F Mirror ${e} completed with ${p.length} issue(s).`));for(let h of p)console.log(i.gray(`- ${h.id}: ${h.message}`));return 1}let g={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:o,details:d.details,checks:d.checks};return await u(g),r?(process.stdout.write(`${JSON.stringify(g,null,2)}
211
- `),0):e==="rotate"?(console.log(i.green(`\u2705 Mirror rotate completed. Rotated files: ${d.details.rotatedFiles}.`)),0):e==="verify"?(console.log(i.green(`\u2705 Mirror verify completed. Verified artifacts: ${d.details.verifiedArtifacts}.`)),0):(console.log(i.green(`\u2705 Mirror sync completed. Synced artifacts: ${d.details.syncedArtifacts}.`)),0)}return console.log(i.yellow("Usage: rapidkit mirror <status|sync|verify|rotate> [--json]")),1}async function wo(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 qs(r,async()=>{let n=Q(r),s=Je("python",{runCommandInCwd:V,runCoreRapidkit:e$1}),a=Je("dotnet",{runCommandInCwd:V,runCoreRapidkit:e$1}),c=t.slice(1).filter(f=>!f.startsWith("-"));if(c.length>0){let f=y__default.resolve(r,c[0]),h=a$4(f),b=await Dt(f);return b$2(h,f)||b==="go"?await mo(f):d(h,f)||b==="java"?await st("init",f):e$2(h,f)||b==="dotnet"?me(await a.initProject(f)):c$1(h,f)||b==="node"?await po(f):f$1(h,f)||b==="python"?await lo(f,s):await e$1(t,{cwd:r})}let l=a$4(r),u=!!Q(r)&&r===Q(r);if(!u&&b$2(l,r))return await mo(r);let d$1=await Dt(r);if(!u&&(d(l,r)||d$1==="java"))return await st("init",r);if(!u&&(e$2(l,r)||d$1==="dotnet"))return me(await a.initProject(r));if(!u&&(c$1(l,r)||d$1==="node"))return await po(r);if(!u&&(f$1(l,r)||d$1==="python"))return await lo(r,s);let p=n||Q(r),m=Js(r),g=m?y__default.dirname(y__default.dirname(m)):null;if(g&&g!==p){let f=a$4(g),h=await Dt(g);return b$2(f,g)||h==="go"?await mo(g):d(f,g)||h==="java"?await st("init",g):e$2(f,g)||h==="dotnet"?me(await a.initProject(g)):c$1(f,g)||h==="node"?await po(g):f$1(f,g)||h==="python"?await lo(g,s):await e$1(["init"],{cwd:g})}if(p&&r===p){console.log(i.yellow("\u26A0\uFE0F Running `npx rapidkit init` at workspace root.")),console.log(i.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 f=await yo(p);if(f!==0)return f;let{runWorkspaceStage:h}=await import('./workspace-run-SWN34LVQ.js');return (await h({workspacePath:p,stage:"init",affected:false,blastRadius:false,parallel:false,continueOnError:false,strict:false,json:false,enforceGates:false})).summary.exitCode}if(!p){let f=await a$2(),{name:h}=Rc(r),{createProject:b}=await import('./create-M7LT6WF6.js');return await b(h,{yes:true,userConfig:f}),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 Is(t){let e=Q(t);if(!e)return [];let r="warn";try{let l=await P.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(!P.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 P.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 a=s.runtime??{},c=a$4(t);b$2(c,t)&&!a.go?.version?o.push("go.version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."):c$1(c,t)&&!a.node?.version?o.push("node.version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."):d(c,t)&&!a.java?.version?o.push("java.version is not pinned in toolchain.lock \u2014 run `rapidkit setup java` first."):e$2(c,t)&&!a.dotnet?.version?o.push("dotnet.version is not pinned in toolchain.lock \u2014 run `rapidkit setup dotnet` first."):f$1(c,t)&&!a.python?.version&&o.push("python.version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");try{let u=JSON.parse(await P.promises.readFile(y__default.join(e,".rapidkit","workspace.json"),"utf-8")).profile??"";u==="python-only"&&(b$2(c,t)||c$1(c,t)||d(c,t)||e$2(c,t))?o.push('Workspace profile is "python-only" but this project is not Python.'):u==="node-only"&&(b$2(c,t)||f$1(c,t)||d(c,t)||e$2(c,t))?o.push('Workspace profile is "node-only" but this project is not Node.'):u==="go-only"&&(c$1(c,t)||f$1(c,t)||d(c,t)||e$2(c,t))?o.push('Workspace profile is "go-only" but this project is not Go.'):u==="java-only"&&(f$1(c,t)||c$1(c,t)||b$2(c,t)||e$2(c,t))?o.push('Workspace profile is "java-only" but this project is not Java.'):u==="dotnet-only"&&(f$1(c,t)||c$1(c,t)||b$2(c,t)||d(c,t))&&o.push('Workspace profile is "dotnet-only" but this project is not .NET.');}catch{}return o}async function Oc(){let t=async w=>{if(!a()||!w.toLowerCase().endsWith(".cmd"))return false;try{let C=(await ___default.readFile(w,"utf8")).replace(/\r\n/g,`
212
- `).toLowerCase(),x=C.includes("\\.rapidkit\\rapidkit"),E=C.includes("\\.rapidkit\\rapidkit.cmd")||C.includes("\\.rapidkit\\rapidkit.exe")||C.includes("\\.venv\\scripts\\rapidkit.exe");return x&&!E}catch{return false}},e=process.cwd(),r=process.argv.slice(2),o=r[0],n=o==="init",s=new Set(["dev","start","build","test"]),a$2=!o||o==="--help"||o==="-h"||o==="help",c=it(e),l=P.existsSync(y__default.join(e,".rapidkit","project.json")),u=a$4(e),d=b$2(u,e)||c$1(u,e),p=!!o&&s.has(o)&&d;if(Mt(r)||r[0]==="create")return false;if(go(r))return true;if(r[0]==="init"&&c&&!l)return false;if(Ls(r))return true;try{let w=o==="shell"&&r[1]==="activate",k=o==="create",C=await Wo(e,{cwd:e,timeoutMs:1200});if(C.ok&&C.data?.isRapidkitProject&&C.data.engine==="python"){let x=k||Mt(r);if(!a$2&&!w&&!x&&!n&&!p&&Cr(r)){if(o&&vs.includes(o)){let W=await Is(e).catch(()=>[]);if(W.length>0){process.stderr.write(i.red("\u274C Strict policy violations prevent running this command:")+`
213
- `);for(let de of W)process.stderr.write(i.red(` \u2022 ${de}`)+`
214
- `);process.exit(1);}}let E=await e$1(process.argv.slice(2),{cwd:e});process.exit(E);}}}catch{}let m=Js(e),g=a(),f=i$2(e),h=null;for(let w of f)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 b=o==="create";if(o==="init"&&c&&!l)return false;if(o&&vs.includes(o)){let w=await Is(e);if(w.length>0){process.stderr.write(i.red("\u274C Strict policy violations prevent running this command:")+`
202
+ Hints:`));for(let d of a)console.log(i.gray(`- ${d}`));}return s.exitCode}function gc(t){let e={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};for(let r of t.split(`
203
+ `)){let o=r.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 a=o.match(/^self_heal:\s*(true|false)/);a&&(e.self_heal=a[1]==="true");let c=o.match(/^verify_integrity:\s*(true|false)/);c&&(e.verify_integrity=c[1]==="true");}return e}async function js(t){if(t.includes("--help")||t.includes("-h"))return console.log(i.yellow("Usage: rapidkit cache <status|clear|prune|repair>")),0;let e=(t[1]||"status").toLowerCase(),r=pr.getInstance(),o=ee(process.cwd()),n={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};if(o)try{let s=await v.promises.readFile(y__default.join(o,".rapidkit","cache-config.yml"),"utf-8");n=gc(s);}catch{}return e==="status"?(console.log(i.cyan("RapidKit cache is enabled")),console.log(i.cyan("RapidKit cache status")),o?(console.log(i.gray(` Workspace: ${o}`)),console.log(i.gray(` Strategy: ${n.strategy}`)),console.log(i.gray(` Self-heal: ${n.self_heal}`)),console.log(i.gray(` Prune on bootstrap:${n.prune_on_bootstrap}`)),console.log(i.gray(` Verify integrity: ${n.verify_integrity}`))):console.log(i.gray(" (not inside a workspace \u2014 showing in-memory cache only)")),console.log(i.gray(" In-memory cache: enabled")),console.log(i.gray(" Use: rapidkit cache clear|prune|repair")),0):e==="clear"?(await r.clear(),console.log(i.green("Cache clear completed")),console.log(i.green("\u2705 Cache cleared (all entries removed).")),0):e==="prune"?(await r.clear(),console.log(i.green("\u2705 Cache pruned (stale entries removed).")),n.prune_on_bootstrap||console.log(i.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(i.green("\u2705 Cache repaired (self-heal applied, stale entries evicted).")),n.verify_integrity&&console.log(i.gray(" Integrity verification is enabled in cache-config.yml.")),0):(console.log(i.yellow("\u26A0\uFE0F self_heal is disabled in .rapidkit/cache-config.yml \u2014 skipping repair.")),0):(console.log(i.yellow("Usage: rapidkit cache <status|clear|prune|repair>")),1)}async function hc(t,e,r,o){let n=(e||"show").toLowerCase(),s=y__default.join(t,".rapidkit","policies.yml");if(n==="show"||n==="status"||n==="get"){let p=await vs(t),d=ws(p);return console.log(i.cyan(`Policy file: ${s}`)),console.log(i.gray(` mode: ${d.mode}`)),console.log(i.gray(` dependency_sharing_mode: ${d.dependency_sharing_mode}`)),console.log(i.gray(" rules:")),console.log(i.gray(` enforce_workspace_marker: ${d.rules.enforce_workspace_marker}`)),console.log(i.gray(` enforce_toolchain_lock: ${d.rules.enforce_toolchain_lock}`)),console.log(i.gray(` disallow_untrusted_tool_sources: ${d.rules.disallow_untrusted_tool_sources}`)),console.log(i.gray(` enforce_compatibility_matrix: ${d.rules.enforce_compatibility_matrix}`)),console.log(i.gray(` require_mirror_lock_for_offline: ${d.rules.require_mirror_lock_for_offline}`)),console.log(i.gray("Examples:")),console.log(i.gray(" npx rapidkit workspace policy set mode strict")),console.log(i.gray(" npx rapidkit workspace policy set dependency_sharing_mode shared-runtime-caches")),console.log(i.gray(" npx rapidkit workspace policy set rules.enforce_toolchain_lock true")),0}if(n!=="set")return console.log(i.red(`Unknown workspace policy action: ${e||""}`)),console.log(i.gray("Available: show, set")),1;if(!r||typeof o>"u")return console.log(i.yellow("Usage: rapidkit workspace policy set <key> <value>")),console.log(i.gray("Allowed keys:")),console.log(i.gray(" mode (warn|strict)")),console.log(i.gray(" dependency_sharing_mode (isolated|shared-runtime-caches|shared-node-deps)")),console.log(i.gray(" rules.enforce_workspace_marker (true|false)")),console.log(i.gray(" rules.enforce_toolchain_lock (true|false)")),console.log(i.gray(" rules.disallow_untrusted_tool_sources (true|false)")),console.log(i.gray(" rules.enforce_compatibility_matrix (true|false)")),console.log(i.gray(" rules.require_mirror_lock_for_offline (true|false)")),1;let a=r.trim(),l=await vs(t);if(a==="mode"){let p=o.trim().toLowerCase();if(p!=="warn"&&p!=="strict")return console.log(i.red("\u274C Invalid mode. Use: warn | strict")),1;l=ks(l,"mode",`${p} # "warn" or "strict"`);}else if(a==="dependency_sharing_mode"){let p=o.trim().toLowerCase();if(p!=="isolated"&&p!=="shared-runtime-caches"&&p!=="shared-node-deps")return console.log(i.red("\u274C Invalid dependency_sharing_mode. Use: isolated | shared-runtime-caches | shared-node-deps")),1;l=ks(l,"dependency_sharing_mode",`${p} # "isolated" or "shared-runtime-caches" or "shared-node-deps"`);}else if(a.startsWith("rules.")){let p=a.slice(6);if(!(p in Ws))return console.log(i.red(`\u274C Unknown policy rule: ${p}`)),1;let d=lc(o);if(d===null)return console.log(i.red("\u274C Rule values must be boolean: true | false")),1;l=ic(l,p,d);}else return console.log(i.red(`\u274C Unknown policy key: ${a}`)),1;await cc(t,l);let u=ws(l);return console.log(i.green(`\u2705 Updated ${a} in .rapidkit/policies.yml`)),console.log(i.gray(` mode: ${u.mode}`)),console.log(i.gray(` dependency_sharing_mode: ${u.dependency_sharing_mode}`)),console.log(i.gray(" Tip: run `npx rapidkit workspace policy show` to inspect all values.")),0}async function Ss(t){if(t.includes("--help")||t.includes("-h"))return console.log(i.yellow("Usage: rapidkit mirror <status|sync|verify|rotate> [--json]")),0;let e=(t[1]||"status").toLowerCase(),r=t.includes("--json"),o=ee(process.cwd());if(!o)return console.log(i.red("\u274C Not inside a RapidKit workspace")),console.log(i.gray("\u{1F4A1} Run this command from within a workspace directory")),1;let n=y__default.join(o,".rapidkit"),s=y__default.join(n,"mirror-config.json"),a=y__default.join(n,"mirror.lock"),c=y__default.join(n,"mirror","artifacts"),l=y__default.join(n,"reports");async function u(p){let d=new Date().toISOString().replace(/[:.]/g,"-"),f=y__default.join(l,`mirror-ops-${d}.json`),g=y__default.join(l,"mirror-ops.latest.json");await E__default.ensureDir(l),await ot(f,p),await ot(g,p);}if(e==="status"){if(!await E__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 E__default.ensureDir(n),await v.promises.writeFile(s,JSON.stringify(P,null,2)+`
204
+ `,"utf-8"),console.log(i.gray(" mirror-config.json created with defaults (.rapidkit/mirror-config.json)"));}catch{}let d=await E__default.pathExists(s),f=await E__default.pathExists(c),g=await E__default.pathExists(a),m=f?(await v.promises.readdir(c,{withFileTypes:true})).filter(P=>P.isFile()).length:0,h={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:o,mirror:{configExists:d,lockExists:g,artifactsCount:m}};return await u(h),r?(process.stdout.write(`${JSON.stringify(h,null,2)}
205
+ `),0):(console.log(i.cyan("RapidKit mirror status")),console.log(i.gray(`Workspace: ${o}`)),console.log(i.gray(`Config: ${d?"present":"missing"} (${s})`)),console.log(i.gray(`Lock: ${g?"present":"missing"} (${a})`)),console.log(i.gray(`Artifacts: ${m}`)),0)}if(e==="sync"||e==="verify"||e==="rotate"){let p=await ro(o,{ciMode:true,offlineMode:e==="verify",forceRun:true}),d=p.checks.filter(m=>m.status==="failed"),f=p.checks.some(m=>m.id.startsWith("mirror.verify.")&&m.status==="failed");if(e==="verify"&&f){let m={command:"mirror",action:e,result:"failed",timestamp:new Date().toISOString(),workspacePath:o,details:p.details,checks:p.checks};if(await u(m),r)return process.stdout.write(`${JSON.stringify(m,null,2)}
206
+ `),1;console.log(i.red("\u274C Mirror verify failed."));for(let h of p.checks.filter(P=>P.id.startsWith("mirror.verify.")))console.log(i.gray(`- ${h.id}: ${h.message}`));return 1}if(d.length>0){let m={command:"mirror",action:e,result:"failed",timestamp:new Date().toISOString(),workspacePath:o,details:p.details,checks:p.checks};if(await u(m),r)return process.stdout.write(`${JSON.stringify(m,null,2)}
207
+ `),1;console.log(i.yellow(`\u26A0\uFE0F Mirror ${e} completed with ${d.length} issue(s).`));for(let h of d)console.log(i.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 u(g),r?(process.stdout.write(`${JSON.stringify(g,null,2)}
208
+ `),0):e==="rotate"?(console.log(i.green(`\u2705 Mirror rotate completed. Rotated files: ${p.details.rotatedFiles}.`)),0):e==="verify"?(console.log(i.green(`\u2705 Mirror verify completed. Verified artifacts: ${p.details.verifiedArtifacts}.`)),0):(console.log(i.green(`\u2705 Mirror sync completed. Synced artifacts: ${p.details.syncedArtifacts}.`)),0)}return console.log(i.yellow("Usage: rapidkit mirror <status|sync|verify|rotate> [--json]")),1}async function fo(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 Ls(r,async()=>{let n=ee(r),s=Fe("python",{runCommandInCwd:q,runCoreRapidkit:e$1}),a=Fe("dotnet",{runCommandInCwd:q,runCoreRapidkit:e$1}),c=t.slice(1).filter(m=>!m.startsWith("-"));if(c.length>0){let m=y__default.resolve(r,c[0]),h=a$4(m),P=await Ot(m);return b$3(h,m)||P==="go"?await co(m):d(h,m)||P==="java"?await nt("init",m):e$2(h,m)||P==="dotnet"?fe(await a.initProject(m)):c$1(h,m)||P==="node"?await io(m):f$1(h,m)||P==="python"?await so(m,s):await e$1(t,{cwd:r})}let l=a$4(r),u=!!ee(r)&&r===ee(r);if(!u&&b$3(l,r))return await co(r);let p=await Ot(r);if(!u&&(d(l,r)||p==="java"))return await nt("init",r);if(!u&&(e$2(l,r)||p==="dotnet"))return fe(await a.initProject(r));if(!u&&(c$1(l,r)||p==="node"))return await io(r);if(!u&&(f$1(l,r)||p==="python"))return await so(r,s);let d$1=n||ee(r),f=Ts(r),g=f?y__default.dirname(y__default.dirname(f)):null;if(g&&g!==d$1){let m=a$4(g),h=await Ot(g);return b$3(m,g)||h==="go"?await co(g):d(m,g)||h==="java"?await nt("init",g):e$2(m,g)||h==="dotnet"?fe(await a.initProject(g)):c$1(m,g)||h==="node"?await io(g):f$1(m,g)||h==="python"?await so(g,s):await e$1(["init"],{cwd:g})}if(d$1&&r===d$1){console.log(i.yellow("\u26A0\uFE0F Running `npx rapidkit init` at workspace root.")),console.log(i.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 m=await mo(d$1);if(m!==0)return m;let{runWorkspaceStage:h}=await import('./workspace-run-EDM3SUPA.js');return (await h({workspacePath:d$1,stage:"init",affected:false,blastRadius:false,parallel:false,continueOnError:false,strict:false,json:false,enforceGates:false})).summary.exitCode}if(!d$1){let m=await a$2(),{name:h}=pc(r),{createProject:P}=await import('./create-BO2I3ESU.js');return await P(h,{yes:true,userConfig:m}),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 xs(t){let e=ee(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 s={};try{s=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 a=s.runtime??{},c=a$4(t);b$3(c,t)&&!a.go?.version?o.push("go.version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."):c$1(c,t)&&!a.node?.version?o.push("node.version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."):d(c,t)&&!a.java?.version?o.push("java.version is not pinned in toolchain.lock \u2014 run `rapidkit setup java` first."):e$2(c,t)&&!a.dotnet?.version?o.push("dotnet.version is not pinned in toolchain.lock \u2014 run `rapidkit setup dotnet` first."):f$1(c,t)&&!a.python?.version&&o.push("python.version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");try{let u=JSON.parse(await v.promises.readFile(y__default.join(e,".rapidkit","workspace.json"),"utf-8")).profile??"";u==="python-only"&&(b$3(c,t)||c$1(c,t)||d(c,t)||e$2(c,t))?o.push('Workspace profile is "python-only" but this project is not Python.'):u==="node-only"&&(b$3(c,t)||f$1(c,t)||d(c,t)||e$2(c,t))?o.push('Workspace profile is "node-only" but this project is not Node.'):u==="go-only"&&(c$1(c,t)||f$1(c,t)||d(c,t)||e$2(c,t))?o.push('Workspace profile is "go-only" but this project is not Go.'):u==="java-only"&&(f$1(c,t)||c$1(c,t)||b$3(c,t)||e$2(c,t))?o.push('Workspace profile is "java-only" but this project is not Java.'):u==="dotnet-only"&&(f$1(c,t)||c$1(c,t)||b$3(c,t)||d(c,t))&&o.push('Workspace profile is "dotnet-only" but this project is not .NET.');}catch{}return o}async function yc(){let t=async w=>{if(!a()||!w.toLowerCase().endsWith(".cmd"))return false;try{let x=(await E__default.readFile(w,"utf8")).replace(/\r\n/g,`
209
+ `).toLowerCase(),_=x.includes("\\.rapidkit\\rapidkit"),$=x.includes("\\.rapidkit\\rapidkit.cmd")||x.includes("\\.rapidkit\\rapidkit.exe")||x.includes("\\.venv\\scripts\\rapidkit.exe");return _&&!$}catch{return false}},e=process.cwd(),r=process.argv.slice(2),o=r[0],n=o==="init",s=new Set(["dev","start","build","test"]),a$2=!o||o==="--help"||o==="-h"||o==="help",c=st(e),l=v.existsSync(y__default.join(e,".rapidkit","project.json")),u=a$4(e),p=b$3(u,e)||c$1(u,e),d=!!o&&s.has(o)&&p,f=process.env.RAPIDKIT_LOCAL_LAUNCHER_BYPASS==="1";if(Nt(r)||r[0]==="create")return false;if(po(r))return true;if(r[0]==="init"&&c&&!l)return false;if(Ds(r))return true;try{let w=o==="shell"&&r[1]==="activate",k=o==="create",x=await Mo(e,{cwd:e,timeoutMs:1200});if(x.ok&&x.data?.isRapidkitProject&&x.data.engine==="python"){let _=k||Nt(r);if(!a$2&&!w&&!_&&!n&&!d&&jr(r)){if(o&&gs.includes(o)){let ye=await xs(e).catch(()=>[]);if(ye.length>0){process.stderr.write(i.red("\u274C Strict policy violations prevent running this command:")+`
210
+ `);for(let U of ye)process.stderr.write(i.red(` \u2022 ${U}`)+`
211
+ `);process.exit(1);}}let $=await e$1(process.argv.slice(2),{cwd:e});process.exit($);}}}catch{}let g=Ts(e),m=a(),h=f?[]:i$2(e),P=null;for(let w of h)if(await E__default.pathExists(w)){if(await t(w)){a$1.warn(`Skipping legacy/broken Windows launcher candidate: ${w}. Falling back to core bridge.`);continue}P=w;break}let C=o==="create";if(o==="init"&&c&&!l)return false;if(o&&gs.includes(o)){let w=await xs(e);if(w.length>0){process.stderr.write(i.red("\u274C Strict policy violations prevent running this command:")+`
215
212
  `);for(let k of w)process.stderr.write(i.red(` \u2022 ${k}`)+`
216
- `);process.exit(1);}}if(h&&o&&ks.includes(o)&&!b&&!n&&!p){a$1.debug(`Delegating to local CLI: ${h} ${r.join(" ")}`);let w=o==="init"?ws():process.env,k=spawn(h,r,{stdio:"inherit",cwd:e,shell:g,env:w});return k.on("close",C=>{process.exit(C??0);}),k.on("error",C=>{a$1.error(`Failed to run local rapidkit: ${C.message}`),process.exit(1);}),true}if(m&&await ___default.pathExists(m))try{let w=await ___default.readJson(m);if(Ko(w.engine)){let k=r[0],C=i$2(e),x=null;for(let E of C)if(await ___default.pathExists(E)){if(await t(E)){a$1.warn(`Skipping legacy/broken Windows launcher candidate: ${E}. Falling back to core bridge.`);continue}x=E;break}if(x&&k&&ks.includes(k)&&k!=="init"&&!p){a$1.debug(`Delegating to local CLI (early detection): ${x} ${r.join(" ")}`);let E=k==="init"?ws():process.env,W=spawn(x,r,{stdio:"inherit",cwd:e,env:E});return W.on("close",de=>process.exit(de??0)),W.on("error",de=>{a$1.error(`Failed to run local rapidkit: ${de.message}`),process.exit(1);}),true}if(k==="shell"&&r[1]==="activate"){let E=a()?`# RapidKit: activation snippet (PowerShell)
213
+ `);process.exit(1);}}if(P&&o&&fs.includes(o)&&!C&&!n&&!d){a$1.debug(`Delegating to local CLI: ${P} ${r.join(" ")}`);let w=o==="init"?ms():process.env,k=spawn(P,r,{stdio:"inherit",cwd:e,shell:m,env:w});return k.on("close",x=>{process.exit(x??0);}),k.on("error",x=>{a$1.error(`Failed to run local rapidkit: ${x.message}`),process.exit(1);}),true}if(g&&await E__default.pathExists(g))try{let w=await E__default.readJson(g);if(To(w.engine)){let k=r[0],x=f?[]:i$2(e),_=null;for(let $ of x)if(await E__default.pathExists($)){if(await t($)){a$1.warn(`Skipping legacy/broken Windows launcher candidate: ${$}. Falling back to core bridge.`);continue}_=$;break}if(_&&k&&fs.includes(k)&&k!=="init"&&!d){a$1.debug(`Delegating to local CLI (early detection): ${_} ${r.join(" ")}`);let $=k==="init"?ms():process.env,ye=spawn(_,r,{stdio:"inherit",cwd:e,env:$});return ye.on("close",U=>process.exit(U??0)),ye.on("error",U=>{a$1.error(`Failed to run local rapidkit: ${U.message}`),process.exit(1);}),true}if(k==="shell"&&r[1]==="activate"){let $=a()?`# RapidKit: activation snippet (PowerShell)
217
214
  $venv = ".venv"
218
215
  if (Test-Path "$venv\\Scripts\\Activate.ps1") { . "$venv\\Scripts\\Activate.ps1" }
219
216
  $env:RAPIDKIT_PROJECT_ROOT = (Get-Location).Path
@@ -233,12 +230,12 @@ export RAPIDKIT_PROJECT_ROOT="$(pwd)"
233
230
  export PATH="$(pwd)/.rapidkit:$(pwd):$PATH"
234
231
  `;console.log(i.green.bold(`
235
232
  \u2705 Activation snippet \u2014 run the following to activate this project in your current shell:
236
- `)),console.log(E),console.log(i.gray(`
233
+ `)),console.log($),console.log(i.gray(`
237
234
  \u{1F4A1} After activation you can run: rapidkit dev
238
- `)),process.exit(0);}if(!a$2&&!Mt(r)&&k!=="init"&&!p&&Cr(r)){let E=await e$1(r,{cwd:e});process.exit(E);}}}catch{}return false}var et=null,fr=false,ie=new Command,Nc=process.env.RAPIDKIT_SHOW_LEGACY==="1"||process.env.RAPIDKIT_SHOW_LEGACY?.toLowerCase()==="true";async function Dc(t){if(t.length===0)return false;let e=t[0],r=t[1];if(k(t)||mc.includes(e))return false;if(Ts.includes(e))return true;if(Mt(t)||e==="shell"&&r==="activate")return false;if(t.includes("--tui"))return true;if(e==="--help"||e==="-h"||e==="help"||e==="--version"||e==="-V"||e==="-v"||t.includes("--template")||t.includes("-t"))return false;let o=await i$3();return xr(e,o)?true:t.some(n=>Sr.has(n))?false:o?o.has(e):!!(a$5.has(e)||t.length>1)}ie.name("rapidkit").description("Create RapidKit workspaces and projects").version(b());var Mc=a()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";ie.addHelpText("beforeAll",`RapidKit NPM CLI
235
+ `)),process.exit(0);}if(!a$2&&!Nt(r)&&k!=="init"&&!d&&jr(r)){let $=await e$1(r,{cwd:e});process.exit($);}}}catch{}return false}var Qe=null,ur=false,oe=new Command,wc=process.env.RAPIDKIT_SHOW_LEGACY==="1"||process.env.RAPIDKIT_SHOW_LEGACY?.toLowerCase()==="true";async function kc(t){if(t.length===0)return false;let e=t[0],r=t[1];if(k(t)||Qa.includes(e))return false;if($s.includes(e))return true;if(Nt(t)||e==="shell"&&r==="activate")return false;if(t.includes("--tui"))return true;if(e==="--help"||e==="-h"||e==="help"||e==="--version"||e==="-V"||e==="-v"||t.includes("--template")||t.includes("-t"))return false;let o=await i$3();return br(e,o)?true:t.some(n=>Pr.has(n))?false:o?o.has(e):!!(a$6.has(e)||t.length>1)}oe.name("rapidkit").description("Create RapidKit workspaces and projects").version(b());var vc=a()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";oe.addHelpText("beforeAll",`RapidKit NPM CLI
239
236
 
240
237
  Create workspaces, scaffold projects, and manage your development toolchain.
241
- `);ie.addHelpText("afterAll",`
238
+ `);oe.addHelpText("afterAll",`
242
239
  Workspace Setup Commands
243
240
  rapidkit bootstrap Bootstrap projects in workspace (--profile java-only|python-only|node-only|go-only|dotnet-only|polyglot|enterprise)
244
241
  rapidkit analyze Analyze workspace/project health and generate enterprise evidence
@@ -264,48 +261,48 @@ Quick start:
264
261
  npx rapidkit my-workspace # Create + bootstrap workspace
265
262
  cd my-workspace
266
263
  npx rapidkit create project # Interactive kit picker
267
- ${Mc} # Install deps + run
264
+ ${vc} # Install deps + run
268
265
 
269
266
  Notes:
270
267
  --skip-install (npm wrapper) enables fast-path for lock/dependency steps.
271
268
  It is different from core --skip-essentials (essential module installation).
272
269
 
273
270
  Use "rapidkit help <command>" for more information.
274
- `);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, dotnet) 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, dotnet-only, polyglot, enterprise").choices(["minimal","java-only","python-only","node-only","go-only","dotnet-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(i.blue.bold(`
271
+ `);oe.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, dotnet) 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, dotnet-only, polyglot, enterprise").choices(["minimal","java-only","python-only","node-only","go-only","dotnet-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(i.blue.bold(`
275
272
  \u{1F680} Welcome to RapidKit NPM CLI!
276
- `)),t||(Us(),process.exit(0));try{Ut(t);}catch(c){throw c instanceof e&&(a$1.error(`
273
+ `)),t||(Js(),process.exit(0));try{Vt(t);}catch(c){throw c instanceof e&&(a$1.error(`
277
274
  \u274C ${c.message}`),c.details&&a$1.warn(`\u{1F4A1} ${c.details}
278
- `),process.exit(1)),c}let s=y__default.resolve(process.cwd(),t);et=s,await ___default.pathExists(s)&&(a$1.error(`
275
+ `),process.exit(1)),c}let s=y__default.resolve(process.cwd(),t);Qe=s,await E__default.pathExists(s)&&(a$1.error(`
279
276
  \u274C Directory "${t}" already exists`),console.log(i.cyan(`
280
277
  \u{1F4A1} Choose a different name or delete the existing directory.
281
278
  `)),process.exit(1));let a=!!e$2.template;if(e$2.dryRun){console.log(i.cyan(`
282
279
  \u{1F50D} Dry-run mode - showing what would be created:
283
- `)),console.log(i.white("\u{1F4C2} Path:"),s),console.log(i.white("\u{1F4E6} Type:"),a?`Project (${e$2.template})`:"Workspace"),console.log();return}if(!e$2.yes&&!a?await Ge.prompt([{type:"input",name:"author",message:"Author name:",default:process.env.USER||"RapidKit User"}]):e$2.yes&&console.log(i.gray(`Using default values (--yes flag)
284
- `)),a){let c=String(e$2.template||"").trim(),l=es(c);if(At(l)){let w=await gr(["create","project",l,t,...e$2.skipGit?["--skip-git"]:[]]);w!==0&&process.exit(w);return}if(!!!ho(process.cwd())){let{registerWorkspaceAtPath:w}=await import('./create-M7LT6WF6.js');if(e$2.createWorkspace)await w(process.cwd(),{skipGit:e$2.skipGit,yes:e$2.yes,userConfig:r});else if(!e$2.noWorkspace)if(e$2.yes)await w(process.cwd(),{skipGit:e$2.skipGit,yes:true,userConfig:r});else {let{createWs:k}=await Ge.prompt([{type:"confirm",name:"createWs",message:"This project will be created outside a RapidKit workspace. Create and register a workspace here?",default:true}]);k&&await w(process.cwd(),{skipGit:e$2.skipGit,yes:false,userConfig:r});}}let d=["create","project",l,t,"--output",process.cwd()];e$2.yes&&d.push("--yes");let p=Q(process.cwd()),m=!!e$2.skipInstall,g=m||!!p;m&&d.push("--skip-essentials");let f$1=g?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0,h=await f(d,{cwd:process.cwd(),env:f$1});h!==0&&process.exit(h),p&&!e$2.skipInstall&&(console.log(i.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(i.white(" Next: cd <project-name> && npx rapidkit init")));let b=ho(process.cwd());if(b){let w=y__default.dirname(b),k=y__default.join(w,".python-version"),C=y__default.join(s,".python-version");try{if(await ___default.pathExists(k)){let x=P.readFileSync(k,"utf-8");P.writeFileSync(C,x.trim()+`
285
- `),a$1.debug(`Synced Python version ${x.trim()} from workspace to project`);}}catch(x){a$1.debug("Could not sync Python version from workspace:",x);}}if(!e$2.skipInstall){let w=await e$1(["init",s],{cwd:process.cwd()});if(w!==0&&process.exit(w),b){let k=y__default.dirname(b),C=y__default.join(k,".python-version"),x=y__default.join(s,".python-version");try{if(await ___default.pathExists(C)){let E=P.readFileSync(C,"utf-8");P.writeFileSync(x,E.trim()+`
286
- `),a$1.debug(`Re-synced Python version ${E.trim()} after init`);}}catch(E){a$1.debug("Could not re-sync Python version after init:",E);}}}}else {let{createProject:c}=await import('./create-M7LT6WF6.js');await c(t,{skipGit:e$2.skipGit,dryRun:e$2.dryRun,yes:e$2.yes,userConfig:n,installMethod:e$2.installMethod,profile:e$2.profile});}}catch(r){r instanceof e?(a$1.error(`
280
+ `)),console.log(i.white("\u{1F4C2} Path:"),s),console.log(i.white("\u{1F4E6} Type:"),a?`Project (${e$2.template})`:"Workspace"),console.log();return}if(!e$2.yes&&!a?await Ke.prompt([{type:"input",name:"author",message:"Author name:",default:process.env.USER||"RapidKit User"}]):e$2.yes&&console.log(i.gray(`Using default values (--yes flag)
281
+ `)),a){let c=String(e$2.template||"").trim(),l=Qn(c);if(It(l)){let C=await mr(["create","project",l,t,...e$2.skipGit?["--skip-git"]:[]]);C!==0&&process.exit(C);return}if(!!!uo(process.cwd())){let{registerWorkspaceAtPath:C}=await import('./create-BO2I3ESU.js');if(e$2.createWorkspace)await C(process.cwd(),{skipGit:e$2.skipGit,yes:e$2.yes,userConfig:r});else if(!e$2.noWorkspace)if(e$2.yes)await C(process.cwd(),{skipGit:e$2.skipGit,yes:true,userConfig:r});else {let{createWs:w}=await Ke.prompt([{type:"confirm",name:"createWs",message:"This project will be created outside a RapidKit workspace. Create and register a workspace here?",default:true}]);w&&await C(process.cwd(),{skipGit:e$2.skipGit,yes:false,userConfig:r});}}let p=["create","project",l,t,"--output",process.cwd()];e$2.yes&&p.push("--yes");let d=ee(process.cwd()),f$1=!!e$2.skipInstall,g=f$1||!!d;f$1&&p.push("--skip-essentials");let m=g?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0,h=await f(p,{cwd:process.cwd(),env:m});h!==0&&process.exit(h),d&&!e$2.skipInstall&&(console.log(i.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(i.white(" Next: cd <project-name> && npx rapidkit init")));let P=uo(process.cwd());if(P){let C=y__default.dirname(P),w=y__default.join(C,".python-version"),k=y__default.join(s,".python-version");try{if(await E__default.pathExists(w)){let x=v.readFileSync(w,"utf-8");v.writeFileSync(k,x.trim()+`
282
+ `),a$1.debug(`Synced Python version ${x.trim()} from workspace to project`);}}catch(x){a$1.debug("Could not sync Python version from workspace:",x);}}if(!e$2.skipInstall){let C=await e$1(["init",s],{cwd:process.cwd()});if(C!==0&&process.exit(C),P){let w=y__default.dirname(P),k=y__default.join(w,".python-version"),x=y__default.join(s,".python-version");try{if(await E__default.pathExists(k)){let _=v.readFileSync(k,"utf-8");v.writeFileSync(x,_.trim()+`
283
+ `),a$1.debug(`Re-synced Python version ${_.trim()} after init`);}}catch(_){a$1.debug("Could not re-sync Python version after init:",_);}}}}else {let{createProject:c}=await import('./create-BO2I3ESU.js');await c(t,{skipGit:e$2.skipGit,dryRun:e$2.dryRun,yes:e$2.yes,userConfig:n,installMethod:e$2.installMethod,profile:e$2.profile});}}catch(r){r instanceof e?(a$1.error(`
287
284
  \u274C ${r.message}`),r.details&&a$1.warn(`\u{1F4A1} ${r.details}`),a$1.debug("Error code:",r.code)):(a$1.error(`
288
- \u274C An unexpected error occurred:`),console.error(r)),process.exit(1);}finally{et=null;}});mn(ie);wn(ie);Hn(ie);ie.command("commands").description("Show effective RapidKit command ownership and runtime support").option("--json","Emit machine-readable JSON output").action(async t=>{wc({json:t.json});});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-Q2XAYVUQ.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(i.red(`Analyze failed: ${r}`)),process.exit(1);}});qo(ie);ie.command("shell <action>").description("Shell helpers (activate virtualenv in current shell)").action(async t=>{t!=="activate"&&(console.log(i.red(`Unknown shell command: ${t}`)),process.exit(1));let e=process.cwd();function r(l){let u=l;for(;;){let d=y__default.join(u,".rapidkit","context.json");if(P.existsSync(d))return d;let p=y__default.dirname(u);if(p===u)break;u=p;}return null}let o=r(e);function n(l){let u=l;for(;;){let d=y__default.join(u,".venv"),p=y__default.join(u,".rapidkit","activate");if(P.existsSync(p)||P.existsSync(d))return {venv:d,activateFile:p};let m=y__default.dirname(u);if(m===u)break;u=m;}return null}let s=n(e);!o&&!s&&(console.log(i.yellow("No RapidKit project found in this directory")),process.exit(1));let a$1;s&&P.existsSync(s.activateFile)?a$1=s.activateFile:s&&P.existsSync(s.venv)?a$1=h(s.venv):(console.log(i.yellow("No virtual environment found")),process.exit(1));let c=a();console.log(c?`call "${a$1}"`:`. "${a$1}"`);});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 ns(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(i.red(`Unknown autopilot action: ${t}`)),console.log(i.gray("Available: release")),process.exit(1));let r=String(e.mode||"audit").trim().toLowerCase();["audit","safe-fix","enforce"].includes(r)||(console.log(i.red(`Invalid autopilot mode: ${e.mode}`)),console.log(i.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-AOPUECK6.js'),a;try{a=await s({workspacePath:process.cwd(),mode:r,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(i.red(`Autopilot release failed: ${l}`)),process.exit(3);}e.json&&console.log(JSON.stringify(a,null,2)),a.summary.exitCode!==0&&process.exit(a.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 Cc(t,e);r!==0&&process.exit(r);});var hr=ie.command("snapshot").description("Create, list, and restore RapidKit workspace snapshots");hr.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 ht({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(i.green(`\u2714 Workspace snapshot created: ${r.manifest.name}`)),console.log(i.gray(` Mode: ${r.manifest.mode}`)),console.log(i.gray(` Path: ${r.snapshotPath}`));}catch(r){console.log(i.red(`\u274C Snapshot create failed: ${r.message}`)),process.exit(1);}});hr.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 xn({workspacePath:t.workspace});if(t.json){console.log(JSON.stringify({snapshots:e},null,2));return}if(e.length===0){console.log(i.yellow("No workspace snapshots found."));return}for(let r of e)console.log(i.cyan(r.name)),console.log(i.gray(` ${r.createdAt} | ${r.mode} | ${r.projects.length} project(s)`)),console.log(i.gray(` ${r.snapshotPath}`));}catch(e){console.log(i.red(`\u274C Snapshot list failed: ${e.message}`)),process.exit(1);}});hr.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 Sn({workspacePath:e.workspace,name:t});if(e.json){console.log(JSON.stringify(r,null,2));return}console.log(i.cyan(`Snapshot: ${r.manifest.name}`)),console.log(i.gray(` Mode: ${r.manifest.mode}`)),console.log(i.gray(` Created: ${r.manifest.createdAt}`)),console.log(i.gray(` Projects: ${r.manifest.projects.length}`)),console.log(i.gray(` Files: ${r.estimatedFileCount}`)),console.log(i.gray(` Bytes: ${r.estimatedBytes}`)),console.log(i.gray(` Path: ${r.snapshotPath}`));}catch(r){console.log(i.red(`\u274C Snapshot inspect failed: ${r.message}`)),process.exit(1);}});hr.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 Cn({workspacePath:e.workspace,name:t,reason:e.reason,dryRun:e.dryRun===true||process.argv.includes("--dry-run"),force:e.force===true,safetySnapshot:e.safetySnapshot});if(e.json){console.log(JSON.stringify(r,null,2));return}r.dryRun?console.log(i.cyan(`Snapshot restore dry-run: ${t}`)):console.log(i.green(`\u2714 Workspace snapshot restored: ${t}`)),console.log(i.gray(` Snapshot: ${r.snapshotPath}`)),console.log(i.gray(` Restored paths: ${r.restoredPaths.join(", ")}`)),r.safetySnapshotPath&&console.log(i.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(i.red(`\u274C Snapshot restore failed: ${r.message}`)),process.exit(1);}});var Tt=ie.command("project").description("Safe workspace project lifecycle operations");Tt.command("commands").description("Show effective commands supported by the current RapidKit project").option("--json","Emit machine-readable JSON output").action(async t=>{Ks({json:t.json});});Tt.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 Br({workspacePath:t.workspace});if(t.json){console.log(JSON.stringify({archives:e},null,2));return}if(e.length===0){console.log(i.yellow("No archived projects found."));return}for(let r of e)console.log(i.cyan(r.projectName)),console.log(i.gray(` Archived: ${r.archivedAt}`)),console.log(i.gray(` Path: ${r.archivePath}`)),r.reason&&console.log(i.gray(` Reason: ${r.reason}`));}catch(e){console.log(i.red(`\u274C Project archive list failed: ${e.message}`)),process.exit(1);}});Tt.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 Vr({workspacePath:e.workspace,project:t,reason:e.reason,dryRun:e.dryRun===true||process.argv.includes("--dry-run")});if(e.json){console.log(JSON.stringify(r,null,2));return}console.log(r.dryRun?i.cyan(`Project archive dry-run: ${r.projectName}`):i.green(`\u2714 Project archived: ${r.projectName}`)),console.log(i.gray(` From: ${r.projectPath}`)),r.archivePath&&console.log(i.gray(` To: ${r.archivePath}`)),r.safetySnapshotPath&&console.log(i.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(i.red(`\u274C Project archive failed: ${r.message}`)),process.exit(1);}});Tt.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 An({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?i.cyan(`Project restore dry-run: ${r.projectName}`):i.green(`\u2714 Project restored: ${r.projectName}`)),console.log(i.gray(` From: ${r.archivePath}`)),console.log(i.gray(` To: ${r.projectPath}`)),r.safetySnapshotPath&&console.log(i.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(i.red(`\u274C Project restore failed: ${r.message}`)),process.exit(1);}});Tt.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 In({workspacePath:e.workspace,project:t,reason:e.reason,permanent:e.permanent===true,confirm:e.confirm,dryRun:e.dryRun===true||process.argv.includes("--dry-run")});if(e.json){console.log(JSON.stringify(r,null,2));return}let o=r.action==="archive"?"archived":"deleted";console.log(r.dryRun?i.cyan(`Project ${o} dry-run: ${r.projectName}`):i.green(`\u2714 Project ${o}: ${r.projectName}`)),console.log(i.gray(` Path: ${r.projectPath}`)),r.archivePath&&console.log(i.gray(` Archive: ${r.archivePath}`)),r.safetySnapshotPath&&console.log(i.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(i.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(i.red(`Unknown doctor scope: ${t}`)),console.log(i.gray("Available: workspace, project")),console.log(i.gray("Usage: npx rapidkit doctor | npx rapidkit doctor workspace | npx rapidkit doctor project")),process.exit(1)),e.plan&&(e.fix||e.apply)&&(console.log(i.red("Invalid doctor flags: --plan cannot be combined with --fix or --apply")),process.exit(1));let r=await kc({scope:t,workspaceFlag:e.workspace});r.detected&&!e.json&&(console.log(i.yellow("\u26A0\uFE0F Local launcher shadow detected for doctor workspace checks.")),r.candidatePath&&console.log(i.gray(` Candidate: ${r.candidatePath}`)),console.log(i.gray(" Running npm-wrapper doctor workflow directly as safe fallback to avoid ambiguous rapidkit binary resolution.")),console.log(i.gray(" If this happens in a shell call, run: npx --yes --package rapidkit rapidkit doctor workspace")));let{runDoctor:o}=await import('./doctor-T6F2I6VO.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)
285
+ \u274C An unexpected error occurred:`),console.error(r)),process.exit(1);}finally{Qe=null;}});dn(oe);gn(oe);Vn(oe);oe.command("commands").description("Show effective RapidKit command ownership and runtime support").option("--json","Emit machine-readable JSON output").action(async t=>{rc({json:t.json});});oe.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-SVYRQNLO.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(i.red(`Analyze failed: ${r}`)),process.exit(1);}});Go(oe);oe.command("shell <action>").description("Shell helpers (activate virtualenv in current shell)").action(async t=>{t!=="activate"&&(console.log(i.red(`Unknown shell command: ${t}`)),process.exit(1));let e=process.cwd();function r(l){let u=l;for(;;){let p=y__default.join(u,".rapidkit","context.json");if(v.existsSync(p))return p;let d=y__default.dirname(u);if(d===u)break;u=d;}return null}let o=r(e);function n(l){let u=l;for(;;){let p=y__default.join(u,".venv"),d=y__default.join(u,".rapidkit","activate");if(v.existsSync(d)||v.existsSync(p))return {venv:p,activateFile:d};let f=y__default.dirname(u);if(f===u)break;u=f;}return null}let s=n(e);!o&&!s&&(console.log(i.yellow("No RapidKit project found in this directory")),process.exit(1));let a$1;s&&v.existsSync(s.activateFile)?a$1=s.activateFile:s&&v.existsSync(s.venv)?a$1=h(s.venv):(console.log(i.yellow("No virtual environment found")),process.exit(1));let c=a();console.log(c?`call "${a$1}"`:`. "${a$1}"`);});oe.command("readiness").description("\u{1F6A6} Generate machine-readable release readiness summary (env + doctor + analyze + verify + dependency)").option("--json","Output readiness result in JSON format").option("--strict","Exit with code 1 unless overall readiness is pass").option("--skip-verify","Skip verify gate (use for workspaces without extension verify artifacts)").action(async t=>{await b$2({json:t.json,strict:t.strict,skipVerify:t.skipVerify});});oe.command("pipeline").description("\u{1F517} Run governance pipeline: sync \u2192 doctor \u2192 analyze \u2192 readiness \u2192 autopilot (writes pipeline-last-run.json)").option("--json","Output pipeline report as JSON").option("--strict","Treat warnings as blocking and propagate non-zero exit codes").option("--skip-verify","Skip readiness verify gate").option("--skip-analyze","Skip analyze stage").option("--skip-autopilot","Skip autopilot release stage").option("--autopilot-mode <mode>","Autopilot mode when stage is enabled: audit | safe-fix | enforce","audit").action(async t=>{let e=String(t.autopilotMode||"audit").trim().toLowerCase();["audit","safe-fix","enforce"].includes(e)||(console.log(i.red(`Invalid autopilot mode: ${t.autopilotMode}`)),process.exit(1));let{runPipelineCommand:r}=await import('./pipeline-VUQ6AXKF.js');await r({json:t.json===true,strict:t.strict===true,skipVerify:t.skipVerify===true,skipAnalyze:t.skipAnalyze===true,skipAutopilot:t.skipAutopilot===true,autopilotMode:e});});oe.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(i.red(`Unknown autopilot action: ${t}`)),console.log(i.gray("Available: release")),process.exit(1));let r=String(e.mode||"audit").trim().toLowerCase();["audit","safe-fix","enforce"].includes(r)||(console.log(i.red(`Invalid autopilot mode: ${e.mode}`)),console.log(i.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-LBKCP73F.js'),a;try{a=await s({workspacePath:process.cwd(),mode:r,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(i.red(`Autopilot release failed: ${l}`)),process.exit(3);}e.json&&console.log(JSON.stringify(a,null,2)),a.summary.exitCode!==0&&process.exit(a.summary.exitCode);});oe.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 dc(t,e);r!==0&&process.exit(r);});var fr=oe.command("snapshot").description("Create, list, and restore RapidKit workspace snapshots");fr.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 gt({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(i.green(`\u2714 Workspace snapshot created: ${r.manifest.name}`)),console.log(i.gray(` Mode: ${r.manifest.mode}`)),console.log(i.gray(` Path: ${r.snapshotPath}`));}catch(r){console.log(i.red(`\u274C Snapshot create failed: ${r.message}`)),process.exit(1);}});fr.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 bn({workspacePath:t.workspace});if(t.json){console.log(JSON.stringify({snapshots:e},null,2));return}if(e.length===0){console.log(i.yellow("No workspace snapshots found."));return}for(let r of e)console.log(i.cyan(r.name)),console.log(i.gray(` ${r.createdAt} | ${r.mode} | ${r.projects.length} project(s)`)),console.log(i.gray(` ${r.snapshotPath}`));}catch(e){console.log(i.red(`\u274C Snapshot list failed: ${e.message}`)),process.exit(1);}});fr.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 Pn({workspacePath:e.workspace,name:t});if(e.json){console.log(JSON.stringify(r,null,2));return}console.log(i.cyan(`Snapshot: ${r.manifest.name}`)),console.log(i.gray(` Mode: ${r.manifest.mode}`)),console.log(i.gray(` Created: ${r.manifest.createdAt}`)),console.log(i.gray(` Projects: ${r.manifest.projects.length}`)),console.log(i.gray(` Files: ${r.estimatedFileCount}`)),console.log(i.gray(` Bytes: ${r.estimatedBytes}`)),console.log(i.gray(` Path: ${r.snapshotPath}`));}catch(r){console.log(i.red(`\u274C Snapshot inspect failed: ${r.message}`)),process.exit(1);}});fr.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 jn({workspacePath:e.workspace,name:t,reason:e.reason,dryRun:e.dryRun===true||process.argv.includes("--dry-run"),force:e.force===true,safetySnapshot:e.safetySnapshot});if(e.json){console.log(JSON.stringify(r,null,2));return}r.dryRun?console.log(i.cyan(`Snapshot restore dry-run: ${t}`)):console.log(i.green(`\u2714 Workspace snapshot restored: ${t}`)),console.log(i.gray(` Snapshot: ${r.snapshotPath}`)),console.log(i.gray(` Restored paths: ${r.restoredPaths.join(", ")}`)),r.safetySnapshotPath&&console.log(i.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(i.red(`\u274C Snapshot restore failed: ${r.message}`)),process.exit(1);}});var Mt=oe.command("project").description("Safe workspace project lifecycle operations");Mt.command("commands").description("Show effective commands supported by the current RapidKit project").option("--json","Emit machine-readable JSON output").action(async t=>{Ms({json:t.json});});Mt.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 Lr({workspacePath:t.workspace});if(t.json){console.log(JSON.stringify({archives:e},null,2));return}if(e.length===0){console.log(i.yellow("No archived projects found."));return}for(let r of e)console.log(i.cyan(r.projectName)),console.log(i.gray(` Archived: ${r.archivedAt}`)),console.log(i.gray(` Path: ${r.archivePath}`)),r.reason&&console.log(i.gray(` Reason: ${r.reason}`));}catch(e){console.log(i.red(`\u274C Project archive list failed: ${e.message}`)),process.exit(1);}});Mt.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 Jr({workspacePath:e.workspace,project:t,reason:e.reason,dryRun:e.dryRun===true||process.argv.includes("--dry-run")});if(e.json){console.log(JSON.stringify(r,null,2));return}console.log(r.dryRun?i.cyan(`Project archive dry-run: ${r.projectName}`):i.green(`\u2714 Project archived: ${r.projectName}`)),console.log(i.gray(` From: ${r.projectPath}`)),r.archivePath&&console.log(i.gray(` To: ${r.archivePath}`)),r.safetySnapshotPath&&console.log(i.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(i.red(`\u274C Project archive failed: ${r.message}`)),process.exit(1);}});Mt.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 En({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?i.cyan(`Project restore dry-run: ${r.projectName}`):i.green(`\u2714 Project restored: ${r.projectName}`)),console.log(i.gray(` From: ${r.archivePath}`)),console.log(i.gray(` To: ${r.projectPath}`)),r.safetySnapshotPath&&console.log(i.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(i.red(`\u274C Project restore failed: ${r.message}`)),process.exit(1);}});Mt.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 Rn({workspacePath:e.workspace,project:t,reason:e.reason,permanent:e.permanent===true,confirm:e.confirm,dryRun:e.dryRun===true||process.argv.includes("--dry-run")});if(e.json){console.log(JSON.stringify(r,null,2));return}let o=r.action==="archive"?"archived":"deleted";console.log(r.dryRun?i.cyan(`Project ${o} dry-run: ${r.projectName}`):i.green(`\u2714 Project ${o}: ${r.projectName}`)),console.log(i.gray(` Path: ${r.projectPath}`)),r.archivePath&&console.log(i.gray(` Archive: ${r.archivePath}`)),r.safetySnapshotPath&&console.log(i.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(i.red(`\u274C Project delete failed: ${r.message}`)),process.exit(1);}});oe.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("--strict","Exit 1 on health errors or warnings (workspace/project scope)").option("--ci","CI gate: exit 1 on errors, exit 2 on warnings only").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(i.red(`Unknown doctor scope: ${t}`)),console.log(i.gray("Available: workspace, project")),console.log(i.gray("Usage: npx rapidkit doctor | npx rapidkit doctor workspace | npx rapidkit doctor project")),process.exit(1)),e.plan&&(e.fix||e.apply)&&(console.log(i.red("Invalid doctor flags: --plan cannot be combined with --fix or --apply")),process.exit(1));let r=await oc({scope:t,workspaceFlag:e.workspace});r.detected&&!e.json&&(console.log(i.yellow("\u26A0\uFE0F Local launcher shadow detected for doctor workspace checks.")),r.candidatePath&&console.log(i.gray(` Candidate: ${r.candidatePath}`)),console.log(i.gray(" Running npm-wrapper doctor workflow directly as safe fallback to avoid ambiguous rapidkit binary resolution.")),console.log(i.gray(" If this happens in a shell call, run: npx --yes --package rapidkit rapidkit doctor workspace")));let{runDoctor:o}=await import('./doctor-3SBEO7XU.js'),n=await o({...e,workspace:e.workspace||t==="workspace",project:e.project||t==="project",strict:e.strict===true,ci:e.ci===true});n!==0&&process.exit(n);});oe.command("workspace <action> [subaction] [key] [value]").description(`Manage RapidKit workspaces (list, sync, policy, share, export, hydrate, run)
289
286
  workspace run <stage> \u2014 fleet stage execution across discovered projects
290
- 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(),s=c=>{let l=Q(process.cwd());l||(console.log(i.red("\u274C Not inside a RapidKit workspace")),console.log(i.gray("\u{1F4A1} Run this command from within a workspace directory")),process.exit(1));let u=y__default.resolve(process.cwd()),d=y__default.resolve(l);return u!==d&&(console.log(i.red(`\u274C Workspace action "${c}" must be run from workspace root.`)),console.log(i.gray(`\u{1F4A1} Workspace root: ${l}`)),console.log(i.white(` cd ${l}`)),(c==="run init"||c==="init")&&console.log(i.gray(" For project-only init in the current directory, run: npx rapidkit init")),process.exit(1)),l},a=c=>process.argv.includes(c);if(t==="list"){let{listWorkspaces:c}=await import('./workspace-4VGM2NPS.js');await c();}else if(t==="sync"){let c=s("sync"),{syncWorkspaceProjects:l}=await import('./workspace-4VGM2NPS.js');console.log(i.cyan(`\u{1F4C2} Scanning workspace: ${y__default.basename(c)}`)),await l(c),await vt(c);}else if(t==="foundation"){let c=s("foundation"),l=e||"ensure";l!=="ensure"&&(console.log(i.red(`\u274C Unknown workspace foundation action: ${l}`)),console.log(i.gray(" npx rapidkit workspace foundation ensure [--force] [--json]")),process.exit(1));let{ensureWorkspaceFoundation:u}=await import('./workspace-foundation-4EYME5VM.js'),d=await u(c,{force:n.force===true||a("--force")});if(n.json){console.log(JSON.stringify(d,null,2));return}d.created.length>0?console.log(i.green(`\u2714 Workspace foundation ensured: ${d.created.join(", ")}`)):console.log(i.gray("Workspace foundation files are already up to date."));}else if(t==="policy"){let c=s("policy"),l=await $c(c,e,r,o);l!==0&&process.exit(l);}else if(t==="contract"){let c=s("contract"),{buildWorkspaceContractGraph:l,readWorkspaceContract:u,verifyWorkspaceContract:d,writeWorkspaceContract:p,WORKSPACE_CONTRACT_PATH:m}=await import('./workspace-contract-Z5VYUF3T.js'),g=e||"inspect",f=n.output;try{if(g==="init"){let h=await p({workspacePath:c,outputPath:f,force:n.force===true||a("--force")});if(n.json){console.log(JSON.stringify(h,null,2));return}console.log(i.green(`\u2714 Workspace contract initialized: ${h.contractPath}`)),console.log(i.gray(` Projects: ${h.contract.projects.length}`));return}if(g==="inspect"){let h=await u({workspacePath:c,contractPath:f});if(n.json){console.log(JSON.stringify(h,null,2));return}console.log(i.green(`\u2714 Workspace contract: ${h.contractPath}`)),console.log(i.gray(` Workspace: ${h.contract.workspace.name}`)),console.log(i.gray(` Projects: ${h.contract.projects.length}`)),console.log(i.gray(` Schema: v${h.contract.schemaVersion}`));return}if(g==="verify"){let h=await d({workspacePath:c,contractPath:f,strict:n.strict===true||a("--strict")});if(n.json)console.log(JSON.stringify(h,null,2));else {let b=h.status==="passed"?i.green:i.red;console.log(b(`\u2714 Workspace contract verification ${h.status}: ${h.contractPath}`)),console.log(i.gray(` Projects: ${h.projectCount}`));for(let w of h.checks){let k=w.status==="passed"?"\u2714":"\u2718";console.log(i.gray(` ${k} ${w.id}: ${w.message}`));}for(let w of h.violations)console.log(i.gray(` Violation: ${w}`));}(h.status==="failed"||h.status!=="passed"&&n.strict)&&process.exit(1);return}if(g==="graph"){let h=await l({workspacePath:c,contractPath:f});if(n.json){console.log(JSON.stringify(h,null,2));return}console.log(i.green(`\u2714 Workspace contract graph: ${h.contractPath}`)),console.log(i.gray(` Workspace: ${h.graph.workspace.name}`)),console.log(i.gray(` Projects: ${h.graph.summary.projectCount}`)),console.log(i.gray(` Dependencies: ${h.graph.summary.dependencyEdges}`)),console.log(i.gray(` Event links: ${h.graph.summary.eventEdges}`)),console.log(i.gray(` Ports: ${h.graph.summary.portCount}`));for(let b of h.graph.nodes){let w=b.ports.map(k=>`${k.name}:${k.port}`).join(", ")||"none";console.log(i.gray(` \u2022 ${b.id} (${b.runtime||"unknown"}${b.framework?`/${b.framework}`:""}) ports=${w}`));}for(let b of h.graph.edges){let w=b.type==="event"?`event:${b.label}`:b.label;console.log(i.gray(` ${b.from} -> ${b.to} [${w}]`));}return}console.log(i.red(`\u274C Unknown workspace contract action: ${g}`)),console.log(i.white(` npx rapidkit workspace contract init|inspect|verify|graph [--output ${m}]`)),process.exit(1);}catch(h){console.log(i.red(`\u274C Workspace contract ${g} failed: ${h.message}`)),process.exit(1);}}else if(t==="share"){let c=s("share"),l=n.output||e,{createWorkspaceShareBundle:u}=await import('./workspace-4VGM2NPS.js'),d=await u(c,{outputPath:l,includePaths:n.includePaths===true,includeDoctorEvidence:n.doctor!==false,includeBlueprint:n.blueprint!==false});console.log(i.green(`\u2714 Workspace share bundle exported: ${d}`)),console.log(i.gray("Share this JSON with your team for reproducible workspace/project diagnostics."));}else if(t==="export"){let c=s("export"),{exportWorkspaceArchive:l}=await import('./workspace-archive-EJIGYKSR.js'),u=await l({workspacePath:c,outputPath:n.output||e,includeEnv:n.includeEnv===true||a("--include-env")});if(n.json){console.log(JSON.stringify(u,null,2));return}let d=(u.bytesWritten/(1024*1024)).toFixed(2);console.log(i.green(`\u2714 Workspace archive exported: ${u.archivePath}`)),console.log(i.gray(` Files: ${u.manifest.files.length}`)),console.log(i.gray(` Size: ${d} MB`)),u.manifest.security.envFilesIncluded||console.log(i.gray(" Secrets: excluded (.env, private keys, logs, dependency caches)"));}else if(t==="archive"&&(e==="inspect"||e==="verify"||e==="doctor")){let c=r;c||(console.log(i.red(`\u274C workspace archive ${e} requires an archive path or URL.`)),console.log(i.white(` npx rapidkit workspace archive ${e} team.rapidkit-archive.zip`)),process.exit(1));let{doctorWorkspaceArchive:l,inspectWorkspaceArchive:u,verifyWorkspaceArchive:d}=await import('./workspace-archive-EJIGYKSR.js');try{if(e==="inspect"){let m=await u({archivePathOrUrl:c});if(n.json){console.log(JSON.stringify(m,null,2));return}let g=(m.totalBytes/(1024*1024)).toFixed(2);console.log(i.green(`\u2714 Workspace archive: ${m.archivePath}`)),console.log(i.gray(` Workspace: ${m.manifest.workspaceName}`)),console.log(i.gray(` Exported: ${m.manifest.exportedAt}`)),console.log(i.gray(` Exporter: ${m.manifest.exportedBy||"unknown"}`)),console.log(i.gray(` Files: ${m.fileCount}`)),console.log(i.gray(` Payload: ${g} MB`));return}if(e==="doctor"){let m=await l({archivePathOrUrl:c,strict:n.strict===true||a("--strict")});if(n.json)console.log(JSON.stringify(m,null,2));else {let g=m.status==="passed"?i.green:m.status==="warning"?i.yellow:i.red;console.log(g(`\u2714 Workspace archive doctor ${m.status}: ${m.archivePath}`)),console.log(i.gray(` Workspace: ${m.workspaceName}`)),console.log(i.gray(` Files: ${m.fileCount}`));for(let f of m.checks){let h=f.status==="passed"?"\u2714":f.status==="warning"?"\u26A0":"\u2718";console.log(i.gray(` ${h} ${f.id}: ${f.message}`));}for(let f of m.recommendedActions)console.log(i.gray(` Next: ${f}`));}(m.status==="failed"||m.status==="warning"&&n.strict)&&process.exit(1);return}let p=await d({archivePathOrUrl:c,requireChecksums:n.strict===true||a("--strict")});if(n.json)console.log(JSON.stringify(p,null,2));else if(p.status==="passed")console.log(i.green(`\u2714 Workspace archive verified: ${p.archivePath}`)),console.log(i.gray(` Files: ${p.verifiedFiles}/${p.fileCount}`));else {let m=p.status==="failed"?i.red:i.yellow;console.log(m(`\u274C Workspace archive verification ${p.status}: ${p.archivePath}`)),p.missingArchiveEntries.length&&console.log(i.gray(` Missing entries: ${p.missingArchiveEntries.join(", ")}`)),p.extraArchiveEntries.length&&console.log(i.gray(` Unexpected entries: ${p.extraArchiveEntries.join(", ")}`)),p.mismatches.length&&console.log(i.gray(` Mismatches: ${p.mismatches.map(g=>g.path).join(", ")}`)),p.missingChecksumFiles.length&&console.log(i.gray(` Missing checksums: ${p.missingChecksumFiles.join(", ")}`));}(p.status==="failed"||p.status==="warning"&&n.strict)&&process.exit(1);}catch(p){console.log(i.red(`\u274C Workspace archive ${e} failed: ${p.message}`)),process.exit(1);}}else if(t==="hydrate"||t==="import"){let c=e;c||(console.log(i.red(`\u274C workspace ${t} requires an archive path or URL.`)),console.log(i.white(` npx rapidkit workspace ${t} team.rapidkit-archive.zip --output ./team`)),process.exit(1));let{hydrateWorkspaceArchive:l}=await import('./workspace-archive-EJIGYKSR.js');try{let u=await l({archivePathOrUrl:c,outputPath:n.output,force:n.force===true||a("--force"),dryRun:n.dryRun===true||a("--dry-run"),strict:n.strict===true||a("--strict")});if(n.json){console.log(JSON.stringify(u,null,2));return}console.log(i.green(u.dryRun?`\u2714 Workspace archive hydrate preview: ${u.outputPath}`:`\u2714 Workspace archive hydrated: ${u.outputPath}`)),console.log(i.gray(` Files: ${u.files.length}`)),u.manifest?.workspaceName&&console.log(i.gray(` Workspace: ${u.manifest.workspaceName}`));}catch(u){console.log(i.red(`\u274C Workspace ${t} failed: ${u.message}`)),process.exit(1);}}else if(t==="run"){let c=s(`run ${e||""}`.trim());(!e||!["init","test","build","start"].includes(e))&&(console.log(i.red(`Unknown workspace run stage: ${e||"(none provided)"}`)),console.log(i.gray("Available stages: init | test | build | start")),console.log(i.gray(" \u2022 init \u2014 run install/bootstrap across the project fleet")),console.log(i.gray(" \u2022 test \u2014 run test suite across selected projects")),console.log(i.gray(" \u2022 build \u2014 compile/package across selected projects")),console.log(i.gray(" \u2022 start \u2014 start services (smoke/e2e scenarios)")),console.log(i.gray(" Note: dev is excluded \u2014 it is a local-only primitive, not a CI stage")),process.exit(2));let l=Number(n.maxWorkers??""),u=Number.isFinite(l)?Math.max(1,Math.trunc(l)):void 0;if(e==="init"){let m=await yo(c);m!==0&&process.exit(m);}let{runWorkspaceStage:d}=await import('./workspace-run-SWN34LVQ.js'),p=await d({workspacePath:c,stage:e,affected:n.affected===true,blastRadius:n.blastRadius===true,since:n.since,parallel:n.parallel===true,maxWorkers:u,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 if(t==="init"){console.log(i.yellow("\u2139 workspace init is an alias of: npx rapidkit workspace run init")),console.log(i.gray(` Equivalent full-init aliases at workspace root:
287
+ 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(),s=c=>{let l=ee(process.cwd());l||(console.log(i.red("\u274C Not inside a RapidKit workspace")),console.log(i.gray("\u{1F4A1} Run this command from within a workspace directory")),process.exit(1));let u=y__default.resolve(process.cwd()),p=y__default.resolve(l);return u!==p&&(console.log(i.red(`\u274C Workspace action "${c}" must be run from workspace root.`)),console.log(i.gray(`\u{1F4A1} Workspace root: ${l}`)),console.log(i.white(` cd ${l}`)),(c==="run init"||c==="init")&&console.log(i.gray(" For project-only init in the current directory, run: npx rapidkit init")),process.exit(1)),l},a=c=>process.argv.includes(c);if(t==="list"){let{listWorkspaces:c}=await import('./workspace-AG2MQFTY.js');await c();}else if(t==="sync"){let c=s("sync"),{syncWorkspaceProjects:l}=await import('./workspace-AG2MQFTY.js');n.json||console.log(i.cyan(`\u{1F4C2} Scanning workspace: ${y__default.basename(c)}`));let u=await l(c,n.json===true);await rt(c,{silent:n.json===true}),n.json&&console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-sync-v1",workspacePath:c,registry:u,contractSynced:true},null,2));}else if(t==="foundation"){let c=s("foundation"),l=e||"ensure";l!=="ensure"&&(console.log(i.red(`\u274C Unknown workspace foundation action: ${l}`)),console.log(i.gray(" npx rapidkit workspace foundation ensure [--force] [--json]")),process.exit(1));let{ensureWorkspaceFoundation:u}=await import('./workspace-foundation-G74V6K4U.js'),p=await u(c,{force:n.force===true||a("--force")});if(n.json){console.log(JSON.stringify(p,null,2));return}p.created.length>0?console.log(i.green(`\u2714 Workspace foundation ensured: ${p.created.join(", ")}`)):console.log(i.gray("Workspace foundation files are already up to date."));}else if(t==="policy"){let c=s("policy"),l=await hc(c,e,r,o);l!==0&&process.exit(l);}else if(t==="contract"){let c=s("contract"),{buildWorkspaceContractGraph:l,readWorkspaceContract:u,verifyWorkspaceContract:p,writeWorkspaceContract:d,WORKSPACE_CONTRACT_PATH:f}=await import('./workspace-contract-Z5VYUF3T.js'),g=e||"inspect",m=n.output;try{if(g==="init"){let h=await d({workspacePath:c,outputPath:m,force:n.force===true||a("--force")});if(n.json){console.log(JSON.stringify(h,null,2));return}console.log(i.green(`\u2714 Workspace contract initialized: ${h.contractPath}`)),console.log(i.gray(` Projects: ${h.contract.projects.length}`));return}if(g==="inspect"){let h=await u({workspacePath:c,contractPath:m});if(n.json){console.log(JSON.stringify(h,null,2));return}console.log(i.green(`\u2714 Workspace contract: ${h.contractPath}`)),console.log(i.gray(` Workspace: ${h.contract.workspace.name}`)),console.log(i.gray(` Projects: ${h.contract.projects.length}`)),console.log(i.gray(` Schema: v${h.contract.schemaVersion}`));return}if(g==="verify"){let h=await p({workspacePath:c,contractPath:m,strict:n.strict===true||a("--strict")});if(n.json)console.log(JSON.stringify(h,null,2));else {let P=h.status==="passed"?i.green:i.red;console.log(P(`\u2714 Workspace contract verification ${h.status}: ${h.contractPath}`)),console.log(i.gray(` Projects: ${h.projectCount}`));for(let C of h.checks){let w=C.status==="passed"?"\u2714":"\u2718";console.log(i.gray(` ${w} ${C.id}: ${C.message}`));}for(let C of h.violations)console.log(i.gray(` Violation: ${C}`));}(h.status==="failed"||h.status!=="passed"&&n.strict)&&process.exit(1);return}if(g==="graph"){let h=await l({workspacePath:c,contractPath:m});if(n.json){console.log(JSON.stringify(h,null,2));return}console.log(i.green(`\u2714 Workspace contract graph: ${h.contractPath}`)),console.log(i.gray(` Workspace: ${h.graph.workspace.name}`)),console.log(i.gray(` Projects: ${h.graph.summary.projectCount}`)),console.log(i.gray(` Dependencies: ${h.graph.summary.dependencyEdges}`)),console.log(i.gray(` Event links: ${h.graph.summary.eventEdges}`)),console.log(i.gray(` Ports: ${h.graph.summary.portCount}`));for(let P of h.graph.nodes){let C=P.ports.map(w=>`${w.name}:${w.port}`).join(", ")||"none";console.log(i.gray(` \u2022 ${P.id} (${P.runtime||"unknown"}${P.framework?`/${P.framework}`:""}) ports=${C}`));}for(let P of h.graph.edges){let C=P.type==="event"?`event:${P.label}`:P.label;console.log(i.gray(` ${P.from} -> ${P.to} [${C}]`));}return}console.log(i.red(`\u274C Unknown workspace contract action: ${g}`)),console.log(i.white(` npx rapidkit workspace contract init|inspect|verify|graph [--output ${f}]`)),process.exit(1);}catch(h){console.log(i.red(`\u274C Workspace contract ${g} failed: ${h.message}`)),process.exit(1);}}else if(t==="share"){let c=s("share"),l=n.output||e,{createWorkspaceShareBundle:u}=await import('./workspace-AG2MQFTY.js'),p=await u(c,{outputPath:l,includePaths:n.includePaths===true,includeDoctorEvidence:n.doctor!==false,includeBlueprint:n.blueprint!==false});console.log(i.green(`\u2714 Workspace share bundle exported: ${p}`)),console.log(i.gray("Share this JSON with your team for reproducible workspace/project diagnostics."));}else if(t==="export"){let c=s("export"),{exportWorkspaceArchive:l}=await import('./workspace-archive-EJIGYKSR.js'),u=await l({workspacePath:c,outputPath:n.output||e,includeEnv:n.includeEnv===true||a("--include-env")});if(n.json){console.log(JSON.stringify(u,null,2));return}let p=(u.bytesWritten/(1024*1024)).toFixed(2);console.log(i.green(`\u2714 Workspace archive exported: ${u.archivePath}`)),console.log(i.gray(` Files: ${u.manifest.files.length}`)),console.log(i.gray(` Size: ${p} MB`)),u.manifest.security.envFilesIncluded||console.log(i.gray(" Secrets: excluded (.env, private keys, logs, dependency caches)"));}else if(t==="archive"&&(e==="inspect"||e==="verify"||e==="doctor")){let c=r;c||(console.log(i.red(`\u274C workspace archive ${e} requires an archive path or URL.`)),console.log(i.white(` npx rapidkit workspace archive ${e} team.rapidkit-archive.zip`)),process.exit(1));let{doctorWorkspaceArchive:l,inspectWorkspaceArchive:u,verifyWorkspaceArchive:p}=await import('./workspace-archive-EJIGYKSR.js');try{if(e==="inspect"){let f=await u({archivePathOrUrl:c});if(n.json){console.log(JSON.stringify(f,null,2));return}let g=(f.totalBytes/(1024*1024)).toFixed(2);console.log(i.green(`\u2714 Workspace archive: ${f.archivePath}`)),console.log(i.gray(` Workspace: ${f.manifest.workspaceName}`)),console.log(i.gray(` Exported: ${f.manifest.exportedAt}`)),console.log(i.gray(` Exporter: ${f.manifest.exportedBy||"unknown"}`)),console.log(i.gray(` Files: ${f.fileCount}`)),console.log(i.gray(` Payload: ${g} MB`));return}if(e==="doctor"){let f=await l({archivePathOrUrl:c,strict:n.strict===true||a("--strict")});if(n.json)console.log(JSON.stringify(f,null,2));else {let g=f.status==="passed"?i.green:f.status==="warning"?i.yellow:i.red;console.log(g(`\u2714 Workspace archive doctor ${f.status}: ${f.archivePath}`)),console.log(i.gray(` Workspace: ${f.workspaceName}`)),console.log(i.gray(` Files: ${f.fileCount}`));for(let m of f.checks){let h=m.status==="passed"?"\u2714":m.status==="warning"?"\u26A0":"\u2718";console.log(i.gray(` ${h} ${m.id}: ${m.message}`));}for(let m of f.recommendedActions)console.log(i.gray(` Next: ${m}`));}(f.status==="failed"||f.status==="warning"&&n.strict)&&process.exit(1);return}let d=await p({archivePathOrUrl:c,requireChecksums:n.strict===true||a("--strict")});if(n.json)console.log(JSON.stringify(d,null,2));else if(d.status==="passed")console.log(i.green(`\u2714 Workspace archive verified: ${d.archivePath}`)),console.log(i.gray(` Files: ${d.verifiedFiles}/${d.fileCount}`));else {let f=d.status==="failed"?i.red:i.yellow;console.log(f(`\u274C Workspace archive verification ${d.status}: ${d.archivePath}`)),d.missingArchiveEntries.length&&console.log(i.gray(` Missing entries: ${d.missingArchiveEntries.join(", ")}`)),d.extraArchiveEntries.length&&console.log(i.gray(` Unexpected entries: ${d.extraArchiveEntries.join(", ")}`)),d.mismatches.length&&console.log(i.gray(` Mismatches: ${d.mismatches.map(g=>g.path).join(", ")}`)),d.missingChecksumFiles.length&&console.log(i.gray(` Missing checksums: ${d.missingChecksumFiles.join(", ")}`));}(d.status==="failed"||d.status==="warning"&&n.strict)&&process.exit(1);}catch(d){console.log(i.red(`\u274C Workspace archive ${e} failed: ${d.message}`)),process.exit(1);}}else if(t==="hydrate"||t==="import"){let c=e;c||(console.log(i.red(`\u274C workspace ${t} requires an archive path or URL.`)),console.log(i.white(` npx rapidkit workspace ${t} team.rapidkit-archive.zip --output ./team`)),process.exit(1));let{hydrateWorkspaceArchive:l}=await import('./workspace-archive-EJIGYKSR.js');try{let u=await l({archivePathOrUrl:c,outputPath:n.output,force:n.force===true||a("--force"),dryRun:n.dryRun===true||a("--dry-run"),strict:n.strict===true||a("--strict")});if(n.json){console.log(JSON.stringify(u,null,2));return}console.log(i.green(u.dryRun?`\u2714 Workspace archive hydrate preview: ${u.outputPath}`:`\u2714 Workspace archive hydrated: ${u.outputPath}`)),console.log(i.gray(` Files: ${u.files.length}`)),u.manifest?.workspaceName&&console.log(i.gray(` Workspace: ${u.manifest.workspaceName}`));}catch(u){console.log(i.red(`\u274C Workspace ${t} failed: ${u.message}`)),process.exit(1);}}else if(t==="run"){let c=s(`run ${e||""}`.trim());(!e||!["init","test","build","start"].includes(e))&&(console.log(i.red(`Unknown workspace run stage: ${e||"(none provided)"}`)),console.log(i.gray("Available stages: init | test | build | start")),console.log(i.gray(" \u2022 init \u2014 run install/bootstrap across the project fleet")),console.log(i.gray(" \u2022 test \u2014 run test suite across selected projects")),console.log(i.gray(" \u2022 build \u2014 compile/package across selected projects")),console.log(i.gray(" \u2022 start \u2014 start services (smoke/e2e scenarios)")),console.log(i.gray(" Note: dev is excluded \u2014 it is a local-only primitive, not a CI stage")),process.exit(2));let l=Number(n.maxWorkers??""),u=Number.isFinite(l)?Math.max(1,Math.trunc(l)):void 0;if(e==="init"){let f=await mo(c);f!==0&&process.exit(f);}let{runWorkspaceStage:p}=await import('./workspace-run-EDM3SUPA.js'),d=await p({workspacePath:c,stage:e,affected:n.affected===true,blastRadius:n.blastRadius===true,since:n.since,parallel:n.parallel===true,maxWorkers:u,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(i.yellow("\u2139 workspace init is an alias of: npx rapidkit workspace run init")),console.log(i.gray(` Equivalent full-init aliases at workspace root:
291
288
  npx rapidkit init | npx rapidkit workspace init | npx rapidkit workspace run init
292
- `));let c=s("init"),l=Number(n.maxWorkers??""),u=Number.isFinite(l)?Math.max(1,Math.trunc(l)):void 0,d=await yo(c);d!==0&&process.exit(d);let{runWorkspaceStage:p}=await import('./workspace-run-SWN34LVQ.js'),m=await p({workspacePath:c,stage:"init",affected:n.affected===true,blastRadius:n.blastRadius===true,since:n.since,parallel:n.parallel===true,maxWorkers:u,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(i.red(`Unknown workspace action: ${t}`)),console.log(i.gray("Available: list, sync, policy, share, export, hydrate, import, run")),process.exit(1);});function Us(){let t=a()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";console.log(i.white(`Usage:
289
+ `));let c=s("init"),l=Number(n.maxWorkers??""),u=Number.isFinite(l)?Math.max(1,Math.trunc(l)):void 0,p=await mo(c);p!==0&&process.exit(p);let{runWorkspaceStage:d}=await import('./workspace-run-EDM3SUPA.js'),f=await d({workspacePath:c,stage:"init",affected:n.affected===true,blastRadius:n.blastRadius===true,since:n.since,parallel:n.parallel===true,maxWorkers:u,continueOnError:n.continueOnError===true,strict:n.strict===true,json:n.json===true,enforceGates:n.gates});n.json&&console.log(JSON.stringify(f,null,2)),f.summary.exitCode!==0&&process.exit(f.summary.exitCode);}else console.log(i.red(`Unknown workspace action: ${t}`)),console.log(i.gray("Available: list, sync, policy, share, export, hydrate, import, run")),process.exit(1);});function Js(){let t=a()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";console.log(i.white(`Usage:
293
290
  `)),console.log(i.cyan(` npx rapidkit <workspace-name> [options]
294
291
  `)),console.log(i.bold("Quick start \u2014 workspace workflow:")),console.log(i.cyan(" npx rapidkit my-workspace ")+i.gray("# Create workspace (interactive profile picker)")),console.log(i.cyan(" cd my-workspace")),console.log(i.cyan(" npx rapidkit bootstrap ")+i.gray("# Bootstrap all runtime toolchains")),console.log(i.cyan(" npx rapidkit create project ")+i.gray("# Interactive kit picker")),console.log(i.cyan(" cd my-api")),console.log(i.cyan(` ${t}
295
292
  `)),console.log(i.bold("Workspace profiles (asked during creation):")),console.log(i.gray(" minimal Foundation files only \u2014 fastest bootstrap (default)")),console.log(i.gray(" java-only Java runtime (Spring Boot services)")),console.log(i.gray(" python-only Python + Poetry (FastAPI, Django, ML)")),console.log(i.gray(" node-only Node.js runtime (NestJS, Express, Next.js)")),console.log(i.gray(" go-only Go runtime (Fiber, Gin, gRPC)")),console.log(i.gray(" dotnet-only .NET runtime (ASP.NET Core services)")),console.log(i.gray(" polyglot Python + Node.js + Go + Java + .NET multi-runtime")),console.log(i.gray(` enterprise Polyglot + governance + Sigstore
296
- `)),console.log(i.bold("Workspace commands (inside a workspace):")),console.log(i.gray(" npx rapidkit bootstrap [--profile <p>] Re-bootstrap toolchains")),console.log(i.gray(" npx rapidkit analyze [--json --strict] Analyze workspace health and gaps")),console.log(i.gray(" npx rapidkit workspace list List registered workspaces")),console.log(i.gray(" npx rapidkit import <path|git-url> Copy or clone a backend project into this workspace")),console.log(i.gray(" npx rapidkit snapshot create [name] Create a recoverable workspace snapshot")),console.log(i.gray(" npx rapidkit snapshot restore <name> Restore snapshot metadata with safety guard")),console.log(i.gray(" npx rapidkit snapshot inspect <name> Inspect snapshot manifest and size")),console.log(i.gray(" npx rapidkit project archive <name> Archive a project with a safety snapshot")),console.log(i.gray(" npx rapidkit project restore <archive> Restore an archived project safely")),console.log(i.gray(" npx rapidkit workspace share [--output <file>] Export collaboration bundle")),console.log(i.gray(" npx rapidkit workspace foundation ensure Ensure workspace.json/policies/toolchain files")),console.log(i.gray(" npx rapidkit workspace contract init Create workspace service contract")),console.log(i.gray(" npx rapidkit workspace contract verify Verify service ports/dependencies")),console.log(i.gray(" npx rapidkit workspace contract graph Show service dependency graph")),console.log(i.gray(" npx rapidkit workspace export --output <file> Export portable workspace archive")),console.log(i.gray(" npx rapidkit workspace archive verify <file> Verify archive integrity")),console.log(i.gray(" npx rapidkit workspace archive doctor <file> Diagnose archive readiness")),console.log(i.gray(" npx rapidkit workspace hydrate <archive> --output <dir> Hydrate workspace archive")),console.log(i.gray(" npx rapidkit workspace policy show Show effective workspace policies")),console.log(i.gray(" npx rapidkit workspace policy set <k> <v> Update workspace policy values")),console.log(i.gray(" npx rapidkit setup python|node|go|java|dotnet [--warm-deps] Set up runtime (+ optional deps warm-up)")),console.log(i.gray(" npx rapidkit mirror [status|sync|verify|rotate] Registry mirror management")),console.log(i.gray(" npx rapidkit cache [status|clear|prune|repair] Package cache management")),console.log(i.gray(" npx rapidkit infra plan Discover and generate infra compose")),console.log(i.gray(` npx rapidkit infra up|down|status Manage Docker sidecar infrastructure
293
+ `)),console.log(i.bold("Workspace commands (inside a workspace):")),console.log(i.gray(" npx rapidkit bootstrap [--profile <p>] Re-bootstrap toolchains")),console.log(i.gray(" npx rapidkit analyze [--json --strict] Analyze workspace health and gaps")),console.log(i.gray(" npx rapidkit pipeline [--json --strict] Governance loop: sync \u2192 doctor \u2192 analyze \u2192 readiness \u2192 autopilot")),console.log(i.gray(" npx rapidkit readiness [--json --strict] Release readiness gates (env/doctor/analyze/verify/deps)")),console.log(i.gray(" npx rapidkit doctor workspace [--ci] Workspace health with CI exit codes")),console.log(i.gray(" npx rapidkit workspace list List registered workspaces")),console.log(i.gray(" npx rapidkit workspace sync [--json] Sync registry + contract from projects")),console.log(i.gray(" npx rapidkit import <path|git-url> Copy or clone a backend project into this workspace")),console.log(i.gray(" npx rapidkit snapshot create [name] Create a recoverable workspace snapshot")),console.log(i.gray(" npx rapidkit snapshot restore <name> Restore snapshot metadata with safety guard")),console.log(i.gray(" npx rapidkit snapshot inspect <name> Inspect snapshot manifest and size")),console.log(i.gray(" npx rapidkit project archive <name> Archive a project with a safety snapshot")),console.log(i.gray(" npx rapidkit project restore <archive> Restore an archived project safely")),console.log(i.gray(" npx rapidkit workspace share [--output <file>] Export collaboration bundle")),console.log(i.gray(" npx rapidkit workspace foundation ensure Ensure workspace.json/policies/toolchain files")),console.log(i.gray(" npx rapidkit workspace contract init Create workspace service contract")),console.log(i.gray(" npx rapidkit workspace contract verify Verify service ports/dependencies")),console.log(i.gray(" npx rapidkit workspace contract graph Show service dependency graph")),console.log(i.gray(" npx rapidkit workspace export --output <file> Export portable workspace archive")),console.log(i.gray(" npx rapidkit workspace archive verify <file> Verify archive integrity")),console.log(i.gray(" npx rapidkit workspace archive doctor <file> Diagnose archive readiness")),console.log(i.gray(" npx rapidkit workspace hydrate <archive> --output <dir> Hydrate workspace archive")),console.log(i.gray(" npx rapidkit workspace policy show Show effective workspace policies")),console.log(i.gray(" npx rapidkit workspace policy set <k> <v> Update workspace policy values")),console.log(i.gray(" npx rapidkit setup python|node|go|java|dotnet [--warm-deps] Set up runtime (+ optional deps warm-up)")),console.log(i.gray(" npx rapidkit mirror [status|sync|verify|rotate] Registry mirror management")),console.log(i.gray(" npx rapidkit cache [status|clear|prune|repair] Package cache management")),console.log(i.gray(" npx rapidkit infra plan Discover and generate infra compose")),console.log(i.gray(` npx rapidkit infra up|down|status Manage Docker sidecar infrastructure
297
294
  `)),console.log(i.bold("Options (workspace creation):")),console.log(i.gray(" -y, --yes Skip prompts and use defaults")),console.log(i.gray(" --author <name> Author/team name for workspace metadata")),console.log(i.gray(" --skip-git Skip git initialization")),console.log(i.gray(" --debug Enable debug logging")),console.log(i.gray(" --dry-run Show what would be created")),console.log(i.gray(" --create-workspace When creating a project outside a workspace: create and register a workspace in the current directory")),console.log(i.gray(" --no-workspace When creating a project outside a workspace: do not create a workspace")),console.log(i.gray(` --no-update-check Skip checking for updates
298
295
  `)),console.log(i.bold("Project commands (inside a project):")),console.log(i.gray(" npx rapidkit create project Scaffold a new project")),console.log(i.gray(" cd my-api Change directory to the new project")),console.log(i.gray(" npx rapidkit init Install project dependencies")),console.log(i.gray(" npx rapidkit dev Start dev server")),console.log(i.gray(" npx rapidkit build Build for production")),console.log(i.gray(` npx rapidkit test Run tests
299
296
  `)),console.log(i.bold("Flags clarification:")),console.log(i.gray(" --skip-install npm fast-path for lock/dependency steps")),console.log(i.gray(` --skip-essentials core flag for skipping essential module installation
300
- `)),Nc?(console.log(i.bold("Legacy (shown because RAPIDKIT_SHOW_LEGACY=1):")),console.log(i.gray(" npx rapidkit my-project --template fastapi")),console.log(i.gray(" npx rapidkit my-project --template nestjs")),console.log(i.gray(" npx rapidkit my-project --template springboot")),console.log(i.gray(" npx rapidkit my-project --template gofiber")),console.log(i.gray(" npx rapidkit my-project --template gogin")),console.log(i.gray(" npx rapidkit my-project --template dotnet")),console.log(i.gray(` --skip-install Fast-path lock/deps (legacy template mode) \u2014 not same as --skip-essentials
297
+ `)),wc?(console.log(i.bold("Legacy (shown because RAPIDKIT_SHOW_LEGACY=1):")),console.log(i.gray(" npx rapidkit my-project --template fastapi")),console.log(i.gray(" npx rapidkit my-project --template nestjs")),console.log(i.gray(" npx rapidkit my-project --template springboot")),console.log(i.gray(" npx rapidkit my-project --template gofiber")),console.log(i.gray(" npx rapidkit my-project --template gogin")),console.log(i.gray(" npx rapidkit my-project --template dotnet")),console.log(i.gray(` --skip-install Fast-path lock/deps (legacy template mode) \u2014 not same as --skip-essentials
301
298
  `))):console.log(i.gray(`Tip: set RAPIDKIT_SHOW_LEGACY=1 to show legacy template flags in help.
302
- `));}var As="__rapidkit_signal_handlers_registered__",$s=globalThis;$s[As]||($s[As]=true,process.on("SIGINT",async()=>{if(!fr){if(fr=true,console.log(i.yellow(`
299
+ `));}var Cs="__rapidkit_signal_handlers_registered__",Rs=globalThis;Rs[Cs]||(Rs[Cs]=true,process.on("SIGINT",async()=>{if(!ur){if(ur=true,console.log(i.yellow(`
303
300
 
304
- \u26A0\uFE0F Interrupted by user`)),et&&await ___default.pathExists(et)){console.log(i.gray("Cleaning up partial installation..."));try{await ___default.remove(et),console.log(i.green("\u2713 Cleanup complete"));}catch(t){a$1.debug("Cleanup failed:",t);}}process.exit(130);}}),process.on("SIGTERM",async()=>{if(!fr){if(fr=true,a$1.debug("Received SIGTERM"),et&&await ___default.pathExists(et))try{await ___default.remove(et);}catch(t){a$1.debug("Cleanup failed:",t);}process.exit(143);}}));var Tc=process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test",Wc=(()=>{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 P.realpathSync(t)===P.realpathSync(fileURLToPath(import.meta.url))||r}catch{return y__default.resolve(t)===y__default.resolve(fileURLToPath(import.meta.url))||r}})(),Fc=!Tc||Wc;function Kc(){for(let t of [process.stdout,process.stderr])t._handle?.setBlocking?.(true);}async function ue(t){await new Promise(e=>setImmediate(e)),await new Promise(e=>setTimeout(e,25)),await Promise.all([process.stdout,process.stderr].map(e=>new Promise(r=>{e.write("",()=>r());}))),process.exit(t);}if(Fc){Kc();let t=process.argv.slice(2),e=t[0],r=process.cwd(),o=it(r),n=P.existsSync(y__default.join(r,".rapidkit","project.json")),s=hc(),a=Ps(t),c=s&&Mt(t),l=e==="init"&&o&&!n;(t.length===0||t.length===1&&(e==="--help"||e==="-h"||e==="help"))&&(console.log(i.blue.bold(`
301
+ \u26A0\uFE0F Interrupted by user`)),Qe&&await E__default.pathExists(Qe)){console.log(i.gray("Cleaning up partial installation..."));try{await E__default.remove(Qe),console.log(i.green("\u2713 Cleanup complete"));}catch(t){a$1.debug("Cleanup failed:",t);}}process.exit(130);}}),process.on("SIGTERM",async()=>{if(!ur){if(ur=true,a$1.debug("Received SIGTERM"),Qe&&await E__default.pathExists(Qe))try{await E__default.remove(Qe);}catch(t){a$1.debug("Cleanup failed:",t);}process.exit(143);}}));var Pc=process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test",bc=(()=>{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}})(),jc=!Pc||bc;function Sc(){for(let t of [process.stdout,process.stderr])t._handle?.setBlocking?.(true);}async function me(t){await new Promise(e=>setImmediate(e)),await new Promise(e=>setTimeout(e,25)),await Promise.all([process.stdout,process.stderr].map(e=>new Promise(r=>{e.write("",()=>r());}))),process.exit(t);}if(jc){Sc();let t=process.argv.slice(2),e=t[0],r=process.cwd(),o=st(r),n=v.existsSync(y__default.join(r,".rapidkit","project.json")),s=ec(),a=hs(t),c=s&&Nt(t),l=e==="init"&&o&&!n;(t.length===0||t.length===1&&(e==="--help"||e==="-h"||e==="help"))&&(console.log(i.blue.bold(`
305
302
  \u{1F680} Welcome to RapidKit NPM CLI!
306
- `)),Us(),process.exit(0)),t.some(d=>d==="--version"||d==="-V"||d==="-v")&&!t.some(d=>d==="--help"||d==="-h"||d==="help")&&(console.log(b()),process.exit(0)),go(t)&&process.exit(0),c&&bs(e)?(async()=>{e==="bootstrap"&&await ue(await Cs(t)),e==="setup"&&await ue(await Rs(t)),e==="cache"&&await ue(await Es(t)),await ue(await _s(t));})().catch(d=>{process.stderr.write(`RapidKit (npm) failed to run ${e}: ${d?.message??d}
307
- `),process.exit(1);}):a||c?ie.parseAsync().catch(d=>{process.stderr.write(`RapidKit (npm) failed: ${d?.message??d}
308
- `),process.exit(1);}):l?wo(t).then(d=>ue(d)).catch(d=>{process.stderr.write(`RapidKit (npm) failed to run workspace init: ${d?.message??d}
309
- `),process.exit(1);}):Oc().then(async d$1=>{if(!d$1){let p=process.argv.slice(2);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] argv=${JSON.stringify(p)}
310
- `),Ps(p)){await ie.parseAsync();return}if(go(p)&&await ue(0),p[0]==="create"){let g=await Ms(p);await ue(g);}if(p[0]==="init"){let g=await wo(p);await ue(g);}if(bs(p[0])){if(p[0]==="bootstrap"){let f=await Cs(p);await ue(f);}if(p[0]==="setup"){let f=await Rs(p);await ue(f);}if(p[0]==="cache"){let f=await Es(p);await ue(f);}let g=await _s(p);await ue(g);}if(Ws.includes(p[0])){let g=p[0],f=a$4(process.cwd()),h=await Dt(process.cwd()),b=Q(process.cwd()),w=false;if(b){let E=y__default.join(b,".rapidkit","policies.yml");if(await ___default.pathExists(E))try{let W=await P.promises.readFile(E,"utf-8");if(w=((W.match(/^\s*enforcement_mode:\s*(warn|strict)\s*(?:#.*)?$/m)??W.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m))?.[1]??"warn")==="strict",w){let Z=y__default.join(b,".rapidkit","toolchain.lock"),N=[];if(!await ___default.pathExists(Z))N.push("toolchain.lock is missing \u2014 run `rapidkit bootstrap` first (strict mode requires a reproducible toolchain).");else try{let T=JSON.parse(await P.promises.readFile(Z,"utf-8")).runtime??{};b$2(f,process.cwd())&&!T.go?.version&&N.push("Go runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."),c$1(f,process.cwd())&&!T.node?.version&&N.push("Node runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."),d(f,process.cwd())&&!T.java?.version&&N.push("Java runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup java` first."),e$2(f,process.cwd())&&!T.dotnet?.version&&N.push(".NET runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup dotnet` first."),f$1(f,process.cwd())&&!T.python?.version&&N.push("Python runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");}catch{N.push("toolchain.lock is invalid JSON \u2014 regenerate it with `rapidkit bootstrap` before running commands in strict mode.");}let ye=y__default.join(b,".rapidkit","workspace.json");if(await ___default.pathExists(ye))try{let T=JSON.parse(await P.promises.readFile(ye,"utf-8")).profile??"";T==="python-only"&&(b$2(f,process.cwd())||c$1(f,process.cwd())||d(f,process.cwd())||e$2(f,process.cwd()))&&N.push('Workspace profile is "python-only" but this project is not Python. Update the workspace profile or use a polyglot workspace.'),T==="node-only"&&(b$2(f,process.cwd())||f$1(f,process.cwd())||d(f,process.cwd())||e$2(f,process.cwd()))&&N.push('Workspace profile is "node-only" but this project is not Node. Update the workspace profile or use a polyglot workspace.'),T==="go-only"&&(f$1(f,process.cwd())||c$1(f,process.cwd())||d(f,process.cwd())||e$2(f,process.cwd()))&&N.push('Workspace profile is "go-only" but this project is not Go. Update the workspace profile or use a polyglot workspace.'),T==="java-only"&&(f$1(f,process.cwd())||c$1(f,process.cwd())||b$2(f,process.cwd())||e$2(f,process.cwd()))&&N.push('Workspace profile is "java-only" but this project is not Java. Update the workspace profile or use a polyglot workspace.'),T==="dotnet-only"&&(f$1(f,process.cwd())||c$1(f,process.cwd())||b$2(f,process.cwd())||d(f,process.cwd()))&&N.push('Workspace profile is "dotnet-only" but this project is not .NET. Update the workspace profile or use a polyglot workspace.');}catch{}if(N.length>0){console.log(i.red(`\u274C Strict policy violations block \`${g}\`:`));for(let xe of N)console.log(i.red(` \u2022 ${xe}`));console.log(i.gray("\u{1F4A1} Fix violations or switch to warn mode: set mode: warn in .rapidkit/policies.yml")),await ue(1);}}}catch{}}let k=await so({startPath:process.cwd(),action:g,writeReport:true}),C=w||process.env.RAPIDKIT_LIFECYCLE_ENFORCE_READINESS==="1"||process.env.RAPIDKIT_ENFORCE_READINESS==="1";if(k.blocking&&C){console.log(i.red(`\u274C Release readiness blocks \`${g}\`:`));for(let E of k.blockingReasons)console.log(i.red(` \u2022 ${E}`));k.evidencePath&&console.log(i.gray(`\u2139\uFE0F Readiness evidence: ${k.evidencePath}`)),await ue(1);}k.overallStatus!=="pass"&&!C&&(console.log(i.yellow(`\u26A0\uFE0F Release readiness is ${k.overallStatus}. Command continues in warn mode.`)),k.evidencePath&&console.log(i.gray(` Evidence: ${k.evidencePath} (set RAPIDKIT_LIFECYCLE_ENFORCE_READINESS=1 to block)`)));let x=await qs(process.cwd(),async()=>{if(b$2(f,process.cwd())||h==="go"){let E=Je("go",{runCommandInCwd:V,runCoreRapidkit:e$1}),W=g==="dev"?await E.runDev(process.cwd()):g==="test"?await E.runTest(process.cwd()):g==="build"?await E.runBuild(process.cwd()):await E.runStart(process.cwd());return W.message&&console.log(i.red(`\u274C ${W.message}`)),W.exitCode}if(d(f,process.cwd())||h==="java")return g==="dev"?await st("dev",process.cwd()):g==="test"?await st("test",process.cwd()):g==="build"?await st("build",process.cwd()):await st("start",process.cwd());if(e$2(f,process.cwd())||h==="dotnet"){let E=Je("dotnet",{runCommandInCwd:V,runCoreRapidkit:e$1}),W=g==="dev"?await E.runDev(process.cwd()):g==="test"?await E.runTest(process.cwd()):g==="build"?await E.runBuild(process.cwd()):await E.runStart(process.cwd());return W.message&&console.log(i.red(`\u274C ${W.message}`)),W.exitCode}if(c$1(f,process.cwd())||h==="node")return g==="dev"?await Nt("dev",process.cwd()):g==="test"?await Nt("test",process.cwd()):g==="build"?await Nt("build",process.cwd()):await Nt("start",process.cwd());if(f$1(f,process.cwd())||h==="python"){let E=Je("python",{runCommandInCwd:V,runCoreRapidkit:e$1});return me(g==="dev"?await E.runDev(process.cwd()):g==="test"?await E.runTest(process.cwd()):g==="build"?await E.runBuild(process.cwd()):await E.runStart(process.cwd()))}return -1});x.ok||await ue(x.code),x.ok&&x.value>=0&&await ue(x.value);}if(p[0]==="add"||p[0]==="module"&&p[1]==="add"){let g=a$4(process.cwd());if(g?.module_support===false){let f=g?.runtime==="java"?"Spring Boot":g?.runtime==="dotnet"?"ASP.NET Core":"Go";console.error(i.red(`\u274C RapidKit modules are not available for ${f} npm-level kits.`)),console.error(i.gray(" The module system requires Python and is currently only supported for FastAPI and NestJS projects.")),await ue(1);}}if(Ls(p))return;let m=await Dc(p);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] shouldForwardToCore=${m}
311
- `),m){let g=await e$1(p,{cwd:process.cwd()});await ue(g);}await ie.parseAsync();}});}export{uc as NPM_ONLY_SCOPED_COMMANDS,lc as NPM_ONLY_TOP_LEVEL_COMMANDS,mc as WRAPPER_ORCHESTRATED_PROJECT_COMMANDS,kc as detectWindowsDoctorWorkspaceShadow,Cs as handleBootstrapCommand,Es as handleCacheCommand,Ms as handleCreateOrFallback,Cc as handleImportCommand,wo as handleInitCommand,_s as handleMirrorCommand,Rs as handleSetupCommand,yo as installWorkspaceDependencies,hc as isNpmExecInvocation,Dc as shouldForwardToCore};
303
+ `)),Js(),process.exit(0)),t.some(p=>p==="--version"||p==="-V"||p==="-v")&&!t.some(p=>p==="--help"||p==="-h"||p==="help")&&(console.log(b()),process.exit(0)),po(t)&&process.exit(0),c&&ys(e)?(async()=>{e==="bootstrap"&&await me(await Ps(t)),e==="setup"&&await me(await bs(t)),e==="cache"&&await me(await js(t)),await me(await Ss(t));})().catch(p=>{process.stderr.write(`RapidKit (npm) failed to run ${e}: ${p?.message??p}
304
+ `),process.exit(1);}):a||c?oe.parseAsync().catch(p=>{process.stderr.write(`RapidKit (npm) failed: ${p?.message??p}
305
+ `),process.exit(1);}):l?fo(t).then(p=>me(p)).catch(p=>{process.stderr.write(`RapidKit (npm) failed to run workspace init: ${p?.message??p}
306
+ `),process.exit(1);}):yc().then(async p=>{if(!p){let d$1=process.argv.slice(2);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] argv=${JSON.stringify(d$1)}
307
+ `),hs(d$1)){await oe.parseAsync();return}if(po(d$1)&&await me(0),d$1[0]==="create"){let g=await As(d$1);await me(g);}if(d$1[0]==="init"){let g=await fo(d$1);await me(g);}if(ys(d$1[0])){if(d$1[0]==="bootstrap"){let m=await Ps(d$1);await me(m);}if(d$1[0]==="setup"){let m=await bs(d$1);await me(m);}if(d$1[0]==="cache"){let m=await js(d$1);await me(m);}let g=await Ss(d$1);await me(g);}if(Os.includes(d$1[0])){let g=d$1[0],m=a$4(process.cwd()),h=await Ot(process.cwd()),P=ee(process.cwd()),C=false;if(P){let _=y__default.join(P,".rapidkit","policies.yml");if(await E__default.pathExists(_))try{let $=await v.promises.readFile(_,"utf-8");if(C=(($.match(/^\s*enforcement_mode:\s*(warn|strict)\s*(?:#.*)?$/m)??$.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m))?.[1]??"warn")==="strict",C){let Ne=y__default.join(P,".rapidkit","toolchain.lock"),W=[];if(!await E__default.pathExists(Ne))W.push("toolchain.lock is missing \u2014 run `rapidkit bootstrap` first (strict mode requires a reproducible toolchain).");else try{let T=JSON.parse(await v.promises.readFile(Ne,"utf-8")).runtime??{};b$3(m,process.cwd())&&!T.go?.version&&W.push("Go runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."),c$1(m,process.cwd())&&!T.node?.version&&W.push("Node runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."),d(m,process.cwd())&&!T.java?.version&&W.push("Java runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup java` first."),e$2(m,process.cwd())&&!T.dotnet?.version&&W.push(".NET runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup dotnet` first."),f$1(m,process.cwd())&&!T.python?.version&&W.push("Python runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");}catch{W.push("toolchain.lock is invalid JSON \u2014 regenerate it with `rapidkit bootstrap` before running commands in strict mode.");}let G=y__default.join(P,".rapidkit","workspace.json");if(await E__default.pathExists(G))try{let T=JSON.parse(await v.promises.readFile(G,"utf-8")).profile??"";T==="python-only"&&(b$3(m,process.cwd())||c$1(m,process.cwd())||d(m,process.cwd())||e$2(m,process.cwd()))&&W.push('Workspace profile is "python-only" but this project is not Python. Update the workspace profile or use a polyglot workspace.'),T==="node-only"&&(b$3(m,process.cwd())||f$1(m,process.cwd())||d(m,process.cwd())||e$2(m,process.cwd()))&&W.push('Workspace profile is "node-only" but this project is not Node. Update the workspace profile or use a polyglot workspace.'),T==="go-only"&&(f$1(m,process.cwd())||c$1(m,process.cwd())||d(m,process.cwd())||e$2(m,process.cwd()))&&W.push('Workspace profile is "go-only" but this project is not Go. Update the workspace profile or use a polyglot workspace.'),T==="java-only"&&(f$1(m,process.cwd())||c$1(m,process.cwd())||b$3(m,process.cwd())||e$2(m,process.cwd()))&&W.push('Workspace profile is "java-only" but this project is not Java. Update the workspace profile or use a polyglot workspace.'),T==="dotnet-only"&&(f$1(m,process.cwd())||c$1(m,process.cwd())||b$3(m,process.cwd())||d(m,process.cwd()))&&W.push('Workspace profile is "dotnet-only" but this project is not .NET. Update the workspace profile or use a polyglot workspace.');}catch{}if(W.length>0){console.log(i.red(`\u274C Strict policy violations block \`${g}\`:`));for(let we of W)console.log(i.red(` \u2022 ${we}`));console.log(i.gray("\u{1F4A1} Fix violations or switch to warn mode: set mode: warn in .rapidkit/policies.yml")),await me(1);}}}catch{}}let w=await a$5({startPath:process.cwd(),action:g,writeReport:true}),k=C||process.env.RAPIDKIT_LIFECYCLE_ENFORCE_READINESS==="1"||process.env.RAPIDKIT_ENFORCE_READINESS==="1";if(w.blocking&&k){console.log(i.red(`\u274C Release readiness blocks \`${g}\`:`));for(let _ of w.blockingReasons)console.log(i.red(` \u2022 ${_}`));w.evidencePath&&console.log(i.gray(`\u2139\uFE0F Readiness evidence: ${w.evidencePath}`)),await me(1);}w.overallStatus!=="pass"&&!k&&(console.log(i.yellow(`\u26A0\uFE0F Release readiness is ${w.overallStatus}. Command continues in warn mode.`)),w.evidencePath&&console.log(i.gray(` Evidence: ${w.evidencePath} (set RAPIDKIT_LIFECYCLE_ENFORCE_READINESS=1 to block)`)));let x=await Ls(process.cwd(),async()=>{if(b$3(m,process.cwd())||h==="go"){let _=Fe("go",{runCommandInCwd:q,runCoreRapidkit:e$1}),$=g==="dev"?await _.runDev(process.cwd()):g==="test"?await _.runTest(process.cwd()):g==="build"?await _.runBuild(process.cwd()):await _.runStart(process.cwd());return $.message&&console.log(i.red(`\u274C ${$.message}`)),$.exitCode}if(d(m,process.cwd())||h==="java")return g==="dev"?await nt("dev",process.cwd()):g==="test"?await nt("test",process.cwd()):g==="build"?await nt("build",process.cwd()):await nt("start",process.cwd());if(e$2(m,process.cwd())||h==="dotnet"){let _=Fe("dotnet",{runCommandInCwd:q,runCoreRapidkit:e$1}),$=g==="dev"?await _.runDev(process.cwd()):g==="test"?await _.runTest(process.cwd()):g==="build"?await _.runBuild(process.cwd()):await _.runStart(process.cwd());return $.message&&console.log(i.red(`\u274C ${$.message}`)),$.exitCode}if(c$1(m,process.cwd())||h==="node")return g==="dev"?await $t("dev",process.cwd()):g==="test"?await $t("test",process.cwd()):g==="build"?await $t("build",process.cwd()):await $t("start",process.cwd());if(f$1(m,process.cwd())||h==="python"){let _=Fe("python",{runCommandInCwd:q,runCoreRapidkit:e$1});return fe(g==="dev"?await _.runDev(process.cwd()):g==="test"?await _.runTest(process.cwd()):g==="build"?await _.runBuild(process.cwd()):await _.runStart(process.cwd()))}return -1});x.ok||await me(x.code),x.ok&&x.value>=0&&await me(x.value);}if(d$1[0]==="add"||d$1[0]==="module"&&d$1[1]==="add"){let g=a$4(process.cwd());if(g?.module_support===false){let m=g?.runtime==="java"?"Spring Boot":g?.runtime==="dotnet"?"ASP.NET Core":"Go";console.error(i.red(`\u274C RapidKit modules are not available for ${m} npm-level kits.`)),console.error(i.gray(" The module system requires Python and is currently only supported for FastAPI and NestJS projects.")),await me(1);}}if(Ds(d$1))return;let f=await kc(d$1);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] shouldForwardToCore=${f}
308
+ `),f){let g=await e$1(d$1,{cwd:process.cwd()});await me(g);}await oe.parseAsync();}});}export{Ya as NPM_ONLY_SCOPED_COMMANDS,Ua as NPM_ONLY_TOP_LEVEL_COMMANDS,Qa as WRAPPER_ORCHESTRATED_PROJECT_COMMANDS,oc as detectWindowsDoctorWorkspaceShadow,Ps as handleBootstrapCommand,js as handleCacheCommand,As as handleCreateOrFallback,dc as handleImportCommand,fo as handleInitCommand,Ss as handleMirrorCommand,bs as handleSetupCommand,mo as installWorkspaceDependencies,ec as isNpmExecInvocation,kc as shouldForwardToCore};