rapidkit 0.32.1 → 0.32.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/data/modules-embeddings.json +16907 -80088
- package/dist/{autopilot-release-WYDX67HR.js → autopilot-release-BQT23OL7.js} +1 -1
- package/dist/{chunk-LSFRHYMD.js → chunk-3V47U5UZ.js} +1 -1
- package/dist/chunk-W62Q2D3K.js +33 -0
- package/dist/{create-6AMYKNEG.js → create-YPTSMFZH.js} +7 -7
- package/dist/{dotnet-webapi-clean-W7SD3U3W.js → dotnet-webapi-clean-TPQMNFSD.js} +111 -43
- package/dist/index.js +51 -51
- package/dist/{pythonRapidkitExec-4MP62M5R.js → pythonRapidkitExec-JXOKKTXZ.js} +1 -1
- package/dist/{workspace-EHYCBFXL.js → workspace-QCU3VBCD.js} +1 -1
- package/dist/workspace-run-KMENEDIZ.js +1 -0
- package/package.json +7 -7
- package/dist/chunk-BFCIY2QK.js +0 -33
- package/dist/workspace-run-OIPQYI6V.js +0 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {a as a$6}from'./chunk-VKLL63TL.js';import {a as a$4,b as b$2,c as c$1,d,e as e$2,f as f$1,i,k,j as j$1,l,g as g$1,h as h$1}from'./chunk-QCZGNOTH.js';import {c as c$3}from'./chunk-NFUXULIF.js';import {e as e$3}from'./chunk-KXTXQODI.js';import {f,e as e$1,d as d$1,i as i$2,a as a$5,g}from'./chunk-
|
|
2
|
+
import {a as a$6}from'./chunk-VKLL63TL.js';import {a as a$4,b as b$2,c as c$1,d,e as e$2,f as f$1,i,k,j as j$1,l,g as g$1,h as h$1}from'./chunk-QCZGNOTH.js';import {c as c$3}from'./chunk-NFUXULIF.js';import {e as e$3}from'./chunk-KXTXQODI.js';import {f,e as e$1,d as d$1,i as i$2,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 {a,h,i as i$1,f as f$2,b as b$4,d as d$3,c as c$2}from'./chunk-Z5LKRG57.js';import {b,a as a$3}from'./chunk-AC6KIKII.js';import {a as a$1}from'./chunk-VM2TOHNX.js';import {c as c$4}from'./chunk-2FIX2MDC.js';import {b as b$3,d as d$2}from'./chunk-RV6HBTFC.js';import {Command,Option}from'commander';import s from'chalk';import Je from'inquirer';import*as y from'path';import y__default from'path';import {fileURLToPath}from'url';import {spawn,spawnSync}from'child_process';import os from'validate-npm-package-name';import*as E from'fs-extra';import E__default from'fs-extra';import P,{promises,createWriteStream}from'fs';import fo,{tmpdir,homedir}from'os';import {execa}from'execa';import Ss from'ora';import Cr,{createVerify,createHash,createHmac}from'crypto';import on from'http';import nn from'https';function Dt(t){let e=os(t);if(!e.validForNewPackages){let o=e.errors||[],n=e.warnings||[],i=[...o,...n];throw new j(t,`NPM validation failed: ${i.join(", ")}`)}if(!/^[a-z][a-z0-9_-]*$/.test(t))throw new j(t,"Must start with a lowercase letter and contain only lowercase letters, numbers, hyphens, and underscores");if(["test","tests","src","dist","build","lib","python","pip","poetry","node","npm","rapidkit","rapidkit"].includes(t.toLowerCase()))throw new j(t,`"${t}" is a reserved name. Please choose a different name.`);if(t.length<2)throw new j(t,"Name must be at least 2 characters long");if(t.length>214)throw new j(t,"Name must be less than 214 characters");return true}function ss(){return d$3()}function is(t,e){return t==="py"?["-3",...e]:e}function as(t){return typeof t=="object"&&t!==null}async function cs(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 ls(t,e){let r=["-m","rapidkit",...t],o=ss();for(let n of o){let i=await cs(n,is(n,r),e?.cwd,e?.timeoutMs);if(!i.ok)continue;let c=(i.stdout??"").trim();try{let a=JSON.parse(c);return as(a)?{ok:true,command:n,exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr,data:a}:{ok:false,command:n,exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr}}catch{return {ok:false,command:n,exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr}}}return {ok:false}}async function po(t,e){let r=await ls(["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 rt=y__default.join(fo.homedir(),".rapidkitrc.json"),ds=y__default.join(fo.homedir(),".rapidkit","config.json");function uo(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 go(t){if(process.platform!=="win32")try{P.chmodSync(t,384);}catch{}}function ot(){let t=uo(rt),e=uo(ds);return P.existsSync(rt)&&go(rt),{...t,openaiApiKey:t.openaiApiKey??e.openaiApiKey,aiEnabled:t.aiEnabled??e.aiEnabled,telemetry:t.telemetry??e.telemetry}}function Tt(t){let r={...ot(),...t};P.writeFileSync(rt,JSON.stringify(r,null,2),{encoding:"utf-8",mode:384}),go(rt);}function gt(){return process.env.OPENAI_API_KEY||ot().openaiApiKey||null}function dr(){return ot().aiEnabled!==false}function pr(){return rt}async function ho(){return (await import('inquirer')).default}function yo(t){let e=t.command("config").description("Configure RapidKit settings");e.command("set-api-key").description("Set OpenAI API key for AI features").option("--key <key>","API key (or enter interactively)").action(async r=>{let o=r.key;o?o.startsWith("sk-")||(console.log(s.red(`
|
|
3
3
|
\u274C Invalid API key format (should start with sk-)
|
|
4
4
|
`)),process.exit(1)):o=(await(await ho()).prompt([{type:"password",name:"apiKey",message:"Enter your OpenAI API key:",validate:c=>c?c.startsWith("sk-")?c.length<20?"API key seems too short":true:"Invalid API key format (should start with sk-)":"API key is required"}])).apiKey,Tt({openaiApiKey:o}),console.log(s.green(`
|
|
5
5
|
\u2705 OpenAI API key saved successfully!
|
|
@@ -20,7 +20,7 @@ Cancelled
|
|
|
20
20
|
\u274C Invalid action: ${r}`)),console.log(s.gray(`Use: rapidkit config ai enable|disable
|
|
21
21
|
`)),process.exit(1));let o=r==="enable";Tt({aiEnabled:o}),console.log(s.green(`
|
|
22
22
|
\u2705 AI features ${o?"enabled":"disabled"}
|
|
23
|
-
`));});}var Wt=null,Ft=false,ur=null;async function ms(){return ur||(ur=(await import('openai')).default),ur}function wo(){Ft=true;}function ko(t){let r=new Array(1536),o=0;for(let i=0;i<t.length;i++)o=(o<<5)-o+t.charCodeAt(i),o=o&o;for(let i=0;i<1536;i++)o=o*1664525+1013904223&4294967295,r[i]=o/4294967295*2-1;let n=Math.sqrt(r.reduce((i,c)=>i+c*c,0));return r.map(i=>i/n)}async function Kt(t){let e=await ms();Wt=new e({apiKey:t});}function vo(){if(!Wt)throw new Error("OpenAI client not initialized. Call initOpenAI() first with your API key.");return Wt}async function mr(t){return Ft?ko(t):(await vo().embeddings.create({model:"text-embedding-3-small",input:t,encoding_format:"float"})).data[0].embedding}async function Po(t){return Ft?t.map(ko):(await vo().embeddings.create({model:"text-embedding-3-small",input:t,encoding_format:"float"})).data.map(o=>o.embedding)}function bo(){return Wt!==null}function nt(){return Ft}function fr(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"):[]}function fs(t){return !t||typeof t!="object"?{}:t}var hr=[{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"]}],Ge=null,gr=0,gs=300*1e3;function hs(t){let e=fs(t),r=e.slug||e.name||e.id||e.module_id||"",o=fr(e.keywords??e.tags);return {id:r,name:e.display_name||e.name||"",category:ys(e.category||"infrastructure"),description:e.description||e.summary||"",longDescription:e.long_description||e.description||"",keywords:o.map(n=>n.toLowerCase()),framework:ws(e.framework),dependencies:fr(e.dependencies),useCases:fr(e.use_cases??e.useCases)}}function ys(t){return {auth:"auth",authentication:"auth",database:"database",payment:"payment",billing:"payment",communication:"communication",infrastructure:"infrastructure",security:"security",analytics:"analytics"}[t.toLowerCase()]||"infrastructure"}function ws(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 ks(){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(hs).filter(i=>i.id&&i.name)}catch(t){return console.warn("\u26A0\uFE0F Failed to fetch modules from Python Core:",t.message),console.warn(" Using fallback module catalog (11 modules)"),hr}}async function Jt(){let t=Date.now();return nt()?(Ge=hr,gr=t,Ge):(Ge&&t-gr<gs||(Ge=await ks(),gr=t,Ge.length===0&&(console.warn("\u26A0\uFE0F No modules found, using fallback catalog"),Ge=hr)),Ge)}var Ps=fileURLToPath(import.meta.url),So=y__default.dirname(Ps),st=null,xo=new Map;function bs(t){return [t.name,t.description,t.longDescription,...t.keywords,...t.useCases].filter(Boolean).join(" ")}async function js(t){let e=xo.get(t.id);if(e)return e;let r=await mr(bs(t));return xo.set(t.id,r),r}function Ss(){if(st)return st;let t=[y__default.join(So,"../../data/modules-embeddings.json"),y__default.join(So,"../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)?st={model:"mock-or-text-embedding-3-small",dimension:o[0]?.embedding?.length||1536,generated_at:new Date().toISOString(),modules:o}:st=o,!st)throw new Error("failed to load embeddings data");return st}function Co(t,e){if(t.length!==e.length)throw new Error("Vectors must have the same length");let r=0,o=0,n=0;for(let c=0;c<t.length;c++)r+=t[c]*e[c],o+=t[c]*t[c],n+=e[c]*e[c];let i=Math.sqrt(o)*Math.sqrt(n);return i===0?0:r/i}function Ro(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 _o(t,e=5){let r=await Jt(),o=await mr(t);if(nt()){let c=await Promise.all(r.map(async a=>{let l=await js(a);return {module:a,score:Co(o,l),reason:Ro(a,t)}}));return c.sort((a,l)=>l.score-a.score),c.slice(0,e)}let i=Ss().modules.map(c=>{let a=r.find(u=>u.id===c.id);if(!a)return null;let l=Co(o,c.embedding);return {module:a,score:l,reason:Ro(a,t)}}).filter(c=>c!==null);return i.sort((c,a)=>a.score-c.score),i.slice(0,e)}var Rs=fileURLToPath(import.meta.url),Eo=y__default.dirname(Rs);async function Io(){return (await import('inquirer')).default}function Ao(t){return t instanceof Error?t.message:String(t)}function _s(){return [y__default.join(Eo,"../../data/modules-embeddings.json"),y__default.join(Eo,"../data/modules-embeddings.json"),y__default.join(process.cwd(),"data/modules-embeddings.json")]}function $o(){let t=_s();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 Gt(t=true,e){try{if(!bo()&&!nt())return console.log(s.red(`
|
|
23
|
+
`));});}var Wt=null,Ft=false,ur=null;async function ps(){return ur||(ur=(await import('openai')).default),ur}function wo(){Ft=true;}function ko(t){let r=new Array(1536),o=0;for(let i=0;i<t.length;i++)o=(o<<5)-o+t.charCodeAt(i),o=o&o;for(let i=0;i<1536;i++)o=o*1664525+1013904223&4294967295,r[i]=o/4294967295*2-1;let n=Math.sqrt(r.reduce((i,c)=>i+c*c,0));return r.map(i=>i/n)}async function Kt(t){let e=await ps();Wt=new e({apiKey:t});}function vo(){if(!Wt)throw new Error("OpenAI client not initialized. Call initOpenAI() first with your API key.");return Wt}async function mr(t){return Ft?ko(t):(await vo().embeddings.create({model:"text-embedding-3-small",input:t,encoding_format:"float"})).data[0].embedding}async function Po(t){return Ft?t.map(ko):(await vo().embeddings.create({model:"text-embedding-3-small",input:t,encoding_format:"float"})).data.map(o=>o.embedding)}function bo(){return Wt!==null}function nt(){return Ft}function fr(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"):[]}function us(t){return !t||typeof t!="object"?{}:t}var hr=[{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"]}],Ge=null,gr=0,ms=300*1e3;function fs(t){let e=us(t),r=e.slug||e.name||e.id||e.module_id||"",o=fr(e.keywords??e.tags);return {id:r,name:e.display_name||e.name||"",category:gs(e.category||"infrastructure"),description:e.description||e.summary||"",longDescription:e.long_description||e.description||"",keywords:o.map(n=>n.toLowerCase()),framework:hs(e.framework),dependencies:fr(e.dependencies),useCases:fr(e.use_cases??e.useCases)}}function gs(t){return {auth:"auth",authentication:"auth",database:"database",payment:"payment",billing:"payment",communication:"communication",infrastructure:"infrastructure",security:"security",analytics:"analytics"}[t.toLowerCase()]||"infrastructure"}function hs(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 ys(){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(fs).filter(i=>i.id&&i.name)}catch(t){return console.warn("\u26A0\uFE0F Failed to fetch modules from Python Core:",t.message),console.warn(" Using fallback module catalog (11 modules)"),hr}}async function Jt(){let t=Date.now();return nt()?(Ge=hr,gr=t,Ge):(Ge&&t-gr<ms||(Ge=await ys(),gr=t,Ge.length===0&&(console.warn("\u26A0\uFE0F No modules found, using fallback catalog"),Ge=hr)),Ge)}var ks=fileURLToPath(import.meta.url),So=y__default.dirname(ks),st=null,xo=new Map;function vs(t){return [t.name,t.description,t.longDescription,...t.keywords,...t.useCases].filter(Boolean).join(" ")}async function Ps(t){let e=xo.get(t.id);if(e)return e;let r=await mr(vs(t));return xo.set(t.id,r),r}function bs(){if(st)return st;let t=[y__default.join(So,"../../data/modules-embeddings.json"),y__default.join(So,"../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)?st={model:"mock-or-text-embedding-3-small",dimension:o[0]?.embedding?.length||1536,generated_at:new Date().toISOString(),modules:o}:st=o,!st)throw new Error("failed to load embeddings data");return st}function Co(t,e){if(t.length!==e.length)throw new Error("Vectors must have the same length");let r=0,o=0,n=0;for(let c=0;c<t.length;c++)r+=t[c]*e[c],o+=t[c]*t[c],n+=e[c]*e[c];let i=Math.sqrt(o)*Math.sqrt(n);return i===0?0:r/i}function Ro(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 _o(t,e=5){let r=await Jt(),o=await mr(t);if(nt()){let c=await Promise.all(r.map(async a=>{let l=await Ps(a);return {module:a,score:Co(o,l),reason:Ro(a,t)}}));return c.sort((a,l)=>l.score-a.score),c.slice(0,e)}let i=bs().modules.map(c=>{let a=r.find(u=>u.id===c.id);if(!a)return null;let l=Co(o,c.embedding);return {module:a,score:l,reason:Ro(a,t)}}).filter(c=>c!==null);return i.sort((c,a)=>a.score-c.score),i.slice(0,e)}var xs=fileURLToPath(import.meta.url),Eo=y__default.dirname(xs);async function Io(){return (await import('inquirer')).default}function Ao(t){return t instanceof Error?t.message:String(t)}function Cs(){return [y__default.join(Eo,"../../data/modules-embeddings.json"),y__default.join(Eo,"../data/modules-embeddings.json"),y__default.join(process.cwd(),"data/modules-embeddings.json")]}function $o(){let t=Cs();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 Gt(t=true,e){try{if(!bo()&&!nt())return console.log(s.red(`
|
|
24
24
|
\u274C OpenAI not initialized`)),console.log(s.yellow("Please set your API key:")),console.log(s.white(" rapidkit config set-api-key")),console.log(s.gray(` OR set: export OPENAI_API_KEY="sk-..."
|
|
25
25
|
`)),false;console.log(s.blue(`
|
|
26
26
|
\u{1F916} Generating AI embeddings for RapidKit modules...
|
|
@@ -28,7 +28,7 @@ Cancelled
|
|
|
28
28
|
`));let o=r.length*50/1e6*.02;if(console.log(s.cyan(`\u{1F4B0} Estimated cost: ~$${o.toFixed(3)}`)),console.log(s.gray(` (Based on ${r.length} modules at $0.02/1M tokens)
|
|
29
29
|
`)),t){let c=await Io(),{confirm:a}=await c.prompt([{type:"confirm",name:"confirm",message:"Generate embeddings now?",default:true}]);if(!a)return console.log(s.yellow(`
|
|
30
30
|
\u26A0\uFE0F Embeddings generation cancelled
|
|
31
|
-
`)),false}let n=r.map(c=>`${c.name}. ${c.description}. ${c.longDescription}. Keywords: ${c.keywords.join(", ")}. Use cases: ${c.useCases.join(", ")}.`),i=
|
|
31
|
+
`)),false}let n=r.map(c=>`${c.name}. ${c.description}. ${c.longDescription}. Keywords: ${c.keywords.join(", ")}. Use cases: ${c.useCases.join(", ")}.`),i=Ss(`Generating embeddings for ${r.length} modules...`).start();try{let c=await Po(n);i.succeed(`Generated embeddings for ${r.length} modules`);let a={model:"text-embedding-3-small",dimension:c[0].length,generated_at:new Date().toISOString(),modules:r.map((p,d)=>({id:p.id,name:p.name,embedding:c[d]}))},l=e||y__default.join(process.cwd(),"data","modules-embeddings.json"),u=y__default.dirname(l);return P.existsSync(u)||P.mkdirSync(u,{recursive:true}),P.writeFileSync(l,JSON.stringify(a,null,2)),console.log(s.green(`
|
|
32
32
|
\u2705 Embeddings generated successfully!`)),console.log(s.gray(`\u{1F4C1} Saved to: ${l}`)),console.log(s.gray(`\u{1F4CA} Size: ${r.length} modules, ${c[0].length} dimensions
|
|
33
33
|
`)),true}catch(c){i.fail("Failed to generate embeddings");let a=Ao(c);return a.includes("429")?(console.log(s.red(`
|
|
34
34
|
\u274C OpenAI API quota exceeded`)),console.log(s.yellow(`Please check your billing: https://platform.openai.com/account/billing
|
|
@@ -38,7 +38,7 @@ Cancelled
|
|
|
38
38
|
\u274C Error: ${a}
|
|
39
39
|
`)),false}}catch(r){return console.log(s.red(`
|
|
40
40
|
\u274C Failed to generate embeddings: ${Ao(r)}
|
|
41
|
-
`)),false}}async function
|
|
41
|
+
`)),false}}async function Mo(t=true){if($o().exists)return true;if(console.log(s.yellow(`
|
|
42
42
|
\u26A0\uFE0F Module embeddings not found`)),console.log(s.gray(`AI recommendations require embeddings to be generated.
|
|
43
43
|
`)),!t)return console.log(s.red("\u274C Cannot generate embeddings in non-interactive mode")),console.log(s.white(`Run: rapidkit ai generate-embeddings
|
|
44
44
|
`)),false;let r=await Io(),{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 Gt(true):(o==="manual"&&(console.log(s.cyan(`
|
|
@@ -46,7 +46,7 @@ Cancelled
|
|
|
46
46
|
`)),console.log(s.white("1. Get OpenAI API key from: https://platform.openai.com/api-keys")),console.log(s.white("2. Set the API key:")),console.log(s.gray(" rapidkit config set-api-key")),console.log(s.gray(` OR: export OPENAI_API_KEY="sk-..."
|
|
47
47
|
`)),console.log(s.white("3. Generate embeddings:")),console.log(s.gray(` rapidkit ai generate-embeddings
|
|
48
48
|
`)),console.log(s.cyan(`\u{1F4B0} Cost: ~$0.50 one-time
|
|
49
|
-
`))),false)}async function
|
|
49
|
+
`))),false)}async function Oo(){let t=$o();return t.exists?(console.log(s.blue(`
|
|
50
50
|
\u{1F504} Updating embeddings...`)),console.log(s.gray(`Current: ${t.moduleCount} modules`)),console.log(s.gray(`Generated: ${t.generatedAt||"unknown"}
|
|
51
51
|
`)),t.path?await Gt(true,t.path):false):(console.log(s.yellow(`
|
|
52
52
|
\u26A0\uFE0F No existing embeddings found`)),console.log(s.gray(`Use: rapidkit ai generate-embeddings
|
|
@@ -58,7 +58,7 @@ Cancelled
|
|
|
58
58
|
`)),console.log(s.white(" 1. Get your key from: https://platform.openai.com/api-keys")),console.log(s.white(" 2. Configure it: rapidkit config set-api-key")),console.log(s.gray(` OR set: export OPENAI_API_KEY="sk-proj-..."
|
|
59
59
|
`))),wo());let i=r;i||(i=(await(await No()).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(s.blue(`
|
|
60
60
|
\u{1F916} Analyzing your request...
|
|
61
|
-
`)),(n?await
|
|
61
|
+
`)),(n?await Mo(!o.json):true)||(o.json&&Do({ok:false,query:i,error:{code:"EMBEDDINGS_MISSING",message:"Module embeddings are not available",remediation:"rapidkit ai generate-embeddings"}},1),console.log(s.yellow(`
|
|
62
62
|
\u26A0\uFE0F Cannot proceed without embeddings
|
|
63
63
|
`)),process.exit(1));let a=parseInt(o.number,10),l=await _o(i,a);if(l.length===0||l[0].score<.3)if(console.log(s.yellow(`
|
|
64
64
|
\u26A0\uFE0F No matching modules found in RapidKit registry.
|
|
@@ -101,31 +101,31 @@ No modules selected
|
|
|
101
101
|
`))),process.exit(o?0:1);}catch(r){let o=yr(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=gt();r||(console.log(s.red(`
|
|
102
102
|
\u274C OpenAI API key not configured
|
|
103
103
|
`)),console.log(s.white(`Set your API key: rapidkit config set-api-key
|
|
104
|
-
`)),process.exit(1)),Kt(r);let o=await
|
|
105
|
-
`,"utf-8");}function
|
|
104
|
+
`)),process.exit(1)),Kt(r);let o=await Oo();process.exit(o?0:1);}catch(r){let o=yr(r);a$1.error("Failed to update embeddings:",o.message),process.exit(1);}});}var _s="rapidkit.product-factory-plan.v1",Es="rapidkit.private-product-manifest.v1";function yt(t,e=""){return typeof t=="string"&&t.trim()?t.trim():e}function wr(t){return typeof t=="string"&&t.trim()?t.trim():null}function As(t,e){return typeof t=="number"&&Number.isFinite(t)?t:e}function Wo(t){return Array.isArray(t)?[...new Set(t.filter(e=>typeof e=="string").map(e=>e.trim()).filter(Boolean))]:[]}function Ko(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 Is(t,e,r){let o=yt(t.slug);if(!o)throw new Error(`Backlog product at index ${e} is missing slug.`);Ko(o);let n=Wo(t.modules),i=Wo(t.moduleGaps);return {rank:As(t.rank,e+1),slug:o,title:yt(t.title,o),category:yt(t.category,"Uncategorized"),tier:yt(t.tier,"pro"),summary:yt(t.summary),modules:n,moduleGaps:i,recommendedKit:r,workspaceProfile:"enterprise",readiness:{status:i.length>0?"blocked-by-module-gaps":"ready-for-private-manifest",blockingGaps:i}}}function $s(t){if(!t||typeof t!="object"||Array.isArray(t))throw new Error("Backlog must be a JSON object.");return t}async function Ms(t){let e=y__default.resolve(process.cwd(),t),r=$s(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 Os(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 Jo(t){let e=t.kit?.trim()||"fastapi.standard",{absolutePath:r,payload:o}=await Ms(t.backlogPath),n=o.products,i=n.map((p,d)=>Is(p,d,e)),c=Os(i,t),a=new Set(c.flatMap(p=>p.modules)),l=c.flatMap(p=>p.moduleGaps),u=c.filter(p=>p.readiness.status==="ready-for-private-manifest").length;return {schemaVersion:_s,generatedAt:(t.now??new Date).toISOString(),source:{backlogPath:r,backlogSchemaVersion:wr(o.schemaVersion),purpose:wr(o.purpose),publicationRule:wr(o.publicationRule)},defaults:{kit:e,workspaceProfile:"enterprise",projectSlug:"api"},stats:{totalProducts:n.length,plannedProducts:c.length,readyProducts:u,blockedProducts:c.length-u,uniqueModules:a.size,knownModuleGaps:l.length},products:c}}function at(t){return JSON.stringify(t,null,2)}function Ns(t){return `sha256:${Cr.createHash("sha256").update(at(t)).digest("hex")}`}async function Ds(t){let e=await Jo({backlogPath:t.backlogPath,kit:t.kit,now:t.now}),r=e.products.find(i=>i.slug===t.slug);if(!r)throw new Error(`Product "${t.slug}" was not found in backlog.`);let o=t.outputRoot||"../rapidkit-examples-pro",n={schemaVersion:Es,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:Ns({...n,factory:{...n.factory,manifestChecksum:""}})}}}async function Fo(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,`${at(e)}
|
|
105
|
+
`,"utf-8");}function Ts(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 Ws(t,e){console.log(s.bold(`
|
|
106
106
|
RapidKit Product Factory Plan
|
|
107
107
|
`)),console.log(s.cyan("Products:"),s.white(String(t.stats.plannedProducts))),console.log(s.cyan("Ready:"),s.green(String(t.stats.readyProducts))),console.log(s.cyan("Blocked:"),s.yellow(String(t.stats.blockedProducts))),console.log(s.cyan("Unique modules:"),s.white(String(t.stats.uniqueModules))),console.log(s.cyan("Known gaps:"),s.yellow(String(t.stats.knownModuleGaps))),e&&console.log(s.gray(`
|
|
108
108
|
Wrote plan: ${y__default.resolve(process.cwd(),e)}`)),console.log(s.gray(`
|
|
109
109
|
Next: npx rapidkit product manifest create <slug> --from-backlog <file>
|
|
110
|
-
`));}function
|
|
110
|
+
`));}function Fs(t,e){console.log(s.bold(`
|
|
111
111
|
RapidKit Private Product Manifest
|
|
112
112
|
`)),console.log(s.cyan("Product:"),s.white(t.product.slug)),console.log(s.cyan("Kit:"),s.white(t.projects[0].kit)),console.log(s.cyan("Modules:"),s.white(String(t.projects[0].modules.length))),console.log(s.cyan("Module gaps:"),s.yellow(String(t.projects[0].moduleGaps.length))),console.log(s.cyan("Checksum:"),s.white(t.factory.manifestChecksum)),console.log(s.gray(`
|
|
113
113
|
Wrote manifest: ${y__default.resolve(process.cwd(),e)}
|
|
114
|
-
`));}function Lo(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 Jo({backlogPath:r,kit:o.kit,tier:o.tier,category:o.category,limit:o.limit});o.output&&await Fo(o.output,n,true),o.json?console.log(at(n)):
|
|
114
|
+
`));}function Lo(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 Jo({backlogPath:r,kit:o.kit,tier:o.tier,category:o.category,limit:o.limit});o.output&&await Fo(o.output,n,true),o.json?console.log(at(n)):Ws(n,o.output);}catch(n){let i=n instanceof Error?n.message:String(n);o.json?console.log(at({ok:false,error:{message:i}})):console.error(s.red(`Product plan failed: ${i}`)),process.exit(1);}}),e.command("manifest").description("Create or inspect private product manifests").command("create <slug>").description("Create a private product manifest from a backlog product slug").requiredOption("--from-backlog <file>","Source workspace backlog JSON").option("--output <fileOrDir>","Manifest output file or directory").option("--kit <kit>","API kit for the generated workspace product","fastapi.standard").option("--workspace-output <dir>","Suggested root for generated product workspaces").option("--json","Print JSON to stdout").option("--force","Overwrite existing manifest file").action(async(r,o)=>{try{Ko(r);let n=await Ds({backlogPath:o.fromBacklog,slug:r,kit:o.kit,outputRoot:o.workspaceOutput}),i=Ts(o.output,r);await Fo(i,n,o.force===true),o.json?console.log(at(n)):Fs(n,i);}catch(n){let i=n instanceof Error?n.message:String(n);o.json?console.log(at({ok:false,error:{message:i}})):console.error(s.red(`Product manifest create failed: ${i}`)),process.exit(1);}});}var qt=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=[],i=[{dir:e,depth:0}],c=new Set(["bin","obj",".git","node_modules",".rapidkit"]);for(;i.length>0;){let a=i.shift();if(!a||a.depth>o)continue;let l=[];try{l=P.readdirSync(a.dir,{withFileTypes:true});}catch{continue}for(let u of l){let p=y__default.join(a.dir,u.name);if(u.isDirectory()){c.has(u.name)||i.push({dir:p,depth:a.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 Ut=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(i=>i.isDirectory()).map(i=>i.name).sort();for(let i of n)if(P.existsSync(y__default.join(o,i,"main.go")))return `./cmd/${i}`}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 a=P.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(a==="shared-runtime-caches"||a==="shared-node-deps"||a==="isolated")return a}catch{}return "isolated"}withGoCacheEnv(e,r){let o=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=o==="shared-runtime-caches"?y__default.join(n||e,".rapidkit","cache","go"):y__default.join(e,".rapidkit","cache","go"),c=process.env.GOMODCACHE,a=process.env.GOCACHE;return process.env.GOMODCACHE=y__default.join(i,"mod"),process.env.GOCACHE=y__default.join(i,"build"),r().finally(()=>{typeof c>"u"?delete process.env.GOMODCACHE:process.env.GOMODCACHE=c,typeof a>"u"?delete process.env.GOCACHE:process.env.GOCACHE=a;})}async checkPrereqs(){return this.run("go",["version"],process.cwd())}async warmSetupCache(e){return this.withGoCacheEnv(e,async()=>{try{return process.env.GOMODCACHE&&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(i=>P.existsSync(i));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 Vt=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||""}
|
|
115
115
|
${o.stderr||""}`,i=n.match(/version\s+"([^"]+)"/i);if(i?.[1])return this.parseMajorJavaVersion(i[1]);let c=n.match(/(?:openjdk|java)\s+(\d+(?:[._]\d+)?)/i);return c?.[1]?this.parseMajorJavaVersion(c[1]):null}catch{return null}}parseMavenVersion(e){if(!e)return null;let r=e.match(/Apache Maven\s+(\d+)\.(\d+)\.(\d+)/i);return r?[Number.parseInt(r[1],10),Number.parseInt(r[2],10),Number.parseInt(r[3],10)]:null}isMavenVersionAtLeast(e,r){for(let o=0;o<3;o+=1){if(e[o]>r[o])return true;if(e[o]<r[o])return false}return true}async checkSystemMavenVersion(e){try{let r=await execa("mvn",["-version"],{cwd:e,timeout:5e3,reject:false});if(r.exitCode!==0)return {exitCode:r.exitCode||1,message:"Maven is required and must be available on PATH (3.9+)."};let o=this.parseMavenVersion(`${r.stdout||""}
|
|
116
|
-
${r.stderr||""}`);return o?this.isMavenVersionAtLeast(o,[3,9,0])?{exitCode:0}:{exitCode:1,message:`Maven ${o.join(".")} detected; Maven 3.9+ is required.`}:{exitCode:1,message:"Unable to parse Maven version. Ensure Maven 3.9+ is installed and retry."}}catch{return {exitCode:1,message:"Maven version check failed. Install Maven 3.9+ and ensure mvn is on PATH."}}}shouldUseGradleNoDaemon(){return process.env.CI==="true"||process.env.RAPIDKIT_GRADLE_NO_DAEMON==="1"}inspectJavaProject(e){let r=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")),i=P.existsSync(y__default.join(e,"gradlew"))||P.existsSync(y__default.join(e,"gradlew.bat"));return {hasMavenProject:r||o,hasMavenWrapper:o,hasGradleProject:n||i,hasGradleWrapper:i}}findWorkspaceRoot(e){let r=e;for(;;){if(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 a=P.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(a==="shared-runtime-caches"||a==="shared-node-deps"||a==="isolated")return a}catch{}return "isolated"}buildToolCommand(e){return this.isGradleProject(e)?this.gradleCommand(e):this.mavenCommand(e)}mavenCommand(e){let r=y__default.join(e,"mvnw.cmd");if(process.platform==="win32"&&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 i=n.shift();if(!i||o.has(i))continue;o.add(i);let c=[];try{c=P.readdirSync(i,{withFileTypes:true});}catch{continue}for(let a of c){if(!a.isDirectory()||a.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(a.name))continue;let l=y__default.join(i,a.name),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),i=o==="shared-runtime-caches"?y__default.join(n||e,".rapidkit","cache","java","m2"):y__default.join(e,".rapidkit","cache","java","m2"),c=o==="shared-runtime-caches"?y__default.join(n||e,".rapidkit","cache","java","gradle"):y__default.join(e,".rapidkit","cache","java","gradle"),a=process.env.MAVEN_OPTS,l=process.env.GRADLE_USER_HOME,u=`-Dmaven.repo.local=${i}`;return process.env.MAVEN_OPTS=a?`${a} ${u}`:u,process.env.GRADLE_USER_HOME=c,r().finally(()=>{typeof a>"u"?delete process.env.MAVEN_OPTS:process.env.MAVEN_OPTS=a,typeof l>"u"?delete process.env.GRADLE_USER_HOME:process.env.GRADLE_USER_HOME=l;})}async runBuildTool(e,r,o=true){return this.withJavaCacheEnv(e,async()=>{try{let{command:n,baseArgs:i}=this.buildToolCommand(e),c=await this.runCommand(n,[...i,...r],e);if(c===0||!o)return {exitCode:c};let a=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:c,message:a||l?"Java build failed. Verify pom.xml/build.gradle syntax and dependencies, then retry.":"Java build tool is not installed or not available on PATH. Install Maven/Gradle and JDK 21+, or commit mvnw/gradlew wrapper scripts."}}catch(n){return {exitCode:1,message:`Java command execution failed: ${n instanceof Error?n.message:String(n)}. Verify pom.xml/build.gradle integrity and wrapper permissions.`}}})}resolveJarPath(e){let r=[y__default.join(e,"target"),y__default.join(e,"build","libs")];for(let o of r){if(!P.existsSync(o))continue;let i=P.readdirSync(o).filter(c=>c.toLowerCase().endsWith(".jar")).find(c=>!c.toLowerCase().endsWith("-sources.jar")&&!c.toLowerCase().endsWith("-javadoc.jar")&&!c.toLowerCase().endsWith("-plain.jar"));if(i)return y__default.join(o,i)}return null}commandArgsFor(e,r){if(e==="gradle"){let o=this.shouldUseGradleNoDaemon()?["--no-daemon"]:[];return r==="init"?[...o,"dependencies"]:r==="dev"?[...o,"bootRun"]:r==="test"?[...o,"test"]:[...o,"bootJar"]}return r==="init"?["-B","-q","-DskipTests","dependency:go-offline"]:r==="dev"?["spring-boot:run"]:r==="test"?["test"]:["-DskipTests","package"]}detectBuildTool(e){return this.isGradleProject(e)?"gradle":"maven"}async checkPrereqs(){let e=process.cwd(),r=this.resolveJavaCommand(e),o=await this.runCommand(r,["-version"],e);if(o!==0)return {exitCode:o,message:"JDK 21+ is required. Ensure java is on PATH or JAVA_HOME/bin/java is available."};if(this.isMavenProject(e)){let a=this.readRequiredJavaMajor(e),l=await this.detectInstalledJavaMajor(r,e);if(l!==null&&l<a)return {exitCode:1,message:`Detected Java ${l}, but project requires Java ${a}+.`};let u=y__default.join(process.env.JAVA_HOME||"","release");if(process.env.JAVA_HOME&&P.existsSync(u))try{let d=P.readFileSync(u,"utf-8").match(/^JAVA_VERSION="([^"]+)"/m),f=this.parseMajorJavaVersion(d?.[1]);if(f!==null&&f<a)return {exitCode:1,message:`Detected JAVA_HOME version ${f}, but project requires Java ${a}+.`}}catch{}}if(this.isMavenProject(e)||this.isGradleProject(e)){let a=this.detectBuildTool(e),l=a==="gradle"?["--version"]:["-version"],u=await this.runBuildTool(e,l);return u.exitCode!==0?u:a==="maven"&&!this.inspectJavaProject(e).hasMavenWrapper?this.checkSystemMavenVersion(e):u}let n=this.findWorkspaceRoot(e);if(n&&n===e){let a=this.discoverWorkspaceJavaProjects(n);if(a.length>0){let l=a.reduce((d,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=a.filter(h=>this.readRequiredJavaMajor(h)>d).map(h=>y__default.relative(e,h)).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 a){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 i=await this.withJavaCacheEnv(e,async()=>this.runCommand("mvn",["-version"],e));if(i===0){let a=await this.checkSystemMavenVersion(e);return a.exitCode!==0?a:{exitCode:0}}let c=await this.withJavaCacheEnv(e,async()=>this.runCommand("gradle",["--version"],e));return c===0?{exitCode:0}:{exitCode:i||c||1,message:"Neither Maven nor Gradle is available on PATH. Install one of them, or use mvnw/gradlew wrappers in project roots."}}async warmSetupCache(e){return this.withJavaCacheEnv(e,async()=>{try{let r=process.env.MAVEN_OPTS?.match(/-Dmaven\.repo\.local=([^\s]+)/)?.[1];return r&&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 Ht=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 a=P.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(a==="shared-runtime-caches"||a==="shared-node-deps"||a==="isolated")return a}catch{}return "isolated"}withDependencyEnv(e,r,o){let n=this.resolveDependencyMode(e),i=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),c=n==="isolated"?y__default.join(e,".rapidkit","cache","node"):y__default.join(i||e,".rapidkit","cache","node"),a=process.env.npm_config_cache,l=process.env.npm_config_store_dir,u=process.env.RAPIDKIT_DEP_SHARING_MODE,p=process.env.RAPIDKIT_WORKSPACE_PATH;return process.env.RAPIDKIT_DEP_SHARING_MODE=n,i&&(process.env.RAPIDKIT_WORKSPACE_PATH=i),r==="pnpm"?(process.env.npm_config_store_dir=y__default.join(c,"pnpm-store"),process.env.npm_config_cache=y__default.join(c,"pnpm-cache")):r==="yarn"?process.env.npm_config_cache=y__default.join(c,"yarn-cache"):process.env.npm_config_cache=y__default.join(c,"npm-cache"),o().finally(()=>{typeof a>"u"?delete process.env.npm_config_cache:process.env.npm_config_cache=a,typeof l>"u"?delete process.env.npm_config_store_dir:process.env.npm_config_store_dir=l,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(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 zt=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 a=P.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(a==="shared-runtime-caches"||a==="shared-node-deps"||a==="isolated")return a}catch{}return "isolated"}withPythonCacheEnv(e,r){let o=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=o==="shared-runtime-caches"?y__default.join(n||e,".rapidkit","cache","python"):y__default.join(e,".rapidkit","cache","python"),c=process.env.PIP_CACHE_DIR,a=process.env.POETRY_CACHE_DIR;return process.env.PIP_CACHE_DIR=y__default.join(i,"pip"),process.env.POETRY_CACHE_DIR=y__default.join(i,"poetry"),r().finally(()=>{typeof c>"u"?delete process.env.PIP_CACHE_DIR:process.env.PIP_CACHE_DIR=c,typeof a>"u"?delete process.env.POETRY_CACHE_DIR:process.env.POETRY_CACHE_DIR=a;})}async checkPrereqs(){let e=process.cwd(),r=await this.run(["doctor","check"],e);return r.exitCode===0?r:this.run(["doctor"],e)}async initProject(e){return this.run(["init"],e)}async runDev(e){return this.run(["dev"],e)}async runTest(e){return this.run(["test"],e)}async runBuild(e){return this.run(["build"],e)}async runStart(e){return this.run(["start"],e)}async doctorHints(e){return ['Run "npx rapidkit doctor workspace" for a full workspace scan.','Use "npx rapidkit init" after adding or changing modules.','Use workspace launcher "./rapidkit" to avoid environment drift.']}};function Gs(){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 Ut((r,o,n)=>e.runCommandInCwd(r,o,n)):t==="node"?new Ht((r,o,n)=>e.runCommandInCwd(r,o,n)):t==="java"?new Vt((r,o,n)=>e.runCommandInCwd(r,o,n)):t==="dotnet"?new Bt((r,o,n)=>e.runCommandInCwd(r,o,n)):new zt((r,o)=>e.runCoreRapidkit(r,{cwd:o,env:Gs()}))}var Vo=y__default.join(fo.homedir(),".rapidkit","cache"),Ho=1440*60*1e3;function vr(){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(Vo,`vitest-${e}`):Vo}var Qt=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(vr(),`${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<Ho)return a$1.debug(`Cache hit (memory): ${e}`),o.data;try{let n=this.getCachePath(e),i=await promises.readFile(n,"utf-8"),c=JSON.parse(i);if(c.version===r&&Date.now()-c.timestamp<Ho)return a$1.debug(`Cache hit (disk): ${e}`),this.memoryCache.set(e,c),c.data;await promises.unlink(n).catch(()=>{});}catch{a$1.debug(`Cache miss: ${e}`);}return null}async set(e,r,o="1.0"){let n={data:r,timestamp:Date.now(),version:o};this.memoryCache.set(e,n);try{await promises.mkdir(vr(),{recursive:true});let i=this.getCachePath(e),c=this.getTempCachePath(i);await promises.writeFile(c,JSON.stringify(n),"utf-8"),await promises.rename(c,i),a$1.debug(`Cache set: ${e}`);}catch(i){a$1.debug(`Cache write failed: ${e}`,i);}}async invalidate(e){this.memoryCache.delete(e);try{let r=this.getCachePath(e);await promises.unlink(r),a$1.debug(`Cache invalidated: ${e}`);}catch{}}async clear(){this.memoryCache.clear();try{let e=vr(),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 zo=[{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>]"}],Pr=new Map;for(let t of zo){Pr.set(t.id.toLowerCase(),t);for(let e of t.aliases)Pr.set(e.toLowerCase(),t);}function wt(t){return t?Pr.get(t.trim().toLowerCase())??null:null}function Yo(t){return wt(t)?.id??t}function Qo(){return zo.filter(t=>t.owner==="core"||t.generator)}function kt(t){return wt(t)?.owner==="npm"}async function Zo(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:Oe(e.args,"--java-version")?.trim(),spring_boot_version:Oe(e.args,"--spring-boot-version")?.trim(),springdoc_version:Oe(e.args,"--springdoc-version")?.trim(),group_id:Oe(e.args,"--group-id")?.trim(),package_name:Oe(e.args,"--package-name")?.trim(),description:Oe(e.args,"--description")?.trim(),port:Oe(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-W7SD3U3W.js');await r(e.projectPath,{project_name:e.projectName,target_framework:Oe(e.args,"--target-framework")?.trim(),root_namespace:Oe(e.args,"--root-namespace")?.trim(),description:Oe(e.args,"--description")?.trim(),port:Oe(e.args,"--port")?.trim(),skipGit:e.skipGit,skipInstall:e.skipInstall});return}throw new Error(`Unhandled npm kit generator: ${t.generator}`)}function Oe(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 Us(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 Vs(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 Hs(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 vt(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}function zs(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=vt(o.runtime),c=["python","node","go","java"].filter(a=>{let l=vt(n[a]);return typeof l.version=="string"&&l.version.trim().length>0});if(c.length===0)return {gate:"env",status:"fail",summary:"No runtime versions are pinned in toolchain.lock",details:["Pin at least one runtime version via rapidkit setup <runtime> and re-run bootstrap."],evidencePath:r};if(e!=="unknown"){let a=vt(n[e]);if(typeof a.version!="string"||a.version.trim().length===0)return {gate:"env",status:"fail",summary:`Project runtime (${e}) is not pinned in toolchain.lock`,details:[`Run rapidkit setup ${e} and rapidkit bootstrap to lock ${e} for this workspace.`],evidencePath:r}}return {gate:"env",status:"pass",summary:`Pinned runtimes: ${c.join(", ")}`,details:[],evidencePath:r}}catch{return {gate:"env",status:"fail",summary:"toolchain.lock is invalid JSON",details:["Regenerate lockfile with rapidkit bootstrap."],evidencePath:r}}}function Ys(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$3(r,"workspace")?{payload:r,path:e}:{payload:null,path:e}}catch{return {payload:null,path:e}}}function Qs(t){let e=Ys(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=vt(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 Zs(t){let e=y__default.join(t,".rapidkit","reports"),r=Hs(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(),i=vt(o.summary),c=Number(i.failedChecks??0);return n==="fail"||c>0?{gate:"verify",status:"fail",summary:"Verify-pack contract reports failed checks",details:["Fix failed verify checks and regenerate verify-pack contract evidence."],evidencePath:r}:n==="pass"?{gate:"verify",status:"pass",summary:"Verify-pack contract passed",details:[],evidencePath:r}:{gate:"verify",status:"warn",summary:"Verify-pack contract status is not explicit",details:["Ensure contract status is pass/fail and keep schema aligned with v1 contract."],evidencePath:r}}catch{return {gate:"verify",status:"fail",summary:"Verify-pack contract is invalid JSON",details:["Regenerate verify-pack contract artifact."],evidencePath:r}}}function Xs(t,e){let r=y__default.join(e,".rapidkit","reports","doctor-last-run.json");if(!t)return {gate:"dependency",status:"warn",summary:"Dependency risk check skipped (doctor evidence missing)",details:["Run rapidkit doctor workspace --json to include dependency findings."],evidencePath:r};let o=Array.isArray(t.projects)?t.projects:[],n=o.reduce((c,a)=>{let l=Number(a.vulnerabilities??0);return Number.isFinite(l)?c+Math.max(0,l):c},0),i=o.filter(c=>c.depsInstalled===false).length;return n>0?{gate:"dependency",status:"fail",summary:`${n} dependency vulnerability(ies) reported`,details:["Resolve vulnerabilities (npm/pip/go audit pipelines) before release."],evidencePath:r}:i>0?{gate:"dependency",status:"warn",summary:`${i} project(s) report missing dependencies`,details:["Run project init/bootstrap and regenerate doctor evidence."],evidencePath:r}:{gate:"dependency",status:"pass",summary:"No dependency vulnerabilities reported",details:[],evidencePath:r}}function ei(t){return t.some(e=>e.status==="fail")?"fail":t.some(e=>e.status==="warn")?"warn":"pass"}async function ti(t,e){let r=y__default.join(t,".rapidkit","reports","release-readiness-last-run.json");return await E__default.ensureDir(y__default.dirname(r)),await E__default.writeJSON(r,e,{spaces:2}),r}async function br(t={}){let e=y__default.resolve(t.startPath??process.cwd()),r=Us(e)??e,o=Vs(e),n=zs(r,o),i=Qs(r),c=Zs(r),a=Xs(i.payload,r),l=[n,i.gate,c,a],u=ei(l),p={schemaVersion:"v1",generatedAt:new Date().toISOString(),workspacePath:r,projectPath:e,action:t.action,overallStatus:u,blocking:u==="fail",blockingReasons:l.filter(d=>d.status==="fail").map(d=>`${d.gate}: ${d.summary}`),gates:l};return t.writeReport!==false&&(p.evidencePath=await ti(r,p)),p}function ri(t){return t==="pass"?s.green("PASS"):t==="warn"?s.yellow("WARN"):s.red("FAIL")}function oi(t){return t==="pass"?s.green("PASS"):t==="warn"?s.yellow("WARN"):s.red("FAIL")}async function en(t){let e=await br({writeReport:true});if(t.json)console.log(JSON.stringify(e,null,2));else {console.log(s.bold.cyan(`
|
|
116
|
+
${r.stderr||""}`);return o?this.isMavenVersionAtLeast(o,[3,9,0])?{exitCode:0}:{exitCode:1,message:`Maven ${o.join(".")} detected; Maven 3.9+ is required.`}:{exitCode:1,message:"Unable to parse Maven version. Ensure Maven 3.9+ is installed and retry."}}catch{return {exitCode:1,message:"Maven version check failed. Install Maven 3.9+ and ensure mvn is on PATH."}}}shouldUseGradleNoDaemon(){return process.env.CI==="true"||process.env.RAPIDKIT_GRADLE_NO_DAEMON==="1"}inspectJavaProject(e){let r=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")),i=P.existsSync(y__default.join(e,"gradlew"))||P.existsSync(y__default.join(e,"gradlew.bat"));return {hasMavenProject:r||o,hasMavenWrapper:o,hasGradleProject:n||i,hasGradleWrapper:i}}findWorkspaceRoot(e){let r=e;for(;;){if(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 a=P.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(a==="shared-runtime-caches"||a==="shared-node-deps"||a==="isolated")return a}catch{}return "isolated"}buildToolCommand(e){return this.isGradleProject(e)?this.gradleCommand(e):this.mavenCommand(e)}mavenCommand(e){let r=y__default.join(e,"mvnw.cmd");if(process.platform==="win32"&&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 i=n.shift();if(!i||o.has(i))continue;o.add(i);let c=[];try{c=P.readdirSync(i,{withFileTypes:true});}catch{continue}for(let a of c){if(!a.isDirectory()||a.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(a.name))continue;let l=y__default.join(i,a.name),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),i=o==="shared-runtime-caches"?y__default.join(n||e,".rapidkit","cache","java","m2"):y__default.join(e,".rapidkit","cache","java","m2"),c=o==="shared-runtime-caches"?y__default.join(n||e,".rapidkit","cache","java","gradle"):y__default.join(e,".rapidkit","cache","java","gradle"),a=process.env.MAVEN_OPTS,l=process.env.GRADLE_USER_HOME,u=`-Dmaven.repo.local=${i}`;return process.env.MAVEN_OPTS=a?`${a} ${u}`:u,process.env.GRADLE_USER_HOME=c,r().finally(()=>{typeof a>"u"?delete process.env.MAVEN_OPTS:process.env.MAVEN_OPTS=a,typeof l>"u"?delete process.env.GRADLE_USER_HOME:process.env.GRADLE_USER_HOME=l;})}async runBuildTool(e,r,o=true){return this.withJavaCacheEnv(e,async()=>{try{let{command:n,baseArgs:i}=this.buildToolCommand(e),c=await this.runCommand(n,[...i,...r],e);if(c===0||!o)return {exitCode:c};let a=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:c,message:a||l?"Java build failed. Verify pom.xml/build.gradle syntax and dependencies, then retry.":"Java build tool is not installed or not available on PATH. Install Maven/Gradle and JDK 21+, or commit mvnw/gradlew wrapper scripts."}}catch(n){return {exitCode:1,message:`Java command execution failed: ${n instanceof Error?n.message:String(n)}. Verify pom.xml/build.gradle integrity and wrapper permissions.`}}})}resolveJarPath(e){let r=[y__default.join(e,"target"),y__default.join(e,"build","libs")];for(let o of r){if(!P.existsSync(o))continue;let i=P.readdirSync(o).filter(c=>c.toLowerCase().endsWith(".jar")).find(c=>!c.toLowerCase().endsWith("-sources.jar")&&!c.toLowerCase().endsWith("-javadoc.jar")&&!c.toLowerCase().endsWith("-plain.jar"));if(i)return y__default.join(o,i)}return null}commandArgsFor(e,r){if(e==="gradle"){let o=this.shouldUseGradleNoDaemon()?["--no-daemon"]:[];return r==="init"?[...o,"dependencies"]:r==="dev"?[...o,"bootRun"]:r==="test"?[...o,"test"]:[...o,"bootJar"]}return r==="init"?["-B","-q","-DskipTests","dependency:go-offline"]:r==="dev"?["spring-boot:run"]:r==="test"?["test"]:["-DskipTests","package"]}detectBuildTool(e){return this.isGradleProject(e)?"gradle":"maven"}async checkPrereqs(){let e=process.cwd(),r=this.resolveJavaCommand(e),o=await this.runCommand(r,["-version"],e);if(o!==0)return {exitCode:o,message:"JDK 21+ is required. Ensure java is on PATH or JAVA_HOME/bin/java is available."};if(this.isMavenProject(e)){let a=this.readRequiredJavaMajor(e),l=await this.detectInstalledJavaMajor(r,e);if(l!==null&&l<a)return {exitCode:1,message:`Detected Java ${l}, but project requires Java ${a}+.`};let u=y__default.join(process.env.JAVA_HOME||"","release");if(process.env.JAVA_HOME&&P.existsSync(u))try{let d=P.readFileSync(u,"utf-8").match(/^JAVA_VERSION="([^"]+)"/m),f=this.parseMajorJavaVersion(d?.[1]);if(f!==null&&f<a)return {exitCode:1,message:`Detected JAVA_HOME version ${f}, but project requires Java ${a}+.`}}catch{}}if(this.isMavenProject(e)||this.isGradleProject(e)){let a=this.detectBuildTool(e),l=a==="gradle"?["--version"]:["-version"],u=await this.runBuildTool(e,l);return u.exitCode!==0?u:a==="maven"&&!this.inspectJavaProject(e).hasMavenWrapper?this.checkSystemMavenVersion(e):u}let n=this.findWorkspaceRoot(e);if(n&&n===e){let a=this.discoverWorkspaceJavaProjects(n);if(a.length>0){let l=a.reduce((d,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=a.filter(h=>this.readRequiredJavaMajor(h)>d).map(h=>y__default.relative(e,h)).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 a){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 i=await this.withJavaCacheEnv(e,async()=>this.runCommand("mvn",["-version"],e));if(i===0){let a=await this.checkSystemMavenVersion(e);return a.exitCode!==0?a:{exitCode:0}}let c=await this.withJavaCacheEnv(e,async()=>this.runCommand("gradle",["--version"],e));return c===0?{exitCode:0}:{exitCode:i||c||1,message:"Neither Maven nor Gradle is available on PATH. Install one of them, or use mvnw/gradlew wrappers in project roots."}}async warmSetupCache(e){return this.withJavaCacheEnv(e,async()=>{try{let r=process.env.MAVEN_OPTS?.match(/-Dmaven\.repo\.local=([^\s]+)/)?.[1];return r&&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 Ht=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 a=P.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(a==="shared-runtime-caches"||a==="shared-node-deps"||a==="isolated")return a}catch{}return "isolated"}withDependencyEnv(e,r,o){let n=this.resolveDependencyMode(e),i=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),c=n==="isolated"?y__default.join(e,".rapidkit","cache","node"):y__default.join(i||e,".rapidkit","cache","node"),a=process.env.npm_config_cache,l=process.env.npm_config_store_dir,u=process.env.RAPIDKIT_DEP_SHARING_MODE,p=process.env.RAPIDKIT_WORKSPACE_PATH;return process.env.RAPIDKIT_DEP_SHARING_MODE=n,i&&(process.env.RAPIDKIT_WORKSPACE_PATH=i),r==="pnpm"?(process.env.npm_config_store_dir=y__default.join(c,"pnpm-store"),process.env.npm_config_cache=y__default.join(c,"pnpm-cache")):r==="yarn"?process.env.npm_config_cache=y__default.join(c,"yarn-cache"):process.env.npm_config_cache=y__default.join(c,"npm-cache"),o().finally(()=>{typeof a>"u"?delete process.env.npm_config_cache:process.env.npm_config_cache=a,typeof l>"u"?delete process.env.npm_config_store_dir:process.env.npm_config_store_dir=l,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(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 zt=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 a=P.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(a==="shared-runtime-caches"||a==="shared-node-deps"||a==="isolated")return a}catch{}return "isolated"}withPythonCacheEnv(e,r){let o=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=o==="shared-runtime-caches"?y__default.join(n||e,".rapidkit","cache","python"):y__default.join(e,".rapidkit","cache","python"),c=process.env.PIP_CACHE_DIR,a=process.env.POETRY_CACHE_DIR;return process.env.PIP_CACHE_DIR=y__default.join(i,"pip"),process.env.POETRY_CACHE_DIR=y__default.join(i,"poetry"),r().finally(()=>{typeof c>"u"?delete process.env.PIP_CACHE_DIR:process.env.PIP_CACHE_DIR=c,typeof a>"u"?delete process.env.POETRY_CACHE_DIR:process.env.POETRY_CACHE_DIR=a;})}async checkPrereqs(){let e=process.cwd(),r=await this.run(["doctor","check"],e);return r.exitCode===0?r:this.run(["doctor"],e)}async initProject(e){return this.run(["init"],e)}async runDev(e){return this.run(["dev"],e)}async runTest(e){return this.run(["test"],e)}async runBuild(e){return this.run(["build"],e)}async runStart(e){return this.run(["start"],e)}async doctorHints(e){return ['Run "npx rapidkit doctor workspace" for a full workspace scan.','Use "npx rapidkit init" after adding or changing modules.','Use workspace launcher "./rapidkit" to avoid environment drift.']}};function Gs(){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 Ut((r,o,n)=>e.runCommandInCwd(r,o,n)):t==="node"?new Ht((r,o,n)=>e.runCommandInCwd(r,o,n)):t==="java"?new Vt((r,o,n)=>e.runCommandInCwd(r,o,n)):t==="dotnet"?new qt((r,o,n)=>e.runCommandInCwd(r,o,n)):new zt((r,o)=>e.runCoreRapidkit(r,{cwd:o,env:Gs()}))}var qo=y__default.join(fo.homedir(),".rapidkit","cache"),Uo=1440*60*1e3;function vr(){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(qo,`vitest-${e}`):qo}var Qt=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(vr(),`${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<Uo)return a$1.debug(`Cache hit (memory): ${e}`),o.data;try{let n=this.getCachePath(e),i=await promises.readFile(n,"utf-8"),c=JSON.parse(i);if(c.version===r&&Date.now()-c.timestamp<Uo)return a$1.debug(`Cache hit (disk): ${e}`),this.memoryCache.set(e,c),c.data;await promises.unlink(n).catch(()=>{});}catch{a$1.debug(`Cache miss: ${e}`);}return null}async set(e,r,o="1.0"){let n={data:r,timestamp:Date.now(),version:o};this.memoryCache.set(e,n);try{await promises.mkdir(vr(),{recursive:true});let i=this.getCachePath(e),c=this.getTempCachePath(i);await promises.writeFile(c,JSON.stringify(n),"utf-8"),await promises.rename(c,i),a$1.debug(`Cache set: ${e}`);}catch(i){a$1.debug(`Cache write failed: ${e}`,i);}}async invalidate(e){this.memoryCache.delete(e);try{let r=this.getCachePath(e);await promises.unlink(r),a$1.debug(`Cache invalidated: ${e}`);}catch{}}async clear(){this.memoryCache.clear();try{let e=vr(),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 Vo=[{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>]"}],Pr=new Map;for(let t of Vo){Pr.set(t.id.toLowerCase(),t);for(let e of t.aliases)Pr.set(e.toLowerCase(),t);}function wt(t){return t?Pr.get(t.trim().toLowerCase())??null:null}function Ho(t){return wt(t)?.id??t}function zo(){return Vo.filter(t=>t.owner==="core"||t.generator)}function kt(t){return wt(t)?.owner==="npm"}async function Yo(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:Me(e.args,"--java-version")?.trim(),spring_boot_version:Me(e.args,"--spring-boot-version")?.trim(),springdoc_version:Me(e.args,"--springdoc-version")?.trim(),group_id:Me(e.args,"--group-id")?.trim(),package_name:Me(e.args,"--package-name")?.trim(),description:Me(e.args,"--description")?.trim(),port:Me(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:Me(e.args,"--target-framework")?.trim(),root_namespace:Me(e.args,"--root-namespace")?.trim(),description:Me(e.args,"--description")?.trim(),port:Me(e.args,"--port")?.trim(),skipGit:e.skipGit,skipInstall:e.skipInstall});return}throw new Error(`Unhandled npm kit generator: ${t.generator}`)}function Me(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 Us(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 Vs(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 Hs(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 vt(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}function zs(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=vt(o.runtime),c=["python","node","go","java"].filter(a=>{let l=vt(n[a]);return typeof l.version=="string"&&l.version.trim().length>0});if(c.length===0)return {gate:"env",status:"fail",summary:"No runtime versions are pinned in toolchain.lock",details:["Pin at least one runtime version via rapidkit setup <runtime> and re-run bootstrap."],evidencePath:r};if(e!=="unknown"){let a=vt(n[e]);if(typeof a.version!="string"||a.version.trim().length===0)return {gate:"env",status:"fail",summary:`Project runtime (${e}) is not pinned in toolchain.lock`,details:[`Run rapidkit setup ${e} and rapidkit bootstrap to lock ${e} for this workspace.`],evidencePath:r}}return {gate:"env",status:"pass",summary:`Pinned runtimes: ${c.join(", ")}`,details:[],evidencePath:r}}catch{return {gate:"env",status:"fail",summary:"toolchain.lock is invalid JSON",details:["Regenerate lockfile with rapidkit bootstrap."],evidencePath:r}}}function Ys(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$3(r,"workspace")?{payload:r,path:e}:{payload:null,path:e}}catch{return {payload:null,path:e}}}function Qs(t){let e=Ys(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=vt(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 Zs(t){let e=y__default.join(t,".rapidkit","reports"),r=Hs(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(),i=vt(o.summary),c=Number(i.failedChecks??0);return n==="fail"||c>0?{gate:"verify",status:"fail",summary:"Verify-pack contract reports failed checks",details:["Fix failed verify checks and regenerate verify-pack contract evidence."],evidencePath:r}:n==="pass"?{gate:"verify",status:"pass",summary:"Verify-pack contract passed",details:[],evidencePath:r}:{gate:"verify",status:"warn",summary:"Verify-pack contract status is not explicit",details:["Ensure contract status is pass/fail and keep schema aligned with v1 contract."],evidencePath:r}}catch{return {gate:"verify",status:"fail",summary:"Verify-pack contract is invalid JSON",details:["Regenerate verify-pack contract artifact."],evidencePath:r}}}function Xs(t,e){let r=y__default.join(e,".rapidkit","reports","doctor-last-run.json");if(!t)return {gate:"dependency",status:"warn",summary:"Dependency risk check skipped (doctor evidence missing)",details:["Run rapidkit doctor workspace --json to include dependency findings."],evidencePath:r};let o=Array.isArray(t.projects)?t.projects:[],n=o.reduce((c,a)=>{let l=Number(a.vulnerabilities??0);return Number.isFinite(l)?c+Math.max(0,l):c},0),i=o.filter(c=>c.depsInstalled===false).length;return n>0?{gate:"dependency",status:"fail",summary:`${n} dependency vulnerability(ies) reported`,details:["Resolve vulnerabilities (npm/pip/go audit pipelines) before release."],evidencePath:r}:i>0?{gate:"dependency",status:"warn",summary:`${i} project(s) report missing dependencies`,details:["Run project init/bootstrap and regenerate doctor evidence."],evidencePath:r}:{gate:"dependency",status:"pass",summary:"No dependency vulnerabilities reported",details:[],evidencePath:r}}function ei(t){return t.some(e=>e.status==="fail")?"fail":t.some(e=>e.status==="warn")?"warn":"pass"}async function ti(t,e){let r=y__default.join(t,".rapidkit","reports","release-readiness-last-run.json");return await E__default.ensureDir(y__default.dirname(r)),await E__default.writeJSON(r,e,{spaces:2}),r}async function br(t={}){let e=y__default.resolve(t.startPath??process.cwd()),r=Us(e)??e,o=Vs(e),n=zs(r,o),i=Qs(r),c=Zs(r),a=Xs(i.payload,r),l=[n,i.gate,c,a],u=ei(l),p={schemaVersion:"v1",generatedAt:new Date().toISOString(),workspacePath:r,projectPath:e,action:t.action,overallStatus:u,blocking:u==="fail",blockingReasons:l.filter(d=>d.status==="fail").map(d=>`${d.gate}: ${d.summary}`),gates:l};return t.writeReport!==false&&(p.evidencePath=await ti(r,p)),p}function ri(t){return t==="pass"?s.green("PASS"):t==="warn"?s.yellow("WARN"):s.red("FAIL")}function oi(t){return t==="pass"?s.green("PASS"):t==="warn"?s.yellow("WARN"):s.red("FAIL")}async function Zo(t){let e=await br({writeReport:true});if(t.json)console.log(JSON.stringify(e,null,2));else {console.log(s.bold.cyan(`
|
|
117
117
|
\u{1F6A6} RapidKit Release Readiness
|
|
118
118
|
`)),console.log(s.bold(`Workspace: ${s.cyan(y__default.basename(e.workspacePath))}`)),console.log(s.gray(`Path: ${e.workspacePath}`)),console.log(`Overall: ${oi(e.overallStatus)}`);for(let r of e.gates){console.log(` - ${r.gate}: ${ri(r.status)} ${r.summary}`);for(let o of r.details)console.log(s.gray(` ${o}`));r.evidencePath&&console.log(s.gray(` evidence: ${r.evidencePath}`));}e.evidencePath&&console.log(s.gray(`
|
|
119
|
-
Evidence saved: ${e.evidencePath}`));}t.strict&&e.overallStatus!=="pass"&&process.exit(1);}async function ai(t){let e=await promises.readFile(t);return createHash("sha256").update(e).digest("hex")}async function
|
|
120
|
-
`,"utf-8");}function Ne(t,e){return y__default.isAbsolute(e)?e:y__default.join(t,e)}function ci(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 li(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(i=>i.trim()).filter(i=>i.length>0&&!i.startsWith("#"));for(let i of n)r.add(i.toLowerCase());}catch{}return r}async function di(t,e,r){await E.ensureDir(y__default.dirname(e)),await new Promise((o,n)=>{let c=(t.startsWith("https://")?
|
|
121
|
-
`,"utf-8"),n}function mi(t,e){if(!e?.enabled)return {headers:{}};let r=process.env[e.hmacKeyEnv];if(!r)return {headers:{},error:`Evidence signing key env is missing: ${e.hmacKeyEnv}`};let o=(e.algorithm||"sha256").toLowerCase(),n=e.headerName||"x-rapidkit-evidence-signature",i=createHmac(o,r).update(JSON.stringify(t)).digest("hex");return {headers:{[n]:i,"x-rapidkit-evidence-signature-alg":o}}}async function fi(t,e,r){let o=(r.algorithm||"sha256").toLowerCase(),n=Ne(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 i=await promises.readFile(n,"utf-8"),c=await promises.readFile(e),a=createVerify(o);a.update(c),a.end();let l=Buffer.from(r.signature,"base64"),u=a.verify(i,l),p=createHash("sha256").update(i).digest("hex");return {verified:u,algorithm:o,publicKeyPath:n,publicKeyFingerprint:p,signature:r.signature,message:u?"Attestation verified.":"Attestation signature verification failed."}}catch(i){return {verified:false,algorithm:o,publicKeyPath:n,publicKeyFingerprint:"",signature:r.signature,message:`Attestation verification error: ${i.message}`}}}async function gi(t,e,r,o){let n=process.env.RAPIDKIT_SIGSTORE_MOCK;if(n==="success")return {verified:true,tlogVerified:o.requireTransparencyLog,message:"Sigstore verification passed (mock).",identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:r.bundlePath||null,certificatePath:r.certificatePath||null,signaturePath:r.signaturePath||null};if(n==="fail")return {verified:false,tlogVerified:false,message:"Sigstore verification failed (mock).",identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:r.bundlePath||null,certificatePath:r.certificatePath||null,signaturePath:r.signaturePath||null};let i=r.signaturePath?Ne(t,r.signaturePath):null;if(!i||!await E.pathExists(i))return {verified:false,tlogVerified:false,message:"Sigstore signaturePath is missing or not found.",identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:r.bundlePath||null,certificatePath:r.certificatePath||null,signaturePath:i};let c=["verify-blob",e,"--signature",i],a=r.certificatePath?Ne(t,r.certificatePath):null;a&&c.push("--certificate",a);let l=r.bundlePath?Ne(t,r.bundlePath):null;l&&c.push("--bundle",l);let u=r.keyPath?Ne(t,r.keyPath):null;u&&c.push("--key",u),r.identity&&c.push("--certificate-identity",r.identity),r.issuer&&c.push("--certificate-oidc-issuer",r.issuer),r.rekorUrl&&c.push("--rekor-url",r.rekorUrl),o.requireTransparencyLog||c.push("--insecure-ignore-tlog");try{let p=await execa("cosign",c,{reject:false});return p.exitCode===0?{verified:true,tlogVerified:o.requireTransparencyLog,message:"Sigstore verification passed.",identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:l,certificatePath:a,signaturePath:i}:{verified:false,tlogVerified:false,message:`Sigstore verification failed: ${p.stderr||p.stdout||"unknown error"}`,identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:l,certificatePath:a,signaturePath:i}}catch(p){return {verified:false,tlogVerified:false,message:`Sigstore verification error: ${p.message}`,identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:l,certificatePath:a,signaturePath:i}}}async function hi(t,e){let r=e.algorithm||"sha256",o=Ne(t,e.policyPath),n=Ne(t,e.signaturePath),i=Ne(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(i))return {verified:false,message:`Governance policy public key not found: ${i}`,policies:null};try{let c=await promises.readFile(o,"utf-8"),a=(await promises.readFile(n,"utf-8")).trim(),l=await promises.readFile(i,"utf-8"),u=createVerify(r);return u.update(c),u.end(),u.verify(l,Buffer.from(a,"base64"))?{verified:true,message:"Governance policy bundle verified.",policies:JSON.parse(c).policies||{}}:{verified:false,message:"Governance policy bundle signature verification failed.",policies:null}}catch(c){return {verified:false,message:`Governance policy bundle verification error: ${c.message}`,policies:null}}}async function jr(t,e){let r=[],o={syncedArtifacts:0,verifiedArtifacts:0,rotatedFiles:0,lockWritten:false,governanceBundleVerified:false,transparencyEvidenceWritten:false,transparencyEvidenceRecords:0,evidenceExported:false,evidenceExportTarget:null},n=y__default.join(t,".rapidkit"),i=y__default.join(n,"mirror-config.json"),c=y__default.join(n,"mirror.lock"),a=y__default.join(n,"mirror","artifacts"),l=y__default.join(n,"reports"),u=await li(t);if(!await E.pathExists(i))return r.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: .rapidkit/mirror-config.json not found."}),{checks:r,details:o};let p={};try{p=JSON.parse(await promises.readFile(i,"utf-8"));}catch{return r.push({id:"mirror.lifecycle.config",status:"failed",message:"Mirror lifecycle failed: invalid JSON in mirror-config.json."}),{checks:r,details:o}}if(!(e.forceRun===true||e.ciMode||e.offlineMode||p.mode==="offline-only"))return r.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: not in ci/offline mode."}),{checks:r,details:o};await E.ensureDir(a);let f=Math.max(0,p.prefetch?.retries??2),h=Math.max(0,p.prefetch?.backoffMs??250),m=Math.max(1e3,p.prefetch?.timeoutMs??15e3),g=p.security?.requireAttestation===true,b=p.security?.requireSigstore===true,w=p.security?.requireTransparencyLog===true,k=p.security?.requireSignedGovernance===true,C=p.security?.evidenceExport,x=(process.env.RAPIDKIT_ENV||p.security?.governance?.environment||"dev").toLowerCase(),_=p.security?.governance?.policies||{};if(p.security?.governanceBundle){let D=await hi(t,p.security.governanceBundle);if(r.push({id:"governance.bundle.verify",status:D.verified?"passed":"failed",message:D.message}),D.verified&&D.policies)_=D.policies,o.governanceBundleVerified=true;else if(k)return {checks:r,details:o}}let T=_[x],le=w||T?.requireTransparencyLog===true,ge=[],z=Array.isArray(p.artifacts)?p.artifacts:[],O=[];for(let D=0;D<z.length;D+=1){let I=z[D],S=I.id||`artifact-${D+1}`,se=I.source?Ne(t,I.source):null,ve=ci(I,S),q=y__default.join(a,ve),me=false,Pe={sourceType:"path",source:se||I.url||"unknown",host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true};if(se&&await E.pathExists(se))await E.ensureDir(y__default.dirname(q)),await E.copyFile(se,q),o.syncedArtifacts+=1,me=true,Pe={sourceType:"path",source:se,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(I.url){let W="";try{W=new URL(I.url).hostname.toLowerCase();}catch{r.push({id:`mirror.prefetch.${S}`,status:"failed",message:`Invalid URL for ${S}: ${I.url}`});continue}if(!(process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||u.has(W))){r.push({id:`mirror.prefetch.trust.${S}`,status:"failed",message:`Untrusted mirror host for ${S}: ${W}. Add host to .rapidkit/trusted-sources.lock or set RAPIDKIT_TRUSTED_SOURCES=1.`});continue}if(e.offlineMode&&(await E.pathExists(q)?(me=true,Pe={sourceType:"url",source:I.url,host:W,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.`}),!me))continue;if(!me){let V=null,_e=0;for(let Ie=1;Ie<=f+1;Ie+=1){_e=Ie;try{await di(I.url,q,m),o.syncedArtifacts+=1,me=true,Pe={sourceType:"url",source:I.url,host:W,fetchedAt:new Date().toISOString(),attempts:_e,trusted:true},r.push({id:`mirror.prefetch.${S}`,status:"passed",message:_e>1?`Prefetched artifact ${S} from ${W} after ${_e} attempts.`:`Prefetched artifact ${S} from ${W}.`});break}catch(or){if(V=or,Ie<=f){await rn(h*Ie);continue}}}if(!me){r.push({id:`mirror.prefetch.${S}`,status:"failed",message:`Failed to prefetch ${S} after ${f+1} attempt(s): ${V?.message||"unknown error"}`});continue}}if(!me){r.push({id:`mirror.prefetch.${S}`,status:"failed",message:`Failed to prefetch ${S}.`});continue}}if(!me){I.required||e.offlineMode?r.push({id:`mirror.sync.${S}`,status:"failed",message:`Mirror source missing for ${S}${se?`: ${se}`:""}`}):r.push({id:`mirror.sync.${S}`,status:"skipped",message:`Mirror source not found for optional artifact ${S}.`});continue}let Le=await ai(q);if(I.sha256&&I.sha256.toLowerCase()!==Le.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 fe=I.attestation?await fi(t,q,I.attestation):null;if(I.attestation){if(r.push({id:`mirror.attest.${S}`,status:fe?.verified?"passed":"failed",message:fe?.message||"Attestation verification failed."}),!fe?.verified)continue}else if(g){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 ye=I.attestation?.sigstore,v=ye?await gi(t,q,ye,{requireTransparencyLog:le}):null;if(ye){if(r.push({id:`mirror.sigstore.${S}`,status:v?.verified?"passed":"failed",message:v?.message||"Sigstore verification failed."}),ge.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(ye&&v?.verified&&T){let W=T.allowedIdentities||[];if(W.length>0){let V=!!v.identity&&W.includes(v.identity);if(r.push({id:`mirror.sigstore.policy.identity.${S}`,status:V?"passed":"failed",message:V?`Sigstore identity policy passed for ${S} in ${x}.`:`Sigstore identity policy failed for ${S} in ${x}.`}),!V)continue}let Ae=T.allowedIssuers||[];if(Ae.length>0){let V=!!v.issuer&&Ae.includes(v.issuer);if(r.push({id:`mirror.sigstore.policy.issuer.${S}`,status:V?"passed":"failed",message:V?`Sigstore issuer policy passed for ${S} in ${x}.`:`Sigstore issuer policy failed for ${S} in ${x}.`}),!V)continue}let we=T.allowedRekorUrls||[];if(we.length>0){let V=!!v.rekorUrl&&we.includes(v.rekorUrl);if(r.push({id:`mirror.sigstore.policy.rekor.${S}`,status:V?"passed":"failed",message:V?`Sigstore Rekor policy passed for ${S} in ${x}.`:`Sigstore Rekor policy failed for ${S} in ${x}.`}),!V)continue}}else T&&r.push({id:`mirror.sigstore.policy.${S}`,status:"skipped",message:`Sigstore governance policy configured for ${x} but no verified Sigstore attestation for ${S}.`});let $=await promises.stat(q);O.push({id:S,path:y__default.relative(t,q),sha256:Le,size:$.size,provenance:Pe,attestation:{detached:{provided:!!I.attestation,verified:fe?.verified||false,algorithm:fe?.algorithm||null,publicKeyPath:fe?.publicKeyPath||null,publicKeyFingerprint:fe?.publicKeyFingerprint||null,signature:fe?.signature||null,verifiedAt:fe?.verified?new Date().toISOString():null},sigstore:{provided:!!ye,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 he=p.retention?.keepLast;if(typeof he=="number"&&he>0){let I=(await promises.readdir(a,{withFileTypes:true})).filter(S=>S.isFile()).map(S=>y__default.join(a,S.name));if(I.length>he){let S=await Promise.all(I.map(async ve=>({filePath:ve,stat:await promises.stat(ve)})));S.sort((ve,q)=>q.stat.mtimeMs-ve.stat.mtimeMs);let se=S.slice(he);for(let ve of se)await promises.unlink(ve.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 Se={schemaVersion:"1.0",generatedAt:new Date().toISOString(),mode:p.mode||null,environment:x,artifacts:O};if(await promises.writeFile(c,`${JSON.stringify(Se,null,2)}
|
|
122
|
-
`,"utf-8"),o.lockWritten=true,r.push({id:"mirror.lock.write",status:"passed",message:`Mirror lock updated at ${y__default.relative(t,c)}.`}),o.transparencyEvidenceRecords=ge.length,ge.length>0){let D={schemaVersion:"1.0",generatedAt:new Date().toISOString(),environment:x,records:ge},I=new Date().toISOString().replace(/[:.]/g,"-"),S=y__default.join(l,`transparency-evidence-${I}.json`),se=y__default.join(l,"transparency-evidence.latest.json");if(await E.ensureDir(l),await
|
|
123
|
-
`,"utf-8"),o.evidenceExported=true,o.evidenceExportTarget=q,r.push({id:"sigstore.evidence.export.file",status:"passed",message:`Transparency evidence exported to file sink ${q}.`});}catch(q){r.push({id:"sigstore.evidence.export.file",status:"failed",message:`Evidence file export failed: ${q.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 q=Math.max(0,C.retries??0),me=Math.max(0,C.backoffMs??500),Pe=mi(D,C.signing);Pe.error&&r.push({id:"sigstore.evidence.export.http",status:"failed",message:Pe.error});try{let Le=C.authTokenEnv?process.env[C.authTokenEnv]:void 0,fe=false,ye=null;for(let v=1;v<=q+1;v+=1)try{if(Pe.error)throw new Error(Pe.error);await pi(C.endpoint,D,ve,Le,Pe.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}.`}),fe=true;break}catch($){ye=$,v<=q&&await rn(me*v);}if(!fe)throw ye||new Error("unknown evidence export error")}catch(Le){let fe=`Evidence HTTP export failed: ${Le.message}`;r.push({id:"sigstore.evidence.export.http",status:"failed",message:fe});try{let ye=await ui(t,C.deadLetterPath,D,fe);r.push({id:"sigstore.evidence.export.deadletter",status:"passed",message:`Evidence export failure persisted to dead-letter sink ${ye}.`});}catch(ye){r.push({id:"sigstore.evidence.export.deadletter",status:"failed",message:`Evidence dead-letter write failed: ${ye.message}`});}}}if(C.failOnError&&r.some(me=>me.status==="failed"&&(me.id==="sigstore.evidence.export.file"||me.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 cn(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(c=>c.status==="fail"),i=o.some(c=>c.status==="warn");return {schemaVersion:1,kind:"rapidkit.import_readiness",generatedAt:(t.generatedAt??new Date).toISOString(),status:n?"blocked":i?"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 Sr(t){return y.join(t,".rapidkit","imported-projects.json")}async function ln(t){let e=Sr(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 i=n;return typeof i.name=="string"&&typeof i.path=="string"&&typeof i.stack=="string"&&typeof i.confidence=="string"&&typeof i.importedAt=="string"})}catch{return []}}async function dn(t,e){if(e.length===0)return;let r=await ln(t),o=new Map;for(let a of r)o.set(a.path,a);for(let a of e)o.set(a.path,a);let n=Array.from(o.values()).sort((a,l)=>a.name.localeCompare(l.name)).map(a=>({...a})),i={version:1,updatedAt:new Date().toISOString(),projects:n},c=Sr(t);await E__default.ensureDir(y.dirname(c)),await E__default.writeJSON(c,i,{spaces:2});}async function Pt(t,e){if(e.length===0)return;let r=await ln(t),o=new Set(e.map(a=>y.resolve(a))),n=r.filter(a=>!o.has(y.resolve(a.path))),i={version:1,updatedAt:new Date().toISOString(),projects:n},c=Sr(t);await E__default.ensureDir(y.dirname(c)),await E__default.writeJSON(c,i,{spaces:2});}function pn(t){return t.trim().toLowerCase().replace(/\.git$/i,"").replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,64)}function wi(t){let e=t.trim();if(!e)return "imported-project";let r=e.replace(/\\/g,"/").replace(/\/+$/,"").split("/"),o=r[r.length-1]||e,n=o.split(":"),i=(n[n.length-1]||o).replace(/\.git$/i,"");return pn(i)||"imported-project"}function xr(t){let e=t.trim();return e.includes("://")||e.startsWith("git@")}function ki(t){return xr(t)?"git-url":"local-folder"}async function vi(t,e){let r=pn(e)||"imported-project",o=0;for(;;){let n=o===0?r:o===1?`${r}-imported`:`${r}-imported-${o}`,i=y__default.join(t,n);if(!await E__default.pathExists(i))return i;o+=1;}}function Pi(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 bi(t,e){if(Pi(t,e))throw new Error("Import source must be outside the current workspace root.")}function un(t){return t.replace(/\\/g,"/")}function ji(t){return t.startsWith(".env")?![".env.example",".env.sample",".env.template",".env.defaults",".env.dist"].includes(t):false}function Si(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)||ji(e)||e.endsWith(".pem")||e.endsWith(".key"))}function xi(t){return t?.module_support===true}async function Ci(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 Ri(t){let e=new Date().toISOString(),r=un(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"),i=y__default.join(t.projectPath,".rapidkit","import-readiness.json"),c=xi(t.existingProjectJson),a=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:c,modules:a,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:c},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:c}},d=cn({projectName:String(u.name),relativePath:r,source:t.sourceType,detection:t.detection,moduleSupport:c,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(i,d,{spaces:2}),{projectJsonPath:o,importJsonPath:n,importReadinessPath:i,moduleSupport:c}}async function _i(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 dn(t,[r]);}async function mn(t){await E__default.pathExists(t)&&await E__default.remove(t);}async function fn(t,e){await mn(e),await Pt(t,[e]);}async function gn(t){let e=y__default.resolve(t.workspacePath),r=t.source.trim(),o=t.sourceType??ki(r),n=t.name??(o==="git-url"?wi(r):y__default.basename(r)),i=await vi(e,n),c=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.");bi(e,d),c=true,await E__default.copy(d,i,{overwrite:false,errorOnExist:true,filter:Si});}else c=true,await execa("git",["clone","--depth","1",r,i],{timeout:12e4});let a=await Ci(i),l=e$3(i,a),u=await Ri({workspacePath:e,projectPath:i,sourceType:o,detection:l,existingProjectJson:a}),p={name:y__default.basename(i),path:i,relativePath:un(y__default.relative(e,i)),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 _i(e,p),p}catch(a){if(c)try{await mn(i);}catch(l){let u=a instanceof Error?a.message:String(a),p=l instanceof Error?l.message:String(l);throw new Error(`Import failed: ${u}. Rollback also failed: ${p}`)}throw a}}var yn="rapidkit-workspace-snapshot-v1",wn="rapidkit-project-archive-v1",Ei=[".rapidkit/workspace.json",".rapidkit-workspace","rapidkit.config.json","rapidkit.config.js","rapidkit.config.cjs","rapidkit.config.mjs","package.json"],Ai=new Set([".git","node_modules",".venv","dist","build","target","coverage","htmlcov",".next"]),bt={requireReasonForDestructiveOps:false,requireSafetySnapshotForDestructiveOps:true,allowPermanentDelete:true};function lt(t=new Date){return t.toISOString().replace(/[:.]/g,"-")}function Rr(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 Ii(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 {...bt};try{let r=await E__default.readFile(e,"utf-8"),o=(n,i)=>{let c=r.match(new RegExp(`^\\s*${n}:\\s*([^#\\n]+)`,"m"));return $i(c?.[1],i)};return {requireReasonForDestructiveOps:o("require_reason_for_destructive_ops",bt.requireReasonForDestructiveOps),requireSafetySnapshotForDestructiveOps:o("require_safety_snapshot_for_destructive_ops",bt.requireSafetySnapshotForDestructiveOps),allowPermanentDelete:o("allow_permanent_delete",bt.allowPermanentDelete)}}catch{return {...bt}}}function Mi(t){return y__default.join(t,".rapidkit","audit","events.jsonl")}async function Ke(t,e){let r={schema:"rapidkit-workspace-audit-event-v1",id:Cr.randomUUID(),timestamp:new Date().toISOString(),workspacePath:t,...e},o=Mi(t);return await E__default.ensureDir(y__default.dirname(o)),await E__default.appendFile(o,`${JSON.stringify(r)}
|
|
124
|
-
`,"utf-8"),r}async function Zt(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 Ni(t=process.cwd()){let e=y__default.resolve(t),r=y__default.resolve(fo.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):Ni(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 Di(t){let e=await Ii(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 Xt(t){return y__default.join(t,".rapidkit","snapshots")}function jt(t){return y__default.join(t,".rapidkit","archive","projects")}function _r(t){return y__default.join(t,"files")}function Ti(t){return y__default.join(fo.tmpdir(),`rapidkit-workspace-snapshot-${process.pid}-${t}-${Cr.randomBytes(4).toString("hex")}`)}function Er(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=>Ai.has(n))}async function Wi(t){return (await a$6(t,{descendIntoMatchedProjects:false})).map(r=>({name:y__default.basename(r),relativePath:y__default.relative(t,r)}))}async function Fi(t,e){let r=[];for(let o of Ei){let n=y__default.join(t,o);if(!await E__default.pathExists(n))continue;let i=y__default.join(e,o);await E__default.copy(n,i,{filter:c=>Er(t,c)}),r.push(o);}return r}async function Ki(t,e){await E__default.writeJson(y__default.join(t,"snapshot.json"),e,{spaces:2});}async function Ar(t){let e=y__default.join(t,"snapshot.json"),r=await E__default.readJson(e);if(!r||typeof r!="object"||r.schema!==yn)throw new Error(`Invalid RapidKit workspace snapshot manifest: ${e}`);return r}async function Ji(t){let e=0,r=0,o=[t];for(;o.length>0;){let n=o.shift();if(!n)continue;let i=[];try{i=await E__default.readdir(n,{withFileTypes:true});}catch{continue}for(let c of i){let a=y__default.join(n,c.name);if(c.isDirectory()){o.push(a);continue}if(c.isFile())try{let l=await E__default.stat(a);e+=1,r+=l.size;}catch{}}}return {files:e,bytes:r}}async function dt(t={}){let e=Ve(t.workspacePath),r=t.name?t.name:`snapshot-${lt()}`,o=Rr(r),n=y__default.join(Xt(e),o),i=Ti(o);if(await E__default.pathExists(n))throw new Error(`Snapshot already exists: ${o}`);let c=_r(i);try{await E__default.ensureDir(c);let a=t.includeProjects?"full":"metadata",l=a==="full"?["."]:await Fi(e,c);a==="full"&&await E__default.copy(e,c,{filter:p=>Er(e,p)});let u={schema:yn,name:o,mode:a,reason:t.reason,createdAt:new Date().toISOString(),workspaceName:await Di(e),workspacePath:e,copiedPaths:l,projects:await Wi(e)};return await Ki(i,u),await E__default.ensureDir(y__default.dirname(n)),await E__default.move(i,n,{overwrite:false}),await Ke(e,{action:"snapshot.create",target:o,status:"succeeded",reason:t.reason,details:{mode:a,copiedPaths:l,snapshotPath:n,projectCount:u.projects.length}}),{manifest:u,snapshotPath:n}}catch(a){throw await E__default.remove(i),await Ke(e,{action:"snapshot.create",target:o,status:"failed",reason:t.reason,details:{error:a instanceof Error?a.message:String(a)}}),a}}async function kn(t){let e=Ve(t.workspacePath),r=y__default.join(Xt(e),Rr(t.name));if(!await E__default.pathExists(r))throw new Error(`Snapshot not found: ${t.name}`);let o=await Ar(r),n=_r(r),i=await Ji(n);return {manifest:o,snapshotPath:r,filesRoot:n,estimatedFileCount:i.files,estimatedBytes:i.bytes}}async function vn(t={}){let e=Ve(t.workspacePath),r=Xt(e);if(!await E__default.pathExists(r))return [];let o=await E__default.readdir(r,{withFileTypes:true}),n=[];for(let i of o){if(!i.isDirectory())continue;let c=y__default.join(r,i.name);try{n.push({...await Ar(c),snapshotPath:c});}catch{}}return n.sort((i,c)=>c.createdAt.localeCompare(i.createdAt))}async function Pn(t){let e=Ve(t.workspacePath),r=y__default.join(Xt(e),Rr(t.name));if(!await E__default.pathExists(r))throw new Error(`Snapshot not found: ${t.name}`);let o=await Ar(r),n=_r(r),i=o.mode==="full"?["."]:Array.from(new Set(o.copiedPaths.map(l=>l.startsWith(".rapidkit/")?".rapidkit":l)));if(t.dryRun)return await Ke(e,{action:"snapshot.restore",target:o.name,status:"planned",reason:t.reason,details:{restoredPaths:i}}),{workspacePath:e,snapshotPath:r,restoredPaths:i,dryRun:true};if(!t.force)throw new Error("Restore is destructive. Re-run with --force after reviewing --dry-run output.");await Zt(e,"snapshot.restore",{reason:t.reason,safetySnapshot:t.safetySnapshot});let c;if(t.safetySnapshot!==false&&(c=(await dt({workspacePath:e,name:`pre-restore-${o.name}-${lt()}`,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=>Er(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 a={workspacePath:e,snapshotPath:r,restoredPaths:i,dryRun:false,safetySnapshotPath:c};return await Ke(e,{action:"snapshot.restore",target:o.name,status:"succeeded",reason:t.reason,details:{restoredPaths:i,safetySnapshotPath:c}}),a}function bn(t){let e=t.trim();if(!e)throw new Error("Project name/path is required.");return e}async function jn(t,e){let r=bn(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 i=(await a$6(t,{descendIntoMatchedProjects:false})).filter(c=>{let a=y__default.relative(t,c);return y__default.basename(c)===r||a===r});if(i.length===0)throw new Error(`Project not found in workspace: ${e}`);if(i.length>1)throw new Error(`Project reference is ambiguous: ${e}`);return i[0]}async function Ir(t){try{let{syncWorkspaceProjects:e}=await import('./workspace-EHYCBFXL.js');await e(t,true);}catch{}}function Li(t,e){let r=Cr.randomBytes(4).toString("hex");return y__default.join(jt(t),`${e}-${lt()}-${r}`)}async function Sn(t){let e=y__default.join(t,"rapidkit-archive.json"),r=await E__default.readJson(e);if(!r||typeof r!="object"||r.schema!==wn)throw new Error(`Invalid RapidKit archive manifest: ${e}`);return r}async function $r(t={}){let e=Ve(t.workspacePath),r=jt(e);if(!await E__default.pathExists(r))return [];let o=await E__default.readdir(r,{withFileTypes:true}),n=[];for(let i of o){if(!i.isDirectory())continue;let c=y__default.join(r,i.name),a=y__default.join(c,"rapidkit-archive.json");try{n.push({...await Sn(c),archivePath:c,manifestPath:a});}catch{}}return n.sort((i,c)=>c.archivedAt.localeCompare(i.archivedAt))}async function Gi(t,e){let r=bn(e),o=y__default.isAbsolute(r)?y__default.resolve(r):y__default.resolve(jt(t),r);if(o.startsWith(`${y__default.resolve(jt(t))}${y__default.sep}`)&&await E__default.pathExists(y__default.join(o,"rapidkit-archive.json")))return o;let i=(await $r({workspacePath:t})).filter(c=>y__default.basename(c.archivePath)===r||c.projectName===r||y__default.relative(jt(t),c.archivePath)===r);if(i.length===0)throw new Error(`Archived project not found: ${e}`);if(i.length>1)throw new Error(`Archive reference is ambiguous: ${e}`);return i[0].archivePath}async function Or(t){let e=Ve(t.workspacePath),r=await jn(e,t.project),o=y__default.basename(r),n=Li(e,o),i=y__default.join(n,"rapidkit-archive.json");if(t.dryRun)return await Ke(e,{action:"project.archive",target:o,status:"planned",reason:t.reason,details:{projectPath:r,archivePath:n}}),{workspacePath:e,projectName:o,projectPath:r,action:"archive",archivePath:n,manifestPath:i,dryRun:true};await Zt(e,"project.archive",{reason:t.reason,safetySnapshot:true});let c=await dt({workspacePath:e,name:`pre-archive-${o}-${lt()}`,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 a={schema:wn,projectName:o,originalPath:r,archivedPath:n,reason:t.reason,archivedAt:new Date().toISOString(),safetySnapshotPath:c.snapshotPath};return await E__default.writeJson(i,a,{spaces:2}),await Pt(e,[r]),await Ir(e),await Ke(e,{action:"project.archive",target:o,status:"succeeded",reason:t.reason,details:{projectPath:r,archivePath:n,manifestPath:i,safetySnapshotPath:c.snapshotPath}}),{workspacePath:e,projectName:o,projectPath:r,action:"archive",archivePath:n,manifestPath:i,safetySnapshotPath:c.snapshotPath,dryRun:false}}async function xn(t){if(!t.permanent)return Or(t);let e=Ve(t.workspacePath),r=await jn(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 Ke(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 Zt(e,"project.delete",{reason:t.reason,permanent:true,safetySnapshot:true});let n=await dt({workspacePath:e,name:`pre-delete-${o}-${lt()}`,reason:t.reason||`Automatic safety snapshot before deleting ${o}`,includeProjects:false});return await E__default.remove(r),await Pt(e,[r]),await Ir(e),await Ke(e,{action:"project.delete",target:o,status:"succeeded",reason:t.reason,details:{projectPath:r,permanent:true,safetySnapshotPath:n.snapshotPath}}),{workspacePath:e,projectName:o,projectPath:r,action:"delete",safetySnapshotPath:n.snapshotPath,dryRun:false}}async function Cn(t){let e=Ve(t.workspacePath),r=await Gi(e,t.archive),o=await Sn(r),n=t.targetName?.trim()||o.projectName,i=y__default.join(e,n);if(!i.startsWith(`${y__default.resolve(e)}${y__default.sep}`))throw new Error(`Archive restore target escapes workspace: ${n}`);if(await E__default.pathExists(i)&&!t.force)throw new Error(`Project path already exists. Re-run with --force to overwrite: ${i}`);if(t.dryRun)return await Ke(e,{action:"project.restore",target:n,status:"planned",reason:t.reason,details:{archivePath:r,projectPath:i}}),{workspacePath:e,projectName:n,projectPath:i,action:"restore",archivePath:r,manifestPath:y__default.join(r,"rapidkit-archive.json"),dryRun:true};await Zt(e,"project.restore",{reason:t.reason,safetySnapshot:true});let c=await dt({workspacePath:e,name:`pre-restore-project-${n}-${lt()}`,reason:t.reason||`Automatic safety snapshot before restoring ${n}`,includeProjects:false});return await E__default.move(r,i,{overwrite:t.force===true}),await Ir(e),await Ke(e,{action:"project.restore",target:n,status:"succeeded",reason:t.reason,details:{archivePath:r,projectPath:i,safetySnapshotPath:c.snapshotPath}}),{workspacePath:e,projectName:n,projectPath:i,action:"restore",archivePath:r,manifestPath:y__default.join(i,"rapidkit-archive.json"),safetySnapshotPath:c.snapshotPath,dryRun:false}}function Mr(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 Ui(t){let e=t.trim().toLowerCase();return e?e.startsWith("fastapi")?"fastapi":e.startsWith("nestjs")?"nestjs":null:null}function Ee(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 qr(){return d$3()}function _n(){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 Vi(t){return f$2(y__default.join(t,".venv"))}async function qn(t,e){return await L(t,["--version"],e)===0}async function Ct(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 P.promises.readdir(t,{withFileTypes:true}):[]).some(d=>d.isFile()&&d.name.toLowerCase().endsWith(".sln")))return "dotnet";let c=y__default.join(t,"src");if(await E__default.pathExists(c)&&(await P.promises.readdir(c,{withFileTypes:true})).some(f=>f.isFile()&&f.name.toLowerCase().endsWith(".csproj")))return "dotnet";let a=y__default.join(t,"package.json");if(await E__default.pathExists(a))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 Hi(t){for(let e of qr())if(await L(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function Bn(t){for(let e of qr())if(await L(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function zi(t){let e=f$2(y__default.join(t,".venv"));if(!await E__default.pathExists(e)){let i=await Bn(t);if(i!==0)return i}if(!await qn("poetry",t))return 0;let o=await L("poetry",["config","virtualenvs.in-project","true","--local"],t);if(o!==0)return o;let n=await L("poetry",["env","use",e],t);return n!==0?n:0}async function Yi(t){let e=f$2(y__default.join(t,".venv"));if(!await E__default.pathExists(e)){let n=await Bn(t);if(n!==0)return n}await L(e,["-m","pip","install","--upgrade","pip","setuptools","wheel"],t);let r=y__default.join(t,"requirements.txt");if(await E__default.pathExists(r)&&await L(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 L(e,["-m","pip","install","-e","."],t)===0||await L(e,["-m","pip","install","."],t)===0)?0:1}async function Nr(t,e){return await zi(t)!==0&&console.log(s.yellow("\u26A0\uFE0F Could not fully configure Poetry local venv. Trying fallback installer...")),(await e.initProject(t)).exitCode===0&&await E__default.pathExists(y__default.join(t,".venv"))?0:(console.log(s.yellow("\u26A0\uFE0F Python init fallback: installing dependencies directly into project .venv")),await Yi(t))}async function Dr(t){let e=await xt("init",t);if(e===0)return 0;let r=["npm","pnpm","yarn"];for(let o of r){if(!await qn(o,t))continue;if(await L(o,["install"],t)===0)return console.log(s.green(`\u2705 Node init fallback succeeded with ${o} install`)),0}return e}function Qi(t,e){let r=n=>/^\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?$/.test(n),o=Ee([...e],"--port");if(o&&!/^\d+$/.test(o.trim()))return "Invalid --port. Expected numeric TCP port, e.g. 8080";if(t==="springboot.standard"){let n=Ee([...e],"--java-version"),i=Ee([...e],"--spring-boot-version"),c=Ee([...e],"--springdoc-version"),a=Ee([...e],"--group-id"),l=Ee([...e],"--package-name");if(n&&!/^\d+$/.test(n.trim()))return "Invalid --java-version. Expected major version number, e.g. 21";if(i&&!r(i.trim()))return "Invalid --spring-boot-version. Expected semantic version, e.g. 3.5.0";if(c&&!r(c.trim()))return "Invalid --springdoc-version. Expected semantic version, e.g. 2.8.9";if(a&&!/^[A-Za-z0-9_.-]+$/.test(a.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=Ee([...e],"--target-framework"),i=Ee([...e],"--root-namespace");if(n&&!/^net\d+\.\d+$/.test(n.trim()))return "Invalid --target-framework. Expected .NET target framework, e.g. net8.0";if(i&&!/^[A-Za-z0-9_.]+$/.test(i.trim()))return "Invalid --root-namespace. Use dot-separated .NET namespace identifiers only."}return null}async function tr(t){if(t[0]!=="create"||t[1]!=="project")return 1;let e=t[2],r=wt(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>]"}
|
|
119
|
+
Evidence saved: ${e.evidencePath}`));}t.strict&&e.overallStatus!=="pass"&&process.exit(1);}async function ai(t){let e=await promises.readFile(t);return createHash("sha256").update(e).digest("hex")}async function Xo(t,e){await E.outputFile(t,`${JSON.stringify(e,null,2)}
|
|
120
|
+
`,"utf-8");}function Ne(t,e){return y__default.isAbsolute(e)?e:y__default.join(t,e)}function ci(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 li(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(i=>i.trim()).filter(i=>i.length>0&&!i.startsWith("#"));for(let i of n)r.add(i.toLowerCase());}catch{}return r}async function di(t,e,r){await E.ensureDir(y__default.dirname(e)),await new Promise((o,n)=>{let c=(t.startsWith("https://")?nn:on).get(t,a=>{if(!a.statusCode||a.statusCode<200||a.statusCode>=300){n(new Error(`HTTP ${a.statusCode||"unknown"}`)),a.resume();return}let l=createWriteStream(e);a.pipe(l),l.on("finish",()=>{l.close(),o();}),l.on("error",u=>{n(u);});});c.setTimeout(r,()=>{c.destroy(new Error(`Request timeout after ${r}ms`));}),c.on("error",a=>{n(a);});});}async function pi(t,e,r,o,n){let i=new URL(t),c=JSON.stringify(e),a=i.protocol==="https:"?nn:on;await new Promise((l,u)=>{let p=a.request({method:"POST",hostname:i.hostname,port:i.port||(i.protocol==="https:"?443:80),path:`${i.pathname}${i.search}`,headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(c),...o?{Authorization:`Bearer ${o}`}:{},...n||{}}},d=>{if(!d.statusCode||d.statusCode<200||d.statusCode>=300){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(c),p.end();});}function en(t){return new Promise(e=>setTimeout(e,t))}async function ui(t,e,r,o){let n=Ne(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})}
|
|
121
|
+
`,"utf-8"),n}function mi(t,e){if(!e?.enabled)return {headers:{}};let r=process.env[e.hmacKeyEnv];if(!r)return {headers:{},error:`Evidence signing key env is missing: ${e.hmacKeyEnv}`};let o=(e.algorithm||"sha256").toLowerCase(),n=e.headerName||"x-rapidkit-evidence-signature",i=createHmac(o,r).update(JSON.stringify(t)).digest("hex");return {headers:{[n]:i,"x-rapidkit-evidence-signature-alg":o}}}async function fi(t,e,r){let o=(r.algorithm||"sha256").toLowerCase(),n=Ne(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 i=await promises.readFile(n,"utf-8"),c=await promises.readFile(e),a=createVerify(o);a.update(c),a.end();let l=Buffer.from(r.signature,"base64"),u=a.verify(i,l),p=createHash("sha256").update(i).digest("hex");return {verified:u,algorithm:o,publicKeyPath:n,publicKeyFingerprint:p,signature:r.signature,message:u?"Attestation verified.":"Attestation signature verification failed."}}catch(i){return {verified:false,algorithm:o,publicKeyPath:n,publicKeyFingerprint:"",signature:r.signature,message:`Attestation verification error: ${i.message}`}}}async function gi(t,e,r,o){let n=process.env.RAPIDKIT_SIGSTORE_MOCK;if(n==="success")return {verified:true,tlogVerified:o.requireTransparencyLog,message:"Sigstore verification passed (mock).",identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:r.bundlePath||null,certificatePath:r.certificatePath||null,signaturePath:r.signaturePath||null};if(n==="fail")return {verified:false,tlogVerified:false,message:"Sigstore verification failed (mock).",identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:r.bundlePath||null,certificatePath:r.certificatePath||null,signaturePath:r.signaturePath||null};let i=r.signaturePath?Ne(t,r.signaturePath):null;if(!i||!await E.pathExists(i))return {verified:false,tlogVerified:false,message:"Sigstore signaturePath is missing or not found.",identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:r.bundlePath||null,certificatePath:r.certificatePath||null,signaturePath:i};let c=["verify-blob",e,"--signature",i],a=r.certificatePath?Ne(t,r.certificatePath):null;a&&c.push("--certificate",a);let l=r.bundlePath?Ne(t,r.bundlePath):null;l&&c.push("--bundle",l);let u=r.keyPath?Ne(t,r.keyPath):null;u&&c.push("--key",u),r.identity&&c.push("--certificate-identity",r.identity),r.issuer&&c.push("--certificate-oidc-issuer",r.issuer),r.rekorUrl&&c.push("--rekor-url",r.rekorUrl),o.requireTransparencyLog||c.push("--insecure-ignore-tlog");try{let p=await execa("cosign",c,{reject:false});return p.exitCode===0?{verified:true,tlogVerified:o.requireTransparencyLog,message:"Sigstore verification passed.",identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:l,certificatePath:a,signaturePath:i}:{verified:false,tlogVerified:false,message:`Sigstore verification failed: ${p.stderr||p.stdout||"unknown error"}`,identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:l,certificatePath:a,signaturePath:i}}catch(p){return {verified:false,tlogVerified:false,message:`Sigstore verification error: ${p.message}`,identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:l,certificatePath:a,signaturePath:i}}}async function hi(t,e){let r=e.algorithm||"sha256",o=Ne(t,e.policyPath),n=Ne(t,e.signaturePath),i=Ne(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(i))return {verified:false,message:`Governance policy public key not found: ${i}`,policies:null};try{let c=await promises.readFile(o,"utf-8"),a=(await promises.readFile(n,"utf-8")).trim(),l=await promises.readFile(i,"utf-8"),u=createVerify(r);return u.update(c),u.end(),u.verify(l,Buffer.from(a,"base64"))?{verified:true,message:"Governance policy bundle verified.",policies:JSON.parse(c).policies||{}}:{verified:false,message:"Governance policy bundle signature verification failed.",policies:null}}catch(c){return {verified:false,message:`Governance policy bundle verification error: ${c.message}`,policies:null}}}async function jr(t,e){let r=[],o={syncedArtifacts:0,verifiedArtifacts:0,rotatedFiles:0,lockWritten:false,governanceBundleVerified:false,transparencyEvidenceWritten:false,transparencyEvidenceRecords:0,evidenceExported:false,evidenceExportTarget:null},n=y__default.join(t,".rapidkit"),i=y__default.join(n,"mirror-config.json"),c=y__default.join(n,"mirror.lock"),a=y__default.join(n,"mirror","artifacts"),l=y__default.join(n,"reports"),u=await li(t);if(!await E.pathExists(i))return r.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: .rapidkit/mirror-config.json not found."}),{checks:r,details:o};let p={};try{p=JSON.parse(await promises.readFile(i,"utf-8"));}catch{return r.push({id:"mirror.lifecycle.config",status:"failed",message:"Mirror lifecycle failed: invalid JSON in mirror-config.json."}),{checks:r,details:o}}if(!(e.forceRun===true||e.ciMode||e.offlineMode||p.mode==="offline-only"))return r.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: not in ci/offline mode."}),{checks:r,details:o};await E.ensureDir(a);let f=Math.max(0,p.prefetch?.retries??2),h=Math.max(0,p.prefetch?.backoffMs??250),m=Math.max(1e3,p.prefetch?.timeoutMs??15e3),g=p.security?.requireAttestation===true,b=p.security?.requireSigstore===true,w=p.security?.requireTransparencyLog===true,k=p.security?.requireSignedGovernance===true,C=p.security?.evidenceExport,x=(process.env.RAPIDKIT_ENV||p.security?.governance?.environment||"dev").toLowerCase(),_=p.security?.governance?.policies||{};if(p.security?.governanceBundle){let D=await hi(t,p.security.governanceBundle);if(r.push({id:"governance.bundle.verify",status:D.verified?"passed":"failed",message:D.message}),D.verified&&D.policies)_=D.policies,o.governanceBundleVerified=true;else if(k)return {checks:r,details:o}}let T=_[x],le=w||T?.requireTransparencyLog===true,ge=[],z=Array.isArray(p.artifacts)?p.artifacts:[],M=[];for(let D=0;D<z.length;D+=1){let I=z[D],S=I.id||`artifact-${D+1}`,se=I.source?Ne(t,I.source):null,ve=ci(I,S),B=y__default.join(a,ve),me=false,Pe={sourceType:"path",source:se||I.url||"unknown",host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true};if(se&&await E.pathExists(se))await E.ensureDir(y__default.dirname(B)),await E.copyFile(se,B),o.syncedArtifacts+=1,me=true,Pe={sourceType:"path",source:se,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(I.url){let W="";try{W=new URL(I.url).hostname.toLowerCase();}catch{r.push({id:`mirror.prefetch.${S}`,status:"failed",message:`Invalid URL for ${S}: ${I.url}`});continue}if(!(process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||u.has(W))){r.push({id:`mirror.prefetch.trust.${S}`,status:"failed",message:`Untrusted mirror host for ${S}: ${W}. Add host to .rapidkit/trusted-sources.lock or set RAPIDKIT_TRUSTED_SOURCES=1.`});continue}if(e.offlineMode&&(await E.pathExists(B)?(me=true,Pe={sourceType:"url",source:I.url,host:W,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.`}),!me))continue;if(!me){let V=null,_e=0;for(let Ie=1;Ie<=f+1;Ie+=1){_e=Ie;try{await di(I.url,B,m),o.syncedArtifacts+=1,me=true,Pe={sourceType:"url",source:I.url,host:W,fetchedAt:new Date().toISOString(),attempts:_e,trusted:true},r.push({id:`mirror.prefetch.${S}`,status:"passed",message:_e>1?`Prefetched artifact ${S} from ${W} after ${_e} attempts.`:`Prefetched artifact ${S} from ${W}.`});break}catch(or){if(V=or,Ie<=f){await en(h*Ie);continue}}}if(!me){r.push({id:`mirror.prefetch.${S}`,status:"failed",message:`Failed to prefetch ${S} after ${f+1} attempt(s): ${V?.message||"unknown error"}`});continue}}if(!me){r.push({id:`mirror.prefetch.${S}`,status:"failed",message:`Failed to prefetch ${S}.`});continue}}if(!me){I.required||e.offlineMode?r.push({id:`mirror.sync.${S}`,status:"failed",message:`Mirror source missing for ${S}${se?`: ${se}`:""}`}):r.push({id:`mirror.sync.${S}`,status:"skipped",message:`Mirror source not found for optional artifact ${S}.`});continue}let Le=await ai(B);if(I.sha256&&I.sha256.toLowerCase()!==Le.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 fe=I.attestation?await fi(t,B,I.attestation):null;if(I.attestation){if(r.push({id:`mirror.attest.${S}`,status:fe?.verified?"passed":"failed",message:fe?.message||"Attestation verification failed."}),!fe?.verified)continue}else if(g){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 ye=I.attestation?.sigstore,v=ye?await gi(t,B,ye,{requireTransparencyLog:le}):null;if(ye){if(r.push({id:`mirror.sigstore.${S}`,status:v?.verified?"passed":"failed",message:v?.message||"Sigstore verification failed."}),ge.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(ye&&v?.verified&&T){let W=T.allowedIdentities||[];if(W.length>0){let V=!!v.identity&&W.includes(v.identity);if(r.push({id:`mirror.sigstore.policy.identity.${S}`,status:V?"passed":"failed",message:V?`Sigstore identity policy passed for ${S} in ${x}.`:`Sigstore identity policy failed for ${S} in ${x}.`}),!V)continue}let Ae=T.allowedIssuers||[];if(Ae.length>0){let V=!!v.issuer&&Ae.includes(v.issuer);if(r.push({id:`mirror.sigstore.policy.issuer.${S}`,status:V?"passed":"failed",message:V?`Sigstore issuer policy passed for ${S} in ${x}.`:`Sigstore issuer policy failed for ${S} in ${x}.`}),!V)continue}let we=T.allowedRekorUrls||[];if(we.length>0){let V=!!v.rekorUrl&&we.includes(v.rekorUrl);if(r.push({id:`mirror.sigstore.policy.rekor.${S}`,status:V?"passed":"failed",message:V?`Sigstore Rekor policy passed for ${S} in ${x}.`:`Sigstore Rekor policy failed for ${S} in ${x}.`}),!V)continue}}else T&&r.push({id:`mirror.sigstore.policy.${S}`,status:"skipped",message:`Sigstore governance policy configured for ${x} but no verified Sigstore attestation for ${S}.`});let $=await promises.stat(B);M.push({id:S,path:y__default.relative(t,B),sha256:Le,size:$.size,provenance:Pe,attestation:{detached:{provided:!!I.attestation,verified:fe?.verified||false,algorithm:fe?.algorithm||null,publicKeyPath:fe?.publicKeyPath||null,publicKeyFingerprint:fe?.publicKeyFingerprint||null,signature:fe?.signature||null,verifiedAt:fe?.verified?new Date().toISOString():null},sigstore:{provided:!!ye,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 he=p.retention?.keepLast;if(typeof he=="number"&&he>0){let I=(await promises.readdir(a,{withFileTypes:true})).filter(S=>S.isFile()).map(S=>y__default.join(a,S.name));if(I.length>he){let S=await Promise.all(I.map(async ve=>({filePath:ve,stat:await promises.stat(ve)})));S.sort((ve,B)=>B.stat.mtimeMs-ve.stat.mtimeMs);let se=S.slice(he);for(let ve of se)await promises.unlink(ve.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 Se={schemaVersion:"1.0",generatedAt:new Date().toISOString(),mode:p.mode||null,environment:x,artifacts:M};if(await promises.writeFile(c,`${JSON.stringify(Se,null,2)}
|
|
122
|
+
`,"utf-8"),o.lockWritten=true,r.push({id:"mirror.lock.write",status:"passed",message:`Mirror lock updated at ${y__default.relative(t,c)}.`}),o.transparencyEvidenceRecords=ge.length,ge.length>0){let D={schemaVersion:"1.0",generatedAt:new Date().toISOString(),environment:x,records:ge},I=new Date().toISOString().replace(/[:.]/g,"-"),S=y__default.join(l,`transparency-evidence-${I}.json`),se=y__default.join(l,"transparency-evidence.latest.json");if(await E.ensureDir(l),await Xo(S,D),await Xo(se,D),o.transparencyEvidenceWritten=true,r.push({id:"sigstore.evidence.write",status:"passed",message:`Transparency evidence written to ${y__default.relative(t,se)}.`}),C?.enabled){let ve=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 B=Ne(t,C.filePath);await E.ensureDir(y__default.dirname(B)),await promises.appendFile(B,`${JSON.stringify(D)}
|
|
123
|
+
`,"utf-8"),o.evidenceExported=true,o.evidenceExportTarget=B,r.push({id:"sigstore.evidence.export.file",status:"passed",message:`Transparency evidence exported to file sink ${B}.`});}catch(B){r.push({id:"sigstore.evidence.export.file",status:"failed",message:`Evidence file export failed: ${B.message}`});}else if(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 B=Math.max(0,C.retries??0),me=Math.max(0,C.backoffMs??500),Pe=mi(D,C.signing);Pe.error&&r.push({id:"sigstore.evidence.export.http",status:"failed",message:Pe.error});try{let Le=C.authTokenEnv?process.env[C.authTokenEnv]:void 0,fe=false,ye=null;for(let v=1;v<=B+1;v+=1)try{if(Pe.error)throw new Error(Pe.error);await pi(C.endpoint,D,ve,Le,Pe.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}.`}),fe=true;break}catch($){ye=$,v<=B&&await en(me*v);}if(!fe)throw ye||new Error("unknown evidence export error")}catch(Le){let fe=`Evidence HTTP export failed: ${Le.message}`;r.push({id:"sigstore.evidence.export.http",status:"failed",message:fe});try{let ye=await ui(t,C.deadLetterPath,D,fe);r.push({id:"sigstore.evidence.export.deadletter",status:"passed",message:`Evidence export failure persisted to dead-letter sink ${ye}.`});}catch(ye){r.push({id:"sigstore.evidence.export.deadletter",status:"failed",message:`Evidence dead-letter write failed: ${ye.message}`});}}}if(C.failOnError&&r.some(me=>me.status==="failed"&&(me.id==="sigstore.evidence.export.file"||me.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 sn(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(c=>c.status==="fail"),i=o.some(c=>c.status==="warn");return {schemaVersion:1,kind:"rapidkit.import_readiness",generatedAt:(t.generatedAt??new Date).toISOString(),status:n?"blocked":i?"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 Sr(t){return y.join(t,".rapidkit","imported-projects.json")}async function an(t){let e=Sr(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 i=n;return typeof i.name=="string"&&typeof i.path=="string"&&typeof i.stack=="string"&&typeof i.confidence=="string"&&typeof i.importedAt=="string"})}catch{return []}}async function cn(t,e){if(e.length===0)return;let r=await an(t),o=new Map;for(let a of r)o.set(a.path,a);for(let a of e)o.set(a.path,a);let n=Array.from(o.values()).sort((a,l)=>a.name.localeCompare(l.name)).map(a=>({...a})),i={version:1,updatedAt:new Date().toISOString(),projects:n},c=Sr(t);await E__default.ensureDir(y.dirname(c)),await E__default.writeJSON(c,i,{spaces:2});}async function Pt(t,e){if(e.length===0)return;let r=await an(t),o=new Set(e.map(a=>y.resolve(a))),n=r.filter(a=>!o.has(y.resolve(a.path))),i={version:1,updatedAt:new Date().toISOString(),projects:n},c=Sr(t);await E__default.ensureDir(y.dirname(c)),await E__default.writeJSON(c,i,{spaces:2});}function ln(t){return t.trim().toLowerCase().replace(/\.git$/i,"").replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,64)}function wi(t){let e=t.trim();if(!e)return "imported-project";let r=e.replace(/\\/g,"/").replace(/\/+$/,"").split("/"),o=r[r.length-1]||e,n=o.split(":"),i=(n[n.length-1]||o).replace(/\.git$/i,"");return ln(i)||"imported-project"}function xr(t){let e=t.trim();return e.includes("://")||e.startsWith("git@")}function ki(t){return xr(t)?"git-url":"local-folder"}async function vi(t,e){let r=ln(e)||"imported-project",o=0;for(;;){let n=o===0?r:o===1?`${r}-imported`:`${r}-imported-${o}`,i=y__default.join(t,n);if(!await E__default.pathExists(i))return i;o+=1;}}function Pi(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 bi(t,e){if(Pi(t,e))throw new Error("Import source must be outside the current workspace root.")}function dn(t){return t.replace(/\\/g,"/")}function ji(t){return t.startsWith(".env")?![".env.example",".env.sample",".env.template",".env.defaults",".env.dist"].includes(t):false}function Si(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)||ji(e)||e.endsWith(".pem")||e.endsWith(".key"))}function xi(t){return t?.module_support===true}async function Ci(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 Ri(t){let e=new Date().toISOString(),r=dn(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"),i=y__default.join(t.projectPath,".rapidkit","import-readiness.json"),c=xi(t.existingProjectJson),a=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:c,modules:a,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:c},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:c}},d=sn({projectName:String(u.name),relativePath:r,source:t.sourceType,detection:t.detection,moduleSupport:c,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(i,d,{spaces:2}),{projectJsonPath:o,importJsonPath:n,importReadinessPath:i,moduleSupport:c}}async function _i(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 cn(t,[r]);}async function pn(t){await E__default.pathExists(t)&&await E__default.remove(t);}async function un(t,e){await pn(e),await Pt(t,[e]);}async function mn(t){let e=y__default.resolve(t.workspacePath),r=t.source.trim(),o=t.sourceType??ki(r),n=t.name??(o==="git-url"?wi(r):y__default.basename(r)),i=await vi(e,n),c=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.");bi(e,d),c=true,await E__default.copy(d,i,{overwrite:false,errorOnExist:true,filter:Si});}else c=true,await execa("git",["clone","--depth","1",r,i],{timeout:12e4});let a=await Ci(i),l=e$3(i,a),u=await Ri({workspacePath:e,projectPath:i,sourceType:o,detection:l,existingProjectJson:a}),p={name:y__default.basename(i),path:i,relativePath:dn(y__default.relative(e,i)),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 _i(e,p),p}catch(a){if(c)try{await pn(i);}catch(l){let u=a instanceof Error?a.message:String(a),p=l instanceof Error?l.message:String(l);throw new Error(`Import failed: ${u}. Rollback also failed: ${p}`)}throw a}}var gn="rapidkit-workspace-snapshot-v1",hn="rapidkit-project-archive-v1",Ei=[".rapidkit/workspace.json",".rapidkit-workspace","rapidkit.config.json","rapidkit.config.js","rapidkit.config.cjs","rapidkit.config.mjs","package.json"],Ai=new Set([".git","node_modules",".venv","dist","build","target","coverage","htmlcov",".next"]),bt={requireReasonForDestructiveOps:false,requireSafetySnapshotForDestructiveOps:true,allowPermanentDelete:true};function lt(t=new Date){return t.toISOString().replace(/[:.]/g,"-")}function Rr(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 Ii(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 Mi(t){let e=y__default.join(t,".rapidkit","policies.yml");if(!await E__default.pathExists(e))return {...bt};try{let r=await E__default.readFile(e,"utf-8"),o=(n,i)=>{let c=r.match(new RegExp(`^\\s*${n}:\\s*([^#\\n]+)`,"m"));return $i(c?.[1],i)};return {requireReasonForDestructiveOps:o("require_reason_for_destructive_ops",bt.requireReasonForDestructiveOps),requireSafetySnapshotForDestructiveOps:o("require_safety_snapshot_for_destructive_ops",bt.requireSafetySnapshotForDestructiveOps),allowPermanentDelete:o("allow_permanent_delete",bt.allowPermanentDelete)}}catch{return {...bt}}}function Oi(t){return y__default.join(t,".rapidkit","audit","events.jsonl")}async function Ke(t,e){let r={schema:"rapidkit-workspace-audit-event-v1",id:Cr.randomUUID(),timestamp:new Date().toISOString(),workspacePath:t,...e},o=Oi(t);return await E__default.ensureDir(y__default.dirname(o)),await E__default.appendFile(o,`${JSON.stringify(r)}
|
|
124
|
+
`,"utf-8"),r}async function Zt(t,e,r){let o=await Mi(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 Ni(t=process.cwd()){let e=y__default.resolve(t),r=y__default.resolve(fo.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):Ni(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 Di(t){let e=await Ii(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 Xt(t){return y__default.join(t,".rapidkit","snapshots")}function jt(t){return y__default.join(t,".rapidkit","archive","projects")}function _r(t){return y__default.join(t,"files")}function Ti(t){return y__default.join(fo.tmpdir(),`rapidkit-workspace-snapshot-${process.pid}-${t}-${Cr.randomBytes(4).toString("hex")}`)}function Er(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=>Ai.has(n))}async function Wi(t){return (await a$6(t,{descendIntoMatchedProjects:false})).map(r=>({name:y__default.basename(r),relativePath:y__default.relative(t,r)}))}async function Fi(t,e){let r=[];for(let o of Ei){let n=y__default.join(t,o);if(!await E__default.pathExists(n))continue;let i=y__default.join(e,o);await E__default.copy(n,i,{filter:c=>Er(t,c)}),r.push(o);}return r}async function Ki(t,e){await E__default.writeJson(y__default.join(t,"snapshot.json"),e,{spaces:2});}async function Ar(t){let e=y__default.join(t,"snapshot.json"),r=await E__default.readJson(e);if(!r||typeof r!="object"||r.schema!==gn)throw new Error(`Invalid RapidKit workspace snapshot manifest: ${e}`);return r}async function Ji(t){let e=0,r=0,o=[t];for(;o.length>0;){let n=o.shift();if(!n)continue;let i=[];try{i=await E__default.readdir(n,{withFileTypes:true});}catch{continue}for(let c of i){let a=y__default.join(n,c.name);if(c.isDirectory()){o.push(a);continue}if(c.isFile())try{let l=await E__default.stat(a);e+=1,r+=l.size;}catch{}}}return {files:e,bytes:r}}async function dt(t={}){let e=Ve(t.workspacePath),r=t.name?t.name:`snapshot-${lt()}`,o=Rr(r),n=y__default.join(Xt(e),o),i=Ti(o);if(await E__default.pathExists(n))throw new Error(`Snapshot already exists: ${o}`);let c=_r(i);try{await E__default.ensureDir(c);let a=t.includeProjects?"full":"metadata",l=a==="full"?["."]:await Fi(e,c);a==="full"&&await E__default.copy(e,c,{filter:p=>Er(e,p)});let u={schema:gn,name:o,mode:a,reason:t.reason,createdAt:new Date().toISOString(),workspaceName:await Di(e),workspacePath:e,copiedPaths:l,projects:await Wi(e)};return await Ki(i,u),await E__default.ensureDir(y__default.dirname(n)),await E__default.move(i,n,{overwrite:false}),await Ke(e,{action:"snapshot.create",target:o,status:"succeeded",reason:t.reason,details:{mode:a,copiedPaths:l,snapshotPath:n,projectCount:u.projects.length}}),{manifest:u,snapshotPath:n}}catch(a){throw await E__default.remove(i),await Ke(e,{action:"snapshot.create",target:o,status:"failed",reason:t.reason,details:{error:a instanceof Error?a.message:String(a)}}),a}}async function yn(t){let e=Ve(t.workspacePath),r=y__default.join(Xt(e),Rr(t.name));if(!await E__default.pathExists(r))throw new Error(`Snapshot not found: ${t.name}`);let o=await Ar(r),n=_r(r),i=await Ji(n);return {manifest:o,snapshotPath:r,filesRoot:n,estimatedFileCount:i.files,estimatedBytes:i.bytes}}async function wn(t={}){let e=Ve(t.workspacePath),r=Xt(e);if(!await E__default.pathExists(r))return [];let o=await E__default.readdir(r,{withFileTypes:true}),n=[];for(let i of o){if(!i.isDirectory())continue;let c=y__default.join(r,i.name);try{n.push({...await Ar(c),snapshotPath:c});}catch{}}return n.sort((i,c)=>c.createdAt.localeCompare(i.createdAt))}async function kn(t){let e=Ve(t.workspacePath),r=y__default.join(Xt(e),Rr(t.name));if(!await E__default.pathExists(r))throw new Error(`Snapshot not found: ${t.name}`);let o=await Ar(r),n=_r(r),i=o.mode==="full"?["."]:Array.from(new Set(o.copiedPaths.map(l=>l.startsWith(".rapidkit/")?".rapidkit":l)));if(t.dryRun)return await Ke(e,{action:"snapshot.restore",target:o.name,status:"planned",reason:t.reason,details:{restoredPaths:i}}),{workspacePath:e,snapshotPath:r,restoredPaths:i,dryRun:true};if(!t.force)throw new Error("Restore is destructive. Re-run with --force after reviewing --dry-run output.");await Zt(e,"snapshot.restore",{reason:t.reason,safetySnapshot:t.safetySnapshot});let c;if(t.safetySnapshot!==false&&(c=(await dt({workspacePath:e,name:`pre-restore-${o.name}-${lt()}`,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=>Er(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 a={workspacePath:e,snapshotPath:r,restoredPaths:i,dryRun:false,safetySnapshotPath:c};return await Ke(e,{action:"snapshot.restore",target:o.name,status:"succeeded",reason:t.reason,details:{restoredPaths:i,safetySnapshotPath:c}}),a}function vn(t){let e=t.trim();if(!e)throw new Error("Project name/path is required.");return e}async function Pn(t,e){let r=vn(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 i=(await a$6(t,{descendIntoMatchedProjects:false})).filter(c=>{let a=y__default.relative(t,c);return y__default.basename(c)===r||a===r});if(i.length===0)throw new Error(`Project not found in workspace: ${e}`);if(i.length>1)throw new Error(`Project reference is ambiguous: ${e}`);return i[0]}async function Ir(t){try{let{syncWorkspaceProjects:e}=await import('./workspace-QCU3VBCD.js');await e(t,true);}catch{}}function Li(t,e){let r=Cr.randomBytes(4).toString("hex");return y__default.join(jt(t),`${e}-${lt()}-${r}`)}async function bn(t){let e=y__default.join(t,"rapidkit-archive.json"),r=await E__default.readJson(e);if(!r||typeof r!="object"||r.schema!==hn)throw new Error(`Invalid RapidKit archive manifest: ${e}`);return r}async function $r(t={}){let e=Ve(t.workspacePath),r=jt(e);if(!await E__default.pathExists(r))return [];let o=await E__default.readdir(r,{withFileTypes:true}),n=[];for(let i of o){if(!i.isDirectory())continue;let c=y__default.join(r,i.name),a=y__default.join(c,"rapidkit-archive.json");try{n.push({...await bn(c),archivePath:c,manifestPath:a});}catch{}}return n.sort((i,c)=>c.archivedAt.localeCompare(i.archivedAt))}async function Gi(t,e){let r=vn(e),o=y__default.isAbsolute(r)?y__default.resolve(r):y__default.resolve(jt(t),r);if(o.startsWith(`${y__default.resolve(jt(t))}${y__default.sep}`)&&await E__default.pathExists(y__default.join(o,"rapidkit-archive.json")))return o;let i=(await $r({workspacePath:t})).filter(c=>y__default.basename(c.archivePath)===r||c.projectName===r||y__default.relative(jt(t),c.archivePath)===r);if(i.length===0)throw new Error(`Archived project not found: ${e}`);if(i.length>1)throw new Error(`Archive reference is ambiguous: ${e}`);return i[0].archivePath}async function Mr(t){let e=Ve(t.workspacePath),r=await Pn(e,t.project),o=y__default.basename(r),n=Li(e,o),i=y__default.join(n,"rapidkit-archive.json");if(t.dryRun)return await Ke(e,{action:"project.archive",target:o,status:"planned",reason:t.reason,details:{projectPath:r,archivePath:n}}),{workspacePath:e,projectName:o,projectPath:r,action:"archive",archivePath:n,manifestPath:i,dryRun:true};await Zt(e,"project.archive",{reason:t.reason,safetySnapshot:true});let c=await dt({workspacePath:e,name:`pre-archive-${o}-${lt()}`,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 a={schema:hn,projectName:o,originalPath:r,archivedPath:n,reason:t.reason,archivedAt:new Date().toISOString(),safetySnapshotPath:c.snapshotPath};return await E__default.writeJson(i,a,{spaces:2}),await Pt(e,[r]),await Ir(e),await Ke(e,{action:"project.archive",target:o,status:"succeeded",reason:t.reason,details:{projectPath:r,archivePath:n,manifestPath:i,safetySnapshotPath:c.snapshotPath}}),{workspacePath:e,projectName:o,projectPath:r,action:"archive",archivePath:n,manifestPath:i,safetySnapshotPath:c.snapshotPath,dryRun:false}}async function jn(t){if(!t.permanent)return Mr(t);let e=Ve(t.workspacePath),r=await Pn(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 Ke(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 Zt(e,"project.delete",{reason:t.reason,permanent:true,safetySnapshot:true});let n=await dt({workspacePath:e,name:`pre-delete-${o}-${lt()}`,reason:t.reason||`Automatic safety snapshot before deleting ${o}`,includeProjects:false});return await E__default.remove(r),await Pt(e,[r]),await Ir(e),await Ke(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 Sn(t){let e=Ve(t.workspacePath),r=await Gi(e,t.archive),o=await bn(r),n=t.targetName?.trim()||o.projectName,i=y__default.join(e,n);if(!i.startsWith(`${y__default.resolve(e)}${y__default.sep}`))throw new Error(`Archive restore target escapes workspace: ${n}`);if(await E__default.pathExists(i)&&!t.force)throw new Error(`Project path already exists. Re-run with --force to overwrite: ${i}`);if(t.dryRun)return await Ke(e,{action:"project.restore",target:n,status:"planned",reason:t.reason,details:{archivePath:r,projectPath:i}}),{workspacePath:e,projectName:n,projectPath:i,action:"restore",archivePath:r,manifestPath:y__default.join(r,"rapidkit-archive.json"),dryRun:true};await Zt(e,"project.restore",{reason:t.reason,safetySnapshot:true});let c=await dt({workspacePath:e,name:`pre-restore-project-${n}-${lt()}`,reason:t.reason||`Automatic safety snapshot before restoring ${n}`,includeProjects:false});return await E__default.move(r,i,{overwrite:t.force===true}),await Ir(e),await Ke(e,{action:"project.restore",target:n,status:"succeeded",reason:t.reason,details:{archivePath:r,projectPath:i,safetySnapshotPath:c.snapshotPath}}),{workspacePath:e,projectName:n,projectPath:i,action:"restore",archivePath:r,manifestPath:y__default.join(i,"rapidkit-archive.json"),safetySnapshotPath:c.snapshotPath,dryRun:false}}function Or(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 Ui(t){let e=t.trim().toLowerCase();return e?e.startsWith("fastapi")?"fastapi":e.startsWith("nestjs")?"nestjs":null:null}function Ee(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 Br(){return d$3()}function Cn(){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 Vi(t){return f$2(y__default.join(t,".venv"))}async function Ln(t,e){return await L(t,["--version"],e)===0}async function Ct(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 P.promises.readdir(t,{withFileTypes:true}):[]).some(d=>d.isFile()&&d.name.toLowerCase().endsWith(".sln")))return "dotnet";let c=y__default.join(t,"src");if(await E__default.pathExists(c)&&(await P.promises.readdir(c,{withFileTypes:true})).some(f=>f.isFile()&&f.name.toLowerCase().endsWith(".csproj")))return "dotnet";let a=y__default.join(t,"package.json");if(await E__default.pathExists(a))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 Hi(t){for(let e of Br())if(await L(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function Gn(t){for(let e of Br())if(await L(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function zi(t){let e=f$2(y__default.join(t,".venv"));if(!await E__default.pathExists(e)){let i=await Gn(t);if(i!==0)return i}if(!await Ln("poetry",t))return 0;let o=await L("poetry",["config","virtualenvs.in-project","true","--local"],t);if(o!==0)return o;let n=await L("poetry",["env","use",e],t);return n!==0?n:0}async function Yi(t){let e=f$2(y__default.join(t,".venv"));if(!await E__default.pathExists(e)){let n=await Gn(t);if(n!==0)return n}await L(e,["-m","pip","install","--upgrade","pip","setuptools","wheel"],t);let r=y__default.join(t,"requirements.txt");if(await E__default.pathExists(r)&&await L(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 L(e,["-m","pip","install","-e","."],t)===0||await L(e,["-m","pip","install","."],t)===0)?0:1}async function Nr(t,e){return await zi(t)!==0&&console.log(s.yellow("\u26A0\uFE0F Could not fully configure Poetry local venv. Trying fallback installer...")),(await e.initProject(t)).exitCode===0&&await E__default.pathExists(y__default.join(t,".venv"))?0:(console.log(s.yellow("\u26A0\uFE0F Python init fallback: installing dependencies directly into project .venv")),await Yi(t))}async function Dr(t){let e=await xt("init",t);if(e===0)return 0;let r=["npm","pnpm","yarn"];for(let o of r){if(!await Ln(o,t))continue;if(await L(o,["install"],t)===0)return console.log(s.green(`\u2705 Node init fallback succeeded with ${o} install`)),0}return e}function Qi(t,e){let r=n=>/^\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?$/.test(n),o=Ee([...e],"--port");if(o&&!/^\d+$/.test(o.trim()))return "Invalid --port. Expected numeric TCP port, e.g. 8080";if(t==="springboot.standard"){let n=Ee([...e],"--java-version"),i=Ee([...e],"--spring-boot-version"),c=Ee([...e],"--springdoc-version"),a=Ee([...e],"--group-id"),l=Ee([...e],"--package-name");if(n&&!/^\d+$/.test(n.trim()))return "Invalid --java-version. Expected major version number, e.g. 21";if(i&&!r(i.trim()))return "Invalid --spring-boot-version. Expected semantic version, e.g. 3.5.0";if(c&&!r(c.trim()))return "Invalid --springdoc-version. Expected semantic version, e.g. 2.8.9";if(a&&!/^[A-Za-z0-9_.-]+$/.test(a.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=Ee([...e],"--target-framework"),i=Ee([...e],"--root-namespace");if(n&&!/^net\d+\.\d+$/.test(n.trim()))return "Invalid --target-framework. Expected .NET target framework, e.g. net8.0";if(i&&!/^[A-Za-z0-9_.]+$/.test(i.trim()))return "Invalid --root-namespace. Use dot-separated .NET namespace identifiers only."}return null}async function tr(t){if(t[0]!=="create"||t[1]!=="project")return 1;let e=t[2],r=wt(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>]"}
|
|
125
125
|
`),1;try{Dt(o);}catch(u){let p=u instanceof Error?u.message:String(u);return process.stderr.write(`${p}
|
|
126
126
|
`),1}let n=Qi(r.id,t);if(n)return process.stderr.write(`${n}
|
|
127
127
|
`),1;let i=Ee(t,"--output")||process.cwd(),c=y__default.resolve(i,o),a=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(c)),await u.pathExists(c))return process.stderr.write(`\u274C Directory "${c}" already exists
|
|
128
|
-
`),1;await u.ensureDir(c),await
|
|
128
|
+
`),1;await u.ensureDir(c),await Yo(r,{projectName:o,projectPath:c,args:t,skipGit:a,skipInstall:l});let p=H(process.cwd());if(p){let{syncWorkspaceProjects:d}=await import('./workspace-QCU3VBCD.js');await d(p,true);}return 0}catch(u){return process.stderr.write(`RapidKit ${r.id} generator failed: ${u?.message??u}
|
|
129
129
|
`),1}}async function Tr(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\`.
|
|
130
130
|
Reason: ${e}.
|
|
131
131
|
Install Python 3.10+ to use the interactive wizard and full kit catalog.
|
|
@@ -137,19 +137,19 @@ Requested kit: ${n}
|
|
|
137
137
|
Offline fallback only supports: fastapi.standard, nestjs.standard (and their shorthands).
|
|
138
138
|
Install Python 3.10+ to access all kits.
|
|
139
139
|
`),1;let a=Ee(t,"--output")||process.cwd(),l=y__default.resolve(a,i),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
|
|
140
|
-
`),1;let d="pip",f=H(process.cwd());if(f)try{let{readWorkspaceMarker:m}=await import('./workspace-marker-IOPQ42A7.js'),g=await m(f);g?.metadata?.npm?.installMethod&&(d=g.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:h}=await import('./demo-kit-KTRITRWH.js');if(await h(l,{project_name:i,template:c,kit_name:n,skipGit:u,skipInstall:p,engine:d}),f){let{syncWorkspaceProjects:m}=await import('./workspace-
|
|
141
|
-
`),1}}async function
|
|
140
|
+
`),1;let d="pip",f=H(process.cwd());if(f)try{let{readWorkspaceMarker:m}=await import('./workspace-marker-IOPQ42A7.js'),g=await m(f);g?.metadata?.npm?.installMethod&&(d=g.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:h}=await import('./demo-kit-KTRITRWH.js');if(await h(l,{project_name:i,template:c,kit_name:n,skipGit:u,skipInstall:p,engine:d}),f){let{syncWorkspaceProjects:m}=await import('./workspace-QCU3VBCD.js');await m(f,true),await pt(f,{silent:true});}return 0}catch(d){return process.stderr.write(`RapidKit (npm) offline fallback failed: ${d?.message??d}
|
|
141
|
+
`),1}}async function Bn(t){let e$2=new Set(["--yes","-y","--skip-git","--skip-install","--debug","--dry-run","--no-update-check","--create-workspace","--no-workspace"]);if(t[0]==="create"&&(!t[1]||t[1].startsWith("-"))){let r=t.includes("--yes")||t.includes("-y"),o=t.slice(1),n;!process.stdin.isTTY||r?(n="workspace",process.stdin.isTTY&&console.log(s.gray("\u2139\uFE0F No subcommand provided for `create`; defaulting to `create workspace`."))):n=(await Je.prompt([{type:"rawlist",name:"createTarget",message:"What do you want to create?",choices:[{name:"workspace",value:"workspace"},{name:"project",value:"project"}]}])).createTarget;let i=["create",n,...o];return await Bn(i)}if(t[0]==="create"&&t[1]==="workspace")try{let r=t.includes("--yes")||t.includes("-y"),o=t.includes("--skip-git")||t.includes("--no-git"),n=t.includes("--dry-run"),i=t[2]&&!t[2].startsWith("-")?t[2]:void 0,c=Ee(t,"--install-method"),a=c==="poetry"||c==="venv"||c==="pipx"?c:void 0,l=Ee(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=i||(r?"my-workspace":(await Je.prompt([{type:"input",name:"workspaceName",message:"Workspace name:",default:"my-workspace"}])).workspaceName);if(!p||!p.trim())return process.stderr.write(`Workspace name is required.
|
|
142
142
|
`),1;try{Dt(p);}catch(g){if(g instanceof e)return process.stderr.write(`${g.message}
|
|
143
143
|
`),1;throw g}let d=y__default.resolve(process.cwd(),p);if(!n&&await E__default.pathExists(d))return process.stderr.write(`\u274C Directory "${p}" already exists
|
|
144
|
-
`),1;let f=await a$2(),h=f.author||process.env.USER||"RapidKit User";if(!r){let g=await Je.prompt([{type:"input",name:"author",message:"Author name:",default:h}]);g.author?.trim()&&(h=g.author.trim());}let{createProject:m}=await import('./create-
|
|
144
|
+
`),1;let f=await a$2(),h=f.author||process.env.USER||"RapidKit User";if(!r){let g=await Je.prompt([{type:"input",name:"author",message:"Author name:",default:h}]);g.author?.trim()&&(h=g.author.trim());}let{createProject:m}=await import('./create-YPTSMFZH.js');return await m(p,{skipGit:o,yes:r,dryRun:n,userConfig:{...f,author:h},installMethod:a,profile:u}),0}catch(r){return process.stderr.write(`RapidKit (npm) failed to create workspace: ${r?.message??r}
|
|
145
145
|
`),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}
|
|
146
146
|
`),1}if(!t[2]||t[2].startsWith("-")){console.log(s.bold(`
|
|
147
147
|
\u{1F680} RapidKit
|
|
148
|
-
`));let{kitChoice:m}=await Je.prompt([{type:"rawlist",name:"kitChoice",message:"Select a kit to scaffold:",choices:
|
|
149
|
-
`),a$1.debug(`Synced Python version ${le.trim()} from workspace to ${w}`);}}}catch(w){a$1.debug("Could not sync Python version from workspace:",w);}let{syncWorkspaceProjects:b}=await import('./workspace-
|
|
150
|
-
`),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=H(process.cwd());if(o){let{syncWorkspaceProjects:n}=await import('./workspace-
|
|
151
|
-
`),1)}return await d$1(),await e$1(t,{cwd:process.cwd()})}catch(r){let o=
|
|
152
|
-
`),1)}}var
|
|
148
|
+
`));let{kitChoice:m}=await Je.prompt([{type:"rawlist",name:"kitChoice",message:"Select a kit to scaffold:",choices:zo().map(b=>({name:b.label,value:b.id}))}]);if(kt(m)){let{projectName:b}=await Je.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 tr(["create","project",m,b.trim(),...w]),C=H(process.cwd());return k===0&&C&&await pt(C),k}let{projectName:g}=await Je.prompt([{type:"input",name:"projectName",message:"Project name:",validate:b=>b.trim().length>0||"Project name is required"}]);t.splice(2,0,m,g.trim());}{let m=H(process.cwd()),g=(t[2]||"").toLowerCase();if(m&&g){let b=y__default.join(m,".rapidkit","workspace.json"),w=y__default.join(m,".rapidkit","policies.yml");try{let[k,C]=await Promise.all([E__default.pathExists(b).then(S=>S?P.promises.readFile(b,"utf-8"):"{}"),E__default.pathExists(w).then(S=>S?P.promises.readFile(w,"utf-8"):"")]),x=JSON.parse(k).profile,T=C.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]??"warn",ge=wt(g)?.runtime,z=ge==="go",M=ge==="java",he=ge==="dotnet",Se=ge==="node",D=ge==="python"||!ge,I=null;if(x==="python-only"&&!D?I=`Kit "${g}" is not a Python kit, but workspace profile is "python-only".`:x==="node-only"&&!Se?I=`Kit "${g}" is not a Node kit, but workspace profile is "node-only".`:x==="go-only"&&!z?I=`Kit "${g}" is not a Go kit, but workspace profile is "go-only".`:x==="java-only"&&!M?I=`Kit "${g}" is not a Java kit, but workspace profile is "java-only".`:x==="dotnet-only"&&!he&&(I=`Kit "${g}" is not a .NET kit, but workspace profile is "dotnet-only".`),I){if(T==="strict")return console.log(s.red(`\u274C Profile violation (strict mode): ${I}`)),console.log(s.gray("\u{1F4A1} Change workspace profile or use --no-workspace to skip enforcement.")),1;console.log(s.yellow(`\u26A0\uFE0F Profile warning: ${I}`)),console.log(s.gray('\u{1F4A1} Consider using a "polyglot" workspace profile for multi-language projects.'));}}catch{}}}if(kt(t[2])){let m=await tr(t),g=H(process.cwd());return m===0&&g&&await pt(g),m}let o=t.includes("--create-workspace"),n=t.includes("--no-workspace"),i=t.includes("--yes")||t.includes("-y"),c=t.includes("--skip-git")||t.includes("--no-git");if(!!!Jr(process.cwd())){let{registerWorkspaceAtPath:m}=await import('./create-YPTSMFZH.js');if(o)await m(process.cwd(),{skipGit:c,yes:i,userConfig:await a$2()});else if(!n)if(i)await m(process.cwd(),{skipGit:c,yes:true,userConfig:await a$2()});else {let{createWs:g}=await Je.prompt([{type:"confirm",name:"createWs",message:"This project will be created outside a RapidKit workspace. Create and register a workspace here?",default:true}]);g&&await m(process.cwd(),{skipGit:c,yes:false,userConfig:await a$2()});}}if(kt(t[2])){let m=await tr(t),g=H(process.cwd());return m===0&&g&&await pt(g,{silent:true}),m}let u=[...t.filter(m=>{let g=m.split("=")[0];return !e$2.has(m)&&!e$2.has(g)})],p=H(process.cwd()),h=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:h});if(m===0&&p&&!t.includes("--skip-install")&&(console.log(s.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(s.white(" Next: cd <project-name> && npx rapidkit init"))),m===0){let g=p||H(process.cwd());if(g){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),_=y__default.join(g,".python-version"),T=y__default.join(x,".python-version");if(P.existsSync(_)&&P.existsSync(x)){let le=P.readFileSync(_,"utf-8");P.writeFileSync(T,le.trim()+`
|
|
149
|
+
`),a$1.debug(`Synced Python version ${le.trim()} from workspace to ${w}`);}}}catch(w){a$1.debug("Could not sync Python version from workspace:",w);}let{syncWorkspaceProjects:b}=await import('./workspace-QCU3VBCD.js');await b(g,true),await pt(g);}}return m}catch(m){let g=Or(m);return g?await Tr(u,g):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${m?.message??m}
|
|
150
|
+
`),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=H(process.cwd());if(o){let{syncWorkspaceProjects:n}=await import('./workspace-QCU3VBCD.js');await n(o,true);}}return r}catch(r){let o=Or(r);return o?await Tr(t,o):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${r?.message??r}
|
|
151
|
+
`),1)}return await d$1(),await e$1(t,{cwd:process.cwd()})}catch(r){let o=Or(r);return o?await Tr(t,o):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${r?.message??r}
|
|
152
|
+
`),1)}}var Rn=["init","dev","start","build","test","docs","lint","format","create","help","--help","-h"],Zi=["analyze","readiness","doctor","autopilot","import","snapshot","workspace","bootstrap","setup","cache","mirror","ai","config","product","shell","commands"],Xi=["analyze","readiness","doctor","autopilot","import","snapshot","workspace","ai","config","product","shell","commands"],ea=["bootstrap","setup","cache","mirror"],ta=[["project","commands"],["project","archives"],["project","archive"],["project","restore"],["project","delete"]],qn=["lint","format","docs"],ra=["init"],Un=["build","dev","start","test"],_n=[...Un,...qn];function oa(t){return !!t&&Zi.includes(t)}function Vn(t){let e=t[0],r=t[1];return ta.some(([o,n])=>e!==o?false:r?r===n:true)}function Rt(t){return oa(t[0])||Vn(t)}function na(t){return !!t&&Xi.includes(t)}function En(t){return na(t[0])||Vn(t)}function An(t){return !!t&&ea.includes(t)}function sa(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 Hn(t={}){let e=i(process.cwd());if(t.json){console.log(JSON.stringify(e,null,2));return}console.log(s.bold("RapidKit project command capabilities")),console.log(s.gray(`Project: ${e.projectRoot??"not detected"}`)),console.log(s.gray(`Runtime: ${e.runtime} (${e.runtimeSupportTier}) | Framework: ${e.frameworkDisplayName} (${e.frameworkSupportTier}) | Module support: ${e.moduleSupport?"yes":"no"}`)),console.log(s.gray(`Doctor support: ${e.runtimeDoctorSupport}`)),console.log(""),console.log(s.green(`Supported: ${e.supportedCommands.join(", ")||"none"}`)),console.log(s.yellow(`Global: ${e.globalCommands.join(", ")||"none"}`)),console.log(s.red(`Unsupported: ${e.unsupportedCommands.join(", ")||"none"}`));}function ia(){let t=["analyze","readiness","doctor","autopilot","import","snapshot","workspace","bootstrap","setup","cache","mirror","ai","config","product","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 aa(t={}){let e=ia();if(t.json){console.log(JSON.stringify(e,null,2));return}console.log(s.bold("RapidKit command capabilities")),console.log(s.gray(`CLI: ${e.cli} v${e.version}`)),console.log(""),console.log(s.green(`npm wrapper: ${e.commands.npmOwned.join(", ")}`)),console.log(s.cyan(`Python core: ${e.commands.coreBacked.join(", ")}`)),console.log(s.yellow(`Project runtime: ${e.commands.projectScoped.join(", ")}`)),console.log(""),console.log(s.gray("Tip: run `rapidkit project commands --json` inside a project."));}function Kr(t){return k(t)?(Hn({json:t.includes("--json")||t.includes("--ci")}),true):false}function zn(t){let e=i(process.cwd());if(!e.projectRoot)return false;let r=j$1(t,process.cwd());if(!r||r.status!=="unsupported")return false;console.error(s.red(l(r,e))),process.exit(1);}function et(t){return P.existsSync(y__default.join(t,".rapidkit-workspace"))||P.existsSync(y__default.join(t,".rapidkit","workspace.json"))}function Yn(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 Jr(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 H(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 pt(t,e){try{let{syncWorkspaceContract:r}=await import('./workspace-contract-4UCEM44I.js'),o=await r({workspacePath:t});if(!e?.silent&&(o.addedProjects.length>0||o.updatedProjects.length>0)&&console.log(s.gray(`\u2139\uFE0F Workspace contract synced (${o.contract.projects.length} project(s)).`)),o.verification.status!=="passed"){console.log(s.yellow("\u26A0\uFE0F Workspace contract verification failed after project sync."));for(let n of o.verification.violations)console.log(s.gray(` Violation: ${n}`));console.log(s.white(" Next: npx rapidkit workspace contract inspect"));}}catch(r){e?.silent||console.log(s.yellow(`\u26A0\uFE0F Workspace contract sync skipped: ${r.message}`));}}async function ca(t,e=process.cwd(),r=process.platform){if(!(t.workspaceFlag||t.scope==="workspace")||!a(r))return {detected:false};let n=i$1(e,r);for(let i of n){if(!await E__default.pathExists(i))continue;let c=i.toLowerCase();if(c.endsWith("rapidkit.cmd")||c.endsWith("rapidkit.exe"))return {detected:true,candidatePath:i,reason:"Found workspace-local rapidkit launcher on Windows."}}return {detected:false}}function la(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 Qn={enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true};function da(t){return t&&t.match(/^[\t ]*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]==="strict"?"strict":"warn"}function St(t,e){let r=t.match(new RegExp(`^[\\t ]*${e}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return r?r[1]==="true":Qn[e]}function In(t){let e=t??"";return {mode:da(e),dependency_sharing_mode:Zn(e),rules:{enforce_workspace_marker:St(e,"enforce_workspace_marker"),enforce_toolchain_lock:St(e,"enforce_toolchain_lock"),disallow_untrusted_tool_sources:St(e,"disallow_untrusted_tool_sources"),enforce_compatibility_matrix:St(e,"enforce_compatibility_matrix"),require_mirror_lock_for_offline:St(e,"require_mirror_lock_for_offline")}}}function $n(t,e,r){let o=`${e}: ${r}`,n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`^[\\t ]*${n}:\\s*.*$`,"m");if(i.test(t))return t.replace(i,o);let c=/^[\t ]*rules:\s*(?:#.*)?$/m;return c.test(t)?t.replace(c,`${o}
|
|
153
153
|
rules:`):`${t.endsWith(`
|
|
154
154
|
`)?t:`${t}
|
|
155
155
|
`}${o}
|
|
@@ -159,29 +159,29 @@ ${o}`):`${t.endsWith(`
|
|
|
159
159
|
`}rules:
|
|
160
160
|
${o}
|
|
161
161
|
`}function ua(){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(`
|
|
162
|
-
`)}async function
|
|
162
|
+
`)}async function Mn(t){let e=y__default.join(t,".rapidkit","policies.yml");return await E__default.pathExists(e)?P.promises.readFile(e,"utf-8"):ua()}async function ma(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(`
|
|
163
163
|
`)?e:`${e}
|
|
164
|
-
`;await P.promises.writeFile(o,n,"utf-8");}function fa(t){let e=t.trim().toLowerCase();return e==="true"||e==="1"||e==="on"?true:e==="false"||e==="0"||e==="off"?false:null}function
|
|
165
|
-
`,"utf-8");}async function ga(t,e,r){let o=process.env.RAPIDKIT_TEST_IMPORT_SYNC_FAIL==="1"&&(process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"),n=e.workspace?y__default.resolve(e.workspace):null,i=n??H(process.cwd()),c=false,a=false;if(n){if(!et(n)){let d=`Workspace path is not a valid RapidKit workspace: ${n}`;return e.json?console.log(JSON.stringify({error:d},null,2)):console.log(s.red(`\u274C ${d}`)),1}}else if(!i||!et(i)){let d=await ka();i=d.workspacePath,c=true,a=d.created;}if(!i||!et(i)){let d="Not inside a RapidKit workspace";return e.json?console.log(JSON.stringify({error:d},null,2)):(console.log(s.red(`\u274C ${d}`)),console.log(s.gray("\u{1F4A1} Run this command from a workspace root or pass --workspace <path>."))),1}let l=`cd ${i}`,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-EHYCBFXL.js');await f(d,true);}),p=r?.rollbackImportedProjectImport??fn;try{let d=await gn({workspacePath:i,source:t,name:e.name,sourceType:e.git===true?"git-url":void 0});try{await u(i);}catch(f){await p(i,d.path);try{await u(i);}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:i,workspaceResolution:c?"default-auto":n?"explicit":"nearest",defaultWorkspaceCreated:c?a:false,suggestedCdCommand:l,importedProject:d},null,2)),0):(c&&console.log(s.yellow(`\u2139 Imported outside a workspace, so RapidKit used the default workspace: ${i}`)),console.log(s.green(`\u2714 Imported project: ${d.name}`)),console.log(s.gray(` Workspace: ${i}`)),console.log(s.gray(` Destination: ${d.path}`)),console.log(s.gray(` Stack: ${d.stack} (${d.confidence})`)),console.log(s.gray(` Source: ${e.git===true||xr(t)?"git-url":"local-folder"}`)),console.log(s.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(s.red(`\u274C Import failed: ${f}`)),1}}async function Lr(t){let e=new Set(["python-only","polyglot","enterprise"]),r="minimal";try{let i=y__default.join(t,".rapidkit","workspace.json");r=JSON.parse(await P.promises.readFile(i,"utf-8")).profile??"minimal";}catch{r="minimal";}if(!await(async()=>{if(e.has(r))return true;let i=await Br(t);if(i.length===0)return false;for(let c of i){let a=a$4(c),l=a?.module_support;if(!(b$2(a,c)||d(a,c)||e$2(a,c))&&l!==false)return f$1(a,c)||c$1(a,c),true}return false})())return 0;let n="poetry";try{let{readWorkspaceMarker:i}=await import('./workspace-marker-IOPQ42A7.js'),a=(await i(t))?.metadata?.npm?.installMethod;(a==="poetry"||a==="venv"||a==="pipx"||a==="pip")&&(n=a);}catch{}if(n==="poetry"||n==="venv"){let i=y__default.join(t,"pyproject.toml"),c=false;try{c=(await P.promises.readFile(i,"utf-8")).includes("rapidkit-core");}catch{c=false;}let a=process.env.RAPIDKIT_DEV_PATH,l=a?await E__default.pathExists(a):false;if(c){let u=Vi(t);if(!await E__default.pathExists(u)){let f=await Hi(t);if(f!==0)return f}let d=await L(u,l&&a?["-m","pip","install",a,"--quiet","--disable-pip-version-check"]:["-m","pip","install","rapidkit-core","--quiet","--disable-pip-version-check"],t);if(d!==0)return d}else {let u=await L("poetry",["install","--no-root"],t);if(u!==0)return u;let p=await L("poetry",["add","rapidkit-core"],t);if(p!==0)return p}try{let{writeWorkspaceLauncher:u}=await import('./create-6AMYKNEG.js');await u(t,n==="venv"?"venv":"poetry");}catch{}return 0}return 0}async function Br(t){let e=[],r=new Set,o=[t];for(;o.length>0;){let n=o.pop();if(!n||r.has(n))continue;r.add(n);let i=[];try{i=await P.promises.readdir(n,{withFileTypes:true});}catch{continue}for(let c of i){if(!c.isDirectory()||c.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(c.name))continue;let a=y__default.join(n,c.name),l=y__default.join(a,".rapidkit","context.json"),u=y__default.join(a,".rapidkit","project.json");if(await E__default.pathExists(l)||await E__default.pathExists(u)){e.push(a);continue}o.push(a);}}return e}function ha(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 ya="default-workspace";function wa(){return y__default.join(homedir(),"Workspai","rapidkits",ya)}async function ka(){let t=wa(),e=y__default.basename(t),r=et(t);await E__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 E__default.pathExists(o)||await Ze(o,{name:e,workspace_name:e,profile:"minimal",createdAt:new Date().toISOString(),createdBy:"rapidkit-npm-import-fallback"}),{workspacePath:t,created:!r}}async function Wr(t){let r=await Fe("go",{runCommandInCwd:L,runCoreRapidkit:e$1}).initProject(t);return ue(r)}function ue(t){return t.message&&console.log(s.red(`\u274C ${t.message}`)),t.exitCode}async function xt(t,e){let r=Fe("node",{runCommandInCwd:L,runCoreRapidkit:e$1});if(t==="init"){let n=await r.initProject(e);return ue(n)}if(t==="dev"){let n=await r.runDev(e);return ue(n)}if(t==="test"){let n=await r.runTest(e);return ue(n)}if(t==="build"){let n=await r.runBuild(e);return ue(n)}let o=await r.runStart(e);return ue(o)}async function Xe(t,e){let r=Fe("java",{runCommandInCwd:L,runCoreRapidkit:e$1});if(t==="init"){let n=await r.initProject(e);return ue(n)}if(t==="dev"){let n=await r.runDev(e);return ue(n)}if(t==="test"){let n=await r.runTest(e);return ue(n)}if(t==="build"){let n=await r.runBuild(e);return ue(n)}let o=await r.runStart(e);return ue(o)}async function Dn(t,e=Gr){let r=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof r>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let i=function(v){if(!v)return null;let $=v.trim().toLowerCase();return $==="minimal"||$==="java-only"||$==="go-only"||$==="dotnet-only"||$==="python-only"||$==="node-only"||$==="polyglot"||$==="enterprise"?$:null},c=function(v){let Ae=v.match(/^\s*mode:\s*([a-zA-Z]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase()==="strict"?"strict":"warn",we=(V,_e)=>{let Ie=v.match(new RegExp(`^\\s*${V}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return Ie?Ie[1].toLowerCase()==="true":_e};return {mode:Ae,dependency_sharing_mode:es(v),rules:{enforce_workspace_marker:we("enforce_workspace_marker",true),enforce_toolchain_lock:we("enforce_toolchain_lock",false),disallow_untrusted_tool_sources:we("disallow_untrusted_tool_sources",false),enforce_compatibility_matrix:we("enforce_compatibility_matrix",false),require_mirror_lock_for_offline:we("require_mirror_lock_for_offline",true)}}};let a=["init"],l,u=false,p=false,d$1=false;for(let v=1;v<t.length;v+=1){let $=t[v];if($==="--ci"){u=true;continue}if($==="--offline"){p=true;continue}if($==="--json"){d$1=true;continue}if($==="--profile"){let W=t[v+1];if(!W||W.startsWith("-"))return console.log(s.yellow("Usage: rapidkit bootstrap [path] [--profile <minimal|java-only|go-only|dotnet-only|python-only|node-only|polyglot|enterprise>] [--ci] [--offline] [--json]")),1;l=W,v+=1;continue}if($.startsWith("--profile=")){l=$.slice(10);continue}a.push($);}let f=i(l);if(l&&!f)return console.log(s.red(`Invalid profile: ${l}. Use one of: minimal, java-only, go-only, dotnet-only, python-only, node-only, polyglot, enterprise.`)),1;let h=process.cwd(),m=a.slice(1).filter(v=>!v.startsWith("-"));if(m.length>0){let v=y__default.resolve(h,m[0]),$=a$4(v),W=P.existsSync(v)?await Ct(v):"unknown";if(!et(v)&&(b$2($,v)||d($,v)||e$2($,v)||c$1($,v)||f$1($,v)||W!=="unknown"))return await e(a)}let g=y__default.join(h,".rapidkit-workspace"),b=y__default.join(h,".rapidkit","workspace.json"),w;!P.existsSync(g)&&P.existsSync(b)?w=h:(w=H(h),w||(w=la(h)));let k=[],C=null,x=null;if(w)try{let v=y__default.join(w,".rapidkit","workspace.json"),$=await P.promises.readFile(v,"utf-8"),W=JSON.parse($);x=i(W.profile);}catch{x=null;}let _=["minimal","java-only","python-only","node-only","go-only","dotnet-only","polyglot","enterprise"],T={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"},le=f;if(!!w&&!f&&!u&&!d$1&&!!process.stdin.isTTY&&!!process.stdout.isTTY){let v=x||"minimal",{chosenProfile:$}=await Je.prompt([{type:"rawlist",name:"chosenProfile",message:`Select workspace profile for bootstrap (current: ${v})`,choices:_.map(W=>({name:W===v?`${T[W]} \u2190 current`:T[W],value:W})),default:_.indexOf(v)}]);le=$;}let z=le||x||"minimal";if(w)try{let $=z==="python-only"||z==="polyglot"||z==="enterprise"?"poetry":"venv",W;try{let _e=(await P.promises.readFile(y__default.join(w,".python-version"),"utf-8")).trim();_e&&(W=_e);}catch{}let{syncWorkspaceFoundationFiles:Ae}=await import('./create-6AMYKNEG.js'),we=await Ae(w,{workspaceName:y__default.basename(w),installMethod:$,pythonVersion:W,profile:z,writeMarker:true,writeGitignore:true,onlyIfMissing:true});k.push({id:"workspace.legacy.sync",status:we.length>0?"passed":"skipped",message:we.length>0?`Legacy workspace foundation synchronized: ${we.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&&le&&le!==x)try{let v=y__default.join(w,".rapidkit","workspace.json"),$=await P.promises.readFile(v,"utf-8"),W=JSON.parse($);W.profile=le,await P.promises.writeFile(v,JSON.stringify(W,null,2)+`
|
|
166
|
-
`,"utf-8");}catch{}let
|
|
167
|
-
`):(console.log(s.red("\u274C Bootstrap blocked by strict policy checks.")),console.log(s.gray(`Compliance report: ${ve}`))),1}let Pe=0;d$1||(Pe=await e(a));let Le=k.filter(v=>v.status==="failed").length,fe=Pe!==0?"failed":Le>0?"ok_with_warnings":"ok",ye={...me,result:fe,initExitCode:Pe};if(await E__default.ensureDir(S),await Ze(ve,ye),await Ze(
|
|
168
|
-
`);else {let v=k.filter($=>$.status==="failed").length;v>0&&console.log(s.yellow(`\u26A0\uFE0F Bootstrap completed with ${v} policy/profile warnings.`)),console.log(s.gray(`Compliance report: ${ve}`));}return Pe}finally{typeof r>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=r;}}async function
|
|
169
|
-
${T.stderr||""}`.match(/version\s+"([^"]+)"/i);g=ge?ge[1]:null;let z=P.existsSync(y__default.join(x,"pom.xml")),
|
|
170
|
-
${Se.stderr||""}`.match(/Apache Maven\s+(\S+)/i);w=I?I[1]:null;}else if(
|
|
164
|
+
`;await P.promises.writeFile(o,n,"utf-8");}function fa(t){let e=t.trim().toLowerCase();return e==="true"||e==="1"||e==="on"?true:e==="false"||e==="0"||e==="off"?false:null}function Zn(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 Xn(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 es(t,e){let r=H(t),o=r?y__default.join(r,".rapidkit","policies.yml"):null,n="isolated";if(o&&await E__default.pathExists(o))try{let a=await P.promises.readFile(o,"utf-8"),l=Xn(a);if(l.status==="failed")return console.log(s.red(`\u274C ${l.message}`)),{ok:false,code:1};n=l.mode;}catch{return console.log(s.red("\u274C Failed to read workspace policy file (.rapidkit/policies.yml).")),{ok:false,code:1}}let i=process.env.RAPIDKIT_DEP_SHARING_MODE,c=process.env.RAPIDKIT_WORKSPACE_PATH;process.env.RAPIDKIT_DEP_SHARING_MODE=n,r&&(process.env.RAPIDKIT_WORKSPACE_PATH=r);try{return {ok:true,value:await e()}}finally{typeof i>"u"?delete process.env.RAPIDKIT_DEP_SHARING_MODE:process.env.RAPIDKIT_DEP_SHARING_MODE=i,typeof c>"u"?delete process.env.RAPIDKIT_WORKSPACE_PATH:process.env.RAPIDKIT_WORKSPACE_PATH=c;}}async function L(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",i=>{process.stdout.write(i);}),n.stderr?.on("data",i=>{process.stderr.write(i);}),n.on("close",i=>o(i??1)),n.on("error",()=>o(1));})}async function Ze(t,e){await E__default.outputFile(t,`${JSON.stringify(e,null,2)}
|
|
165
|
+
`,"utf-8");}async function ga(t,e,r){let o=process.env.RAPIDKIT_TEST_IMPORT_SYNC_FAIL==="1"&&(process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"),n=e.workspace?y__default.resolve(e.workspace):null,i=n??H(process.cwd()),c=false,a=false;if(n){if(!et(n)){let d=`Workspace path is not a valid RapidKit workspace: ${n}`;return e.json?console.log(JSON.stringify({error:d},null,2)):console.log(s.red(`\u274C ${d}`)),1}}else if(!i||!et(i)){let d=await ka();i=d.workspacePath,c=true,a=d.created;}if(!i||!et(i)){let d="Not inside a RapidKit workspace";return e.json?console.log(JSON.stringify({error:d},null,2)):(console.log(s.red(`\u274C ${d}`)),console.log(s.gray("\u{1F4A1} Run this command from a workspace root or pass --workspace <path>."))),1}let l=`cd ${i}`,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-QCU3VBCD.js');await f(d,true);}),p=r?.rollbackImportedProjectImport??un;try{let d=await mn({workspacePath:i,source:t,name:e.name,sourceType:e.git===true?"git-url":void 0});try{await u(i);}catch(f){await p(i,d.path);try{await u(i);}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:i,workspaceResolution:c?"default-auto":n?"explicit":"nearest",defaultWorkspaceCreated:c?a:false,suggestedCdCommand:l,importedProject:d},null,2)),0):(c&&console.log(s.yellow(`\u2139 Imported outside a workspace, so RapidKit used the default workspace: ${i}`)),console.log(s.green(`\u2714 Imported project: ${d.name}`)),console.log(s.gray(` Workspace: ${i}`)),console.log(s.gray(` Destination: ${d.path}`)),console.log(s.gray(` Stack: ${d.stack} (${d.confidence})`)),console.log(s.gray(` Source: ${e.git===true||xr(t)?"git-url":"local-folder"}`)),console.log(s.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(s.red(`\u274C Import failed: ${f}`)),1}}async function Lr(t){let e=new Set(["python-only","polyglot","enterprise"]),r="minimal";try{let i=y__default.join(t,".rapidkit","workspace.json");r=JSON.parse(await P.promises.readFile(i,"utf-8")).profile??"minimal";}catch{r="minimal";}if(!await(async()=>{if(e.has(r))return true;let i=await qr(t);if(i.length===0)return false;for(let c of i){let a=a$4(c),l=a?.module_support;if(!(b$2(a,c)||d(a,c)||e$2(a,c))&&l!==false)return f$1(a,c)||c$1(a,c),true}return false})())return 0;let n="poetry";try{let{readWorkspaceMarker:i}=await import('./workspace-marker-IOPQ42A7.js'),a=(await i(t))?.metadata?.npm?.installMethod;(a==="poetry"||a==="venv"||a==="pipx"||a==="pip")&&(n=a);}catch{}if(n==="poetry"||n==="venv"){let i=y__default.join(t,"pyproject.toml"),c=false;try{c=(await P.promises.readFile(i,"utf-8")).includes("rapidkit-core");}catch{c=false;}let a=process.env.RAPIDKIT_DEV_PATH,l=a?await E__default.pathExists(a):false;if(c){let u=Vi(t);if(!await E__default.pathExists(u)){let f=await Hi(t);if(f!==0)return f}let d=await L(u,l&&a?["-m","pip","install",a,"--quiet","--disable-pip-version-check"]:["-m","pip","install","rapidkit-core","--quiet","--disable-pip-version-check"],t);if(d!==0)return d}else {let u=await L("poetry",["install","--no-root"],t);if(u!==0)return u;let p=await L("poetry",["add","rapidkit-core"],t);if(p!==0)return p}try{let{writeWorkspaceLauncher:u}=await import('./create-YPTSMFZH.js');await u(t,n==="venv"?"venv":"poetry");}catch{}return 0}return 0}async function qr(t){let e=[],r=new Set,o=[t];for(;o.length>0;){let n=o.pop();if(!n||r.has(n))continue;r.add(n);let i=[];try{i=await P.promises.readdir(n,{withFileTypes:true});}catch{continue}for(let c of i){if(!c.isDirectory()||c.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(c.name))continue;let a=y__default.join(n,c.name),l=y__default.join(a,".rapidkit","context.json"),u=y__default.join(a,".rapidkit","project.json");if(await E__default.pathExists(l)||await E__default.pathExists(u)){e.push(a);continue}o.push(a);}}return e}function ha(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 ya="default-workspace";function wa(){return y__default.join(homedir(),"Workspai","rapidkits",ya)}async function ka(){let t=wa(),e=y__default.basename(t),r=et(t);await E__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 E__default.pathExists(o)||await Ze(o,{name:e,workspace_name:e,profile:"minimal",createdAt:new Date().toISOString(),createdBy:"rapidkit-npm-import-fallback"}),{workspacePath:t,created:!r}}async function Wr(t){let r=await Fe("go",{runCommandInCwd:L,runCoreRapidkit:e$1}).initProject(t);return ue(r)}function ue(t){return t.message&&console.log(s.red(`\u274C ${t.message}`)),t.exitCode}async function xt(t,e){let r=Fe("node",{runCommandInCwd:L,runCoreRapidkit:e$1});if(t==="init"){let n=await r.initProject(e);return ue(n)}if(t==="dev"){let n=await r.runDev(e);return ue(n)}if(t==="test"){let n=await r.runTest(e);return ue(n)}if(t==="build"){let n=await r.runBuild(e);return ue(n)}let o=await r.runStart(e);return ue(o)}async function Xe(t,e){let r=Fe("java",{runCommandInCwd:L,runCoreRapidkit:e$1});if(t==="init"){let n=await r.initProject(e);return ue(n)}if(t==="dev"){let n=await r.runDev(e);return ue(n)}if(t==="test"){let n=await r.runTest(e);return ue(n)}if(t==="build"){let n=await r.runBuild(e);return ue(n)}let o=await r.runStart(e);return ue(o)}async function On(t,e=Gr){let r=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof r>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let i=function(v){if(!v)return null;let $=v.trim().toLowerCase();return $==="minimal"||$==="java-only"||$==="go-only"||$==="dotnet-only"||$==="python-only"||$==="node-only"||$==="polyglot"||$==="enterprise"?$:null},c=function(v){let Ae=v.match(/^\s*mode:\s*([a-zA-Z]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase()==="strict"?"strict":"warn",we=(V,_e)=>{let Ie=v.match(new RegExp(`^\\s*${V}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return Ie?Ie[1].toLowerCase()==="true":_e};return {mode:Ae,dependency_sharing_mode:Zn(v),rules:{enforce_workspace_marker:we("enforce_workspace_marker",true),enforce_toolchain_lock:we("enforce_toolchain_lock",false),disallow_untrusted_tool_sources:we("disallow_untrusted_tool_sources",false),enforce_compatibility_matrix:we("enforce_compatibility_matrix",false),require_mirror_lock_for_offline:we("require_mirror_lock_for_offline",true)}}};let a=["init"],l,u=false,p=false,d$1=false;for(let v=1;v<t.length;v+=1){let $=t[v];if($==="--ci"){u=true;continue}if($==="--offline"){p=true;continue}if($==="--json"){d$1=true;continue}if($==="--profile"){let W=t[v+1];if(!W||W.startsWith("-"))return console.log(s.yellow("Usage: rapidkit bootstrap [path] [--profile <minimal|java-only|go-only|dotnet-only|python-only|node-only|polyglot|enterprise>] [--ci] [--offline] [--json]")),1;l=W,v+=1;continue}if($.startsWith("--profile=")){l=$.slice(10);continue}a.push($);}let f=i(l);if(l&&!f)return console.log(s.red(`Invalid profile: ${l}. Use one of: minimal, java-only, go-only, dotnet-only, python-only, node-only, polyglot, enterprise.`)),1;let h=process.cwd(),m=a.slice(1).filter(v=>!v.startsWith("-"));if(m.length>0){let v=y__default.resolve(h,m[0]),$=a$4(v),W=P.existsSync(v)?await Ct(v):"unknown";if(!et(v)&&(b$2($,v)||d($,v)||e$2($,v)||c$1($,v)||f$1($,v)||W!=="unknown"))return await e(a)}let g=y__default.join(h,".rapidkit-workspace"),b=y__default.join(h,".rapidkit","workspace.json"),w;!P.existsSync(g)&&P.existsSync(b)?w=h:(w=H(h),w||(w=la(h)));let k=[],C=null,x=null;if(w)try{let v=y__default.join(w,".rapidkit","workspace.json"),$=await P.promises.readFile(v,"utf-8"),W=JSON.parse($);x=i(W.profile);}catch{x=null;}let _=["minimal","java-only","python-only","node-only","go-only","dotnet-only","polyglot","enterprise"],T={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"},le=f;if(!!w&&!f&&!u&&!d$1&&!!process.stdin.isTTY&&!!process.stdout.isTTY){let v=x||"minimal",{chosenProfile:$}=await Je.prompt([{type:"rawlist",name:"chosenProfile",message:`Select workspace profile for bootstrap (current: ${v})`,choices:_.map(W=>({name:W===v?`${T[W]} \u2190 current`:T[W],value:W})),default:_.indexOf(v)}]);le=$;}let z=le||x||"minimal";if(w)try{let $=z==="python-only"||z==="polyglot"||z==="enterprise"?"poetry":"venv",W;try{let _e=(await P.promises.readFile(y__default.join(w,".python-version"),"utf-8")).trim();_e&&(W=_e);}catch{}let{syncWorkspaceFoundationFiles:Ae}=await import('./create-YPTSMFZH.js'),we=await Ae(w,{workspaceName:y__default.basename(w),installMethod:$,pythonVersion:W,profile:z,writeMarker:true,writeGitignore:true,onlyIfMissing:true});k.push({id:"workspace.legacy.sync",status:we.length>0?"passed":"skipped",message:we.length>0?`Legacy workspace foundation synchronized: ${we.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&&le&&le!==x)try{let v=y__default.join(w,".rapidkit","workspace.json"),$=await P.promises.readFile(v,"utf-8"),W=JSON.parse($);W.profile=le,await P.promises.writeFile(v,JSON.stringify(W,null,2)+`
|
|
166
|
+
`,"utf-8");}catch{}let M={mode:"warn",dependency_sharing_mode:"isolated",rules:{enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true}},he=null;if(w)try{let v=await P.promises.readFile(y__default.join(w,".rapidkit","policies.yml"),"utf-8");he=v,M=c(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=Xn(he);M.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:M.dependency_sharing_mode==="isolated"?"Effective dependency mode: isolated (default secure mode).":M.dependency_sharing_mode==="shared-node-deps"?"Effective dependency mode: shared-node-deps (Node projects share workspace-level caches).":"Effective dependency mode: shared-runtime-caches (Node/Python/Go share workspace-level caches)."});let $=P.existsSync(y__default.join(w,".rapidkit-workspace"));k.push({id:"policy.enforce_workspace_marker",status:!M.rules.enforce_workspace_marker||$?"passed":"failed",message:!M.rules.enforce_workspace_marker||$?"Workspace marker policy satisfied.":"Workspace marker policy failed: .rapidkit-workspace is missing."});let W=P.existsSync(y__default.join(w,".rapidkit","toolchain.lock"));k.push({id:"policy.enforce_toolchain_lock",status:!M.rules.enforce_toolchain_lock||W?"passed":"failed",message:!M.rules.enforce_toolchain_lock||W?"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:!M.rules.disallow_untrusted_tool_sources||Ae?"passed":"failed",message:!M.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 we=y__default.join(w,".rapidkit","compatibility-matrix.json"),V=P.existsSync(we),_e=M.rules.enforce_compatibility_matrix;if(k.push({id:"policy.enforce_compatibility_matrix",status:!_e||V?"passed":"failed",message:!_e||V?"Compatibility matrix policy satisfied.":"Compatibility matrix policy failed: .rapidkit/compatibility-matrix.json is missing."}),V)try{let F=await P.promises.readFile(we,"utf-8"),q=JSON.parse(F),Et=!!q&&typeof q=="object";k.push({id:"compatibility.matrix.parse",status:Et?"passed":"failed",message:Et?"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 Ie=y__default.join(w,".rapidkit","mirror-config.json"),or=y__default.join(w,".rapidkit","mirror.lock"),nr=P.existsSync(Ie),sr=P.existsSync(or),Ur={};if(nr)try{Ur=JSON.parse(await P.promises.readFile(Ie,"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 ir=await jr(w,{ciMode:u,offlineMode:p});if(k.push(...ir.checks.map(F=>({id:F.id,status:F.status,message:F.message}))),C=ir.details,ir.details.lockWritten&&(sr=true),p){let F=process.env.RAPIDKIT_MIRROR_ENABLED==="1"||Ur.enabled===true;k.push({id:"offline.mirror.enabled",status:F?"passed":"failed",message:F?"Offline mode mirror is enabled.":'Offline mode requires mirror enablement (set RAPIDKIT_MIRROR_ENABLED=1 or .rapidkit/mirror-config.json {"enabled": true}).'});let q=M.rules.require_mirror_lock_for_offline;k.push({id:"offline.mirror.lock",status:!q||sr?"passed":"failed",message:!q||sr?"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 rs=await qr(w),Y=new Set;for(let F of rs){let q=a$4(F);if(b$2(q,F)){Y.add("go");continue}if(d(q,F)){Y.add("java");continue}if(e$2(q,F)){Y.add("dotnet");continue}if(c$1(q,F)){Y.add("node");continue}if(f$1(q,F)){Y.add("python");continue}Y.add("unknown");}if(z==="go-only"){let F=Y.size===0||[...Y].every(q=>q==="go");k.push({id:"profile.go-only",status:F?"passed":"failed",message:F?"go-only profile validated for discovered projects.":`go-only profile mismatch: detected runtimes [${[...Y].join(", ")}].`});}else if(z==="java-only"){let F=Y.size===0||[...Y].every(q=>q==="java");k.push({id:"profile.java-only",status:F?"passed":"failed",message:F?"java-only profile validated for discovered projects.":`java-only profile mismatch: detected runtimes [${[...Y].join(", ")}].`});}else if(z==="dotnet-only"){let F=Y.size===0||[...Y].every(q=>q==="dotnet");k.push({id:"profile.dotnet-only",status:F?"passed":"failed",message:F?"dotnet-only profile validated for discovered projects.":`dotnet-only profile mismatch: detected runtimes [${[...Y].join(", ")}].`});}else if(z==="python-only"){let F=Y.size===0||[...Y].every(q=>q==="python");k.push({id:"profile.python-only",status:F?"passed":"failed",message:F?"python-only profile validated for discovered projects.":`python-only profile mismatch: detected runtimes [${[...Y].join(", ")}].`});}else if(z==="node-only"){let F=Y.size===0||[...Y].every(q=>q==="node");k.push({id:"profile.node-only",status:F?"passed":"failed",message:F?"node-only profile validated for discovered projects.":`node-only profile mismatch: detected runtimes [${[...Y].join(", ")}].`});}else if(z==="minimal"){let F=[...Y].filter(Et=>Et!=="unknown"),q=F.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 [${F.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:V?"passed":"failed",message:V?"enterprise profile has compatibility matrix.":"enterprise profile requires .rapidkit/compatibility-matrix.json."}),k.push({id:"profile.enterprise.mirror-config",status:nr?"passed":"failed",message:nr?"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 D=k.some(v=>v.id.startsWith("policy.schema.")&&v.status==="failed")||M.mode==="strict"&&k.some(v=>v.status==="failed"),I=w||h,S=y__default.join(I,".rapidkit","reports"),se=new Date().toISOString().replace(/[:.]/g,"-"),ve=y__default.join(S,`bootstrap-compliance-${se}.json`),B=y__default.join(S,"bootstrap-compliance.latest.json"),me={command:"bootstrap",timestamp:new Date().toISOString(),workspacePath:w,profile:z,options:{ci:u,offline:p,strict:M.mode==="strict"},policyMode:M.mode,policyRules:M.rules,mirrorLifecycle:C,checks:k};if(D){let v={...me,result:"blocked",initExitCode:null};return await E__default.ensureDir(S),await Ze(ve,v),await Ze(B,v),d$1?process.stdout.write(`${JSON.stringify(v,null,2)}
|
|
167
|
+
`):(console.log(s.red("\u274C Bootstrap blocked by strict policy checks.")),console.log(s.gray(`Compliance report: ${ve}`))),1}let Pe=0;d$1||(Pe=await e(a));let Le=k.filter(v=>v.status==="failed").length,fe=Pe!==0?"failed":Le>0?"ok_with_warnings":"ok",ye={...me,result:fe,initExitCode:Pe};if(await E__default.ensureDir(S),await Ze(ve,ye),await Ze(B,ye),d$1)process.stdout.write(`${JSON.stringify(ye,null,2)}
|
|
168
|
+
`);else {let v=k.filter($=>$.status==="failed").length;v>0&&console.log(s.yellow(`\u26A0\uFE0F Bootstrap completed with ${v} policy/profile warnings.`)),console.log(s.gray(`Compliance report: ${ve}`));}return Pe}finally{typeof r>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=r;}}async function Nn(t){if(t.includes("--help")||t.includes("-h"))return console.log(s.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(s.yellow("Usage: rapidkit setup <python|node|go|java|dotnet> [--warm-deps]")),1;let o=async(d,f)=>{if(d==="node"){if(!P.existsSync(y__default.join(f,"package.json")))return {exitCode:0,message:"Node warm-up skipped: package.json not found in current directory."};let m=P.existsSync(y__default.join(f,"pnpm-lock.yaml")),g=P.existsSync(y__default.join(f,"yarn.lock"));return m?{exitCode:await L("pnpm",["install","--lockfile-only","--ignore-scripts"],f)}:g?{exitCode:await L("yarn",["install","--ignore-scripts"],f)}:{exitCode:await L("npm",["install","--package-lock-only","--ignore-scripts"],f)}}if(d==="go")return P.existsSync(y__default.join(f,"go.mod"))?{exitCode:await L("go",["mod","download"],f)}:{exitCode:0,message:"Go warm-up skipped: go.mod not found in current directory."};if(d==="java"){let h=P.existsSync(y__default.join(f,"pom.xml")),m=P.existsSync(y__default.join(f,"build.gradle"))||P.existsSync(y__default.join(f,"build.gradle.kts")),g=y__default.join(f,process.platform==="win32"?"gradlew.bat":"gradlew"),b=P.existsSync(g);return !h&&!m?{exitCode:0,message:"Java warm-up skipped: pom.xml or build.gradle not found in current directory."}:h?{exitCode:await L("mvn",["-B","-q","-DskipTests","dependency:go-offline"],f)}:{exitCode:await L(b?g:"gradle",["--no-daemon","dependencies"],f)}}return d==="dotnet"?(()=>{let m=[{dir:f,depth:0}],g=new Set(["bin","obj",".git","node_modules",".rapidkit"]);for(;m.length>0;){let b=m.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()&&!g.has(k.name)&&m.push({dir:y__default.join(b.dir,k.name),depth:b.depth+1});}return false})()?{exitCode:await L("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:L,runCoreRapidkit:(d,f)=>e$1(d,{...f,cwd:void 0})}),i=await n.checkPrereqs(),c=await n.doctorHints(process.cwd()),a=H(process.cwd()),l=a||process.cwd(),u=null,p=async()=>e!=="java"||!a?[]:u||(u=(await qr(a)).filter(f=>{let h=a$4(f);return d(h,f)}),u);if(i.exitCode===0){console.log(s.green(`\u2705 ${e} prerequisites look good.`));let d=["python","node","go","java","dotnet"].filter(f=>f!==e).join("/");if(console.log(s.gray(` Scope: validated ${e} runtime only. ${d} checks are optional unless your workspace profile uses them.`)),e==="python"&&console.log(s.gray(" Note: Poetry is recommended, but venv/pipx-based flows are supported in workspace creation.")),n.warmSetupCache&&((await n.warmSetupCache(l)).exitCode===0?console.log(s.gray(` ${e} cache warm-up completed.`)):console.log(s.yellow(` ${e} cache warm-up skipped (non-fatal).`))),r)if(e==="java"&&a){let f=await p();if(f.length>0){let h=0,m=0,g=0;for(let b of f){let w=await o("java",b),k=/skipped/i.test(w.message||""),C=y__default.relative(a,b)||y__default.basename(b);w.message&&console.log(s.gray(` [${C}] ${w.message}`)),w.exitCode===0&&!k?h+=1:w.exitCode===0&&k?g+=1:m+=1;}h>0&&console.log(s.gray(` java dependency warm-up completed for ${h} project(s) (--warm-deps).`)),m>0&&console.log(s.yellow(` java dependency warm-up failed for ${m} project(s) (non-fatal).`)),h===0&&m===0&&g>0&&console.log(s.gray(" java dependency warm-up skipped for discovered workspace projects."));}else {let h=await o("java",l),m=/skipped/i.test(h.message||"");h.message&&console.log(s.gray(` ${h.message}`)),h.exitCode===0&&!m?console.log(s.gray(` ${e} dependency warm-up completed (--warm-deps).`)):h.exitCode!==0&&console.log(s.yellow(` ${e} dependency warm-up failed (non-fatal).`));}}else {let f=await o(e,l),h=/skipped/i.test(f.message||"");f.message&&console.log(s.gray(` ${f.message}`)),f.exitCode===0&&!h?console.log(s.gray(` ${e} dependency warm-up completed (--warm-deps).`)):f.exitCode!==0&&console.log(s.yellow(` ${e} dependency warm-up failed (non-fatal).`));}if(a)try{let f=y__default.join(a,".rapidkit","toolchain.lock"),h={};try{h=JSON.parse(await P.promises.readFile(f,"utf-8"));}catch{}(!h.runtime||typeof h.runtime!="object")&&(h.runtime={});let m=h.runtime;if(e==="python"){let g=null;try{let{execa:b}=await import('execa');for(let w of Br()){let C=await b(w,w==="py"?["-3","--version"]:["--version"],{cwd:a,stdio:"pipe",reject:false,timeout:3e3});if(C.exitCode===0){let _=(C.stdout||C.stderr||"").match(/Python\s+(\S+)/);if(g=_?_[1]:null,g)break}}}catch{}m.python={...m.python||{},version:g,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 g=null;try{let{execa:b}=await import('execa'),k=((await b("go",["version"],{cwd:a,stdio:"pipe"})).stdout||"").match(/go(\d+\.\d+(?:\.\d+)?)/i);g=k?k[1]:null;}catch{}m.go={...m.go||{},version:g,last_setup:new Date().toISOString()};}else if(e==="java"){let g=null,b=null,w=null,k=await p(),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:_}=await import('execa'),T=await _("java",["-version"],{cwd:a,stdio:"pipe",reject:false,timeout:3e3}),ge=`${T.stdout||""}
|
|
169
|
+
${T.stderr||""}`.match(/version\s+"([^"]+)"/i);g=ge?ge[1]:null;let z=P.existsSync(y__default.join(x,"pom.xml")),M=P.existsSync(y__default.join(x,"build.gradle"))||P.existsSync(y__default.join(x,"build.gradle.kts"));if(z){b="maven";let he=(()=>{let S=y__default.join(x,"mvnw.cmd");if(process.platform==="win32"&&P.existsSync(S))return S;let se=y__default.join(x,"mvnw");return P.existsSync(se)?se:"mvn"})(),Se=await _(he,["-version"],{cwd:x,stdio:"pipe",reject:false,timeout:3e3}),I=`${Se.stdout||""}
|
|
170
|
+
${Se.stderr||""}`.match(/Apache Maven\s+(\S+)/i);w=I?I[1]:null;}else if(M){b="gradle";let he=(()=>{let S=y__default.join(x,"gradlew.bat");if(process.platform==="win32"&&P.existsSync(S))return S;let se=y__default.join(x,"gradlew");return P.existsSync(se)?se:"gradle"})(),Se=await _(he,["--version"],{cwd:x,stdio:"pipe",reject:false,timeout:3e3}),I=`${Se.stdout||""}
|
|
171
171
|
${Se.stderr||""}`.match(/Gradle\s+(\S+)/i);w=I?I[1]:null;}}catch{}m.java={...m.java||{},version:g,build_tool:b,build_tool_version:w,last_setup:new Date().toISOString()};}else if(e==="dotnet"){let g=null;try{let{execa:b}=await import('execa'),k=((await b("dotnet",["--version"],{cwd:a,stdio:"pipe",reject:false,timeout:3e3})).stdout||"").trim();g=k.length>0?k:null;}catch{}m.dotnet={...m.dotnet||{},version:g,sdk:g,last_setup:new Date().toISOString()};}h.updated_at=new Date().toISOString(),await P.promises.writeFile(f,JSON.stringify(h,null,2)+`
|
|
172
172
|
`,"utf-8"),console.log(s.gray(" toolchain.lock updated (.rapidkit/toolchain.lock)"));}catch{}}else console.log(s.red(`\u274C ${e} prerequisites check failed.`));if(c.length>0){console.log(s.gray(`
|
|
173
173
|
Hints:`));for(let d of c)console.log(s.gray(`- ${d}`));}return i.exitCode}function va(t){let e={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};for(let r of t.split(`
|
|
174
|
-
`)){let o=r.trim(),n=o.match(/^strategy:\s*(\S+)/);n&&(e.strategy=n[1].replace(/['"]]/g,""));let i=o.match(/^prune_on_bootstrap:\s*(true|false)/);i&&(e.prune_on_bootstrap=i[1]==="true");let c=o.match(/^self_heal:\s*(true|false)/);c&&(e.self_heal=c[1]==="true");let a=o.match(/^verify_integrity:\s*(true|false)/);a&&(e.verify_integrity=a[1]==="true");}return e}async function
|
|
174
|
+
`)){let o=r.trim(),n=o.match(/^strategy:\s*(\S+)/);n&&(e.strategy=n[1].replace(/['"]]/g,""));let i=o.match(/^prune_on_bootstrap:\s*(true|false)/);i&&(e.prune_on_bootstrap=i[1]==="true");let c=o.match(/^self_heal:\s*(true|false)/);c&&(e.self_heal=c[1]==="true");let a=o.match(/^verify_integrity:\s*(true|false)/);a&&(e.verify_integrity=a[1]==="true");}return e}async function Dn(t){if(t.includes("--help")||t.includes("-h"))return console.log(s.yellow("Usage: rapidkit cache <status|clear|prune|repair>")),0;let e=(t[1]||"status").toLowerCase(),r=Qt.getInstance(),o=H(process.cwd()),n={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};if(o)try{let i=await P.promises.readFile(y__default.join(o,".rapidkit","cache-config.yml"),"utf-8");n=va(i);}catch{}return e==="status"?(console.log(s.cyan("RapidKit cache is enabled")),console.log(s.cyan("RapidKit cache status")),o?(console.log(s.gray(` Workspace: ${o}`)),console.log(s.gray(` Strategy: ${n.strategy}`)),console.log(s.gray(` Self-heal: ${n.self_heal}`)),console.log(s.gray(` Prune on bootstrap:${n.prune_on_bootstrap}`)),console.log(s.gray(` Verify integrity: ${n.verify_integrity}`))):console.log(s.gray(" (not inside a workspace \u2014 showing in-memory cache only)")),console.log(s.gray(" In-memory cache: enabled")),console.log(s.gray(" Use: rapidkit cache clear|prune|repair")),0):e==="clear"?(await r.clear(),console.log(s.green("Cache clear completed")),console.log(s.green("\u2705 Cache cleared (all entries removed).")),0):e==="prune"?(await r.clear(),console.log(s.green("\u2705 Cache pruned (stale entries removed).")),n.prune_on_bootstrap||console.log(s.gray(" Tip: set prune_on_bootstrap: true in .rapidkit/cache-config.yml to auto-prune on every bootstrap.")),0):e==="repair"?n.self_heal?(await r.clear(),console.log(s.green("\u2705 Cache repaired (self-heal applied, stale entries evicted).")),n.verify_integrity&&console.log(s.gray(" Integrity verification is enabled in cache-config.yml.")),0):(console.log(s.yellow("\u26A0\uFE0F self_heal is disabled in .rapidkit/cache-config.yml \u2014 skipping repair.")),0):(console.log(s.yellow("Usage: rapidkit cache <status|clear|prune|repair>")),1)}async function Pa(t,e,r,o){let n=(e||"show").toLowerCase(),i=y__default.join(t,".rapidkit","policies.yml");if(n==="show"||n==="status"||n==="get"){let p=await Mn(t),d=In(p);return console.log(s.cyan(`Policy file: ${i}`)),console.log(s.gray(` mode: ${d.mode}`)),console.log(s.gray(` dependency_sharing_mode: ${d.dependency_sharing_mode}`)),console.log(s.gray(" rules:")),console.log(s.gray(` enforce_workspace_marker: ${d.rules.enforce_workspace_marker}`)),console.log(s.gray(` enforce_toolchain_lock: ${d.rules.enforce_toolchain_lock}`)),console.log(s.gray(` disallow_untrusted_tool_sources: ${d.rules.disallow_untrusted_tool_sources}`)),console.log(s.gray(` enforce_compatibility_matrix: ${d.rules.enforce_compatibility_matrix}`)),console.log(s.gray(` require_mirror_lock_for_offline: ${d.rules.require_mirror_lock_for_offline}`)),console.log(s.gray("Examples:")),console.log(s.gray(" npx rapidkit workspace policy set mode strict")),console.log(s.gray(" npx rapidkit workspace policy set dependency_sharing_mode shared-runtime-caches")),console.log(s.gray(" npx rapidkit workspace policy set rules.enforce_toolchain_lock true")),0}if(n!=="set")return console.log(s.red(`Unknown workspace policy action: ${e||""}`)),console.log(s.gray("Available: show, set")),1;if(!r||typeof o>"u")return console.log(s.yellow("Usage: rapidkit workspace policy set <key> <value>")),console.log(s.gray("Allowed keys:")),console.log(s.gray(" mode (warn|strict)")),console.log(s.gray(" dependency_sharing_mode (isolated|shared-runtime-caches|shared-node-deps)")),console.log(s.gray(" rules.enforce_workspace_marker (true|false)")),console.log(s.gray(" rules.enforce_toolchain_lock (true|false)")),console.log(s.gray(" rules.disallow_untrusted_tool_sources (true|false)")),console.log(s.gray(" rules.enforce_compatibility_matrix (true|false)")),console.log(s.gray(" rules.require_mirror_lock_for_offline (true|false)")),1;let c=r.trim(),l=await Mn(t);if(c==="mode"){let p=o.trim().toLowerCase();if(p!=="warn"&&p!=="strict")return console.log(s.red("\u274C Invalid mode. Use: warn | strict")),1;l=$n(l,"mode",`${p} # "warn" or "strict"`);}else if(c==="dependency_sharing_mode"){let p=o.trim().toLowerCase();if(p!=="isolated"&&p!=="shared-runtime-caches"&&p!=="shared-node-deps")return console.log(s.red("\u274C Invalid dependency_sharing_mode. Use: isolated | shared-runtime-caches | shared-node-deps")),1;l=$n(l,"dependency_sharing_mode",`${p} # "isolated" or "shared-runtime-caches" or "shared-node-deps"`);}else if(c.startsWith("rules.")){let p=c.slice(6);if(!(p in Qn))return console.log(s.red(`\u274C Unknown policy rule: ${p}`)),1;let d=fa(o);if(d===null)return console.log(s.red("\u274C Rule values must be boolean: true | false")),1;l=pa(l,p,d);}else return console.log(s.red(`\u274C Unknown policy key: ${c}`)),1;await ma(t,l);let u=In(l);return console.log(s.green(`\u2705 Updated ${c} in .rapidkit/policies.yml`)),console.log(s.gray(` mode: ${u.mode}`)),console.log(s.gray(` dependency_sharing_mode: ${u.dependency_sharing_mode}`)),console.log(s.gray(" Tip: run `npx rapidkit workspace policy show` to inspect all values.")),0}async function Tn(t){if(t.includes("--help")||t.includes("-h"))return console.log(s.yellow("Usage: rapidkit mirror <status|sync|verify|rotate> [--json]")),0;let e=(t[1]||"status").toLowerCase(),r=t.includes("--json"),o=H(process.cwd());if(!o)return console.log(s.red("\u274C Not inside a RapidKit workspace")),console.log(s.gray("\u{1F4A1} Run this command from within a workspace directory")),1;let n=y__default.join(o,".rapidkit"),i=y__default.join(n,"mirror-config.json"),c=y__default.join(n,"mirror.lock"),a=y__default.join(n,"mirror","artifacts"),l=y__default.join(n,"reports");async function u(p){let d=new Date().toISOString().replace(/[:.]/g,"-"),f=y__default.join(l,`mirror-ops-${d}.json`),h=y__default.join(l,"mirror-ops.latest.json");await E__default.ensureDir(l),await Ze(f,p),await Ze(h,p);}if(e==="status"){if(!await E__default.pathExists(i))try{let b={schema_version:"1.0",enabled:false,strategy:"on-demand",artifacts:[],created_at:new Date().toISOString(),note:"Auto-generated by rapidkit mirror status. Set enabled: true and add artifact entries to activate mirroring."};await E__default.ensureDir(n),await P.promises.writeFile(i,JSON.stringify(b,null,2)+`
|
|
175
175
|
`,"utf-8"),console.log(s.gray(" mirror-config.json created with defaults (.rapidkit/mirror-config.json)"));}catch{}let d=await E__default.pathExists(i),f=await E__default.pathExists(a),h=await E__default.pathExists(c),m=f?(await P.promises.readdir(a,{withFileTypes:true})).filter(b=>b.isFile()).length:0,g={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:o,mirror:{configExists:d,lockExists:h,artifactsCount:m}};return await u(g),r?(process.stdout.write(`${JSON.stringify(g,null,2)}
|
|
176
176
|
`),0):(console.log(s.cyan("RapidKit mirror status")),console.log(s.gray(`Workspace: ${o}`)),console.log(s.gray(`Config: ${d?"present":"missing"} (${i})`)),console.log(s.gray(`Lock: ${h?"present":"missing"} (${c})`)),console.log(s.gray(`Artifacts: ${m}`)),0)}if(e==="sync"||e==="verify"||e==="rotate"){let p=await jr(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)}
|
|
177
177
|
`),1;console.log(s.red("\u274C Mirror verify failed."));for(let g of p.checks.filter(b=>b.id.startsWith("mirror.verify.")))console.log(s.gray(`- ${g.id}: ${g.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)}
|
|
178
178
|
`),1;console.log(s.yellow(`\u26A0\uFE0F Mirror ${e} completed with ${d.length} issue(s).`));for(let g of d)console.log(s.gray(`- ${g.id}: ${g.message}`));return 1}let h={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:o,details:p.details,checks:p.checks};return await u(h),r?(process.stdout.write(`${JSON.stringify(h,null,2)}
|
|
179
|
-
`),0):e==="rotate"?(console.log(s.green(`\u2705 Mirror rotate completed. Rotated files: ${p.details.rotatedFiles}.`)),0):e==="verify"?(console.log(s.green(`\u2705 Mirror verify completed. Verified artifacts: ${p.details.verifiedArtifacts}.`)),0):(console.log(s.green(`\u2705 Mirror sync completed. Synced artifacts: ${p.details.syncedArtifacts}.`)),0)}return console.log(s.yellow("Usage: rapidkit mirror <status|sync|verify|rotate> [--json]")),1}async function Gr(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
|
|
180
|
-
`).toLowerCase(),x=C.includes("\\.rapidkit\\rapidkit"),_=C.includes("\\.rapidkit\\rapidkit.cmd")||C.includes("\\.rapidkit\\rapidkit.exe")||C.includes("\\.venv\\scripts\\rapidkit.exe");return x&&!_}catch{return false}},e=process.cwd(),r=process.argv.slice(2),o=r[0],n=o==="init",i=new Set(["dev","start","build","test"]),c=!o||o==="--help"||o==="-h"||o==="help",a$2=et(e),l=P.existsSync(y__default.join(e,".rapidkit","project.json")),u=a$4(e),p=b$2(u,e)||c$1(u,e),d=!!o&&i.has(o)&&p;if(Rt(r)||r[0]==="create")return false;if(Kr(r))return true;if(r[0]==="init"&&a$2&&!l)return false;if(
|
|
179
|
+
`),0):e==="rotate"?(console.log(s.green(`\u2705 Mirror rotate completed. Rotated files: ${p.details.rotatedFiles}.`)),0):e==="verify"?(console.log(s.green(`\u2705 Mirror verify completed. Verified artifacts: ${p.details.verifiedArtifacts}.`)),0):(console.log(s.green(`\u2705 Mirror sync completed. Synced artifacts: ${p.details.syncedArtifacts}.`)),0)}return console.log(s.yellow("Usage: rapidkit mirror <status|sync|verify|rotate> [--json]")),1}async function Gr(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 es(r,async()=>{let n=H(r),i=Fe("python",{runCommandInCwd:L,runCoreRapidkit:e$1}),c=Fe("dotnet",{runCommandInCwd:L,runCoreRapidkit:e$1}),a=t.slice(1).filter(m=>!m.startsWith("-"));if(a.length>0){let m=y__default.resolve(r,a[0]),g=a$4(m),b=await Ct(m);return b$2(g,m)||b==="go"?await Wr(m):d(g,m)||b==="java"?await Xe("init",m):e$2(g,m)||b==="dotnet"?ue(await c.initProject(m)):c$1(g,m)||b==="node"?await Dr(m):f$1(g,m)||b==="python"?await Nr(m,i):await e$1(t,{cwd:r})}let l=a$4(r),u=!!H(r)&&r===H(r);if(!u&&b$2(l,r))return await Wr(r);let p=await Ct(r);if(!u&&(d(l,r)||p==="java"))return await Xe("init",r);if(!u&&(e$2(l,r)||p==="dotnet"))return ue(await c.initProject(r));if(!u&&(c$1(l,r)||p==="node"))return await Dr(r);if(!u&&(f$1(l,r)||p==="python"))return await Nr(r,i);let d$1=n||H(r),f=Yn(r),h=f?y__default.dirname(y__default.dirname(f)):null;if(h&&h!==d$1){let m=a$4(h),g=await Ct(h);return b$2(m,h)||g==="go"?await Wr(h):d(m,h)||g==="java"?await Xe("init",h):e$2(m,h)||g==="dotnet"?ue(await c.initProject(h)):c$1(m,h)||g==="node"?await Dr(h):f$1(m,h)||g==="python"?await Nr(h,i):await e$1(["init"],{cwd:h})}if(d$1&&r===d$1){console.log(s.yellow("\u26A0\uFE0F Running `npx rapidkit init` at workspace root.")),console.log(s.gray(" Root `init`, `workspace init`, and `workspace run init` now share the same full-init flow:\n workspace-profile dependencies first, then project dependency initialization.\n"));let m=await Lr(d$1);if(m!==0)return m;let{runWorkspaceStage:g}=await import('./workspace-run-KMENEDIZ.js');return (await g({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:g}=ha(r),{createProject:b}=await import('./create-YPTSMFZH.js');return await b(g,{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 Wn(t){let e=H(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 i={};try{i=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 c=i.runtime??{},a=a$4(t);b$2(a,t)&&!c.go?.version?o.push("go.version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."):c$1(a,t)&&!c.node?.version?o.push("node.version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."):d(a,t)&&!c.java?.version?o.push("java.version is not pinned in toolchain.lock \u2014 run `rapidkit setup java` first."):e$2(a,t)&&!c.dotnet?.version?o.push("dotnet.version is not pinned in toolchain.lock \u2014 run `rapidkit setup dotnet` first."):f$1(a,t)&&!c.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(a,t)||c$1(a,t)||d(a,t)||e$2(a,t))?o.push('Workspace profile is "python-only" but this project is not Python.'):u==="node-only"&&(b$2(a,t)||f$1(a,t)||d(a,t)||e$2(a,t))?o.push('Workspace profile is "node-only" but this project is not Node.'):u==="go-only"&&(c$1(a,t)||f$1(a,t)||d(a,t)||e$2(a,t))?o.push('Workspace profile is "go-only" but this project is not Go.'):u==="java-only"&&(f$1(a,t)||c$1(a,t)||b$2(a,t)||e$2(a,t))?o.push('Workspace profile is "java-only" but this project is not Java.'):u==="dotnet-only"&&(f$1(a,t)||c$1(a,t)||b$2(a,t)||d(a,t))&&o.push('Workspace profile is "dotnet-only" but this project is not .NET.');}catch{}return o}async function ba(){let t=async w=>{if(!a()||!w.toLowerCase().endsWith(".cmd"))return false;try{let C=(await E__default.readFile(w,"utf8")).replace(/\r\n/g,`
|
|
180
|
+
`).toLowerCase(),x=C.includes("\\.rapidkit\\rapidkit"),_=C.includes("\\.rapidkit\\rapidkit.cmd")||C.includes("\\.rapidkit\\rapidkit.exe")||C.includes("\\.venv\\scripts\\rapidkit.exe");return x&&!_}catch{return false}},e=process.cwd(),r=process.argv.slice(2),o=r[0],n=o==="init",i=new Set(["dev","start","build","test"]),c=!o||o==="--help"||o==="-h"||o==="help",a$2=et(e),l=P.existsSync(y__default.join(e,".rapidkit","project.json")),u=a$4(e),p=b$2(u,e)||c$1(u,e),d=!!o&&i.has(o)&&p;if(Rt(r)||r[0]==="create")return false;if(Kr(r))return true;if(r[0]==="init"&&a$2&&!l)return false;if(zn(r))return true;try{let w=o==="shell"&&r[1]==="activate",k=o==="create",C=await po(e,{cwd:e,timeoutMs:1200});if(C.ok&&C.data?.isRapidkitProject&&C.data.engine==="python"){let x=k||Rt(r);if(!c&&!w&&!x&&!n&&!d){if(o&&_n.includes(o)){let T=await Wn(e).catch(()=>[]);if(T.length>0){process.stderr.write(s.red("\u274C Strict policy violations prevent running this command:")+`
|
|
181
181
|
`);for(let le of T)process.stderr.write(s.red(` \u2022 ${le}`)+`
|
|
182
|
-
`);process.exit(1);}}let _=await e$1(process.argv.slice(2),{cwd:e});process.exit(_);}}}catch{}let f=
|
|
182
|
+
`);process.exit(1);}}let _=await e$1(process.argv.slice(2),{cwd:e});process.exit(_);}}}catch{}let f=Yn(e),h=a(),m=i$1(e),g=null;for(let w of m)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}g=w;break}let b=o==="create";if(o==="init"&&a$2&&!l)return false;if(o&&_n.includes(o)){let w=await Wn(e);if(w.length>0){process.stderr.write(s.red("\u274C Strict policy violations prevent running this command:")+`
|
|
183
183
|
`);for(let k of w)process.stderr.write(s.red(` \u2022 ${k}`)+`
|
|
184
|
-
`);process.exit(1);}}if(g&&o&&
|
|
184
|
+
`);process.exit(1);}}if(g&&o&&Rn.includes(o)&&!b&&!n&&!d){a$1.debug(`Delegating to local CLI: ${g} ${r.join(" ")}`);let w=o==="init"?Cn():process.env,k=spawn(g,r,{stdio:"inherit",cwd:e,shell:h,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(f&&await E__default.pathExists(f))try{if((await E__default.readJson(f)).engine==="pip"){let k=r[0],C=i$1(e),x=null;for(let _ of C)if(await E__default.pathExists(_)){if(await t(_)){a$1.warn(`Skipping legacy/broken Windows launcher candidate: ${_}. Falling back to core bridge.`);continue}x=_;break}if(x&&k&&Rn.includes(k)&&k!=="init"&&!d){a$1.debug(`Delegating to local CLI (early detection): ${x} ${r.join(" ")}`);let _=k==="init"?Cn():process.env,T=spawn(x,r,{stdio:"inherit",cwd:e,env:_});return T.on("close",le=>process.exit(le??0)),T.on("error",le=>{a$1.error(`Failed to run local rapidkit: ${le.message}`),process.exit(1);}),true}if(k==="shell"&&r[1]==="activate"){let _=a()?`# RapidKit: activation snippet (PowerShell)
|
|
185
185
|
$venv = ".venv"
|
|
186
186
|
if (Test-Path "$venv\\Scripts\\Activate.ps1") { . "$venv\\Scripts\\Activate.ps1" }
|
|
187
187
|
$env:RAPIDKIT_PROJECT_ROOT = (Get-Location).Path
|
|
@@ -203,7 +203,7 @@ export PATH="$(pwd)/.rapidkit:$(pwd):$PATH"
|
|
|
203
203
|
\u2705 Activation snippet \u2014 run the following to activate this project in your current shell:
|
|
204
204
|
`)),console.log(_),console.log(s.gray(`
|
|
205
205
|
\u{1F4A1} After activation you can run: rapidkit dev
|
|
206
|
-
`)),process.exit(0);}if(!c&&!Rt(r)&&k!=="init"&&!d){let _=await e$1(r,{cwd:e});process.exit(_);}}}catch{}return false}var ze=null,er=false,ce=new Command,ja=process.env.RAPIDKIT_SHOW_LEGACY==="1"||process.env.RAPIDKIT_SHOW_LEGACY?.toLowerCase()==="true";async function Sa(t){if(t.length===0)return false;let e=t[0],r=t[1];if(k(t)||ra.includes(e))return false;if(
|
|
206
|
+
`)),process.exit(0);}if(!c&&!Rt(r)&&k!=="init"&&!d){let _=await e$1(r,{cwd:e});process.exit(_);}}}catch{}return false}var ze=null,er=false,ce=new Command,ja=process.env.RAPIDKIT_SHOW_LEGACY==="1"||process.env.RAPIDKIT_SHOW_LEGACY?.toLowerCase()==="true";async function Sa(t){if(t.length===0)return false;let e=t[0],r=t[1];if(k(t)||ra.includes(e))return false;if(qn.includes(e))return true;if(Rt(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=new Set(["--yes","-y","--skip-git","--skip-install","--debug","--dry-run","--no-update-check","--create-workspace","--no-workspace"]);if(t.some(i=>o.has(i)))return false;let n=await i$2();return n?n.has(e):!!(a$5.has(e)||t.length>1)}ce.name("rapidkit").description("Create RapidKit workspaces and projects").version(b());var xa=a()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";ce.addHelpText("beforeAll",`RapidKit NPM CLI
|
|
207
207
|
|
|
208
208
|
Create workspaces, scaffold projects, and manage your development toolchain.
|
|
209
209
|
`);ce.addHelpText("afterAll",`
|
|
@@ -241,7 +241,7 @@ Notes:
|
|
|
241
241
|
Use "rapidkit help <command>" for more information.
|
|
242
242
|
`);ce.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(s.blue.bold(`
|
|
243
243
|
\u{1F680} Welcome to RapidKit NPM CLI!
|
|
244
|
-
`)),t||(
|
|
244
|
+
`)),t||(ts(),process.exit(0));try{Dt(t);}catch(a){throw a instanceof e&&(a$1.error(`
|
|
245
245
|
\u274C ${a.message}`),a.details&&a$1.warn(`\u{1F4A1} ${a.details}
|
|
246
246
|
`),process.exit(1)),a}let i=y__default.resolve(process.cwd(),t);ze=i,await E__default.pathExists(i)&&(a$1.error(`
|
|
247
247
|
\u274C Directory "${t}" already exists`),console.log(s.cyan(`
|
|
@@ -249,15 +249,15 @@ Use "rapidkit help <command>" for more information.
|
|
|
249
249
|
`)),process.exit(1));let c$1=!!e$2.template;if(e$2.dryRun){console.log(s.cyan(`
|
|
250
250
|
\u{1F50D} Dry-run mode - showing what would be created:
|
|
251
251
|
`)),console.log(s.white("\u{1F4C2} Path:"),i),console.log(s.white("\u{1F4E6} Type:"),c$1?`Project (${e$2.template})`:"Workspace"),console.log();return}if(!e$2.yes&&!c$1?await Je.prompt([{type:"input",name:"author",message:"Author name:",default:process.env.USER||"RapidKit User"}]):e$2.yes&&console.log(s.gray(`Using default values (--yes flag)
|
|
252
|
-
`)),c$1){let a=String(e$2.template||"").trim(),l=
|
|
252
|
+
`)),c$1){let a=String(e$2.template||"").trim(),l=Ho(a);if(kt(l)){let w=await tr(["create","project",l,t,...e$2.skipGit?["--skip-git"]:[]]);w!==0&&process.exit(w);return}if(!!!Jr(process.cwd())){let{registerWorkspaceAtPath:w}=await import('./create-YPTSMFZH.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 Je.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 p=["create","project",l,t,"--output",process.cwd()];e$2.yes&&p.push("--yes");let d=H(process.cwd()),f$1=!!e$2.skipInstall,h=f$1||!!d;f$1&&p.push("--skip-essentials");let m=h?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0,g=await f(p,{cwd:process.cwd(),env:m});g!==0&&process.exit(g),d&&!e$2.skipInstall&&(console.log(s.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(s.white(" Next: cd <project-name> && npx rapidkit init")));let b=Jr(process.cwd());if(b){let w=y__default.dirname(b),k=y__default.join(w,".python-version"),C=y__default.join(i,".python-version");try{if(await E__default.pathExists(k)){let x=P.readFileSync(k,"utf-8");P.writeFileSync(C,x.trim()+`
|
|
253
253
|
`),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",i],{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(i,".python-version");try{if(await E__default.pathExists(C)){let _=P.readFileSync(C,"utf-8");P.writeFileSync(x,_.trim()+`
|
|
254
|
-
`),a$1.debug(`Re-synced Python version ${_.trim()} after init`);}}catch(_){a$1.debug("Could not re-sync Python version after init:",_);}}}}else {let{createProject:a}=await import('./create-
|
|
254
|
+
`),a$1.debug(`Re-synced Python version ${_.trim()} after init`);}}catch(_){a$1.debug("Could not re-sync Python version after init:",_);}}}}else {let{createProject:a}=await import('./create-YPTSMFZH.js');await a(t,{skipGit:e$2.skipGit,dryRun:e$2.dryRun,yes:e$2.yes,userConfig:n,installMethod:e$2.installMethod,profile:e$2.profile});}}catch(r){r instanceof e?(a$1.error(`
|
|
255
255
|
\u274C ${r.message}`),r.details&&a$1.warn(`\u{1F4A1} ${r.details}`),a$1.debug("Error code:",r.code)):(a$1.error(`
|
|
256
|
-
\u274C An unexpected error occurred:`),console.error(r)),process.exit(1);}finally{ze=null;}});To(ce);Lo(ce);ce.command("commands").description("Show effective RapidKit command ownership and runtime support").option("--json","Emit machine-readable JSON output").action(async t=>{aa({json:t.json});});ce.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-ZQHLV2YK.js'),o=await e({workspacePath:t.workspace,json:t.json===true,output:t.output,strict:t.strict===true});t.json?console.log(JSON.stringify(o,null,2)):r(o),o.summary.verdict==="blocked"&&process.exit(2);}catch(e){let r=e instanceof Error?e.message:String(e);t.json?console.log(JSON.stringify({schemaVersion:"rapidkit-analyze-error-v1",ok:false,error:{message:r}},null,2)):console.error(s.red(`Analyze failed: ${r}`)),process.exit(1);}});yo(ce);ce.command("shell <action>").description("Shell helpers (activate virtualenv in current shell)").action(async t=>{t!=="activate"&&(console.log(s.red(`Unknown shell command: ${t}`)),process.exit(1));let e=process.cwd();function r(l){let u=l;for(;;){let p=y__default.join(u,".rapidkit","context.json");if(P.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(P.existsSync(d)||P.existsSync(p))return {venv:p,activateFile:d};let f=y__default.dirname(u);if(f===u)break;u=f;}return null}let i=n(e);!o&&!i&&(console.log(s.yellow("No RapidKit project found in this directory")),process.exit(1));let c;i&&P.existsSync(i.activateFile)?c=i.activateFile:i&&P.existsSync(i.venv)?c=h(i.venv):(console.log(s.yellow("No virtual environment found")),process.exit(1));let a$1=a();console.log(a$1?`call "${c}"`:`. "${c}"`);});ce.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 en(t);});ce.command("autopilot <action>").description("Run end-to-end release autopilot workflows").option("--mode <mode>","Autopilot mode: audit | safe-fix | enforce","audit").option("--json","Emit machine-readable JSON output").option("--output <file>","Write autopilot report to an additional output path").option("--since <ref>","Git ref for affected project selection (default: HEAD~1)").option("--parallel","Run workspace stage execution in parallel").option("--max-workers <count>","Maximum parallel workers").action(async(t,e)=>{t!=="release"&&(console.log(s.red(`Unknown autopilot action: ${t}`)),console.log(s.gray("Available: release")),process.exit(1));let r=String(e.mode||"audit").trim().toLowerCase();["audit","safe-fix","enforce"].includes(r)||(console.log(s.red(`Invalid autopilot mode: ${e.mode}`)),console.log(s.gray("Allowed modes: audit | safe-fix | enforce")),process.exit(1));let o=Number(e.maxWorkers??""),n=Number.isFinite(o)?Math.max(1,Math.trunc(o)):void 0,{runAutopilotRelease:i}=await import('./autopilot-release-WYDX67HR.js'),c;try{c=await i({workspacePath:process.cwd(),mode:r,since:e.since,parallel:e.parallel===true,maxWorkers:n,json:e.json===true,output:e.output});}catch(a){let l=a instanceof Error?a.message:String(a);console.log(s.red(`Autopilot release failed: ${l}`)),process.exit(3);}e.json&&console.log(JSON.stringify(c,null,2)),c.summary.exitCode!==0&&process.exit(c.summary.exitCode);});ce.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 ga(t,e);r!==0&&process.exit(r);});var rr=ce.command("snapshot").description("Create, list, and restore RapidKit workspace snapshots");rr.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 dt({workspacePath:e.workspace,name:t,reason:e.reason,includeProjects:e.includeProjects===true});if(e.json){console.log(JSON.stringify(r,null,2));return}console.log(s.green(`\u2714 Workspace snapshot created: ${r.manifest.name}`)),console.log(s.gray(` Mode: ${r.manifest.mode}`)),console.log(s.gray(` Path: ${r.snapshotPath}`));}catch(r){console.log(s.red(`\u274C Snapshot create failed: ${r.message}`)),process.exit(1);}});rr.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 vn({workspacePath:t.workspace});if(t.json){console.log(JSON.stringify({snapshots:e},null,2));return}if(e.length===0){console.log(s.yellow("No workspace snapshots found."));return}for(let r of e)console.log(s.cyan(r.name)),console.log(s.gray(` ${r.createdAt} | ${r.mode} | ${r.projects.length} project(s)`)),console.log(s.gray(` ${r.snapshotPath}`));}catch(e){console.log(s.red(`\u274C Snapshot list failed: ${e.message}`)),process.exit(1);}});rr.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 kn({workspacePath:e.workspace,name:t});if(e.json){console.log(JSON.stringify(r,null,2));return}console.log(s.cyan(`Snapshot: ${r.manifest.name}`)),console.log(s.gray(` Mode: ${r.manifest.mode}`)),console.log(s.gray(` Created: ${r.manifest.createdAt}`)),console.log(s.gray(` Projects: ${r.manifest.projects.length}`)),console.log(s.gray(` Files: ${r.estimatedFileCount}`)),console.log(s.gray(` Bytes: ${r.estimatedBytes}`)),console.log(s.gray(` Path: ${r.snapshotPath}`));}catch(r){console.log(s.red(`\u274C Snapshot inspect failed: ${r.message}`)),process.exit(1);}});rr.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 Pn({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(s.cyan(`Snapshot restore dry-run: ${t}`)):console.log(s.green(`\u2714 Workspace snapshot restored: ${t}`)),console.log(s.gray(` Snapshot: ${r.snapshotPath}`)),console.log(s.gray(` Restored paths: ${r.restoredPaths.join(", ")}`)),r.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(s.red(`\u274C Snapshot restore failed: ${r.message}`)),process.exit(1);}});var _t=ce.command("project").description("Safe workspace project lifecycle operations");_t.command("commands").description("Show effective commands supported by the current RapidKit project").option("--json","Emit machine-readable JSON output").action(async t=>{Yn({json:t.json});});_t.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 $r({workspacePath:t.workspace});if(t.json){console.log(JSON.stringify({archives:e},null,2));return}if(e.length===0){console.log(s.yellow("No archived projects found."));return}for(let r of e)console.log(s.cyan(r.projectName)),console.log(s.gray(` Archived: ${r.archivedAt}`)),console.log(s.gray(` Path: ${r.archivePath}`)),r.reason&&console.log(s.gray(` Reason: ${r.reason}`));}catch(e){console.log(s.red(`\u274C Project archive list failed: ${e.message}`)),process.exit(1);}});_t.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 Or({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?s.cyan(`Project archive dry-run: ${r.projectName}`):s.green(`\u2714 Project archived: ${r.projectName}`)),console.log(s.gray(` From: ${r.projectPath}`)),r.archivePath&&console.log(s.gray(` To: ${r.archivePath}`)),r.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(s.red(`\u274C Project archive failed: ${r.message}`)),process.exit(1);}});_t.command("restore <archive>").description("Restore an archived project back into the workspace").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--name <projectName>","Restore using a new project folder name").option("--reason <text>","Reason recorded in the audit log").option("--force","Overwrite an existing restore target").option("--dry-run","Show what would be restored without changing files").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let r=await Cn({workspacePath:e.workspace,archive:t,targetName:e.name,reason:e.reason,force:e.force===true,dryRun:e.dryRun===true});if(e.json){console.log(JSON.stringify(r,null,2));return}console.log(r.dryRun?s.cyan(`Project restore dry-run: ${r.projectName}`):s.green(`\u2714 Project restored: ${r.projectName}`)),console.log(s.gray(` From: ${r.archivePath}`)),console.log(s.gray(` To: ${r.projectPath}`)),r.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(s.red(`\u274C Project restore failed: ${r.message}`)),process.exit(1);}});_t.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 xn({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?s.cyan(`Project ${o} dry-run: ${r.projectName}`):s.green(`\u2714 Project ${o}: ${r.projectName}`)),console.log(s.gray(` Path: ${r.projectPath}`)),r.archivePath&&console.log(s.gray(` Archive: ${r.archivePath}`)),r.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(s.red(`\u274C Project delete failed: ${r.message}`)),process.exit(1);}});ce.command("doctor [scope]").description("\u{1FA7A} Check RapidKit system health by default; use workspace or project for scoped checks").option("--workspace","Check entire workspace (including all projects)").option("--project","Check only the current project (or nearest parent project)").option("--json","Output results in JSON format (for CI/CD pipelines)").option("--fix","Automatically fix common issues (with confirmation)").option("--plan","Generate remediation plan without applying changes").option("--apply","Apply remediation plan non-interactively").action(async(t,e)=>{t&&t!=="workspace"&&t!=="project"&&(console.log(s.red(`Unknown doctor scope: ${t}`)),console.log(s.gray("Available: workspace, project")),console.log(s.gray("Usage: npx rapidkit doctor | npx rapidkit doctor workspace | npx rapidkit doctor project")),process.exit(1)),e.plan&&(e.fix||e.apply)&&(console.log(s.red("Invalid doctor flags: --plan cannot be combined with --fix or --apply")),process.exit(1));let r=await ca({scope:t,workspaceFlag:e.workspace});r.detected&&!e.json&&(console.log(s.yellow("\u26A0\uFE0F Local launcher shadow detected for doctor workspace checks.")),r.candidatePath&&console.log(s.gray(` Candidate: ${r.candidatePath}`)),console.log(s.gray(" Running npm-wrapper doctor workflow directly as safe fallback to avoid ambiguous rapidkit binary resolution.")),console.log(s.gray(" If this happens in a shell call, run: npx --yes --package rapidkit rapidkit doctor workspace")));let{runDoctor:o}=await import('./doctor-SGPUU7UT.js');await o({...e,workspace:e.workspace||t==="workspace",project:e.project||t==="project"});});ce.command("workspace <action> [subaction] [key] [value]").description(`Manage RapidKit workspaces (list, sync, policy, share, export, hydrate, run)
|
|
256
|
+
\u274C An unexpected error occurred:`),console.error(r)),process.exit(1);}finally{ze=null;}});To(ce);Lo(ce);ce.command("commands").description("Show effective RapidKit command ownership and runtime support").option("--json","Emit machine-readable JSON output").action(async t=>{aa({json:t.json});});ce.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-ZQHLV2YK.js'),o=await e({workspacePath:t.workspace,json:t.json===true,output:t.output,strict:t.strict===true});t.json?console.log(JSON.stringify(o,null,2)):r(o),o.summary.verdict==="blocked"&&process.exit(2);}catch(e){let r=e instanceof Error?e.message:String(e);t.json?console.log(JSON.stringify({schemaVersion:"rapidkit-analyze-error-v1",ok:false,error:{message:r}},null,2)):console.error(s.red(`Analyze failed: ${r}`)),process.exit(1);}});yo(ce);ce.command("shell <action>").description("Shell helpers (activate virtualenv in current shell)").action(async t=>{t!=="activate"&&(console.log(s.red(`Unknown shell command: ${t}`)),process.exit(1));let e=process.cwd();function r(l){let u=l;for(;;){let p=y__default.join(u,".rapidkit","context.json");if(P.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(P.existsSync(d)||P.existsSync(p))return {venv:p,activateFile:d};let f=y__default.dirname(u);if(f===u)break;u=f;}return null}let i=n(e);!o&&!i&&(console.log(s.yellow("No RapidKit project found in this directory")),process.exit(1));let c;i&&P.existsSync(i.activateFile)?c=i.activateFile:i&&P.existsSync(i.venv)?c=h(i.venv):(console.log(s.yellow("No virtual environment found")),process.exit(1));let a$1=a();console.log(a$1?`call "${c}"`:`. "${c}"`);});ce.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 Zo(t);});ce.command("autopilot <action>").description("Run end-to-end release autopilot workflows").option("--mode <mode>","Autopilot mode: audit | safe-fix | enforce","audit").option("--json","Emit machine-readable JSON output").option("--output <file>","Write autopilot report to an additional output path").option("--since <ref>","Git ref for affected project selection (default: HEAD~1)").option("--parallel","Run workspace stage execution in parallel").option("--max-workers <count>","Maximum parallel workers").action(async(t,e)=>{t!=="release"&&(console.log(s.red(`Unknown autopilot action: ${t}`)),console.log(s.gray("Available: release")),process.exit(1));let r=String(e.mode||"audit").trim().toLowerCase();["audit","safe-fix","enforce"].includes(r)||(console.log(s.red(`Invalid autopilot mode: ${e.mode}`)),console.log(s.gray("Allowed modes: audit | safe-fix | enforce")),process.exit(1));let o=Number(e.maxWorkers??""),n=Number.isFinite(o)?Math.max(1,Math.trunc(o)):void 0,{runAutopilotRelease:i}=await import('./autopilot-release-BQT23OL7.js'),c;try{c=await i({workspacePath:process.cwd(),mode:r,since:e.since,parallel:e.parallel===true,maxWorkers:n,json:e.json===true,output:e.output});}catch(a){let l=a instanceof Error?a.message:String(a);console.log(s.red(`Autopilot release failed: ${l}`)),process.exit(3);}e.json&&console.log(JSON.stringify(c,null,2)),c.summary.exitCode!==0&&process.exit(c.summary.exitCode);});ce.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 ga(t,e);r!==0&&process.exit(r);});var rr=ce.command("snapshot").description("Create, list, and restore RapidKit workspace snapshots");rr.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 dt({workspacePath:e.workspace,name:t,reason:e.reason,includeProjects:e.includeProjects===true});if(e.json){console.log(JSON.stringify(r,null,2));return}console.log(s.green(`\u2714 Workspace snapshot created: ${r.manifest.name}`)),console.log(s.gray(` Mode: ${r.manifest.mode}`)),console.log(s.gray(` Path: ${r.snapshotPath}`));}catch(r){console.log(s.red(`\u274C Snapshot create failed: ${r.message}`)),process.exit(1);}});rr.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 wn({workspacePath:t.workspace});if(t.json){console.log(JSON.stringify({snapshots:e},null,2));return}if(e.length===0){console.log(s.yellow("No workspace snapshots found."));return}for(let r of e)console.log(s.cyan(r.name)),console.log(s.gray(` ${r.createdAt} | ${r.mode} | ${r.projects.length} project(s)`)),console.log(s.gray(` ${r.snapshotPath}`));}catch(e){console.log(s.red(`\u274C Snapshot list failed: ${e.message}`)),process.exit(1);}});rr.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 yn({workspacePath:e.workspace,name:t});if(e.json){console.log(JSON.stringify(r,null,2));return}console.log(s.cyan(`Snapshot: ${r.manifest.name}`)),console.log(s.gray(` Mode: ${r.manifest.mode}`)),console.log(s.gray(` Created: ${r.manifest.createdAt}`)),console.log(s.gray(` Projects: ${r.manifest.projects.length}`)),console.log(s.gray(` Files: ${r.estimatedFileCount}`)),console.log(s.gray(` Bytes: ${r.estimatedBytes}`)),console.log(s.gray(` Path: ${r.snapshotPath}`));}catch(r){console.log(s.red(`\u274C Snapshot inspect failed: ${r.message}`)),process.exit(1);}});rr.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 kn({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(s.cyan(`Snapshot restore dry-run: ${t}`)):console.log(s.green(`\u2714 Workspace snapshot restored: ${t}`)),console.log(s.gray(` Snapshot: ${r.snapshotPath}`)),console.log(s.gray(` Restored paths: ${r.restoredPaths.join(", ")}`)),r.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(s.red(`\u274C Snapshot restore failed: ${r.message}`)),process.exit(1);}});var _t=ce.command("project").description("Safe workspace project lifecycle operations");_t.command("commands").description("Show effective commands supported by the current RapidKit project").option("--json","Emit machine-readable JSON output").action(async t=>{Hn({json:t.json});});_t.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 $r({workspacePath:t.workspace});if(t.json){console.log(JSON.stringify({archives:e},null,2));return}if(e.length===0){console.log(s.yellow("No archived projects found."));return}for(let r of e)console.log(s.cyan(r.projectName)),console.log(s.gray(` Archived: ${r.archivedAt}`)),console.log(s.gray(` Path: ${r.archivePath}`)),r.reason&&console.log(s.gray(` Reason: ${r.reason}`));}catch(e){console.log(s.red(`\u274C Project archive list failed: ${e.message}`)),process.exit(1);}});_t.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 Mr({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?s.cyan(`Project archive dry-run: ${r.projectName}`):s.green(`\u2714 Project archived: ${r.projectName}`)),console.log(s.gray(` From: ${r.projectPath}`)),r.archivePath&&console.log(s.gray(` To: ${r.archivePath}`)),r.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(s.red(`\u274C Project archive failed: ${r.message}`)),process.exit(1);}});_t.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 Sn({workspacePath:e.workspace,archive:t,targetName:e.name,reason:e.reason,force:e.force===true,dryRun:e.dryRun===true});if(e.json){console.log(JSON.stringify(r,null,2));return}console.log(r.dryRun?s.cyan(`Project restore dry-run: ${r.projectName}`):s.green(`\u2714 Project restored: ${r.projectName}`)),console.log(s.gray(` From: ${r.archivePath}`)),console.log(s.gray(` To: ${r.projectPath}`)),r.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(s.red(`\u274C Project restore failed: ${r.message}`)),process.exit(1);}});_t.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 jn({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?s.cyan(`Project ${o} dry-run: ${r.projectName}`):s.green(`\u2714 Project ${o}: ${r.projectName}`)),console.log(s.gray(` Path: ${r.projectPath}`)),r.archivePath&&console.log(s.gray(` Archive: ${r.archivePath}`)),r.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(s.red(`\u274C Project delete failed: ${r.message}`)),process.exit(1);}});ce.command("doctor [scope]").description("\u{1FA7A} Check RapidKit system health by default; use workspace or project for scoped checks").option("--workspace","Check entire workspace (including all projects)").option("--project","Check only the current project (or nearest parent project)").option("--json","Output results in JSON format (for CI/CD pipelines)").option("--fix","Automatically fix common issues (with confirmation)").option("--plan","Generate remediation plan without applying changes").option("--apply","Apply remediation plan non-interactively").action(async(t,e)=>{t&&t!=="workspace"&&t!=="project"&&(console.log(s.red(`Unknown doctor scope: ${t}`)),console.log(s.gray("Available: workspace, project")),console.log(s.gray("Usage: npx rapidkit doctor | npx rapidkit doctor workspace | npx rapidkit doctor project")),process.exit(1)),e.plan&&(e.fix||e.apply)&&(console.log(s.red("Invalid doctor flags: --plan cannot be combined with --fix or --apply")),process.exit(1));let r=await ca({scope:t,workspaceFlag:e.workspace});r.detected&&!e.json&&(console.log(s.yellow("\u26A0\uFE0F Local launcher shadow detected for doctor workspace checks.")),r.candidatePath&&console.log(s.gray(` Candidate: ${r.candidatePath}`)),console.log(s.gray(" Running npm-wrapper doctor workflow directly as safe fallback to avoid ambiguous rapidkit binary resolution.")),console.log(s.gray(" If this happens in a shell call, run: npx --yes --package rapidkit rapidkit doctor workspace")));let{runDoctor:o}=await import('./doctor-SGPUU7UT.js');await o({...e,workspace:e.workspace||t==="workspace",project:e.project||t==="project"});});ce.command("workspace <action> [subaction] [key] [value]").description(`Manage RapidKit workspaces (list, sync, policy, share, export, hydrate, run)
|
|
257
257
|
workspace run <stage> \u2014 fleet stage execution across discovered projects
|
|
258
|
-
stages: init | test | build | start (dev excluded by design)`).option("--output <file>","Output file path for workspace share bundle").option("--include-paths","Include absolute paths in workspace share bundle").option("--no-doctor","Exclude doctor evidence in workspace share bundle").option("--no-blueprint","Exclude reproducibility blueprint from workspace share bundle").option("--include-env","Include .env/private key files in workspace export archive").option("--force","Overwrite an existing hydrate output directory").option("--dry-run","Preview hydrate without writing files").option("--affected","Run only affected projects (requires git diff context)").option("--blast-radius","Include downstream dependents from workspace dependency graph").option("--since <ref>","Git ref for affected calculation (default: HEAD~1)").option("--parallel","Run project stages in parallel").option("--max-workers <count>","Maximum parallel workers (default: min(4, selected))").option("--continue-on-error","Continue running remaining projects after a failure").option("--json","Emit machine-readable JSON output").option("--strict","Return non-zero exit on warn/fail gate outcomes").option("--no-gates","Skip doctor/readiness pre-run gates").action(async function(t,e,r,o){let n=this.opts(),i=a=>{let l=H(process.cwd());l||(console.log(s.red("\u274C Not inside a RapidKit workspace")),console.log(s.gray("\u{1F4A1} Run this command from within a workspace directory")),process.exit(1));let u=y__default.resolve(process.cwd()),p=y__default.resolve(l);return u!==p&&(console.log(s.red(`\u274C Workspace action "${a}" must be run from workspace root.`)),console.log(s.gray(`\u{1F4A1} Workspace root: ${l}`)),console.log(s.white(` cd ${l}`)),(a==="run init"||a==="init")&&console.log(s.gray(" For project-only init in the current directory, run: npx rapidkit init")),process.exit(1)),l},c=a=>process.argv.includes(a);if(t==="list"){let{listWorkspaces:a}=await import('./workspace-EHYCBFXL.js');await a();}else if(t==="sync"){let a=i("sync"),{syncWorkspaceProjects:l}=await import('./workspace-EHYCBFXL.js');console.log(s.cyan(`\u{1F4C2} Scanning workspace: ${y__default.basename(a)}`)),await l(a),await pt(a);}else if(t==="policy"){let a=i("policy"),l=await Pa(a,e,r,o);l!==0&&process.exit(l);}else if(t==="contract"){let a=i("contract"),{buildWorkspaceContractGraph:l,readWorkspaceContract:u,verifyWorkspaceContract:p,writeWorkspaceContract:d,WORKSPACE_CONTRACT_PATH:f}=await import('./workspace-contract-4UCEM44I.js'),h=e||"inspect",m=n.output;try{if(h==="init"){let g=await d({workspacePath:a,outputPath:m,force:n.force===true||c("--force")});if(n.json){console.log(JSON.stringify(g,null,2));return}console.log(s.green(`\u2714 Workspace contract initialized: ${g.contractPath}`)),console.log(s.gray(` Projects: ${g.contract.projects.length}`));return}if(h==="inspect"){let g=await u({workspacePath:a,contractPath:m});if(n.json){console.log(JSON.stringify(g,null,2));return}console.log(s.green(`\u2714 Workspace contract: ${g.contractPath}`)),console.log(s.gray(` Workspace: ${g.contract.workspace.name}`)),console.log(s.gray(` Projects: ${g.contract.projects.length}`)),console.log(s.gray(` Schema: v${g.contract.schemaVersion}`));return}if(h==="verify"){let g=await p({workspacePath:a,contractPath:m});if(n.json)console.log(JSON.stringify(g,null,2));else {let b=g.status==="passed"?s.green:s.red;console.log(b(`\u2714 Workspace contract verification ${g.status}: ${g.contractPath}`)),console.log(s.gray(` Projects: ${g.projectCount}`));for(let w of g.checks){let k=w.status==="passed"?"\u2714":"\u2718";console.log(s.gray(` ${k} ${w.id}: ${w.message}`));}for(let w of g.violations)console.log(s.gray(` Violation: ${w}`));}(g.status==="failed"||g.status!=="passed"&&n.strict)&&process.exit(1);return}if(h==="graph"){let g=await l({workspacePath:a,contractPath:m});if(n.json){console.log(JSON.stringify(g,null,2));return}console.log(s.green(`\u2714 Workspace contract graph: ${g.contractPath}`)),console.log(s.gray(` Workspace: ${g.graph.workspace.name}`)),console.log(s.gray(` Projects: ${g.graph.summary.projectCount}`)),console.log(s.gray(` Dependencies: ${g.graph.summary.dependencyEdges}`)),console.log(s.gray(` Event links: ${g.graph.summary.eventEdges}`)),console.log(s.gray(` Ports: ${g.graph.summary.portCount}`));for(let b of g.graph.nodes){let w=b.ports.map(k=>`${k.name}:${k.port}`).join(", ")||"none";console.log(s.gray(` \u2022 ${b.id} (${b.runtime||"unknown"}${b.framework?`/${b.framework}`:""}) ports=${w}`));}for(let b of g.graph.edges){let w=b.type==="event"?`event:${b.label}`:b.label;console.log(s.gray(` ${b.from} -> ${b.to} [${w}]`));}return}console.log(s.red(`\u274C Unknown workspace contract action: ${h}`)),console.log(s.white(` npx rapidkit workspace contract init|inspect|verify|graph [--output ${f}]`)),process.exit(1);}catch(g){console.log(s.red(`\u274C Workspace contract ${h} failed: ${g.message}`)),process.exit(1);}}else if(t==="share"){let a=i("share"),l=n.output||e,{createWorkspaceShareBundle:u}=await import('./workspace-EHYCBFXL.js'),p=await u(a,{outputPath:l,includePaths:n.includePaths===true,includeDoctorEvidence:n.doctor!==false,includeBlueprint:n.blueprint!==false});console.log(s.green(`\u2714 Workspace share bundle exported: ${p}`)),console.log(s.gray("Share this JSON with your team for reproducible workspace/project diagnostics."));}else if(t==="export"){let a=i("export"),{exportWorkspaceArchive:l}=await import('./workspace-archive-EJIGYKSR.js'),u=await l({workspacePath:a,outputPath:n.output||e,includeEnv:n.includeEnv===true||c("--include-env")});if(n.json){console.log(JSON.stringify(u,null,2));return}let p=(u.bytesWritten/(1024*1024)).toFixed(2);console.log(s.green(`\u2714 Workspace archive exported: ${u.archivePath}`)),console.log(s.gray(` Files: ${u.manifest.files.length}`)),console.log(s.gray(` Size: ${p} MB`)),u.manifest.security.envFilesIncluded||console.log(s.gray(" Secrets: excluded (.env, private keys, logs, dependency caches)"));}else if(t==="archive"&&(e==="inspect"||e==="verify"||e==="doctor")){let a=r;a||(console.log(s.red(`\u274C workspace archive ${e} requires an archive path or URL.`)),console.log(s.white(` npx rapidkit workspace archive ${e} team.rapidkit-archive.zip`)),process.exit(1));let{doctorWorkspaceArchive:l,inspectWorkspaceArchive:u,verifyWorkspaceArchive:p}=await import('./workspace-archive-EJIGYKSR.js');try{if(e==="inspect"){let f=await u({archivePathOrUrl:a});if(n.json){console.log(JSON.stringify(f,null,2));return}let h=(f.totalBytes/(1024*1024)).toFixed(2);console.log(s.green(`\u2714 Workspace archive: ${f.archivePath}`)),console.log(s.gray(` Workspace: ${f.manifest.workspaceName}`)),console.log(s.gray(` Exported: ${f.manifest.exportedAt}`)),console.log(s.gray(` Exporter: ${f.manifest.exportedBy||"unknown"}`)),console.log(s.gray(` Files: ${f.fileCount}`)),console.log(s.gray(` Payload: ${h} MB`));return}if(e==="doctor"){let f=await l({archivePathOrUrl:a,strict:n.strict===true||c("--strict")});if(n.json)console.log(JSON.stringify(f,null,2));else {let h=f.status==="passed"?s.green:f.status==="warning"?s.yellow:s.red;console.log(h(`\u2714 Workspace archive doctor ${f.status}: ${f.archivePath}`)),console.log(s.gray(` Workspace: ${f.workspaceName}`)),console.log(s.gray(` Files: ${f.fileCount}`));for(let m of f.checks){let g=m.status==="passed"?"\u2714":m.status==="warning"?"\u26A0":"\u2718";console.log(s.gray(` ${g} ${m.id}: ${m.message}`));}for(let m of f.recommendedActions)console.log(s.gray(` Next: ${m}`));}(f.status==="failed"||f.status==="warning"&&n.strict)&&process.exit(1);return}let d=await p({archivePathOrUrl:a,requireChecksums:n.strict===true||c("--strict")});if(n.json)console.log(JSON.stringify(d,null,2));else if(d.status==="passed")console.log(s.green(`\u2714 Workspace archive verified: ${d.archivePath}`)),console.log(s.gray(` Files: ${d.verifiedFiles}/${d.fileCount}`));else {let f=d.status==="failed"?s.red:s.yellow;console.log(f(`\u274C Workspace archive verification ${d.status}: ${d.archivePath}`)),d.missingArchiveEntries.length&&console.log(s.gray(` Missing entries: ${d.missingArchiveEntries.join(", ")}`)),d.extraArchiveEntries.length&&console.log(s.gray(` Unexpected entries: ${d.extraArchiveEntries.join(", ")}`)),d.mismatches.length&&console.log(s.gray(` Mismatches: ${d.mismatches.map(h=>h.path).join(", ")}`)),d.missingChecksumFiles.length&&console.log(s.gray(` Missing checksums: ${d.missingChecksumFiles.join(", ")}`));}(d.status==="failed"||d.status==="warning"&&n.strict)&&process.exit(1);}catch(d){console.log(s.red(`\u274C Workspace archive ${e} failed: ${d.message}`)),process.exit(1);}}else if(t==="hydrate"||t==="import"){let a=e;a||(console.log(s.red(`\u274C workspace ${t} requires an archive path or URL.`)),console.log(s.white(` npx rapidkit workspace ${t} team.rapidkit-archive.zip --output ./team`)),process.exit(1));let{hydrateWorkspaceArchive:l}=await import('./workspace-archive-EJIGYKSR.js');try{let u=await l({archivePathOrUrl:a,outputPath:n.output,force:n.force===true||c("--force"),dryRun:n.dryRun===true||c("--dry-run"),strict:n.strict===true||c("--strict")});if(n.json){console.log(JSON.stringify(u,null,2));return}console.log(s.green(u.dryRun?`\u2714 Workspace archive hydrate preview: ${u.outputPath}`:`\u2714 Workspace archive hydrated: ${u.outputPath}`)),console.log(s.gray(` Files: ${u.files.length}`)),u.manifest?.workspaceName&&console.log(s.gray(` Workspace: ${u.manifest.workspaceName}`));}catch(u){console.log(s.red(`\u274C Workspace ${t} failed: ${u.message}`)),process.exit(1);}}else if(t==="run"){let a=i(`run ${e||""}`.trim());(!e||!["init","test","build","start"].includes(e))&&(console.log(s.red(`Unknown workspace run stage: ${e||"(none provided)"}`)),console.log(s.gray("Available stages: init | test | build | start")),console.log(s.gray(" \u2022 init \u2014 run install/bootstrap across the project fleet")),console.log(s.gray(" \u2022 test \u2014 run test suite across selected projects")),console.log(s.gray(" \u2022 build \u2014 compile/package across selected projects")),console.log(s.gray(" \u2022 start \u2014 start services (smoke/e2e scenarios)")),console.log(s.gray(" Note: dev is excluded \u2014 it is a local-only primitive, not a CI stage")),process.exit(2));let l=Number(n.maxWorkers??""),u=Number.isFinite(l)?Math.max(1,Math.trunc(l)):void 0;if(e==="init"){let f=await Lr(a);f!==0&&process.exit(f);}let{runWorkspaceStage:p}=await import('./workspace-run-OIPQYI6V.js'),d=await p({workspacePath:a,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(s.yellow("\u2139 workspace init is an alias of: npx rapidkit workspace run init")),console.log(s.gray(` Equivalent full-init aliases at workspace root:
|
|
258
|
+
stages: init | test | build | start (dev excluded by design)`).option("--output <file>","Output file path for workspace share bundle").option("--include-paths","Include absolute paths in workspace share bundle").option("--no-doctor","Exclude doctor evidence in workspace share bundle").option("--no-blueprint","Exclude reproducibility blueprint from workspace share bundle").option("--include-env","Include .env/private key files in workspace export archive").option("--force","Overwrite an existing hydrate output directory").option("--dry-run","Preview hydrate without writing files").option("--affected","Run only affected projects (requires git diff context)").option("--blast-radius","Include downstream dependents from workspace dependency graph").option("--since <ref>","Git ref for affected calculation (default: HEAD~1)").option("--parallel","Run project stages in parallel").option("--max-workers <count>","Maximum parallel workers (default: min(4, selected))").option("--continue-on-error","Continue running remaining projects after a failure").option("--json","Emit machine-readable JSON output").option("--strict","Return non-zero exit on warn/fail gate outcomes").option("--no-gates","Skip doctor/readiness pre-run gates").action(async function(t,e,r,o){let n=this.opts(),i=a=>{let l=H(process.cwd());l||(console.log(s.red("\u274C Not inside a RapidKit workspace")),console.log(s.gray("\u{1F4A1} Run this command from within a workspace directory")),process.exit(1));let u=y__default.resolve(process.cwd()),p=y__default.resolve(l);return u!==p&&(console.log(s.red(`\u274C Workspace action "${a}" must be run from workspace root.`)),console.log(s.gray(`\u{1F4A1} Workspace root: ${l}`)),console.log(s.white(` cd ${l}`)),(a==="run init"||a==="init")&&console.log(s.gray(" For project-only init in the current directory, run: npx rapidkit init")),process.exit(1)),l},c=a=>process.argv.includes(a);if(t==="list"){let{listWorkspaces:a}=await import('./workspace-QCU3VBCD.js');await a();}else if(t==="sync"){let a=i("sync"),{syncWorkspaceProjects:l}=await import('./workspace-QCU3VBCD.js');console.log(s.cyan(`\u{1F4C2} Scanning workspace: ${y__default.basename(a)}`)),await l(a),await pt(a);}else if(t==="policy"){let a=i("policy"),l=await Pa(a,e,r,o);l!==0&&process.exit(l);}else if(t==="contract"){let a=i("contract"),{buildWorkspaceContractGraph:l,readWorkspaceContract:u,verifyWorkspaceContract:p,writeWorkspaceContract:d,WORKSPACE_CONTRACT_PATH:f}=await import('./workspace-contract-4UCEM44I.js'),h=e||"inspect",m=n.output;try{if(h==="init"){let g=await d({workspacePath:a,outputPath:m,force:n.force===true||c("--force")});if(n.json){console.log(JSON.stringify(g,null,2));return}console.log(s.green(`\u2714 Workspace contract initialized: ${g.contractPath}`)),console.log(s.gray(` Projects: ${g.contract.projects.length}`));return}if(h==="inspect"){let g=await u({workspacePath:a,contractPath:m});if(n.json){console.log(JSON.stringify(g,null,2));return}console.log(s.green(`\u2714 Workspace contract: ${g.contractPath}`)),console.log(s.gray(` Workspace: ${g.contract.workspace.name}`)),console.log(s.gray(` Projects: ${g.contract.projects.length}`)),console.log(s.gray(` Schema: v${g.contract.schemaVersion}`));return}if(h==="verify"){let g=await p({workspacePath:a,contractPath:m});if(n.json)console.log(JSON.stringify(g,null,2));else {let b=g.status==="passed"?s.green:s.red;console.log(b(`\u2714 Workspace contract verification ${g.status}: ${g.contractPath}`)),console.log(s.gray(` Projects: ${g.projectCount}`));for(let w of g.checks){let k=w.status==="passed"?"\u2714":"\u2718";console.log(s.gray(` ${k} ${w.id}: ${w.message}`));}for(let w of g.violations)console.log(s.gray(` Violation: ${w}`));}(g.status==="failed"||g.status!=="passed"&&n.strict)&&process.exit(1);return}if(h==="graph"){let g=await l({workspacePath:a,contractPath:m});if(n.json){console.log(JSON.stringify(g,null,2));return}console.log(s.green(`\u2714 Workspace contract graph: ${g.contractPath}`)),console.log(s.gray(` Workspace: ${g.graph.workspace.name}`)),console.log(s.gray(` Projects: ${g.graph.summary.projectCount}`)),console.log(s.gray(` Dependencies: ${g.graph.summary.dependencyEdges}`)),console.log(s.gray(` Event links: ${g.graph.summary.eventEdges}`)),console.log(s.gray(` Ports: ${g.graph.summary.portCount}`));for(let b of g.graph.nodes){let w=b.ports.map(k=>`${k.name}:${k.port}`).join(", ")||"none";console.log(s.gray(` \u2022 ${b.id} (${b.runtime||"unknown"}${b.framework?`/${b.framework}`:""}) ports=${w}`));}for(let b of g.graph.edges){let w=b.type==="event"?`event:${b.label}`:b.label;console.log(s.gray(` ${b.from} -> ${b.to} [${w}]`));}return}console.log(s.red(`\u274C Unknown workspace contract action: ${h}`)),console.log(s.white(` npx rapidkit workspace contract init|inspect|verify|graph [--output ${f}]`)),process.exit(1);}catch(g){console.log(s.red(`\u274C Workspace contract ${h} failed: ${g.message}`)),process.exit(1);}}else if(t==="share"){let a=i("share"),l=n.output||e,{createWorkspaceShareBundle:u}=await import('./workspace-QCU3VBCD.js'),p=await u(a,{outputPath:l,includePaths:n.includePaths===true,includeDoctorEvidence:n.doctor!==false,includeBlueprint:n.blueprint!==false});console.log(s.green(`\u2714 Workspace share bundle exported: ${p}`)),console.log(s.gray("Share this JSON with your team for reproducible workspace/project diagnostics."));}else if(t==="export"){let a=i("export"),{exportWorkspaceArchive:l}=await import('./workspace-archive-EJIGYKSR.js'),u=await l({workspacePath:a,outputPath:n.output||e,includeEnv:n.includeEnv===true||c("--include-env")});if(n.json){console.log(JSON.stringify(u,null,2));return}let p=(u.bytesWritten/(1024*1024)).toFixed(2);console.log(s.green(`\u2714 Workspace archive exported: ${u.archivePath}`)),console.log(s.gray(` Files: ${u.manifest.files.length}`)),console.log(s.gray(` Size: ${p} MB`)),u.manifest.security.envFilesIncluded||console.log(s.gray(" Secrets: excluded (.env, private keys, logs, dependency caches)"));}else if(t==="archive"&&(e==="inspect"||e==="verify"||e==="doctor")){let a=r;a||(console.log(s.red(`\u274C workspace archive ${e} requires an archive path or URL.`)),console.log(s.white(` npx rapidkit workspace archive ${e} team.rapidkit-archive.zip`)),process.exit(1));let{doctorWorkspaceArchive:l,inspectWorkspaceArchive:u,verifyWorkspaceArchive:p}=await import('./workspace-archive-EJIGYKSR.js');try{if(e==="inspect"){let f=await u({archivePathOrUrl:a});if(n.json){console.log(JSON.stringify(f,null,2));return}let h=(f.totalBytes/(1024*1024)).toFixed(2);console.log(s.green(`\u2714 Workspace archive: ${f.archivePath}`)),console.log(s.gray(` Workspace: ${f.manifest.workspaceName}`)),console.log(s.gray(` Exported: ${f.manifest.exportedAt}`)),console.log(s.gray(` Exporter: ${f.manifest.exportedBy||"unknown"}`)),console.log(s.gray(` Files: ${f.fileCount}`)),console.log(s.gray(` Payload: ${h} MB`));return}if(e==="doctor"){let f=await l({archivePathOrUrl:a,strict:n.strict===true||c("--strict")});if(n.json)console.log(JSON.stringify(f,null,2));else {let h=f.status==="passed"?s.green:f.status==="warning"?s.yellow:s.red;console.log(h(`\u2714 Workspace archive doctor ${f.status}: ${f.archivePath}`)),console.log(s.gray(` Workspace: ${f.workspaceName}`)),console.log(s.gray(` Files: ${f.fileCount}`));for(let m of f.checks){let g=m.status==="passed"?"\u2714":m.status==="warning"?"\u26A0":"\u2718";console.log(s.gray(` ${g} ${m.id}: ${m.message}`));}for(let m of f.recommendedActions)console.log(s.gray(` Next: ${m}`));}(f.status==="failed"||f.status==="warning"&&n.strict)&&process.exit(1);return}let d=await p({archivePathOrUrl:a,requireChecksums:n.strict===true||c("--strict")});if(n.json)console.log(JSON.stringify(d,null,2));else if(d.status==="passed")console.log(s.green(`\u2714 Workspace archive verified: ${d.archivePath}`)),console.log(s.gray(` Files: ${d.verifiedFiles}/${d.fileCount}`));else {let f=d.status==="failed"?s.red:s.yellow;console.log(f(`\u274C Workspace archive verification ${d.status}: ${d.archivePath}`)),d.missingArchiveEntries.length&&console.log(s.gray(` Missing entries: ${d.missingArchiveEntries.join(", ")}`)),d.extraArchiveEntries.length&&console.log(s.gray(` Unexpected entries: ${d.extraArchiveEntries.join(", ")}`)),d.mismatches.length&&console.log(s.gray(` Mismatches: ${d.mismatches.map(h=>h.path).join(", ")}`)),d.missingChecksumFiles.length&&console.log(s.gray(` Missing checksums: ${d.missingChecksumFiles.join(", ")}`));}(d.status==="failed"||d.status==="warning"&&n.strict)&&process.exit(1);}catch(d){console.log(s.red(`\u274C Workspace archive ${e} failed: ${d.message}`)),process.exit(1);}}else if(t==="hydrate"||t==="import"){let a=e;a||(console.log(s.red(`\u274C workspace ${t} requires an archive path or URL.`)),console.log(s.white(` npx rapidkit workspace ${t} team.rapidkit-archive.zip --output ./team`)),process.exit(1));let{hydrateWorkspaceArchive:l}=await import('./workspace-archive-EJIGYKSR.js');try{let u=await l({archivePathOrUrl:a,outputPath:n.output,force:n.force===true||c("--force"),dryRun:n.dryRun===true||c("--dry-run"),strict:n.strict===true||c("--strict")});if(n.json){console.log(JSON.stringify(u,null,2));return}console.log(s.green(u.dryRun?`\u2714 Workspace archive hydrate preview: ${u.outputPath}`:`\u2714 Workspace archive hydrated: ${u.outputPath}`)),console.log(s.gray(` Files: ${u.files.length}`)),u.manifest?.workspaceName&&console.log(s.gray(` Workspace: ${u.manifest.workspaceName}`));}catch(u){console.log(s.red(`\u274C Workspace ${t} failed: ${u.message}`)),process.exit(1);}}else if(t==="run"){let a=i(`run ${e||""}`.trim());(!e||!["init","test","build","start"].includes(e))&&(console.log(s.red(`Unknown workspace run stage: ${e||"(none provided)"}`)),console.log(s.gray("Available stages: init | test | build | start")),console.log(s.gray(" \u2022 init \u2014 run install/bootstrap across the project fleet")),console.log(s.gray(" \u2022 test \u2014 run test suite across selected projects")),console.log(s.gray(" \u2022 build \u2014 compile/package across selected projects")),console.log(s.gray(" \u2022 start \u2014 start services (smoke/e2e scenarios)")),console.log(s.gray(" Note: dev is excluded \u2014 it is a local-only primitive, not a CI stage")),process.exit(2));let l=Number(n.maxWorkers??""),u=Number.isFinite(l)?Math.max(1,Math.trunc(l)):void 0;if(e==="init"){let f=await Lr(a);f!==0&&process.exit(f);}let{runWorkspaceStage:p}=await import('./workspace-run-KMENEDIZ.js'),d=await p({workspacePath:a,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(s.yellow("\u2139 workspace init is an alias of: npx rapidkit workspace run init")),console.log(s.gray(` Equivalent full-init aliases at workspace root:
|
|
259
259
|
npx rapidkit init | npx rapidkit workspace init | npx rapidkit workspace run init
|
|
260
|
-
`));let a=i("init"),l=Number(n.maxWorkers??""),u=Number.isFinite(l)?Math.max(1,Math.trunc(l)):void 0,p=await Lr(a);p!==0&&process.exit(p);let{runWorkspaceStage:d}=await import('./workspace-run-
|
|
260
|
+
`));let a=i("init"),l=Number(n.maxWorkers??""),u=Number.isFinite(l)?Math.max(1,Math.trunc(l)):void 0,p=await Lr(a);p!==0&&process.exit(p);let{runWorkspaceStage:d}=await import('./workspace-run-KMENEDIZ.js'),f=await d({workspacePath:a,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(s.red(`Unknown workspace action: ${t}`)),console.log(s.gray("Available: list, sync, policy, share, export, hydrate, import, run")),process.exit(1);});function ts(){let t=a()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";console.log(s.white(`Usage:
|
|
261
261
|
`)),console.log(s.cyan(` npx rapidkit <workspace-name> [options]
|
|
262
262
|
`)),console.log(s.bold("Quick start \u2014 workspace workflow:")),console.log(s.cyan(" npx rapidkit my-workspace ")+s.gray("# Create workspace (interactive profile picker)")),console.log(s.cyan(" cd my-workspace")),console.log(s.cyan(" npx rapidkit bootstrap ")+s.gray("# Bootstrap all runtime toolchains")),console.log(s.cyan(" npx rapidkit create project ")+s.gray("# Interactive kit picker")),console.log(s.cyan(" cd my-api")),console.log(s.cyan(` ${t}
|
|
263
263
|
`)),console.log(s.bold("Workspace profiles (asked during creation):")),console.log(s.gray(" minimal Foundation files only \u2014 fastest bootstrap (default)")),console.log(s.gray(" java-only Java runtime (Spring Boot services)")),console.log(s.gray(" python-only Python + Poetry (FastAPI, Django, ML)")),console.log(s.gray(" node-only Node.js runtime (NestJS, Express, Next.js)")),console.log(s.gray(" go-only Go runtime (Fiber, Gin, gRPC)")),console.log(s.gray(" dotnet-only .NET runtime (ASP.NET Core services)")),console.log(s.gray(" polyglot Python + Node.js + Go + Java + .NET multi-runtime")),console.log(s.gray(` enterprise Polyglot + governance + Sigstore
|
|
@@ -267,13 +267,13 @@ Use "rapidkit help <command>" for more information.
|
|
|
267
267
|
`)),console.log(s.bold("Flags clarification:")),console.log(s.gray(" --skip-install npm fast-path for lock/dependency steps")),console.log(s.gray(` --skip-essentials core flag for skipping essential module installation
|
|
268
268
|
`)),ja?(console.log(s.bold("Legacy (shown because RAPIDKIT_SHOW_LEGACY=1):")),console.log(s.gray(" npx rapidkit my-project --template fastapi")),console.log(s.gray(" npx rapidkit my-project --template nestjs")),console.log(s.gray(" npx rapidkit my-project --template springboot")),console.log(s.gray(" npx rapidkit my-project --template gofiber")),console.log(s.gray(" npx rapidkit my-project --template gogin")),console.log(s.gray(" npx rapidkit my-project --template dotnet")),console.log(s.gray(` --skip-install Fast-path lock/deps (legacy template mode) \u2014 not same as --skip-essentials
|
|
269
269
|
`))):console.log(s.gray(`Tip: set RAPIDKIT_SHOW_LEGACY=1 to show legacy template flags in help.
|
|
270
|
-
`));}var
|
|
270
|
+
`));}var Fn="__rapidkit_signal_handlers_registered__",Kn=globalThis;Kn[Fn]||(Kn[Fn]=true,process.on("SIGINT",async()=>{if(!er){if(er=true,console.log(s.yellow(`
|
|
271
271
|
|
|
272
|
-
\u26A0\uFE0F Interrupted by user`)),ze&&await E__default.pathExists(ze)){console.log(s.gray("Cleaning up partial installation..."));try{await E__default.remove(ze),console.log(s.green("\u2713 Cleanup complete"));}catch(t){a$1.debug("Cleanup failed:",t);}}process.exit(130);}}),process.on("SIGTERM",async()=>{if(!er){if(er=true,a$1.debug("Received SIGTERM"),ze&&await E__default.pathExists(ze))try{await E__default.remove(ze);}catch(t){a$1.debug("Cleanup failed:",t);}process.exit(143);}}));var Ca=process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test",Ra=(()=>{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}})(),_a=!Ca||Ra;function Ea(){for(let t of [process.stdout,process.stderr])t._handle?.setBlocking?.(true);}async function pe(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(_a){Ea();let t=process.argv.slice(2),e=t[0],r=process.cwd(),o=et(r),n=P.existsSync(y__default.join(r,".rapidkit","project.json")),i=sa(),c=
|
|
272
|
+
\u26A0\uFE0F Interrupted by user`)),ze&&await E__default.pathExists(ze)){console.log(s.gray("Cleaning up partial installation..."));try{await E__default.remove(ze),console.log(s.green("\u2713 Cleanup complete"));}catch(t){a$1.debug("Cleanup failed:",t);}}process.exit(130);}}),process.on("SIGTERM",async()=>{if(!er){if(er=true,a$1.debug("Received SIGTERM"),ze&&await E__default.pathExists(ze))try{await E__default.remove(ze);}catch(t){a$1.debug("Cleanup failed:",t);}process.exit(143);}}));var Ca=process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test",Ra=(()=>{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}})(),_a=!Ca||Ra;function Ea(){for(let t of [process.stdout,process.stderr])t._handle?.setBlocking?.(true);}async function pe(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(_a){Ea();let t=process.argv.slice(2),e=t[0],r=process.cwd(),o=et(r),n=P.existsSync(y__default.join(r,".rapidkit","project.json")),i=sa(),c=En(t),a=i&&Rt(t),l=e==="init"&&o&&!n;(t.length===0||t.length===1&&(e==="--help"||e==="-h"||e==="help"))&&(console.log(s.blue.bold(`
|
|
273
273
|
\u{1F680} Welcome to RapidKit NPM CLI!
|
|
274
|
-
`)),
|
|
274
|
+
`)),ts(),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)),Kr(t)&&process.exit(0),a&&An(e)?(async()=>{e==="bootstrap"&&await pe(await On(t)),e==="setup"&&await pe(await Nn(t)),e==="cache"&&await pe(await Dn(t)),await pe(await Tn(t));})().catch(p=>{process.stderr.write(`RapidKit (npm) failed to run ${e}: ${p?.message??p}
|
|
275
275
|
`),process.exit(1);}):c||a?ce.parseAsync().catch(p=>{process.stderr.write(`RapidKit (npm) failed: ${p?.message??p}
|
|
276
276
|
`),process.exit(1);}):l?Gr(t).then(p=>pe(p)).catch(p=>{process.stderr.write(`RapidKit (npm) failed to run workspace init: ${p?.message??p}
|
|
277
277
|
`),process.exit(1);}):ba().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)}
|
|
278
|
-
`),
|
|
279
|
-
`),f){let h=await e$1(d$1,{cwd:process.cwd()});await pe(h);}await ce.parseAsync();}});}export{ta as NPM_ONLY_SCOPED_COMMANDS,Zi as NPM_ONLY_TOP_LEVEL_COMMANDS,ra as WRAPPER_ORCHESTRATED_PROJECT_COMMANDS,ca as detectWindowsDoctorWorkspaceShadow,
|
|
278
|
+
`),En(d$1)){await ce.parseAsync();return}if(Kr(d$1)&&await pe(0),d$1[0]==="create"){let h=await Bn(d$1);await pe(h);}if(d$1[0]==="init"){let h=await Gr(d$1);await pe(h);}if(An(d$1[0])){if(d$1[0]==="bootstrap"){let m=await On(d$1);await pe(m);}if(d$1[0]==="setup"){let m=await Nn(d$1);await pe(m);}if(d$1[0]==="cache"){let m=await Dn(d$1);await pe(m);}let h=await Tn(d$1);await pe(h);}if(Un.includes(d$1[0])){let h=d$1[0],m=a$4(process.cwd()),g=await Ct(process.cwd()),b=H(process.cwd()),w=false;if(b){let _=y__default.join(b,".rapidkit","policies.yml");if(await E__default.pathExists(_))try{let T=await P.promises.readFile(_,"utf-8");if(w=((T.match(/^\s*enforcement_mode:\s*(warn|strict)\s*(?:#.*)?$/m)??T.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m))?.[1]??"warn")==="strict",w){let z=y__default.join(b,".rapidkit","toolchain.lock"),M=[];if(!await E__default.pathExists(z))M.push("toolchain.lock is missing \u2014 run `rapidkit bootstrap` first (strict mode requires a reproducible toolchain).");else try{let D=JSON.parse(await P.promises.readFile(z,"utf-8")).runtime??{};b$2(m,process.cwd())&&!D.go?.version&&M.push("Go runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."),c$1(m,process.cwd())&&!D.node?.version&&M.push("Node runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."),d(m,process.cwd())&&!D.java?.version&&M.push("Java runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup java` first."),e$2(m,process.cwd())&&!D.dotnet?.version&&M.push(".NET runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup dotnet` first."),f$1(m,process.cwd())&&!D.python?.version&&M.push("Python runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");}catch{M.push("toolchain.lock is invalid JSON \u2014 regenerate it with `rapidkit bootstrap` before running commands in strict mode.");}let he=y__default.join(b,".rapidkit","workspace.json");if(await E__default.pathExists(he))try{let D=JSON.parse(await P.promises.readFile(he,"utf-8")).profile??"";D==="python-only"&&(b$2(m,process.cwd())||c$1(m,process.cwd())||d(m,process.cwd())||e$2(m,process.cwd()))&&M.push('Workspace profile is "python-only" but this project is not Python. Update the workspace profile or use a polyglot workspace.'),D==="node-only"&&(b$2(m,process.cwd())||f$1(m,process.cwd())||d(m,process.cwd())||e$2(m,process.cwd()))&&M.push('Workspace profile is "node-only" but this project is not Node. Update the workspace profile or use a polyglot workspace.'),D==="go-only"&&(f$1(m,process.cwd())||c$1(m,process.cwd())||d(m,process.cwd())||e$2(m,process.cwd()))&&M.push('Workspace profile is "go-only" but this project is not Go. Update the workspace profile or use a polyglot workspace.'),D==="java-only"&&(f$1(m,process.cwd())||c$1(m,process.cwd())||b$2(m,process.cwd())||e$2(m,process.cwd()))&&M.push('Workspace profile is "java-only" but this project is not Java. Update the workspace profile or use a polyglot workspace.'),D==="dotnet-only"&&(f$1(m,process.cwd())||c$1(m,process.cwd())||b$2(m,process.cwd())||d(m,process.cwd()))&&M.push('Workspace profile is "dotnet-only" but this project is not .NET. Update the workspace profile or use a polyglot workspace.');}catch{}if(M.length>0){console.log(s.red(`\u274C Strict policy violations block \`${h}\`:`));for(let Se of M)console.log(s.red(` \u2022 ${Se}`));console.log(s.gray("\u{1F4A1} Fix violations or switch to warn mode: set mode: warn in .rapidkit/policies.yml")),await pe(1);}}}catch{}}let k=await br({startPath:process.cwd(),action:h,writeReport:true}),C=w||process.env.RAPIDKIT_LIFECYCLE_ENFORCE_READINESS==="1"||process.env.RAPIDKIT_ENFORCE_READINESS==="1";if(k.blocking&&C){console.log(s.red(`\u274C Release readiness blocks \`${h}\`:`));for(let _ of k.blockingReasons)console.log(s.red(` \u2022 ${_}`));k.evidencePath&&console.log(s.gray(`\u2139\uFE0F Readiness evidence: ${k.evidencePath}`)),await pe(1);}k.overallStatus!=="pass"&&!C&&(console.log(s.yellow(`\u26A0\uFE0F Release readiness is ${k.overallStatus}. Command continues in warn mode.`)),k.evidencePath&&console.log(s.gray(` Evidence: ${k.evidencePath} (set RAPIDKIT_LIFECYCLE_ENFORCE_READINESS=1 to block)`)));let x=await es(process.cwd(),async()=>{if(b$2(m,process.cwd())||g==="go"){let _=Fe("go",{runCommandInCwd:L,runCoreRapidkit:e$1}),T=h==="dev"?await _.runDev(process.cwd()):h==="test"?await _.runTest(process.cwd()):h==="build"?await _.runBuild(process.cwd()):await _.runStart(process.cwd());return T.message&&console.log(s.red(`\u274C ${T.message}`)),T.exitCode}if(d(m,process.cwd())||g==="java")return h==="dev"?await Xe("dev",process.cwd()):h==="test"?await Xe("test",process.cwd()):h==="build"?await Xe("build",process.cwd()):await Xe("start",process.cwd());if(e$2(m,process.cwd())||g==="dotnet"){let _=Fe("dotnet",{runCommandInCwd:L,runCoreRapidkit:e$1}),T=h==="dev"?await _.runDev(process.cwd()):h==="test"?await _.runTest(process.cwd()):h==="build"?await _.runBuild(process.cwd()):await _.runStart(process.cwd());return T.message&&console.log(s.red(`\u274C ${T.message}`)),T.exitCode}if(c$1(m,process.cwd())||g==="node")return h==="dev"?await xt("dev",process.cwd()):h==="test"?await xt("test",process.cwd()):h==="build"?await xt("build",process.cwd()):await xt("start",process.cwd());if(f$1(m,process.cwd())||g==="python"){let _=Fe("python",{runCommandInCwd:L,runCoreRapidkit:e$1});return ue(h==="dev"?await _.runDev(process.cwd()):h==="test"?await _.runTest(process.cwd()):h==="build"?await _.runBuild(process.cwd()):await _.runStart(process.cwd()))}return -1});x.ok||await pe(x.code),x.ok&&x.value>=0&&await pe(x.value);}if(d$1[0]==="add"||d$1[0]==="module"&&d$1[1]==="add"){let h=a$4(process.cwd());if(h?.module_support===false){let m=h?.runtime==="java"?"Spring Boot":h?.runtime==="dotnet"?"ASP.NET Core":"Go";console.error(s.red(`\u274C RapidKit modules are not available for ${m} npm-level kits.`)),console.error(s.gray(" The module system requires Python and is currently only supported for FastAPI and NestJS projects.")),await pe(1);}}if(zn(d$1))return;let f=await Sa(d$1);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] shouldForwardToCore=${f}
|
|
279
|
+
`),f){let h=await e$1(d$1,{cwd:process.cwd()});await pe(h);}await ce.parseAsync();}});}export{ta as NPM_ONLY_SCOPED_COMMANDS,Zi as NPM_ONLY_TOP_LEVEL_COMMANDS,ra as WRAPPER_ORCHESTRATED_PROJECT_COMMANDS,ca as detectWindowsDoctorWorkspaceShadow,On as handleBootstrapCommand,Dn as handleCacheCommand,Bn as handleCreateOrFallback,ga as handleImportCommand,Gr as handleInitCommand,Tn as handleMirrorCommand,Nn as handleSetupCommand,Lr as installWorkspaceDependencies,sa as isNpmExecInvocation,Sa as shouldForwardToCore};
|