rapidkit 0.41.5 → 0.42.1
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 +53 -9
- package/contracts/agent-customization-pack.v1.json +29 -29
- package/contracts/create-planner-capabilities.v1.json +2 -2
- package/contracts/extension-cli-compatibility.v1.json +2 -2
- package/contracts/runtime-command-surface.v1.json +2 -2
- package/contracts/workspace-registry.v1.json +1 -1
- package/contracts/workspace-run-last.v1.json +1 -1
- package/dist/analyze-XSPWKPA4.js +1 -0
- package/dist/autopilot-release-5J55NPXF.js +1 -0
- package/dist/chunk-2LBPX5K3.js +2 -0
- package/dist/chunk-4EIQRQSA.js +1 -0
- package/dist/{chunk-UZW5QFRW.js → chunk-4KUIFXHM.js} +3 -3
- package/dist/{chunk-3VI4Y7LZ.js → chunk-6WDDATKQ.js} +1 -1
- package/dist/chunk-7M2VBCAX.js +2 -0
- package/dist/chunk-7V7C6GXV.js +4 -0
- package/dist/{chunk-HCJV2ITA.js → chunk-CXWWNQDF.js} +1 -1
- package/dist/chunk-DMITBXR2.js +1 -0
- package/dist/chunk-FLFZC7ZV.js +4 -0
- package/dist/{chunk-GDWLW7GF.js → chunk-JN6R5UP4.js} +2 -2
- package/dist/chunk-KEMWZUGO.js +5 -0
- package/dist/{chunk-TXUBE6KV.js → chunk-KQRXY2GJ.js} +1 -1
- package/dist/chunk-KUOCSDIY.js +1 -0
- package/dist/{chunk-THSTNVE3.js → chunk-MOAQ3WU6.js} +1 -1
- package/dist/{chunk-SO2SSVWN.js → chunk-MQGVCTUL.js} +1 -1
- package/dist/chunk-NN3IV4U6.js +916 -0
- package/dist/chunk-QKVDG6FD.js +32 -0
- package/dist/chunk-RQIHAPF3.js +13 -0
- package/dist/{chunk-FI4VMG2I.js → chunk-S4U2FRJV.js} +1 -1
- package/dist/{chunk-T5GS4BUP.js → chunk-TQULVWUA.js} +1 -1
- package/dist/{chunk-U5IRABWC.js → chunk-WKCBS5DC.js} +2 -2
- package/dist/{create-P3USIH52.js → create-TPFUONHK.js} +1 -1
- package/dist/{demo-kit-N5U3NGAE.js → demo-kit-4NCHGEA6.js} +1 -1
- package/dist/{doctor-KYNACWFC.js → doctor-O2B3XNAB.js} +1 -1
- package/dist/{dotnet-webapi-clean-K33C77EI.js → dotnet-webapi-clean-LV3MADHG.js} +1 -1
- package/dist/{gofiber-standard-BQ4HCXL2.js → gofiber-standard-25DZS5UY.js} +1 -1
- package/dist/{gogin-standard-PUBCYW3A.js → gogin-standard-FMVHPLO5.js} +1 -1
- package/dist/index.js +161 -159
- package/dist/{pipeline-SU3FJUKI.js → pipeline-PX6ZUINW.js} +1 -1
- package/dist/{springboot-standard-XFVQI37R.js → springboot-standard-LMZF7OJS.js} +1 -1
- package/dist/{workspace-5DKOA7TN.js → workspace-MPKEUHFP.js} +1 -1
- package/dist/{workspace-agent-sync-HZ4UBSZ2.js → workspace-agent-sync-XD32GG5V.js} +1 -1
- package/dist/{workspace-context-R3XWWLFP.js → workspace-context-QFES7YBC.js} +1 -1
- package/dist/workspace-explain-Q7TJCHD5.js +1 -0
- package/dist/{workspace-foundation-H6IPS4MW.js → workspace-foundation-2OVUZXPT.js} +1 -1
- package/dist/{workspace-intelligence-5BBKUJAG.js → workspace-intelligence-FJP5ONDB.js} +1 -1
- package/dist/{workspace-marker-HAC7BMEG.js → workspace-marker-5GAJSOFP.js} +1 -1
- package/dist/{workspace-mcp-serve-TQTJ4HWI.js → workspace-mcp-serve-DFJIUTL5.js} +1 -1
- package/dist/{workspace-model-YAC5BKLL.js → workspace-model-IDRCH3VI.js} +1 -1
- package/dist/workspace-python-engine-state-AEEZ7QYB.js +2 -0
- package/dist/workspace-run-NULA72JV.js +1 -0
- package/dist/{workspace-verify-5RZSDKGR.js → workspace-verify-K4RSQIXT.js} +1 -1
- package/dist/{workspace-watch-P2PGSYDD.js → workspace-watch-PFJDHPXI.js} +1 -1
- package/docs/commands-reference.md +30 -3
- package/package.json +2 -2
- package/dist/analyze-JYHEGUSH.js +0 -1
- package/dist/autopilot-release-ZADU63OD.js +0 -1
- package/dist/chunk-7BEZH5LE.js +0 -2
- package/dist/chunk-DAPZJHMN.js +0 -4
- package/dist/chunk-E5ZVQL3C.js +0 -13
- package/dist/chunk-LRF6PQOZ.js +0 -1
- package/dist/chunk-P5NZE2RV.js +0 -883
- package/dist/chunk-Q2KZIBV4.js +0 -5
- package/dist/chunk-Q4HEXEDW.js +0 -4
- package/dist/chunk-T7B3GF3Q.js +0 -1
- package/dist/chunk-U7TS7W2V.js +0 -32
- package/dist/chunk-YBS2HGO3.js +0 -2
- package/dist/workspace-explain-5RDFGHUN.js +0 -1
- package/dist/workspace-run-P5UOJSLQ.js +0 -1
package/dist/index.js
CHANGED
|
@@ -1,66 +1,66 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {a as a$d}from'./chunk-ICGWHIMK.js';import {b as b$
|
|
2
|
+
import {a as a$d}from'./chunk-ICGWHIMK.js';import {b as b$5,a as a$4}from'./chunk-7V7C6GXV.js';import {a as a$b}from'./chunk-ULIVVMT6.js';import {b as b$6,d as d$3,a as a$3,c as c$1,f as f$4,e as e$4}from'./chunk-PCXSTKZ5.js';import {a as a$6}from'./chunk-KMUWWZRT.js';import {a as a$c}from'./chunk-2E6WGUN6.js';import {b as b$a,a as a$f,l as l$3}from'./chunk-QKVDG6FD.js';import {a as a$h}from'./chunk-TQULVWUA.js';import {c as c$5,a as a$i}from'./chunk-6WDDATKQ.js';import {e as e$3}from'./chunk-MOAQ3WU6.js';import {a as a$g}from'./chunk-COBMOVUK.js';import {g,b as b$2,c,d,n,l,h as h$1,m,k,a as a$7,j as j$2,f as f$5,i as i$6}from'./chunk-4EIQRQSA.js';import {a as a$1,b as b$3}from'./chunk-CDCYRBAY.js';import {a as a$9}from'./chunk-A5FBGRJA.js';import {a as a$e}from'./chunk-AQ4XZZC6.js';import {f as f$3,g as g$2,h as h$3,i as i$3,j as j$3,c as c$6,a as a$j}from'./chunk-KUOCSDIY.js';import {m as m$1,d as d$4,e as e$1,f as f$2,g as g$1,h as h$2,i,q,j as j$1,s as s$1,k as k$1,c as c$3,l as l$1,r,t,n as n$3,p,a as a$l,o as o$2}from'./chunk-7M2VBCAX.js';export{l as PROJECT_COMMANDS_CORE_FALLBACK}from'./chunk-7M2VBCAX.js';import {i as i$1}from'./chunk-4KUIFXHM.js';import {f as f$6}from'./chunk-3PTJID76.js';import {h,a as a$2,m as m$2,l as l$2,n as n$2,k as k$2,o as o$1,i as i$5}from'./chunk-RQIHAPF3.js';import {b as b$4,d as d$1,a as a$5,e as e$2}from'./chunk-DMITBXR2.js';import {b as b$8,d as d$6}from'./chunk-2LBPX5K3.js';import {a as a$a}from'./chunk-TDSIF42O.js';import {b,a}from'./chunk-KEMWZUGO.js';import {f,d as d$2,b as b$7}from'./chunk-OLDPVVSV.js';import {c as c$7}from'./chunk-MIWDCR6I.js';import {f as f$1,e,d as d$5,i as i$2,a as a$8,g as g$3}from'./chunk-FMBSON6H.js';import {b as b$1,n as n$1,o,c as c$4,i as i$4,h as h$4,p as p$1,l as l$4,e as e$5,g as g$4}from'./chunk-WRMCPKGA.js';import {c as c$8}from'./chunk-2FIX2MDC.js';import {c as c$2,b as b$9,a as a$k}from'./chunk-HHJAANUC.js';import {Command,Option}from'commander';import s from'chalk';import v from'path';import {fileURLToPath}from'url';import {spawn,spawnSync}from'child_process';import Dl from'vm';import*as E from'fs-extra';import E__default from'fs-extra';import j,{promises,createWriteStream}from'fs';import js,{tmpdir}from'os';import {execa}from'execa';import jr,{createVerify,createHash,createHmac}from'crypto';import Ni from'http';import Di from'https';function Ea(){return i$4()}function _a(t,e){return t==="py"?["-3",...e]:e}function Aa(t){return typeof t=="object"&&t!==null}async function Ia(t,e,o,r=c$8()){try{let n=await execa(t,e,{cwd:o,timeout:r,reject:false,stdio:"pipe"});return {ok:n.exitCode===0,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr}}catch(n){return {ok:false,exitCode:void 0,stdout:"",stderr:n instanceof Error?n.message:String(n)}}}async function $a(t,e){let o=["-m","rapidkit",...t],r=Ea();for(let n of r){let i=await Ia(n,_a(n,o),e?.cwd,e?.timeoutMs);if(!i.ok)continue;let a=(i.stdout??"").trim();try{let l=JSON.parse(a);return Aa(l)?{ok:true,command:n,exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr,data:l}:{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 ws(t,e){let o=await $a(["project","detect","--path",t,"--json"],e);return !o.ok||!o.data||o.data.schema_version!==1?{ok:false,command:o.command,exitCode:o.exitCode,stdout:o.stdout,stderr:o.stderr}:o}var ks=new Set(["create"]),pr=new Set(["--yes","-y","--skip-git","--skip-install","--debug","--dry-run","--no-update-check","--create-workspace","--no-workspace"]),Oa=new Set(["pip","poetry","venv","pipx","python"]);function vs(t){return typeof t=="string"&&Oa.has(t)}function ur(t,e){return !t||ks.has(t)?false:a$8.has(t)?true:e?.has(t)??false}function mr(t,e=null){let o=t[0];return !o||o.startsWith("-")||ks.has(o)||o==="init"?false:ur(o,e)?true:t.filter(n=>!n.startsWith("-")&&!pr.has(n)).length<=1?false:t.length>1}var vt=v.join(js.homedir(),".rapidkitrc.json"),Ma=v.join(js.homedir(),".rapidkit","config.json");function Ps(t){try{if(!j.existsSync(t))return {};let e=j.readFileSync(t,"utf-8"),o=JSON.parse(e);return !o||typeof o!="object"||Array.isArray(o)?{}:o}catch{return {}}}function Ss(t){if(process.platform!=="win32")try{j.chmodSync(t,384);}catch{}}function Pt(){let t=Ps(vt),e=Ps(Ma);return j.existsSync(vt)&&Ss(vt),{...t,openaiApiKey:t.openaiApiKey??e.openaiApiKey,aiEnabled:t.aiEnabled??e.aiEnabled,telemetry:t.telemetry??e.telemetry}}function Po(t){let o={...Pt(),...t};j.writeFileSync(vt,JSON.stringify(o,null,2),{encoding:"utf-8",mode:384}),Ss(vt);}function Ut(){return process.env.OPENAI_API_KEY||Pt().openaiApiKey||null}function fr(){return Pt().aiEnabled!==false}function gr(){return vt}function xs(t){let e=t.command("config").description("Configure RapidKit settings");e.command("set-api-key").description("Set OpenAI API key for AI features").option("--key <key>","API key (or enter interactively)").action(async o=>{let r=o.key;r?r.startsWith("sk-")||(console.log(s.red(`
|
|
3
3
|
\u274C Invalid API key format (should start with sk-)
|
|
4
|
-
`)),process.exit(1)):r=(await b$3([{type:"password",name:"apiKey",message:"Enter your OpenAI API key:",validate:i=>i?i.startsWith("sk-")?i.length<20?"API key seems too short":true:"Invalid API key format (should start with sk-)":"API key is required"}])).apiKey,
|
|
4
|
+
`)),process.exit(1)):r=(await b$3([{type:"password",name:"apiKey",message:"Enter your OpenAI API key:",validate:i=>i?i.startsWith("sk-")?i.length<20?"API key seems too short":true:"Invalid API key format (should start with sk-)":"API key is required"}])).apiKey,Po({openaiApiKey:r}),console.log(s.green(`
|
|
5
5
|
\u2705 OpenAI API key saved successfully!
|
|
6
|
-
`)),console.log(s.gray(`Stored in: ${
|
|
6
|
+
`)),console.log(s.gray(`Stored in: ${gr()}`)),console.log(s.cyan(`
|
|
7
7
|
\u{1F389} You can now use AI features:`)),console.log(s.white(' rapidkit ai recommend "I need user authentication"')),console.log(s.gray(`
|
|
8
8
|
\u{1F4A1} To generate module embeddings (one-time):`)),console.log(s.white(" cd rapidkit-npm")),console.log(s.white(` npx tsx src/ai/generate-embeddings.ts
|
|
9
|
-
`));}),e.command("show").description("Show current configuration").action(()=>{let o=
|
|
9
|
+
`));}),e.command("show").description("Show current configuration").action(()=>{let o=Pt();if(console.log(s.bold(`
|
|
10
10
|
\u2699\uFE0F RapidKit Configuration
|
|
11
11
|
`)),o.openaiApiKey){let r=o.openaiApiKey.substring(0,8)+"..."+o.openaiApiKey.slice(-4);console.log(s.cyan("OpenAI API Key:"),s.white(r));}else console.log(s.cyan("OpenAI API Key:"),s.red("Not set")),console.log(s.gray(" Set with: rapidkit config set-api-key"));console.log(s.cyan("AI Features:"),o.aiEnabled!==false?s.green("Enabled"):s.red("Disabled")),console.log(s.gray(`
|
|
12
|
-
\u{1F4C1} Config file: ${
|
|
13
|
-
`));}),e.command("remove-api-key").description("Remove stored OpenAI API key").action(async()=>{if(!
|
|
12
|
+
\u{1F4C1} Config file: ${gr()}
|
|
13
|
+
`));}),e.command("remove-api-key").description("Remove stored OpenAI API key").action(async()=>{if(!Pt().openaiApiKey){console.log(s.yellow(`
|
|
14
14
|
\u26A0\uFE0F No API key is currently stored
|
|
15
|
-
`));return}(await b$3([{type:"confirm",name:"confirm",message:"Are you sure you want to remove your OpenAI API key?",default:false}])).confirm?(
|
|
15
|
+
`));return}(await b$3([{type:"confirm",name:"confirm",message:"Are you sure you want to remove your OpenAI API key?",default:false}])).confirm?(Po({openaiApiKey:void 0}),console.log(s.green(`
|
|
16
16
|
\u2705 API key removed successfully
|
|
17
17
|
`))):console.log(s.gray(`
|
|
18
18
|
Cancelled
|
|
19
19
|
`));}),e.command("ai <action>").description("Enable or disable AI features (enable|disable)").action(o=>{o!=="enable"&&o!=="disable"&&(console.log(s.red(`
|
|
20
20
|
\u274C Invalid action: ${o}`)),console.log(s.gray(`Use: rapidkit config ai enable|disable
|
|
21
|
-
`)),process.exit(1));let r=o==="enable";
|
|
21
|
+
`)),process.exit(1));let r=o==="enable";Po({aiEnabled:r}),console.log(s.green(`
|
|
22
22
|
\u2705 AI features ${r?"enabled":"disabled"}
|
|
23
|
-
`));});}var fo=null,go=false,ar=null;async function ya(){return ar||(ar=(await import('openai')).default),ar}function us(){go=true;}function ms(t){let o=new Array(1536),r=0;for(let i=0;i<t.length;i++)r=(r<<5)-r+t.charCodeAt(i),r=r&r;for(let i=0;i<1536;i++)r=r*1664525+1013904223&4294967295,o[i]=r/4294967295*2-1;let n=Math.sqrt(o.reduce((i,a)=>i+a*a,0));return o.map(i=>i/n)}async function ho(t){let e=await ya();fo=new e({apiKey:t});}function fs(){if(!fo)throw new Error("OpenAI client not initialized. Call initOpenAI() first with your API key.");return fo}async function cr(t){return go?ms(t):(await fs().embeddings.create({model:"text-embedding-3-small",input:t,encoding_format:"float"})).data[0].embedding}async function gs(t){return go?t.map(ms):(await fs().embeddings.create({model:"text-embedding-3-small",input:t,encoding_format:"float"})).data.map(r=>r.embedding)}function hs(){return fo!==null}function vt(){return go}function lr(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"):[]}function wa(t){return !t||typeof t!="object"?{}:t}var pr=[{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"]}],Xe=null,dr=0,ka=300*1e3;function va(t){let e=wa(t),o=e.slug||e.name||e.id||e.module_id||"",r=lr(e.keywords??e.tags);return {id:o,name:e.display_name||e.name||"",category:Pa(e.category||"infrastructure"),description:e.description||e.summary||"",longDescription:e.long_description||e.description||"",keywords:r.map(n=>n.toLowerCase()),framework:ba(e.framework),dependencies:lr(e.dependencies),useCases:lr(e.use_cases??e.useCases)}}function Pa(t){return {auth:"auth",authentication:"auth",database:"database",payment:"payment",billing:"payment",communication:"communication",infrastructure:"infrastructure",security:"security",analytics:"analytics"}[t.toLowerCase()]||"infrastructure"}function ba(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 ja(){try{let t=await g$3(["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]*\}/),o=e?e[0]:t.stdout,r=JSON.parse(o),n=[];return Array.isArray(r)?n=r:r.modules&&Array.isArray(r.modules)?n=r.modules:r.data&&Array.isArray(r.data)&&(n=r.data),n.map(va).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)"),pr}}async function yo(){let t=Date.now();return vt()?(Xe=pr,dr=t,Xe):(Xe&&t-dr<ka||(Xe=await ja(),dr=t,Xe.length===0&&(console.warn("\u26A0\uFE0F No modules found, using fallback catalog"),Xe=pr)),Xe)}var xa=fileURLToPath(import.meta.url),ws=w.dirname(xa),Pt=null,ks=new Map;function Ca(t){return [t.name,t.description,t.longDescription,...t.keywords,...t.useCases].filter(Boolean).join(" ")}async function Ra(t){let e=ks.get(t.id);if(e)return e;let o=await cr(Ca(t));return ks.set(t.id,o),o}function Ea(){if(Pt)return Pt;let t=[w.join(ws,"../../data/modules-embeddings.json"),w.join(ws,"../data/modules-embeddings.json"),w.join(process.cwd(),"data/modules-embeddings.json")],e=null;for(let n of t)if(j.existsSync(n)){e=n;break}if(!e)throw new Error("embeddings file not found");let o=j.readFileSync(e,"utf-8"),r=JSON.parse(o);if(Array.isArray(r)?Pt={model:"mock-or-text-embedding-3-small",dimension:r[0]?.embedding?.length||1536,generated_at:new Date().toISOString(),modules:r}:Pt=r,!Pt)throw new Error("failed to load embeddings data");return Pt}function vs(t,e){if(t.length!==e.length)throw new Error("Vectors must have the same length");let o=0,r=0,n=0;for(let a=0;a<t.length;a++)o+=t[a]*e[a],r+=t[a]*t[a],n+=e[a]*e[a];let i=Math.sqrt(r)*Math.sqrt(n);return i===0?0:o/i}function Ps(t,e){let o=e.toLowerCase(),r=t.keywords.filter(n=>o.includes(n)||n.includes(o));return r.length>0?`Matches: ${r.slice(0,3).join(", ")}`:`Relevant for: ${t.useCases[0]}`}async function bs(t,e=5){let o=await yo(),r=await cr(t);if(vt()){let a=await Promise.all(o.map(async l=>{let c=await Ra(l);return {module:l,score:vs(r,c),reason:Ps(l,t)}}));return a.sort((l,c)=>c.score-l.score),a.slice(0,e)}let i=Ea().modules.map(a=>{let l=o.find(f=>f.id===a.id);if(!l)return null;let c=vs(r,a.embedding);return {module:l,score:c,reason:Ps(l,t)}}).filter(a=>a!==null);return i.sort((a,l)=>l.score-a.score),i.slice(0,e)}var Aa=fileURLToPath(import.meta.url),js=w.dirname(Aa);function Ss(t){return t instanceof Error?t.message:String(t)}function Ia(){return [w.join(js,"../../data/modules-embeddings.json"),w.join(js,"../data/modules-embeddings.json"),w.join(process.cwd(),"data/modules-embeddings.json")]}function xs(){let t=Ia();for(let e of t)if(j.existsSync(e))try{let o=JSON.parse(j.readFileSync(e,"utf-8")),r=Array.isArray(o)?o:o.modules||[];return {exists:true,path:e,moduleCount:r.length,generatedAt:o.generated_at||null}}catch{continue}return {exists:false,path:null,moduleCount:0,generatedAt:null}}async function ko(t=true,e){try{if(!hs()&&!vt())return console.log(s.red(`
|
|
23
|
+
`));});}var bo=null,jo=false,yr=null;async function Na(){return yr||(yr=(await import('openai')).default),yr}function Cs(){jo=true;}function Rs(t){let o=new Array(1536),r=0;for(let i=0;i<t.length;i++)r=(r<<5)-r+t.charCodeAt(i),r=r&r;for(let i=0;i<1536;i++)r=r*1664525+1013904223&4294967295,o[i]=r/4294967295*2-1;let n=Math.sqrt(o.reduce((i,a)=>i+a*a,0));return o.map(i=>i/n)}async function So(t){let e=await Na();bo=new e({apiKey:t});}function Es(){if(!bo)throw new Error("OpenAI client not initialized. Call initOpenAI() first with your API key.");return bo}async function hr(t){return jo?Rs(t):(await Es().embeddings.create({model:"text-embedding-3-small",input:t,encoding_format:"float"})).data[0].embedding}async function _s(t){return jo?t.map(Rs):(await Es().embeddings.create({model:"text-embedding-3-small",input:t,encoding_format:"float"})).data.map(r=>r.embedding)}function As(){return bo!==null}function bt(){return jo}function wr(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"):[]}function Da(t){return !t||typeof t!="object"?{}:t}var vr=[{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"]}],Qe=null,kr=0,Ta=300*1e3;function Wa(t){let e=Da(t),o=e.slug||e.name||e.id||e.module_id||"",r=wr(e.keywords??e.tags);return {id:o,name:e.display_name||e.name||"",category:Fa(e.category||"infrastructure"),description:e.description||e.summary||"",longDescription:e.long_description||e.description||"",keywords:r.map(n=>n.toLowerCase()),framework:La(e.framework),dependencies:wr(e.dependencies),useCases:wr(e.use_cases??e.useCases)}}function Fa(t){return {auth:"auth",authentication:"auth",database:"database",payment:"payment",billing:"payment",communication:"communication",infrastructure:"infrastructure",security:"security",analytics:"analytics"}[t.toLowerCase()]||"infrastructure"}function La(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 Ja(){try{let t=await g$3(["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]*\}/),o=e?e[0]:t.stdout,r=JSON.parse(o),n=[];return Array.isArray(r)?n=r:r.modules&&Array.isArray(r.modules)?n=r.modules:r.data&&Array.isArray(r.data)&&(n=r.data),n.map(Wa).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)"),vr}}async function xo(){let t=Date.now();return bt()?(Qe=vr,kr=t,Qe):(Qe&&t-kr<Ta||(Qe=await Ja(),kr=t,Qe.length===0&&(console.warn("\u26A0\uFE0F No modules found, using fallback catalog"),Qe=vr)),Qe)}var Ga=fileURLToPath(import.meta.url),$s=v.dirname(Ga),jt=null,Os=new Map;function Ua(t){return [t.name,t.description,t.longDescription,...t.keywords,...t.useCases].filter(Boolean).join(" ")}async function Va(t){let e=Os.get(t.id);if(e)return e;let o=await hr(Ua(t));return Os.set(t.id,o),o}function Ba(){if(jt)return jt;let t=[v.join($s,"../../data/modules-embeddings.json"),v.join($s,"../data/modules-embeddings.json"),v.join(process.cwd(),"data/modules-embeddings.json")],e=null;for(let n of t)if(j.existsSync(n)){e=n;break}if(!e)throw new Error("embeddings file not found");let o=j.readFileSync(e,"utf-8"),r=JSON.parse(o);if(Array.isArray(r)?jt={model:"mock-or-text-embedding-3-small",dimension:r[0]?.embedding?.length||1536,generated_at:new Date().toISOString(),modules:r}:jt=r,!jt)throw new Error("failed to load embeddings data");return jt}function Ms(t,e){if(t.length!==e.length)throw new Error("Vectors must have the same length");let o=0,r=0,n=0;for(let a=0;a<t.length;a++)o+=t[a]*e[a],r+=t[a]*t[a],n+=e[a]*e[a];let i=Math.sqrt(r)*Math.sqrt(n);return i===0?0:o/i}function Ns(t,e){let o=e.toLowerCase(),r=t.keywords.filter(n=>o.includes(n)||n.includes(o));return r.length>0?`Matches: ${r.slice(0,3).join(", ")}`:`Relevant for: ${t.useCases[0]}`}async function Ds(t,e=5){let o=await xo(),r=await hr(t);if(bt()){let a=await Promise.all(o.map(async l=>{let c=await Va(l);return {module:l,score:Ms(r,c),reason:Ns(l,t)}}));return a.sort((l,c)=>c.score-l.score),a.slice(0,e)}let i=Ba().modules.map(a=>{let l=o.find(u=>u.id===a.id);if(!l)return null;let c=Ms(r,a.embedding);return {module:l,score:c,reason:Ns(l,t)}}).filter(a=>a!==null);return i.sort((a,l)=>l.score-a.score),i.slice(0,e)}var qa=fileURLToPath(import.meta.url),Ts=v.dirname(qa);function Ws(t){return t instanceof Error?t.message:String(t)}function za(){return [v.join(Ts,"../../data/modules-embeddings.json"),v.join(Ts,"../data/modules-embeddings.json"),v.join(process.cwd(),"data/modules-embeddings.json")]}function Fs(){let t=za();for(let e of t)if(j.existsSync(e))try{let o=JSON.parse(j.readFileSync(e,"utf-8")),r=Array.isArray(o)?o:o.modules||[];return {exists:true,path:e,moduleCount:r.length,generatedAt:o.generated_at||null}}catch{continue}return {exists:false,path:null,moduleCount:0,generatedAt:null}}async function Ro(t=true,e){try{if(!As()&&!bt())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...
|
|
27
|
-
`)),console.log(s.gray("\u{1F4E1} Fetching modules from RapidKit..."));let o=await
|
|
27
|
+
`)),console.log(s.gray("\u{1F4E1} Fetching modules from RapidKit..."));let o=await xo();console.log(s.green(`\u2713 Found ${o.length} modules
|
|
28
28
|
`));let r=o.length*50/1e6*.02;if(console.log(s.cyan(`\u{1F4B0} Estimated cost: ~$${r.toFixed(3)}`)),console.log(s.gray(` (Based on ${o.length} modules at $0.02/1M tokens)
|
|
29
29
|
`)),t){let{confirm:a}=await b$3([{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=o.map(a=>`${a.name}. ${a.description}. ${a.longDescription}. Keywords: ${a.keywords.join(", ")}. Use cases: ${a.useCases.join(", ")}.`),i=b$7(`Generating embeddings for ${o.length} modules...`,{component:"ai",phase:"embeddings.generate"});try{let a=await
|
|
31
|
+
`)),false}let n=o.map(a=>`${a.name}. ${a.description}. ${a.longDescription}. Keywords: ${a.keywords.join(", ")}. Use cases: ${a.useCases.join(", ")}.`),i=b$7(`Generating embeddings for ${o.length} modules...`,{component:"ai",phase:"embeddings.generate"});try{let a=await _s(n);i.succeed(`Generated embeddings for ${o.length} modules`);let l={model:"text-embedding-3-small",dimension:a[0].length,generated_at:new Date().toISOString(),modules:o.map((m,d)=>({id:m.id,name:m.name,embedding:a[d]}))},c=e||v.join(process.cwd(),"data","modules-embeddings.json"),u=v.dirname(c);return j.existsSync(u)||j.mkdirSync(u,{recursive:true}),j.writeFileSync(c,JSON.stringify(l,null,2)),console.log(s.green(`
|
|
32
32
|
\u2705 Embeddings generated successfully!`)),console.log(s.gray(`\u{1F4C1} Saved to: ${c}`)),console.log(s.gray(`\u{1F4CA} Size: ${o.length} modules, ${a[0].length} dimensions
|
|
33
|
-
`)),true}catch(a){i.fail("Failed to generate embeddings");let l=
|
|
33
|
+
`)),true}catch(a){i.fail("Failed to generate embeddings");let l=Ws(a);return l.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
|
|
35
35
|
`))):l.includes("401")?(console.log(s.red(`
|
|
36
36
|
\u274C Invalid API key`)),console.log(s.yellow("Please set a valid API key:")),console.log(s.white(` rapidkit config set-api-key
|
|
37
37
|
`))):console.log(s.red(`
|
|
38
38
|
\u274C Error: ${l}
|
|
39
39
|
`)),false}}catch(o){return console.log(s.red(`
|
|
40
|
-
\u274C Failed to generate embeddings: ${
|
|
41
|
-
`)),false}}async function
|
|
40
|
+
\u274C Failed to generate embeddings: ${Ws(o)}
|
|
41
|
+
`)),false}}async function Ls(t=true){if(Fs().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
|
-
`)),false;let{action:o}=await b$3([{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
|
|
44
|
+
`)),false;let{action:o}=await b$3([{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 Ro(true):(o==="manual"&&(console.log(s.cyan(`
|
|
45
45
|
\u{1F4DD} To generate embeddings manually:
|
|
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 Js(){let t=Fs();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
|
-
`)),t.path?await
|
|
51
|
+
`)),t.path?await Ro(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
|
|
53
|
-
`)),false)}function
|
|
53
|
+
`)),false)}function Pr(t){if(t&&typeof t=="object"){let e=t;return {message:typeof e.message=="string"?e.message:String(t),code:typeof e.code=="string"?e.code:void 0}}return {message:String(t)}}function Ks(t,e=0){console.log(JSON.stringify(t,null,2)),e!==0&&process.exit(e);}function Gs(t){let e=t.command("ai").description("AI-powered features");e.command("recommend").description("Get AI-powered module recommendations").argument("[query]",'What do you want to build? (e.g., "user authentication with email")').option("-n, --number <count>","Number of recommendations","5").option("--json","Output as JSON").action(async(o,r)=>{try{fr()||(r.json&&Ks({ok:false,error:{code:"AI_DISABLED",message:"AI features are disabled",remediation:"rapidkit config ai enable"}},1),console.log(s.yellow(`
|
|
54
54
|
\u26A0\uFE0F AI features are disabled`)),console.log(s.gray(`Enable with: rapidkit config ai enable
|
|
55
|
-
`)),process.exit(1));let n=
|
|
55
|
+
`)),process.exit(1));let n=Ut();n?await So(n):(r.json||(console.log(s.yellow(`
|
|
56
56
|
\u26A0\uFE0F OpenAI API key not configured - using MOCK MODE for testing
|
|
57
57
|
`)),console.log(s.gray("\u{1F4DD} Note: Mock embeddings provide approximate results for testing.")),console.log(s.gray(` For production, configure your OpenAI API key:
|
|
58
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
|
+
`))),Cs());let i=o;i||(i=(await b$3([{type:"input",name:"query",message:"\u{1F916} What do you want to build?",validate:p=>p.length===0?"Please enter a description":p.length<3?"Please be more specific (at least 3 characters)":true}])).query),r.json||console.log(s.blue(`
|
|
60
60
|
\u{1F916} Analyzing your request...
|
|
61
|
-
`)),!n||await
|
|
61
|
+
`)),!n||await Ls(!r.json)||(r.json&&Ks({ok:false,query:i,error:{code:"EMBEDDINGS_MISSING",message:"Module embeddings are not available",remediation:"rapidkit ai generate-embeddings"}},1),console.log(s.yellow(`
|
|
62
62
|
\u26A0\uFE0F Cannot proceed without embeddings
|
|
63
|
-
`)),process.exit(1));let l=parseInt(r.number,10),c=await
|
|
63
|
+
`)),process.exit(1));let l=parseInt(r.number,10),c=await Ds(i,l);if(c.length===0||c[0].score<.3)if(console.log(s.yellow(`
|
|
64
64
|
\u26A0\uFE0F No matching modules found in RapidKit registry.
|
|
65
65
|
`)),console.log(s.cyan(`\u{1F4A1} Options:
|
|
66
66
|
`)),console.log(s.white("1. Create custom module:")),console.log(s.gray(" rapidkit modules scaffold <name> --category <category>")),console.log(s.gray(` Example: rapidkit modules scaffold blockchain-integration --category integrations
|
|
@@ -68,23 +68,23 @@ Cancelled
|
|
|
68
68
|
`)),console.log(s.white("3. Request feature:")),console.log(s.gray(` https://github.com/rapidkitlabs/rapidkit/issues
|
|
69
69
|
`)),c.length>0)console.log(s.yellow(`\u26A0\uFE0F Low confidence matches found:
|
|
70
70
|
`));else return;if(r.json){console.log(JSON.stringify({query:i,recommendations:c},null,2));return}console.log(s.green.bold(`\u{1F4E6} Recommended Modules:
|
|
71
|
-
`)),c.forEach((p
|
|
72
|
-
`));let{shouldInstall:
|
|
73
|
-
\u{1F4E6} Installing ${
|
|
74
|
-
`)),console.log(s.gray(`Command: rapidkit add module ${
|
|
75
|
-
\u274C RapidKit modules are not available for
|
|
76
|
-
`));return}let
|
|
71
|
+
`)),c.forEach((d,p)=>{let f=(d.score*100).toFixed(1),g=d.score>.8?" \u2B50":"";console.log(s.bold(`${p+1}. ${d.module.name}${g}`)),console.log(s.gray(` ${d.module.description}`)),console.log(s.cyan(` Match: ${f}%`)+s.gray(` - ${d.reason}`)),console.log(s.yellow(` Category: ${d.module.category}`)),d.module.dependencies.length>0&&console.log(s.magenta(` Requires: ${d.module.dependencies.join(", ")}`)),console.log();});let u=c.slice(0,3).map(d=>d.module.id);console.log(s.cyan("\u{1F4A1} Quick install (top 3):")),console.log(s.white(` rapidkit add module ${u.join(" ")}
|
|
72
|
+
`));let{shouldInstall:m}=await b$3([{type:"confirm",name:"shouldInstall",message:"Would you like to install these modules now?",default:false}]);if(m){let{selectedModules:d}=await b$3([{type:"checkbox",name:"selectedModules",message:"Select modules to install:",choices:c.map(f=>({name:`${f.module.name} - ${f.module.description}`,value:f.module.id,checked:f.score>.7}))}]),p=d;if(p.length>0){console.log(s.blue(`
|
|
73
|
+
\u{1F4E6} Installing ${p.length} modules...
|
|
74
|
+
`)),console.log(s.gray(`Command: rapidkit add module ${p.join(" ")}`));let g=q(process.cwd()).commandMap.add;if(!g||g.status!=="supported"){console.log(s.red(`
|
|
75
|
+
\u274C RapidKit modules are not available for this project.`)),console.log(s.gray(` ${g?.reason??"Module commands require RapidKit module-enabled project metadata."}
|
|
76
|
+
`));return}let y=await f$1(["add","module",...p],{cwd:process.cwd()});console.log(y===0?s.green(`
|
|
77
77
|
\u2705 Selected modules installed successfully
|
|
78
78
|
`):s.red(`
|
|
79
|
-
\u274C Module installation failed (exit code: ${
|
|
79
|
+
\u274C Module installation failed (exit code: ${y})
|
|
80
80
|
`));}else console.log(s.gray(`
|
|
81
81
|
No modules selected
|
|
82
|
-
`));}}catch(n){let i=
|
|
82
|
+
`));}}catch(n){let i=Pr(n);f.error(`
|
|
83
83
|
\u274C Error:`,i.message),i.code==="invalid_api_key"?(console.log(s.yellow(`
|
|
84
84
|
\u{1F4A1} Your API key may be invalid or expired`)),console.log(s.cyan(` Update it: rapidkit config set-api-key
|
|
85
85
|
`))):i.message.includes("embeddings file not found")&&(console.log(s.yellow(`
|
|
86
86
|
\u{1F4A1} Module embeddings not generated yet`)),console.log(s.cyan(" Generate them (one-time):")),console.log(s.white(" cd rapidkit-npm")),console.log(s.white(' export OPENAI_API_KEY="sk-proj-..."')),console.log(s.white(` npx tsx src/ai/generate-embeddings.ts
|
|
87
|
-
`))),process.exit(1);}}),e.command("info").description("Show AI features information").action(()=>{let o=
|
|
87
|
+
`))),process.exit(1);}}),e.command("info").description("Show AI features information").action(()=>{let o=Ut(),r=fr();console.log(s.bold(`
|
|
88
88
|
\u{1F916} RapidKit AI Features
|
|
89
89
|
`)),console.log(s.cyan("Status:"),r?s.green("Enabled"):s.red("Disabled")),console.log(s.cyan("API Key:"),o?s.green("Configured \u2713"):s.red("Not configured \u2717")),console.log(s.bold(`
|
|
90
90
|
\u{1F4E6} Available Features:
|
|
@@ -92,159 +92,159 @@ No modules selected
|
|
|
92
92
|
\u{1F4B0} Pricing:
|
|
93
93
|
`)),console.log(s.white("\u2022 Per query: ~$0.0002")+s.gray(" (practically free)")),console.log(s.white("\u2022 100 queries: ~$0.02")+s.gray(" (2 cents)")),console.log(s.white("\u2022 1000 queries: ~$0.20")+s.gray(" (20 cents)")),console.log(s.bold(`
|
|
94
94
|
\u{1F680} Getting Started:
|
|
95
|
-
`)),o?(console.log(s.green("\u2713 You're all set!")),console.log(s.white(' Try: rapidkit ai recommend "user authentication"'))):(console.log(s.white("1. Get OpenAI API key: https://platform.openai.com/api-keys")),console.log(s.white("2. Configure: rapidkit config set-api-key")),console.log(s.white('3. Try: rapidkit ai recommend "user authentication"'))),console.log();}),e.command("generate-embeddings").description("Generate AI embeddings for all modules (one-time setup)").option("--force","Force regeneration even if embeddings exist").action(async()=>{try{let o=
|
|
95
|
+
`)),o?(console.log(s.green("\u2713 You're all set!")),console.log(s.white(' Try: rapidkit ai recommend "user authentication"'))):(console.log(s.white("1. Get OpenAI API key: https://platform.openai.com/api-keys")),console.log(s.white("2. Configure: rapidkit config set-api-key")),console.log(s.white('3. Try: rapidkit ai recommend "user authentication"'))),console.log();}),e.command("generate-embeddings").description("Generate AI embeddings for all modules (one-time setup)").option("--force","Force regeneration even if embeddings exist").action(async()=>{try{let o=Ut();o||(console.log(s.red(`
|
|
96
96
|
\u274C OpenAI API key not configured
|
|
97
97
|
`)),console.log(s.cyan(`To generate embeddings, you need an OpenAI API key:
|
|
98
98
|
`)),console.log(s.white("1. Get your key from: https://platform.openai.com/api-keys")),console.log(s.white("2. Configure it: rapidkit config set-api-key")),console.log(s.gray(`
|
|
99
99
|
OR set environment variable:`)),console.log(s.white(` export OPENAI_API_KEY="sk-proj-..."
|
|
100
|
-
`)),process.exit(1)),
|
|
101
|
-
`))),process.exit(r?0:1);}catch(o){let r=
|
|
100
|
+
`)),process.exit(1)),So(o);let r=await Ro(true);r&&(console.log(s.green("\u2705 Ready to use AI recommendations!")),console.log(s.cyan(`Try: rapidkit ai recommend "authentication"
|
|
101
|
+
`))),process.exit(r?0:1);}catch(o){let r=Pr(o);f.error("Failed to generate embeddings:",r.message),process.exit(1);}}),e.command("update-embeddings").description("Update existing embeddings with latest modules").action(async()=>{try{let o=Ut();o||(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)),
|
|
105
|
-
`,"utf-8");}function
|
|
104
|
+
`)),process.exit(1)),So(o);let r=await Js();process.exit(r?0:1);}catch(o){let r=Pr(o);f.error("Failed to update embeddings:",r.message),process.exit(1);}});}var Qa="rapidkit.product-factory-plan.v1",Xa="rapidkit.private-product-manifest.v1";function Bt(t,e=""){return typeof t=="string"&&t.trim()?t.trim():e}function br(t){return typeof t=="string"&&t.trim()?t.trim():null}function Za(t,e){return typeof t=="number"&&Number.isFinite(t)?t:e}function Us(t){return Array.isArray(t)?[...new Set(t.filter(e=>typeof e=="string").map(e=>e.trim()).filter(Boolean))]:[]}function Bs(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 ec(t,e,o){let r=Bt(t.slug);if(!r)throw new Error(`Backlog product at index ${e} is missing slug.`);Bs(r);let n=Us(t.modules),i=Us(t.moduleGaps);return {rank:Za(t.rank,e+1),slug:r,title:Bt(t.title,r),category:Bt(t.category,"Uncategorized"),tier:Bt(t.tier,"pro"),summary:Bt(t.summary),modules:n,moduleGaps:i,recommendedKit:o,workspaceProfile:"enterprise",readiness:{status:i.length>0?"blocked-by-module-gaps":"ready-for-private-manifest",blockingGaps:i}}}function tc(t){if(!t||typeof t!="object"||Array.isArray(t))throw new Error("Backlog must be a JSON object.");return t}async function oc(t){let e=v.resolve(process.cwd(),t),o=tc(await E__default.readJson(e));if(!Array.isArray(o.products))throw new Error("Backlog must contain a products array.");return {absolutePath:e,payload:o}}function rc(t,e){let o=[...t];if(e.tier){let r=e.tier.toLowerCase();o=o.filter(n=>n.tier.toLowerCase()===r);}if(e.category){let r=e.category.toLowerCase();o=o.filter(n=>n.category.toLowerCase()===r);}if(e.limit){let r=Number.parseInt(e.limit,10);if(!Number.isInteger(r)||r<1)throw new Error("--limit must be a positive integer.");o=o.slice(0,r);}return o}async function Hs(t){let e=t.kit?.trim()||"fastapi.standard",{absolutePath:o,payload:r}=await oc(t.backlogPath),n=r.products,i=n.map((m,d)=>ec(m,d,e)),a=rc(i,t),l=new Set(a.flatMap(m=>m.modules)),c=a.flatMap(m=>m.moduleGaps),u=a.filter(m=>m.readiness.status==="ready-for-private-manifest").length;return {schemaVersion:Qa,generatedAt:(t.now??new Date).toISOString(),source:{backlogPath:o,backlogSchemaVersion:br(r.schemaVersion),purpose:br(r.purpose),publicationRule:br(r.publicationRule)},defaults:{kit:e,workspaceProfile:"enterprise",projectSlug:"api"},stats:{totalProducts:n.length,plannedProducts:a.length,readyProducts:u,blockedProducts:a.length-u,uniqueModules:l.size,knownModuleGaps:c.length},products:a}}function xt(t){return JSON.stringify(t,null,2)}function nc(t){return `sha256:${jr.createHash("sha256").update(xt(t)).digest("hex")}`}async function sc(t){let e=await Hs({backlogPath:t.backlogPath,kit:t.kit,now:t.now}),o=e.products.find(i=>i.slug===t.slug);if(!o)throw new Error(`Product "${t.slug}" was not found in backlog.`);let r=t.outputRoot||"../rapidkit-examples-pro",n={schemaVersion:Xa,generatedAt:e.generatedAt,product:{rank:o.rank,slug:o.slug,title:o.title,category:o.category,tier:o.tier,summary:o.summary},workspace:{name:o.slug,profile:"enterprise",outputHint:v.join(r,o.slug)},projects:[{slug:"api",kit:o.recommendedKit,runtime:"python",framework:"fastapi",modules:o.modules,moduleGaps:o.moduleGaps}],factory:{sourceBacklogPath:e.source.backlogPath,manifestChecksum:"",requiredCommands:[`npx rapidkit create workspace ${o.slug} --yes --profile enterprise`,`npx rapidkit create project ${o.recommendedKit} api --yes --skip-install`,"npx rapidkit init","npx rapidkit workspace run test --strict --json","npx rapidkit readiness --strict --json"],releaseEvidencePath:`.rapidkit/product-factory/${o.slug}/release-evidence.json`}};return {...n,factory:{...n.factory,manifestChecksum:nc({...n,factory:{...n.factory,manifestChecksum:""}})}}}async function Vs(t,e,o=false){let r=v.resolve(process.cwd(),t);if(!o&&await E__default.pathExists(r))throw new Error(`Refusing to overwrite existing file: ${r}. Use --force.`);await E__default.ensureDir(v.dirname(r)),await E__default.writeFile(r,`${xt(e)}
|
|
105
|
+
`,"utf-8");}function ic(t,e){let o=v.join(".rapidkit","product-factory","manifests",`${e}.manifest.json`);return t?t.endsWith(".json")?t:v.join(t,`${e}.manifest.json`):o}function ac(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
|
-
Wrote plan: ${
|
|
108
|
+
Wrote plan: ${v.resolve(process.cwd(),e)}`)),console.log(s.gray(`
|
|
109
109
|
Next: npx rapidkit product manifest create <slug> --from-backlog <file>
|
|
110
|
-
`));}function
|
|
110
|
+
`));}function cc(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
|
-
Wrote manifest: ${
|
|
114
|
-
`));}function
|
|
115
|
-
`,"utf-8"),o}async function Po(t,e,o){let r=await za(t);if(r.requireReasonForDestructiveOps&&!o.reason?.trim())throw new Error(`${e} requires --reason by workspace policy.`);if(r.requireSafetySnapshotForDestructiveOps&&o.safetySnapshot===false)throw new Error(`${e} requires a safety snapshot by workspace policy.`);if(o.permanent&&!r.allowPermanentDelete)throw new Error("Permanent project delete is disabled by workspace policy.");return r}function hr(t=process.cwd()){let e=w.resolve(t),o=w.resolve(ls.tmpdir());for(;;){if(e!==o&&(E__default.existsSync(w.join(e,".rapidkit-workspace"))||E__default.existsSync(w.join(e,".rapidkit","workspace.json"))))return e;let r=w.dirname(e);if(r===e)return null;e=r;}}function et(t){let e=t?w.resolve(t):hr(process.cwd());if(!e)throw new Error("Not inside a RapidKit workspace. Run from workspace root or pass --workspace.");if(!E__default.existsSync(w.join(e,".rapidkit-workspace"))&&!E__default.existsSync(w.join(e,".rapidkit","workspace.json")))throw new Error(`Workspace path is not a RapidKit workspace: ${e}`);return e}async function Qa(t){let e=await Ha(w.join(t,".rapidkit","workspace.json")),o=e?.workspace_name??e?.name;return typeof o=="string"&&o.trim()?o.trim():w.basename(t)}function bo(t){return w.join(t,".rapidkit","snapshots")}function Kt(t){return w.join(t,".rapidkit","archive","projects")}function yr(t){return w.join(t,"files")}function Xa(t){return w.join(ls.tmpdir(),`rapidkit-workspace-snapshot-${process.pid}-${t}-${fr.randomBytes(4).toString("hex")}`)}function wr(t,e){let o=w.relative(t,e);if(!o)return true;let r=o.split(w.sep);return r[0]===".rapidkit"&&["snapshots","archive","audit"].includes(r[1]||"")?false:!r.some(n=>Ba.has(n))}async function Za(t){return (await a$a(t,{descendIntoMatchedProjects:false})).map(o=>({name:w.basename(o),relativePath:w.relative(t,o)}))}async function ec(t,e){let o=[];for(let r of Va){let n=w.join(t,r);if(!await E__default.pathExists(n))continue;let i=w.join(e,r);await E__default.copy(n,i,{filter:a=>wr(t,a)}),o.push(r);}return o}async function tc(t,e){await E__default.writeJson(w.join(t,"snapshot.json"),e,{spaces:2});}async function kr(t){let e=w.join(t,"snapshot.json"),o=await E__default.readJson(e);if(!o||typeof o!="object"||o.schema!==Ds)throw new Error(`Invalid RapidKit workspace snapshot manifest: ${e}`);return o}async function oc(t){let e=0,o=0,r=[t];for(;r.length>0;){let n=r.shift();if(!n)continue;let i=[];try{i=await E__default.readdir(n,{withFileTypes:true});}catch{continue}for(let a of i){let l=w.join(n,a.name);if(a.isDirectory()){r.push(l);continue}if(a.isFile())try{let c=await E__default.stat(l);e+=1,o+=c.size;}catch{}}}return {files:e,bytes:o}}async function xt(t={}){let e=et(t.workspacePath),o=t.name?t.name:`snapshot-${St()}`,r=gr(o),n=w.join(bo(e),r),i=Xa(r);if(await E__default.pathExists(n))throw new Error(`Snapshot already exists: ${r}`);let a=yr(i);try{await E__default.ensureDir(a);let l=t.includeProjects?"full":"metadata",c=l==="full"?["."]:await ec(e,a);l==="full"&&await E__default.copy(e,a,{filter:g=>wr(e,g)});let f={schema:Ds,name:r,mode:l,reason:t.reason,createdAt:new Date().toISOString(),workspaceName:await Qa(e),workspacePath:e,copiedPaths:c,projects:await Za(e)};return await tc(i,f),await E__default.ensureDir(w.dirname(n)),await E__default.move(i,n,{overwrite:false}),await Ue(e,{action:"snapshot.create",target:r,status:"succeeded",reason:t.reason,details:{mode:l,copiedPaths:c,snapshotPath:n,projectCount:f.projects.length}}),{manifest:f,snapshotPath:n}}catch(l){throw await E__default.remove(i),await Ue(e,{action:"snapshot.create",target:r,status:"failed",reason:t.reason,details:{error:l instanceof Error?l.message:String(l)}}),l}}async function Ws(t){let e=et(t.workspacePath),o=w.join(bo(e),gr(t.name));if(!await E__default.pathExists(o))throw new Error(`Snapshot not found: ${t.name}`);let r=await kr(o),n=yr(o),i=await oc(n);return {manifest:r,snapshotPath:o,filesRoot:n,estimatedFileCount:i.files,estimatedBytes:i.bytes}}async function Fs(t={}){let e=et(t.workspacePath),o=bo(e);if(!await E__default.pathExists(o))return [];let r=await E__default.readdir(o,{withFileTypes:true}),n=[];for(let i of r){if(!i.isDirectory())continue;let a=w.join(o,i.name);try{n.push({...await kr(a),snapshotPath:a});}catch{}}return n.sort((i,a)=>a.createdAt.localeCompare(i.createdAt))}async function Js(t){let e=et(t.workspacePath),o=w.join(bo(e),gr(t.name));if(!await E__default.pathExists(o))throw new Error(`Snapshot not found: ${t.name}`);let r=await kr(o),n=yr(o),i=r.mode==="full"?["."]:Array.from(new Set(r.copiedPaths.map(c=>c.startsWith(".rapidkit/")?".rapidkit":c)));if(t.dryRun)return await Ue(e,{action:"snapshot.restore",target:r.name,status:"planned",reason:t.reason,details:{restoredPaths:i}}),{workspacePath:e,snapshotPath:o,restoredPaths:i,dryRun:true};if(!t.force)throw new Error("Restore is destructive. Re-run with --force after reviewing --dry-run output.");await Po(e,"snapshot.restore",{reason:t.reason,safetySnapshot:t.safetySnapshot});let a;if(t.safetySnapshot!==false&&(a=(await xt({workspacePath:e,name:`pre-restore-${r.name}-${St()}`,reason:`Automatic safety snapshot before restoring ${r.name}`,includeProjects:false})).snapshotPath),r.mode==="full")await E__default.copy(n,e,{overwrite:true,errorOnExist:false,filter:c=>wr(n,c)});else for(let c of r.copiedPaths)await E__default.copy(w.join(n,c),w.join(e,c),{overwrite:true,errorOnExist:false});let l={workspacePath:e,snapshotPath:o,restoredPaths:i,dryRun:false,safetySnapshotPath:a};return await Ue(e,{action:"snapshot.restore",target:r.name,status:"succeeded",reason:t.reason,details:{restoredPaths:i,safetySnapshotPath:a}}),l}function Ls(t){let e=t.trim();if(!e)throw new Error("Project name/path is required.");return e}async function Ks(t,e){let o=Ls(e),r=w.isAbsolute(o)?w.resolve(o):w.resolve(t,o);if(r.startsWith(`${w.resolve(t)}${w.sep}`)&&await E__default.pathExists(r))return r;let i=(await a$a(t,{descendIntoMatchedProjects:false})).filter(a=>{let l=w.relative(t,a);return w.basename(a)===o||l===o});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 vr(t){try{let{syncWorkspaceProjects:e}=await import('./workspace-5DKOA7TN.js');await e(t,true);}catch{}}function rc(t,e){let o=fr.randomBytes(4).toString("hex");return w.join(Kt(t),`${e}-${St()}-${o}`)}async function Gs(t){let e=w.join(t,"rapidkit-archive.json"),o=await E__default.readJson(e);if(!o||typeof o!="object"||o.schema!==Ts)throw new Error(`Invalid RapidKit archive manifest: ${e}`);return o}async function Pr(t={}){let e=et(t.workspacePath),o=Kt(e);if(!await E__default.pathExists(o))return [];let r=await E__default.readdir(o,{withFileTypes:true}),n=[];for(let i of r){if(!i.isDirectory())continue;let a=w.join(o,i.name),l=w.join(a,"rapidkit-archive.json");try{n.push({...await Gs(a),archivePath:a,manifestPath:l});}catch{}}return n.sort((i,a)=>a.archivedAt.localeCompare(i.archivedAt))}async function nc(t,e){let o=Ls(e),r=w.isAbsolute(o)?w.resolve(o):w.resolve(Kt(t),o);if(r.startsWith(`${w.resolve(Kt(t))}${w.sep}`)&&await E__default.pathExists(w.join(r,"rapidkit-archive.json")))return r;let i=(await Pr({workspacePath:t})).filter(a=>w.basename(a.archivePath)===o||a.projectName===o||w.relative(Kt(t),a.archivePath)===o);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 br(t){let e=et(t.workspacePath),o=await Ks(e,t.project),r=w.basename(o),n=rc(e,r),i=w.join(n,"rapidkit-archive.json");if(t.dryRun)return await Ue(e,{action:"project.archive",target:r,status:"planned",reason:t.reason,details:{projectPath:o,archivePath:n}}),{workspacePath:e,projectName:r,projectPath:o,action:"archive",archivePath:n,manifestPath:i,dryRun:true};await Po(e,"project.archive",{reason:t.reason,safetySnapshot:true});let a=await xt({workspacePath:e,name:`pre-archive-${r}-${St()}`,reason:t.reason||`Automatic safety snapshot before archiving ${r}`,includeProjects:false});await E__default.ensureDir(w.dirname(n)),await E__default.move(o,n,{overwrite:false});let l={schema:Ts,projectName:r,originalPath:o,archivedPath:n,reason:t.reason,archivedAt:new Date().toISOString(),safetySnapshotPath:a.snapshotPath};return await E__default.writeJson(i,l,{spaces:2}),await c$3(e,[o]),await vr(e),await Ue(e,{action:"project.archive",target:r,status:"succeeded",reason:t.reason,details:{projectPath:o,archivePath:n,manifestPath:i,safetySnapshotPath:a.snapshotPath}}),{workspacePath:e,projectName:r,projectPath:o,action:"archive",archivePath:n,manifestPath:i,safetySnapshotPath:a.snapshotPath,dryRun:false}}async function Us(t){if(!t.permanent)return br(t);let e=et(t.workspacePath),o=await Ks(e,t.project),r=w.basename(o);if(t.confirm!==r)throw new Error(`Permanent delete requires --confirm ${r}`);if(t.dryRun)return await Ue(e,{action:"project.delete",target:r,status:"planned",reason:t.reason,details:{projectPath:o,permanent:true}}),{workspacePath:e,projectName:r,projectPath:o,action:"delete",dryRun:true};await Po(e,"project.delete",{reason:t.reason,permanent:true,safetySnapshot:true});let n=await xt({workspacePath:e,name:`pre-delete-${r}-${St()}`,reason:t.reason||`Automatic safety snapshot before deleting ${r}`,includeProjects:false});return await E__default.remove(o),await c$3(e,[o]),await vr(e),await Ue(e,{action:"project.delete",target:r,status:"succeeded",reason:t.reason,details:{projectPath:o,permanent:true,safetySnapshotPath:n.snapshotPath}}),{workspacePath:e,projectName:r,projectPath:o,action:"delete",safetySnapshotPath:n.snapshotPath,dryRun:false}}async function Vs(t){let e=et(t.workspacePath),o=await nc(e,t.archive),r=await Gs(o),n=t.targetName?.trim()||r.projectName,i=w.join(e,n);if(!i.startsWith(`${w.resolve(e)}${w.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 Ue(e,{action:"project.restore",target:n,status:"planned",reason:t.reason,details:{archivePath:o,projectPath:i}}),{workspacePath:e,projectName:n,projectPath:i,action:"restore",archivePath:o,manifestPath:w.join(o,"rapidkit-archive.json"),dryRun:true};await Po(e,"project.restore",{reason:t.reason,safetySnapshot:true});let a=await xt({workspacePath:e,name:`pre-restore-project-${n}-${St()}`,reason:t.reason||`Automatic safety snapshot before restoring ${n}`,includeProjects:false});return await E__default.move(o,i,{overwrite:t.force===true}),await vr(e),await Ue(e,{action:"project.restore",target:n,status:"succeeded",reason:t.reason,details:{archivePath:o,projectPath:i,safetySnapshotPath:a.snapshotPath}}),{workspacePath:e,projectName:n,projectPath:i,action:"restore",archivePath:o,manifestPath:w.join(i,"rapidkit-archive.json"),safetySnapshotPath:a.snapshotPath,dryRun:false}}var ic="rapidkit.infra-stack.v1",Hs="rapidkit.infra-plan.v1",Ct=".rapidkit/infra/docker-compose.yml",Rt=".rapidkit/reports/infra-plan.json",xr=".rapidkit/infra/.env.example";function ac(){let t=w.dirname(fileURLToPath(import.meta.url)),e=[w.join(t,"../../contracts/infra-stack.v1.json"),w.join(t,"../contracts/infra-stack.v1.json")];for(let o of e)if(j.existsSync(o))return o;throw new Error(`Infra stack contract not found. Expected contracts/infra-stack.v1.json beside the rapidkit package root. Checked: ${e.join(", ")}`)}var Sr=null;function pt(t){if(Sr)return Sr;let e=ac(),o=j.readFileSync(e,"utf-8"),r=JSON.parse(o);if(r.schemaVersion!==ic)throw new Error(`Unsupported infra stack schema: ${r.schemaVersion}`);return cc(r),(Sr=r),r}function cc(t){let e=new Set(Object.keys(t.services));for(let[o,r]of Object.entries(t.moduleMappings)){if(!Array.isArray(r))throw new Error(`Invalid moduleMappings entry for ${o}`);for(let n of r)if(!e.has(n))throw new Error(`moduleMappings/${o} references unknown service '${n}'`)}for(let[o,r]of Object.entries(t.envVarMappings)){if(!Array.isArray(r))throw new Error(`Invalid envVarMappings entry for ${o}`);for(let n of r)if(!e.has(n))throw new Error(`envVarMappings/${o} references unknown service '${n}'`)}}function qs(t,e){let o=e.startsWith("free/")?e:`free/${e}`;return t.moduleMappings[o]||[]}function Et(t,e){return t.envVarMappings[e.toUpperCase()]||[]}function zs(t,e){let o={};for(let r of e){let n=t.services[r];n&&Object.assign(o,n.connectionEnv);}return o}async function lc(t){let e=w.join(t,"registry.json");if(!await E__default.pathExists(e))return [];try{let r=(await E__default.readJson(e)).installed_modules||[];return [...new Set(r.map(n=>typeof n.slug=="string"?n.slug.trim():"").filter(Boolean))]}catch{return []}}async function dc(t){let e=w.join(t,".env.example");if(!await E__default.pathExists(e))return [];try{let o=await E__default.readFile(e,"utf-8"),r=[];for(let n of o.split(`
|
|
116
|
-
`)){let i=n.trim();if(!i||i.startsWith("#"))continue;let a=i.match(/^([A-Z0-9_]+)=/);a?.[1]&&r.push(a[1]);}return r}catch{return []}}async function
|
|
117
|
-
`)){let n=
|
|
118
|
-
`)?JSON.stringify(t):t}function
|
|
119
|
-
`)}function
|
|
120
|
-
`)}function
|
|
121
|
-
`);e.push("services:");for(let r of t.plan.services){let n=t.contract.services[r.id];if(n){if(e.push(` ${r.id}:`),e.push(` image: ${n.image}`),e.push(` container_name: rapidkit-${r.id}`),n.command?.length){let i=n.command.map(a=>JSON.stringify(a)).join(", ");e.push(` command: [${i}]`);}if(n.env&&Object.keys(n.env).length>0){e.push(" environment:");let i={...n.env,...t.plan.serviceEnvOverrides?.[r.id]||{}};e.push(
|
|
122
|
-
`)}function
|
|
123
|
-
`);return t.dryRun?{composePath:o,planPath:r,envExamplePath:n}:(await E__default.ensureDir(
|
|
124
|
-
`,"utf-8"),await E__default.writeFile(n,l,"utf-8"),{composePath:o,planPath:r,envExamplePath:n})}function
|
|
113
|
+
Wrote manifest: ${v.resolve(process.cwd(),e)}
|
|
114
|
+
`));}function qs(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(o,r)=>{try{let n=await Hs({backlogPath:o,kit:r.kit,tier:r.tier,category:r.category,limit:r.limit});r.output&&await Vs(r.output,n,true),r.json?console.log(xt(n)):ac(n,r.output);}catch(n){let i=n instanceof Error?n.message:String(n);r.json?console.log(xt({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(o,r)=>{try{Bs(o);let n=await sc({backlogPath:r.fromBacklog,slug:o,kit:r.kit,outputRoot:r.workspaceOutput}),i=ic(r.output,o);await Vs(i,n,r.force===true),r.json?console.log(xt(n)):cc(n,i);}catch(n){let i=n instanceof Error?n.message:String(n);r.json?console.log(xt({ok:false,error:{message:i}})):console.error(s.red(`Product manifest create failed: ${i}`)),process.exit(1);}});}var Ys="rapidkit-workspace-snapshot-v1",Qs="rapidkit-project-archive-v1",lc=[".rapidkit/workspace.json",".rapidkit-workspace","rapidkit.config.json","rapidkit.config.js","rapidkit.config.cjs","rapidkit.config.mjs","package.json"],dc=new Set([".git","node_modules",".venv","dist","build","target","coverage","htmlcov",".next"]),Ht={requireReasonForDestructiveOps:false,requireSafetySnapshotForDestructiveOps:true,allowPermanentDelete:true};function Ct(t=new Date){return t.toISOString().replace(/[:.]/g,"-")}function Sr(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 pc(t){try{let e=await E__default.readJson(t);return e&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}function uc(t,e){if(!t)return e;let o=t.trim().toLowerCase();return ["true","yes","1","on"].includes(o)?true:["false","no","0","off"].includes(o)?false:e}async function mc(t){let e=v.join(t,".rapidkit","policies.yml");if(!await E__default.pathExists(e))return {...Ht};try{let o=await E__default.readFile(e,"utf-8"),r=(n,i)=>{let a=o.match(new RegExp(`^\\s*${n}:\\s*([^#\\n]+)`,"m"));return uc(a?.[1],i)};return {requireReasonForDestructiveOps:r("require_reason_for_destructive_ops",Ht.requireReasonForDestructiveOps),requireSafetySnapshotForDestructiveOps:r("require_safety_snapshot_for_destructive_ops",Ht.requireSafetySnapshotForDestructiveOps),allowPermanentDelete:r("allow_permanent_delete",Ht.allowPermanentDelete)}}catch{return {...Ht}}}function fc(t){return v.join(t,".rapidkit","audit","events.jsonl")}async function Ke(t,e){let o={schema:"rapidkit-workspace-audit-event-v1",id:jr.randomUUID(),timestamp:new Date().toISOString(),workspacePath:t,...e},r=fc(t);return await E__default.ensureDir(v.dirname(r)),await E__default.appendFile(r,`${JSON.stringify(o)}
|
|
115
|
+
`,"utf-8"),o}async function _o(t,e,o){let r=await mc(t);if(r.requireReasonForDestructiveOps&&!o.reason?.trim())throw new Error(`${e} requires --reason by workspace policy.`);if(r.requireSafetySnapshotForDestructiveOps&&o.safetySnapshot===false)throw new Error(`${e} requires a safety snapshot by workspace policy.`);if(o.permanent&&!r.allowPermanentDelete)throw new Error("Permanent project delete is disabled by workspace policy.");return r}function xr(t=process.cwd()){let e=v.resolve(t),o=v.resolve(js.tmpdir());for(;;){if(e!==o&&(E__default.existsSync(v.join(e,".rapidkit-workspace"))||E__default.existsSync(v.join(e,".rapidkit","workspace.json"))))return e;let r=v.dirname(e);if(r===e)return null;e=r;}}function Ze(t){let e=t?v.resolve(t):xr(process.cwd());if(!e)throw new Error("Not inside a RapidKit workspace. Run from workspace root or pass --workspace.");if(!E__default.existsSync(v.join(e,".rapidkit-workspace"))&&!E__default.existsSync(v.join(e,".rapidkit","workspace.json")))throw new Error(`Workspace path is not a RapidKit workspace: ${e}`);return e}async function gc(t){let e=await pc(v.join(t,".rapidkit","workspace.json")),o=e?.workspace_name??e?.name;return typeof o=="string"&&o.trim()?o.trim():v.basename(t)}function Ao(t){return v.join(t,".rapidkit","snapshots")}function qt(t){return v.join(t,".rapidkit","archive","projects")}function Cr(t){return v.join(t,"files")}function yc(t){return v.join(js.tmpdir(),`rapidkit-workspace-snapshot-${process.pid}-${t}-${jr.randomBytes(4).toString("hex")}`)}function Rr(t,e){let o=v.relative(t,e);if(!o)return true;let r=o.split(v.sep);return r[0]===".rapidkit"&&["snapshots","archive","audit"].includes(r[1]||"")?false:!r.some(n=>dc.has(n))}async function hc(t){return (await a$a(t,{descendIntoMatchedProjects:false})).map(o=>({name:v.basename(o),relativePath:v.relative(t,o)}))}async function wc(t,e){let o=[];for(let r of lc){let n=v.join(t,r);if(!await E__default.pathExists(n))continue;let i=v.join(e,r);await E__default.copy(n,i,{filter:a=>Rr(t,a)}),o.push(r);}return o}async function kc(t,e){await E__default.writeJson(v.join(t,"snapshot.json"),e,{spaces:2});}async function Er(t){let e=v.join(t,"snapshot.json"),o=await E__default.readJson(e);if(!o||typeof o!="object"||o.schema!==Ys)throw new Error(`Invalid RapidKit workspace snapshot manifest: ${e}`);return o}async function vc(t){let e=0,o=0,r=[t];for(;r.length>0;){let n=r.shift();if(!n)continue;let i=[];try{i=await E__default.readdir(n,{withFileTypes:true});}catch{continue}for(let a of i){let l=v.join(n,a.name);if(a.isDirectory()){r.push(l);continue}if(a.isFile())try{let c=await E__default.stat(l);e+=1,o+=c.size;}catch{}}}return {files:e,bytes:o}}async function Rt(t={}){let e=Ze(t.workspacePath),o=t.name?t.name:`snapshot-${Ct()}`,r=Sr(o),n=v.join(Ao(e),r),i=yc(r);if(await E__default.pathExists(n))throw new Error(`Snapshot already exists: ${r}`);let a=Cr(i);try{await E__default.ensureDir(a);let l=t.includeProjects?"full":"metadata",c=l==="full"?["."]:await wc(e,a);l==="full"&&await E__default.copy(e,a,{filter:m=>Rr(e,m)});let u={schema:Ys,name:r,mode:l,reason:t.reason,createdAt:new Date().toISOString(),workspaceName:await gc(e),workspacePath:e,copiedPaths:c,projects:await hc(e)};return await kc(i,u),await E__default.ensureDir(v.dirname(n)),await E__default.move(i,n,{overwrite:false}),await Ke(e,{action:"snapshot.create",target:r,status:"succeeded",reason:t.reason,details:{mode:l,copiedPaths:c,snapshotPath:n,projectCount:u.projects.length}}),{manifest:u,snapshotPath:n}}catch(l){throw await E__default.remove(i),await Ke(e,{action:"snapshot.create",target:r,status:"failed",reason:t.reason,details:{error:l instanceof Error?l.message:String(l)}}),l}}async function Xs(t){let e=Ze(t.workspacePath),o=v.join(Ao(e),Sr(t.name));if(!await E__default.pathExists(o))throw new Error(`Snapshot not found: ${t.name}`);let r=await Er(o),n=Cr(o),i=await vc(n);return {manifest:r,snapshotPath:o,filesRoot:n,estimatedFileCount:i.files,estimatedBytes:i.bytes}}async function Zs(t={}){let e=Ze(t.workspacePath),o=Ao(e);if(!await E__default.pathExists(o))return [];let r=await E__default.readdir(o,{withFileTypes:true}),n=[];for(let i of r){if(!i.isDirectory())continue;let a=v.join(o,i.name);try{n.push({...await Er(a),snapshotPath:a});}catch{}}return n.sort((i,a)=>a.createdAt.localeCompare(i.createdAt))}async function ei(t){let e=Ze(t.workspacePath),o=v.join(Ao(e),Sr(t.name));if(!await E__default.pathExists(o))throw new Error(`Snapshot not found: ${t.name}`);let r=await Er(o),n=Cr(o),i=r.mode==="full"?["."]:Array.from(new Set(r.copiedPaths.map(c=>c.startsWith(".rapidkit/")?".rapidkit":c)));if(t.dryRun)return await Ke(e,{action:"snapshot.restore",target:r.name,status:"planned",reason:t.reason,details:{restoredPaths:i}}),{workspacePath:e,snapshotPath:o,restoredPaths:i,dryRun:true};if(!t.force)throw new Error("Restore is destructive. Re-run with --force after reviewing --dry-run output.");await _o(e,"snapshot.restore",{reason:t.reason,safetySnapshot:t.safetySnapshot});let a;if(t.safetySnapshot!==false&&(a=(await Rt({workspacePath:e,name:`pre-restore-${r.name}-${Ct()}`,reason:`Automatic safety snapshot before restoring ${r.name}`,includeProjects:false})).snapshotPath),r.mode==="full")await E__default.copy(n,e,{overwrite:true,errorOnExist:false,filter:c=>Rr(n,c)});else for(let c of r.copiedPaths)await E__default.copy(v.join(n,c),v.join(e,c),{overwrite:true,errorOnExist:false});let l={workspacePath:e,snapshotPath:o,restoredPaths:i,dryRun:false,safetySnapshotPath:a};return await Ke(e,{action:"snapshot.restore",target:r.name,status:"succeeded",reason:t.reason,details:{restoredPaths:i,safetySnapshotPath:a}}),l}function ti(t){let e=t.trim();if(!e)throw new Error("Project name/path is required.");return e}async function oi(t,e){let o=ti(e),r=v.isAbsolute(o)?v.resolve(o):v.resolve(t,o);if(r.startsWith(`${v.resolve(t)}${v.sep}`)&&await E__default.pathExists(r))return r;let i=(await a$a(t,{descendIntoMatchedProjects:false})).filter(a=>{let l=v.relative(t,a);return v.basename(a)===o||l===o});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 _r(t){try{let{syncWorkspaceProjects:e}=await import('./workspace-MPKEUHFP.js');await e(t,true);}catch{}}function Pc(t,e){let o=jr.randomBytes(4).toString("hex");return v.join(qt(t),`${e}-${Ct()}-${o}`)}async function ri(t){let e=v.join(t,"rapidkit-archive.json"),o=await E__default.readJson(e);if(!o||typeof o!="object"||o.schema!==Qs)throw new Error(`Invalid RapidKit archive manifest: ${e}`);return o}async function Ar(t={}){let e=Ze(t.workspacePath),o=qt(e);if(!await E__default.pathExists(o))return [];let r=await E__default.readdir(o,{withFileTypes:true}),n=[];for(let i of r){if(!i.isDirectory())continue;let a=v.join(o,i.name),l=v.join(a,"rapidkit-archive.json");try{n.push({...await ri(a),archivePath:a,manifestPath:l});}catch{}}return n.sort((i,a)=>a.archivedAt.localeCompare(i.archivedAt))}async function bc(t,e){let o=ti(e),r=v.isAbsolute(o)?v.resolve(o):v.resolve(qt(t),o);if(r.startsWith(`${v.resolve(qt(t))}${v.sep}`)&&await E__default.pathExists(v.join(r,"rapidkit-archive.json")))return r;let i=(await Ar({workspacePath:t})).filter(a=>v.basename(a.archivePath)===o||a.projectName===o||v.relative(qt(t),a.archivePath)===o);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 Ir(t){let e=Ze(t.workspacePath),o=await oi(e,t.project),r=v.basename(o),n=Pc(e,r),i=v.join(n,"rapidkit-archive.json");if(t.dryRun)return await Ke(e,{action:"project.archive",target:r,status:"planned",reason:t.reason,details:{projectPath:o,archivePath:n}}),{workspacePath:e,projectName:r,projectPath:o,action:"archive",archivePath:n,manifestPath:i,dryRun:true};await _o(e,"project.archive",{reason:t.reason,safetySnapshot:true});let a=await Rt({workspacePath:e,name:`pre-archive-${r}-${Ct()}`,reason:t.reason||`Automatic safety snapshot before archiving ${r}`,includeProjects:false});await E__default.ensureDir(v.dirname(n)),await E__default.move(o,n,{overwrite:false});let l={schema:Qs,projectName:r,originalPath:o,archivedPath:n,reason:t.reason,archivedAt:new Date().toISOString(),safetySnapshotPath:a.snapshotPath};return await E__default.writeJson(i,l,{spaces:2}),await c$2(e,[o]),await _r(e),await Ke(e,{action:"project.archive",target:r,status:"succeeded",reason:t.reason,details:{projectPath:o,archivePath:n,manifestPath:i,safetySnapshotPath:a.snapshotPath}}),{workspacePath:e,projectName:r,projectPath:o,action:"archive",archivePath:n,manifestPath:i,safetySnapshotPath:a.snapshotPath,dryRun:false}}async function ni(t){if(!t.permanent)return Ir(t);let e=Ze(t.workspacePath),o=await oi(e,t.project),r=v.basename(o);if(t.confirm!==r)throw new Error(`Permanent delete requires --confirm ${r}`);if(t.dryRun)return await Ke(e,{action:"project.delete",target:r,status:"planned",reason:t.reason,details:{projectPath:o,permanent:true}}),{workspacePath:e,projectName:r,projectPath:o,action:"delete",dryRun:true};await _o(e,"project.delete",{reason:t.reason,permanent:true,safetySnapshot:true});let n=await Rt({workspacePath:e,name:`pre-delete-${r}-${Ct()}`,reason:t.reason||`Automatic safety snapshot before deleting ${r}`,includeProjects:false});return await E__default.remove(o),await c$2(e,[o]),await _r(e),await Ke(e,{action:"project.delete",target:r,status:"succeeded",reason:t.reason,details:{projectPath:o,permanent:true,safetySnapshotPath:n.snapshotPath}}),{workspacePath:e,projectName:r,projectPath:o,action:"delete",safetySnapshotPath:n.snapshotPath,dryRun:false}}async function si(t){let e=Ze(t.workspacePath),o=await bc(e,t.archive),r=await ri(o),n=t.targetName?.trim()||r.projectName,i=v.join(e,n);if(!i.startsWith(`${v.resolve(e)}${v.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:o,projectPath:i}}),{workspacePath:e,projectName:n,projectPath:i,action:"restore",archivePath:o,manifestPath:v.join(o,"rapidkit-archive.json"),dryRun:true};await _o(e,"project.restore",{reason:t.reason,safetySnapshot:true});let a=await Rt({workspacePath:e,name:`pre-restore-project-${n}-${Ct()}`,reason:t.reason||`Automatic safety snapshot before restoring ${n}`,includeProjects:false});return await E__default.move(o,i,{overwrite:t.force===true}),await _r(e),await Ke(e,{action:"project.restore",target:n,status:"succeeded",reason:t.reason,details:{archivePath:o,projectPath:i,safetySnapshotPath:a.snapshotPath}}),{workspacePath:e,projectName:n,projectPath:i,action:"restore",archivePath:o,manifestPath:v.join(i,"rapidkit-archive.json"),safetySnapshotPath:a.snapshotPath,dryRun:false}}var Sc="rapidkit.infra-stack.v1",ai="rapidkit.infra-plan.v1",Et=".rapidkit/infra/docker-compose.yml",_t=".rapidkit/reports/infra-plan.json",Mr=".rapidkit/infra/.env.example";function xc(){let t=v.dirname(fileURLToPath(import.meta.url)),e=[v.join(t,"../../contracts/infra-stack.v1.json"),v.join(t,"../contracts/infra-stack.v1.json")];for(let o of e)if(j.existsSync(o))return o;throw new Error(`Infra stack contract not found. Expected contracts/infra-stack.v1.json beside the rapidkit package root. Checked: ${e.join(", ")}`)}var Or=null;function pt(t){if(Or)return Or;let e=xc(),o=j.readFileSync(e,"utf-8"),r=JSON.parse(o);if(r.schemaVersion!==Sc)throw new Error(`Unsupported infra stack schema: ${r.schemaVersion}`);return Cc(r),(Or=r),r}function Cc(t){let e=new Set(Object.keys(t.services));for(let[o,r]of Object.entries(t.moduleMappings)){if(!Array.isArray(r))throw new Error(`Invalid moduleMappings entry for ${o}`);for(let n of r)if(!e.has(n))throw new Error(`moduleMappings/${o} references unknown service '${n}'`)}for(let[o,r]of Object.entries(t.envVarMappings)){if(!Array.isArray(r))throw new Error(`Invalid envVarMappings entry for ${o}`);for(let n of r)if(!e.has(n))throw new Error(`envVarMappings/${o} references unknown service '${n}'`)}}function ci(t,e){let o=e.startsWith("free/")?e:`free/${e}`;return t.moduleMappings[o]||[]}function At(t,e){return t.envVarMappings[e.toUpperCase()]||[]}function li(t,e){let o={};for(let r of e){let n=t.services[r];n&&Object.assign(o,n.connectionEnv);}return o}async function Rc(t){let e=v.join(t,"registry.json");if(!await E__default.pathExists(e))return [];try{let r=(await E__default.readJson(e)).installed_modules||[];return [...new Set(r.map(n=>typeof n.slug=="string"?n.slug.trim():"").filter(Boolean))]}catch{return []}}async function Ec(t){let e=v.join(t,".env.example");if(!await E__default.pathExists(e))return [];try{let o=await E__default.readFile(e,"utf-8"),r=[];for(let n of o.split(`
|
|
116
|
+
`)){let i=n.trim();if(!i||i.startsWith("#"))continue;let a=i.match(/^([A-Z0-9_]+)=/);a?.[1]&&r.push(a[1]);}return r}catch{return []}}async function _c(t){let e=v.join(t,".rapidkit","infra","overrides.json");if(!await E__default.pathExists(e))return [];try{let o=await E__default.readJson(e);return Array.isArray(o.services)?[...new Set(o.services.filter(r=>typeof r=="string"&&r.trim().length>0))]:[]}catch{return []}}async function Ac(t){let e=v.join(t,".rapidkit","workspace.contract.json");if(!await E__default.pathExists(e))return [];try{let o=await E__default.readJson(e),r=[];for(let n of o.projects||[]){let i=typeof n.slug=="string"?n.slug:"unknown";for(let a of n.contracts?.env||[])typeof a=="string"&&a.trim()&&r.push({project:i,env:a.trim().toUpperCase()});}return r}catch{return []}}function Io(t,e,o,r){t.add(o),e.push(r);}async function di(t){let e=v.resolve(t.workspacePath),o=t.contract||pt(),r=new Set,n=[],i=new Set,a=new Set,l=new Set,c=await f$6(e);for(let u of c){let m=v.dirname(v.dirname(u)),d=v.basename(m);for(let p of await Rc(m)){i.add(p);for(let f of ci(o,p))Io(r,n,f,{kind:"module",value:p,project:d});}for(let p of await Ec(m)){a.add(p);for(let f of At(o,p))Io(r,n,f,{kind:"env-var",value:p,project:d});}}for(let u of await Ac(e)){a.add(u.env);for(let m of At(o,u.env))Io(r,n,m,{kind:"contract-env",value:u.env,project:u.project});}for(let u of await _c(e))l.add(u),Io(r,n,u,{kind:"override",value:u});return {modules:[...i].sort(),envVars:[...a].sort(),overrides:[...l].sort(),sources:n,serviceIds:[...r].sort()}}function Ic(t){let e=t.trim();if(!e||e.startsWith("#"))return null;let o=e.indexOf("=");if(o<=0)return null;let r=e.slice(0,o).trim();if(!/^[A-Z0-9_]+$/.test(r))return null;let n=e.slice(o+1).trim();(n.startsWith('"')&&n.endsWith('"')||n.startsWith("'")&&n.endsWith("'"))&&(n=n.slice(1,-1));let i=n.match(/^\$\{[A-Z0-9_]+:-([^}]+)\}$/),a=(i?i[1]:n).trim();return a?{key:r,value:a}:null}async function $c(t){if(!await E__default.pathExists(t))return {};try{let e=await E__default.readFile(t,"utf-8"),o={};for(let r of e.split(`
|
|
117
|
+
`)){let n=Ic(r);n&&(o[n.key]=n.value);}return o}catch{return {}}}async function ui(t){let e={},o=await f$6(t.workspacePath);for(let r of o){let n=v.dirname(v.dirname(r)),i=await $c(v.join(n,".env.example"));for(let[a,l]of Object.entries(i))At(t.contract,a).length>0&&(e[a]=l);}return e}function mi(t,e){return t.filter(o=>At(e,o).length>0).sort()}function fi(t){let e=t.RAPIDKIT_DB_POSTGRES_URL||t.DATABASE_URL;if(e?.startsWith("postgresql://"))try{let o=new URL(e),r=o.pathname.replace(/^\//,"");return {POSTGRES_USER:decodeURIComponent(o.username||"postgres"),POSTGRES_PASSWORD:decodeURIComponent(o.password||"postgres"),POSTGRES_DB:r||"postgres"}}catch{return}}function gi(t){let e=t.POSTGRES_USER||"postgres",o=t.POSTGRES_DB||"postgres";return ["CMD-SHELL",`pg_isready -U ${e} -d ${o}`]}function Oc(t){return /[:#{}[\],&*!|>'"%@`]/.test(t)||t.includes(`
|
|
118
|
+
`)?JSON.stringify(t):t}function yi(t,e){return Object.entries(t).map(([o,r])=>`${e}${o}: ${Oc(r)}`).join(`
|
|
119
|
+
`)}function Mc(t,e){let o=t.test.map(r=>JSON.stringify(r)).join(", ");return [`${e}healthcheck:`,`${e} test: [${o}]`,`${e} interval: ${t.interval}`,`${e} timeout: ${t.timeout}`,`${e} retries: ${t.retries}`].join(`
|
|
120
|
+
`)}function hi(t){let e=["# Generated by RapidKit infra plan \u2014 do not edit manually.",`# Workspace: ${t.workspaceName}`,`# Generated at: ${t.plan.generatedAt}`,"name: rapidkit-infra"],o=new Set;if(t.plan.services.length===0)return e.push("services: {}"),e.push(""),e.join(`
|
|
121
|
+
`);e.push("services:");for(let r of t.plan.services){let n=t.contract.services[r.id];if(n){if(e.push(` ${r.id}:`),e.push(` image: ${n.image}`),e.push(` container_name: rapidkit-${r.id}`),n.command?.length){let i=n.command.map(a=>JSON.stringify(a)).join(", ");e.push(` command: [${i}]`);}if(n.env&&Object.keys(n.env).length>0){e.push(" environment:");let i={...n.env,...t.plan.serviceEnvOverrides?.[r.id]||{}};e.push(yi(i," "));}else t.plan.serviceEnvOverrides?.[r.id]&&(e.push(" environment:"),e.push(yi(t.plan.serviceEnvOverrides[r.id]," ")));if(n.ports.length>0){e.push(" ports:");for(let i of n.ports)e.push(` - "${i.host}:${i.container}"`);}if(n.volumes?.length){e.push(" volumes:");for(let i of n.volumes){e.push(` - ${i}`);let a=i.split(":")[0];a&&!a.startsWith("/")&&o.add(a);}}if(n.healthcheck){let i=t.plan.serviceEnvOverrides?.[r.id];if(r.id==="postgres"&&i){let a=gi(i).map(l=>JSON.stringify(l)).join(", ");e.push(" healthcheck:"),e.push(` test: [${a}]`),e.push(` interval: ${n.healthcheck.interval}`),e.push(` timeout: ${n.healthcheck.timeout}`),e.push(` retries: ${n.healthcheck.retries}`);}else e.push(Mc(n.healthcheck," "));}e.push(" restart: unless-stopped");}}if(o.size>0){e.push("volumes:");for(let r of [...o].sort())e.push(` ${r}:`),e.push(" driver: local");}return e.push(""),e.join(`
|
|
122
|
+
`)}function Nc(t,e,o){return t.kind==="override"?t.value===e:t.kind==="module"?o.moduleMappings[t.value]?.includes(e)??false:o.envVarMappings[t.value.toUpperCase()]?.includes(e)??false}function Dc(t){let e=new Map,o=[];for(let r of t)for(let n of r.ports){let i=e.get(n.host);i&&i!==r.id?o.push(`Port collision on host ${n.host} between services '${i}' and '${r.id}'`):e.set(n.host,r.id);}return o}async function Tc(t){let e=v.join(t,".rapidkit","workspace.json");if(await E__default.pathExists(e))try{let o=await E__default.readJson(e);return o.workspace_name||o.name}catch{return}}async function Dr(t){let e=v.resolve(t.workspacePath),o=pt(),r=await di({workspacePath:e,contract:o}),n=r.serviceIds.map(p=>{let f=o.services[p];return f?{id:p,displayName:f.displayName,category:f.category,image:f.image,ports:f.ports,sources:r.sources.filter(g=>Nc(g,p,o))}:null}).filter(p=>p!==null),i=Dc(n);n.length===0&&i.push("No infrastructure services detected. Install modules with infra dependencies or add .rapidkit/infra/overrides.json");for(let p of r.overrides)o.services[p]||i.push(`Override references unknown service '${p}'`);let a=await E__default.pathExists(v.join(e,".rapidkit","workspace.contract.json"))?".rapidkit/workspace.contract.json":void 0,l=li(o,r.serviceIds),c=await ui({workspacePath:e,contract:o}),u={...l,...c};c.RAPIDKIT_DB_POSTGRES_URL&&(u.DATABASE_URL=c.RAPIDKIT_DB_POSTGRES_URL);let m={},d=fi(u);return d&&r.serviceIds.includes("postgres")&&(m.postgres=d),{schemaVersion:ai,generatedAt:(t.now||(()=>new Date))().toISOString(),workspacePath:e,workspaceName:await Tc(e),contractPath:a,strategy:"sidecar",composePath:Et,envExamplePath:Mr,services:n,connectionEnv:u,serviceEnvOverrides:Object.keys(m).length>0?m:void 0,sources:{modules:r.modules,envVars:r.envVars,overrides:r.overrides},warnings:i}}async function Tr(t){let e=v.resolve(t.workspacePath),o=v.join(e,Et),r=v.join(e,_t),n=v.join(e,Mr),i=pt(),a=hi({plan:t.plan,contract:i,workspaceName:t.plan.workspaceName||v.basename(e)}),l=["# Generated by: npx rapidkit infra plan","# Copy values into project .env files as needed.",...Object.entries(t.plan.connectionEnv).map(([c,u])=>`${c}=${u}`),""].join(`
|
|
123
|
+
`);return t.dryRun?{composePath:o,planPath:r,envExamplePath:n}:(await E__default.ensureDir(v.dirname(o)),await E__default.ensureDir(v.dirname(r)),await E__default.writeFile(o,a,"utf-8"),await E__default.writeFile(r,`${JSON.stringify(t.plan,null,2)}
|
|
124
|
+
`,"utf-8"),await E__default.writeFile(n,l,"utf-8"),{composePath:o,planPath:r,envExamplePath:n})}function Wc(t){return v.resolve(t).split(v.sep).join("/")}async function ki(){if((await execa("docker",["compose","version"],{reject:false,timeout:5e3})).exitCode===0)return {command:"docker",prefixArgs:["compose"]};if((await execa("docker-compose",["version"],{reject:false,timeout:5e3})).exitCode===0)return {command:"docker-compose",prefixArgs:[]};throw new Error("Docker Compose is not available. Install Docker Desktop or the docker-compose plugin, then verify with: docker compose version")}async function Fc(){if((await execa("docker",["version"],{reject:false,timeout:5e3})).exitCode!==0)throw new Error("Docker is not available in PATH. Install Docker and ensure the daemon is running before using rapidkit infra.");await ki();}function vi(t){let e=t.toLowerCase();return e.includes("no space left on device")?"Docker failed because the disk is full. Free space with: docker system prune -f (or docker system prune -a --volumes -f).":e.includes("address already in use")||e.includes("bind")?"Docker failed to bind a host port. Stop the conflicting service or adjust ports in contracts/infra-stack.v1.json via .rapidkit/infra/overrides.json.":e.includes("cannot connect to the docker daemon")?"Docker daemon is not running. Start Docker Desktop or the docker service, then retry.":null}async function Pi(t){await Fc();let e=await ki(),o=Wc(t.composePath),r=await execa(e.command,[...e.prefixArgs,"-f",o,...t.args],{cwd:t.workspacePath,reject:false});return {exitCode:r.exitCode??1,stdout:r.stdout,stderr:r.stderr}}function Oo(t){let e=t?v.resolve(t):xr(process.cwd());if(!e)throw new Error("Not inside a RapidKit workspace. Run from workspace root or pass --workspace.");return a$9(e)}function Lc(t){return v.join(t,Et)}async function Wr(t){let e=v.join(t,_t);if(!await E__default.pathExists(e))throw new Error(`Infra plan not found at ${_t}. Run: npx rapidkit infra plan`);return await E__default.readJson(e)}async function Fr(t){let e=Lc(t.workspacePath);if(!await E__default.pathExists(e))throw new Error(`Compose file not found at ${Et}. Run: npx rapidkit infra plan`);return Pi({composePath:e,workspacePath:t.workspacePath,args:t.args})}function Jc(t,e={}){if(console.log(s.bold(`
|
|
125
125
|
RapidKit infra plan
|
|
126
|
-
`)),console.log(s.gray(`Workspace: ${t.workspacePath}`)),t.workspaceName&&console.log(s.gray(`Name: ${t.workspaceName}`)),console.log(s.gray(`Strategy: ${t.strategy} (sidecar compose)`)),console.log(s.gray(`Compose: ${t.composePath}`)),console.log(s.gray(`Plan report: ${
|
|
126
|
+
`)),console.log(s.gray(`Workspace: ${t.workspacePath}`)),t.workspaceName&&console.log(s.gray(`Name: ${t.workspaceName}`)),console.log(s.gray(`Strategy: ${t.strategy} (sidecar compose)`)),console.log(s.gray(`Compose: ${t.composePath}`)),console.log(s.gray(`Plan report: ${_t}`)),console.log(s.gray(`Env example: ${t.envExamplePath}`)),console.log(""),t.services.length===0)console.log(s.yellow("No infrastructure services detected."));else {console.log(s.bold("Services:"));for(let o of t.services){let r=o.ports.map(n=>`${n.host}:${n.container}`).join(", ");console.log(s.cyan(` ${o.id}`),s.gray(`(${o.displayName})`),r?s.white(`ports ${r}`):"");}}if(t.sources.modules.length>0&&(console.log(""),console.log(s.bold("Detected from modules:")),console.log(s.gray(` ${t.sources.modules.join(", ")}`))),t.sources.envVars.length>0){let o=pt(),r=mi(t.sources.envVars,o);console.log(s.bold("Detected from env vars (infra-mapped):")),r.length>0?console.log(s.gray(` ${r.join(", ")}`)):console.log(s.gray(" none"));let n=t.sources.envVars.length-r.length;if(n>0&&!e.verbose)console.log(s.gray(` (${n} other project env vars scanned \u2014 use --verbose to list all)`));else if(e.verbose){let i=t.sources.envVars.filter(a=>!r.includes(a));i.length>0&&console.log(s.gray(` Other scanned env vars: ${i.join(", ")}`));}}if(t.sources.overrides.length>0&&(console.log(s.bold("Overrides:")),console.log(s.gray(` ${t.sources.overrides.join(", ")}`))),Object.keys(t.connectionEnv).length>0){console.log(""),console.log(s.bold("Connection env (preview):"));for(let[o,r]of Object.entries(t.connectionEnv))console.log(s.gray(` ${o}=${r}`));}if(t.warnings.length>0){console.log(""),console.log(s.yellow("Warnings:"));for(let o of t.warnings)console.log(s.yellow(` - ${o}`));}console.log("");}function bi(t){let e=t.command("infra").description("Plan and manage workspace infrastructure (Docker sidecar stack)");e.command("plan").description("Discover infra needs and generate compose plan artifacts").option("--workspace <path>","Workspace root path").option("--json","Print plan as JSON").option("--dry-run","Compute plan without writing artifacts").option("--verbose","Show all scanned project env vars").action(async o=>{try{let r=Oo(o.workspace),n=await Dr({workspacePath:r}),i=await Tr({workspacePath:r,plan:n,dryRun:o.dryRun});if(o.json){console.log(JSON.stringify({...n,artifacts:o.dryRun?{composePath:i.composePath,planPath:i.planPath,envExamplePath:i.envExamplePath,dryRun:true}:{composePath:i.composePath,planPath:i.planPath,envExamplePath:i.envExamplePath}},null,2));return}Jc(n,{verbose:o.verbose}),o.dryRun?console.log(s.yellow(`Dry run \u2014 no files written.
|
|
127
127
|
`)):(console.log(s.green("Artifacts written:")),console.log(s.gray(` ${i.composePath}`)),console.log(s.gray(` ${i.planPath}`)),console.log(s.gray(` ${i.envExamplePath}
|
|
128
128
|
`)));}catch(r){console.error(s.red(`
|
|
129
129
|
\u274C ${r instanceof Error?r.message:String(r)}
|
|
130
|
-
`)),process.exit(1);}}),e.command("up").description("Start planned infrastructure services via Docker Compose").option("--workspace <path>","Workspace root path").option("--detach","Run containers in background",true).option("--build","Build images before starting").option("--no-plan","Skip refreshing plan artifacts before starting").action(async o=>{try{let r=
|
|
130
|
+
`)),process.exit(1);}}),e.command("up").description("Start planned infrastructure services via Docker Compose").option("--workspace <path>","Workspace root path").option("--detach","Run containers in background",true).option("--build","Build images before starting").option("--no-plan","Skip refreshing plan artifacts before starting").action(async o=>{try{let r=Oo(o.workspace);if(o.plan!==false){let l=await Dr({workspacePath:r});await Tr({workspacePath:r,plan:l});}if((await Wr(r)).services.length===0)throw new Error("Infra plan has no services. Run: npx rapidkit infra plan (from a workspace with .env.example, core modules, or .rapidkit/infra/overrides.json)");let i=["up"];o.detach!==false&&i.push("-d"),o.build&&i.push("--build");let a=await Fr({workspacePath:r,args:i});if(a.stdout&&process.stdout.write(a.stdout),a.stderr&&process.stderr.write(a.stderr),a.exitCode!==0){let l=vi(a.stderr);l&&console.error(s.yellow(`
|
|
131
131
|
\u26A0\uFE0F ${l}
|
|
132
132
|
`)),process.exit(a.exitCode);}o.detach!==false&&(console.log(s.green(`
|
|
133
133
|
\u2705 Infrastructure stack started.
|
|
134
134
|
`)),console.log(s.gray(`Check status: npx rapidkit infra status
|
|
135
135
|
`)));}catch(r){console.error(s.red(`
|
|
136
136
|
\u274C ${r instanceof Error?r.message:String(r)}
|
|
137
|
-
`)),process.exit(1);}}),e.command("down").description("Stop planned infrastructure services").option("--workspace <path>","Workspace root path").option("--volumes","Remove named volumes").action(async o=>{try{let r=
|
|
137
|
+
`)),process.exit(1);}}),e.command("down").description("Stop planned infrastructure services").option("--workspace <path>","Workspace root path").option("--volumes","Remove named volumes").action(async o=>{try{let r=Oo(o.workspace);await Wr(r);let n=["down"];o.volumes&&n.push("-v");let i=await Fr({workspacePath:r,args:n});i.stdout&&process.stdout.write(i.stdout),i.stderr&&process.stderr.write(i.stderr),i.exitCode!==0&&process.exit(i.exitCode),console.log(s.green(`
|
|
138
138
|
\u2705 Infrastructure stack stopped.
|
|
139
139
|
`));}catch(r){console.error(s.red(`
|
|
140
140
|
\u274C ${r instanceof Error?r.message:String(r)}
|
|
141
|
-
`)),process.exit(1);}}),e.command("status").description("Show Docker Compose status for planned infrastructure").option("--workspace <path>","Workspace root path").option("--json","Print docker compose ps JSON output").option("--strict","Exit non-zero when any container is not healthy/running").action(async o=>{try{let r=
|
|
141
|
+
`)),process.exit(1);}}),e.command("status").description("Show Docker Compose status for planned infrastructure").option("--workspace <path>","Workspace root path").option("--json","Print docker compose ps JSON output").option("--strict","Exit non-zero when any container is not healthy/running").action(async o=>{try{let r=Oo(o.workspace),n=await Wr(r),i=o.json?["ps","--format","json"]:["ps"],a=await Fr({workspacePath:r,args:i});if(o.json){a.stdout&&process.stdout.write(a.stdout),a.exitCode!==0&&process.exit(a.exitCode);return}console.log(s.bold(`
|
|
142
142
|
RapidKit infra status
|
|
143
143
|
`)),console.log(s.gray(`Workspace: ${r}`)),console.log(s.gray(`Planned services: ${n.services.map(l=>l.id).join(", ")||"none"}`)),console.log(""),a.stdout.trim()?process.stdout.write(a.stdout):(console.log(s.yellow("No running containers found for the infra stack.")),console.log(s.gray(`Start with: npx rapidkit infra up
|
|
144
144
|
`))),a.exitCode!==0&&(a.stderr&&process.stderr.write(a.stderr),process.exit(a.exitCode)),o.strict&&/Restarting|Exit|unhealthy/i.test(a.stdout)&&(console.log(""),console.log(s.red("One or more infra containers are not healthy.")),console.log(s.gray(`Inspect logs with: docker logs rapidkit-postgres (or redis/mailpit)
|
|
145
145
|
`)),process.exit(1));}catch(r){console.error(s.red(`
|
|
146
146
|
\u274C ${r instanceof Error?r.message:String(r)}
|
|
147
|
-
`)),process.exit(1);}});}function
|
|
147
|
+
`)),process.exit(1);}});}function Gc(t){try{let e=v.join(t,"Makefile");return j.existsSync(e)?j.readFileSync(e,"utf8"):""}catch{return ""}}function Ue(t,e){let o=Gc(t);return o?new RegExp(`^${e}\\s*:`,"m").test(o):false}var No=class{constructor(e){this.runCommand=e;}runCommand;runtime="dotnet";async run(e,o,r){return {exitCode:await this.runCommand(e,o,r)}}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,o,r=3){let n=[],i=[{dir:e,depth:0}],a=new Set(["bin","obj",".git","node_modules",".rapidkit"]);for(;i.length>0;){let l=i.shift();if(!l||l.depth>r)continue;let c=[];try{c=j.readdirSync(l.dir,{withFileTypes:true});}catch{continue}for(let u of c){let m=v.join(l.dir,u.name);if(u.isDirectory()){a.has(u.name)||i.push({dir:m,depth:l.depth+1});continue}u.name.toLowerCase().endsWith(o.toLowerCase())&&n.push(m);}}return n.sort()}findProjectFile(e){let o=this.findFilesBySuffix(e,".csproj");return o.find(r=>!r.toLowerCase().includes(".tests.csproj"))||o[0]||null}findTestProjectFile(e){return this.findFilesBySuffix(e,".csproj").find(r=>r.toLowerCase().includes(".tests.csproj"))||null}async checkPrereqs(){return this.run("dotnet",["--version"],process.cwd())}async warmSetupCache(e){let o=await this.ensureDotnetInstalled(e);return o||this.run("dotnet",["nuget","locals","all","--list"],e)}async initProject(e){let o=await this.ensureDotnetInstalled(e);if(o)return o;let r=this.findProjectFile(e),n=await this.run("dotnet",r?["restore",r]:["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 o=await this.ensureDotnetInstalled(e);if(o)return o;let r=this.findProjectFile(e),n=r?["watch","--project",r,"run"]:["watch","run"];return this.run("dotnet",n,e)}async runTest(e){let o=await this.ensureDotnetInstalled(e);if(o)return o;let r=this.findTestProjectFile(e)||this.findProjectFile(e);return this.run("dotnet",r?["test",r]:["test"],e)}async runBuild(e){let o=await this.ensureDotnetInstalled(e);if(o)return o;let r=this.findProjectFile(e);return this.run("dotnet",r?["build",r,"-c","Release"]:["build","-c","Release"],e)}async runStart(e){let o=await this.ensureDotnetInstalled(e);if(o)return o;let r=this.findProjectFile(e);return this.run("dotnet",r?["run","--project",r]:["run"],e)}async runLint(e){if(Ue(e,"lint"))return this.run("make",["lint"],e);let o=v.join(e,"Directory.Build.props");if(j.existsSync(o)&&j.readFileSync(o,"utf-8").includes("EnforceCodeStyleInBuild")){let r=await this.ensureDotnetInstalled(e);if(r)return r;let n=this.findProjectFile(e);return this.run("dotnet",n?["build",n,"-warnaserror"]:["build","-warnaserror"],e)}return {exitCode:1,message:"No .NET lint tooling detected. Add a Makefile lint target or enable EnforceCodeStyleInBuild in Directory.Build.props."}}async runFormat(e){if(Ue(e,"format"))return this.run("make",["format"],e);let o=await this.ensureDotnetInstalled(e);return o||(j.existsSync(v.join(e,".editorconfig"))?this.run("dotnet",["format","--verify-no-changes"],e):{exitCode:1,message:"No .NET format tooling detected. Add a Makefile format target or an .editorconfig file for dotnet format."})}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 Do=class{constructor(e){this.runCommand=e;}runCommand;runtime="go";async run(e,o,r){return {exitCode:await this.runCommand(e,o,r)}}async ensureGoInstalled(e){return (await this.run("go",["version"],e)).exitCode===0?null:{exitCode:1,message:"Go toolchain is not installed or not available on PATH. Install Go from https://go.dev/dl/ and retry."}}findGoRunTarget(e){let o=v.join(e,"main.go");if(j.existsSync(o))return "./main.go";let r=v.join(e,"cmd");try{let n=j.readdirSync(r,{withFileTypes:true}).filter(i=>i.isDirectory()).map(i=>i.name).sort();for(let i of n)if(j.existsSync(v.join(r,i,"main.go")))return `./cmd/${i}`}catch{}return "./."}findWorkspaceRoot(e){let o=e;for(;;){if(j.existsSync(v.join(o,".rapidkit-workspace")))return o;let r=v.dirname(o);if(r===o)break;o=r;}return null}resolveDependencyMode(e){let o=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(o==="shared-runtime-caches"||o==="shared-node-deps"||o==="isolated")return o;let r=this.findWorkspaceRoot(e);if(!r)return "isolated";let n=v.join(r,".rapidkit","policies.yml");if(!j.existsSync(n))return "isolated";try{let l=j.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(l==="shared-runtime-caches"||l==="shared-node-deps"||l==="isolated")return l}catch{}return "isolated"}withGoCacheEnv(e,o){let r=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=r==="shared-runtime-caches"?v.join(n||e,".rapidkit","cache","go"):v.join(e,".rapidkit","cache","go"),a=process.env.GOMODCACHE,l=process.env.GOCACHE;return process.env.GOMODCACHE=v.join(i,"mod"),process.env.GOCACHE=v.join(i,"build"),o().finally(()=>{typeof a>"u"?delete process.env.GOMODCACHE:process.env.GOMODCACHE=a,typeof l>"u"?delete process.env.GOCACHE:process.env.GOCACHE=l;})}async checkPrereqs(){return this.run("go",["version"],process.cwd())}async warmSetupCache(e){return this.withGoCacheEnv(e,async()=>{try{return process.env.GOMODCACHE&&j.mkdirSync(process.env.GOMODCACHE,{recursive:true}),process.env.GOCACHE&&j.mkdirSync(process.env.GOCACHE,{recursive:true}),{exitCode:0}}catch{return {exitCode:1,message:"Failed to prepare Go cache directories"}}})}async initProject(e){return this.withGoCacheEnv(e,async()=>{let o=await this.ensureGoInstalled(e);return o||this.run("go",["mod","tidy"],e)})}async runDev(e){return this.withGoCacheEnv(e,()=>(async()=>{let o=await this.ensureGoInstalled(e);if(o)return o;let r=v.join(e,"Makefile");return j.existsSync(r)?this.run("make",["run"],e):this.run("go",["run",this.findGoRunTarget(e)],e)})())}async runTest(e){return this.withGoCacheEnv(e,async()=>{let o=await this.ensureGoInstalled(e);return o||this.run("go",["test","./..."],e)})}async runBuild(e){return this.withGoCacheEnv(e,async()=>{let o=await this.ensureGoInstalled(e);return o||this.run("go",["build","-buildvcs=false","./..."],e)})}async runStart(e){return this.withGoCacheEnv(e,async()=>{let r=(b$1()?[v.join(e,"server.exe"),v.join(e,"server")]:[v.join(e,"server")]).find(i=>j.existsSync(i));if(r)return this.run(r,[],e);let n=await this.ensureGoInstalled(e);return n||this.run("go",["run",this.findGoRunTarget(e)],e)})}async runLint(e){return this.withGoCacheEnv(e,async()=>{let o=await this.ensureGoInstalled(e);return o||(Ue(e,"lint")?this.run("make",["lint"],e):j.existsSync(v.join(e,".golangci.yml"))||j.existsSync(v.join(e,".golangci.yaml"))?this.run("golangci-lint",["run","./..."],e):{exitCode:1,message:"No Go lint tooling detected. Add a Makefile lint target or .golangci.yml configuration."})})}async runFormat(e){return this.withGoCacheEnv(e,async()=>{let o=await this.ensureGoInstalled(e);return o||(Ue(e,"fmt")?this.run("make",["fmt"],e):Ue(e,"format")?this.run("make",["format"],e):this.run("go",["fmt","./..."],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 To=class{constructor(e){this.runCommand=e;}runCommand;runtime="java";isExecutable(e){if(process.platform==="win32")return true;try{return (j.statSync(e).mode&73)!==0}catch{return false}}ensureWrapperExecutable(e){if(process.platform==="win32"||this.isExecutable(e))return true;try{return j.chmodSync(e,493),this.isExecutable(e)}catch{return false}}resolveJavaCommand(e){let o=process.env.JAVA_HOME?.trim();if(!o)return "java";let r=v.join(o,"bin",process.platform==="win32"?"java.exe":"java");return j.existsSync(r)?r:"java"}parseMajorJavaVersion(e){if(!e)return null;let r=e.trim().replace(/\"/g,"").split(".")[0],n=Number.parseInt(r,10);return Number.isFinite(n)?n:null}readRequiredJavaMajor(e){let o=v.join(e,"pom.xml");if(!j.existsSync(o))return 21;try{let n=j.readFileSync(o,"utf-8").match(/<java\.version>\s*([^<\s]+)\s*<\/java\.version>/i);return this.parseMajorJavaVersion(n?.[1])??21}catch{return 21}}async detectInstalledJavaMajor(e,o){try{let r=await execa(e,["-version"],{cwd:o,timeout:5e3,reject:false});if(r.exitCode!==0)return null;let n=`${r.stdout||""}
|
|
148
148
|
${r.stderr||""}`,i=n.match(/version\s+"([^"]+)"/i);if(i?.[1])return this.parseMajorJavaVersion(i[1]);let a=n.match(/(?:openjdk|java)\s+(\d+(?:[._]\d+)?)/i);return a?.[1]?this.parseMajorJavaVersion(a[1]):null}catch{return null}}parseMavenVersion(e){if(!e)return null;let o=e.match(/Apache Maven\s+(\d+)\.(\d+)\.(\d+)/i);return o?[Number.parseInt(o[1],10),Number.parseInt(o[2],10),Number.parseInt(o[3],10)]:null}isMavenVersionAtLeast(e,o){for(let r=0;r<3;r+=1){if(e[r]>o[r])return true;if(e[r]<o[r])return false}return true}async checkSystemMavenVersion(e){try{let o=await execa("mvn",["-version"],{cwd:e,timeout:5e3,reject:false});if(o.exitCode!==0)return {exitCode:o.exitCode||1,message:"Maven is required and must be available on PATH (3.9+)."};let r=this.parseMavenVersion(`${o.stdout||""}
|
|
149
|
-
${o.stderr||""}`);return r?this.isMavenVersionAtLeast(r,[3,9,0])?{exitCode:0}:{exitCode:1,message:`Maven ${r.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 o=j.existsSync(w.join(e,"pom.xml")),r=j.existsSync(w.join(e,"mvnw"))||j.existsSync(w.join(e,"mvnw.cmd")),n=j.existsSync(w.join(e,"build.gradle"))||j.existsSync(w.join(e,"build.gradle.kts"))||j.existsSync(w.join(e,"settings.gradle"))||j.existsSync(w.join(e,"settings.gradle.kts")),i=j.existsSync(w.join(e,"gradlew"))||j.existsSync(w.join(e,"gradlew.bat"));return {hasMavenProject:o||r,hasMavenWrapper:r,hasGradleProject:n||i,hasGradleWrapper:i}}findWorkspaceRoot(e){let o=e;for(;;){if(j.existsSync(w.join(o,".rapidkit-workspace")))return o;let r=w.dirname(o);if(r===o)break;o=r;}return null}resolveDependencyMode(e){let o=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(o==="shared-runtime-caches"||o==="shared-node-deps"||o==="isolated")return o;let r=this.findWorkspaceRoot(e);if(!r)return "isolated";let n=w.join(r,".rapidkit","policies.yml");if(!j.existsSync(n))return "isolated";try{let l=j.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(l==="shared-runtime-caches"||l==="shared-node-deps"||l==="isolated")return l}catch{}return "isolated"}buildToolCommand(e){return this.isGradleProject(e)?this.gradleCommand(e):this.mavenCommand(e)}mavenCommand(e){let o=w.join(e,"mvnw.cmd");if(process.platform==="win32"&&j.existsSync(o))return {command:o,baseArgs:[]};let r=w.join(e,"mvnw");return j.existsSync(r)?this.ensureWrapperExecutable(r)?{command:r,baseArgs:[]}:{command:"sh",baseArgs:[r]}:{command:"mvn",baseArgs:[]}}gradleCommand(e){let o=w.join(e,"gradlew.bat");if(process.platform==="win32"&&j.existsSync(o))return {command:o,baseArgs:[]};let r=w.join(e,"gradlew");return j.existsSync(r)?this.ensureWrapperExecutable(r)?{command:r,baseArgs:[]}:{command:"sh",baseArgs:[r]}:{command:"gradle",baseArgs:[]}}isGradleProject(e){return this.inspectJavaProject(e).hasGradleProject}isMavenProject(e){return this.inspectJavaProject(e).hasMavenProject}discoverWorkspaceJavaProjects(e){let o=[],r=new Set,n=[e];for(;n.length>0;){let i=n.shift();if(!i||r.has(i))continue;r.add(i);let a=[];try{a=j.readdirSync(i,{withFileTypes:true});}catch{continue}for(let l of a){if(!l.isDirectory()||l.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(l.name))continue;let c=w.join(i,l.name),f=this.inspectJavaProject(c);(f.hasMavenProject||f.hasGradleProject)&&o.push(c),n.push(c);}}return o}withJavaCacheEnv(e,o){let r=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=r==="shared-runtime-caches"?w.join(n||e,".rapidkit","cache","java","m2"):w.join(e,".rapidkit","cache","java","m2"),a=r==="shared-runtime-caches"?w.join(n||e,".rapidkit","cache","java","gradle"):w.join(e,".rapidkit","cache","java","gradle"),l=process.env.MAVEN_OPTS,c=process.env.GRADLE_USER_HOME,f=`-Dmaven.repo.local=${i}`;return process.env.MAVEN_OPTS=l?`${l} ${f}`:f,process.env.GRADLE_USER_HOME=a,o().finally(()=>{typeof l>"u"?delete process.env.MAVEN_OPTS:process.env.MAVEN_OPTS=l,typeof c>"u"?delete process.env.GRADLE_USER_HOME:process.env.GRADLE_USER_HOME=c;})}async runBuildTool(e,o,r=true){return this.withJavaCacheEnv(e,async()=>{try{let{command:n,baseArgs:i}=this.buildToolCommand(e),a=await this.runCommand(n,[...i,...o],e);if(a===0||!r)return {exitCode:a};let l=j.existsSync(w.join(e,"pom.xml")),c=j.existsSync(w.join(e,"build.gradle"))||j.existsSync(w.join(e,"build.gradle.kts"));return {exitCode:a,message:l||c?"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 o=[w.join(e,"target"),w.join(e,"build","libs")];for(let r of o){if(!j.existsSync(r))continue;let i=j.readdirSync(r).filter(a=>a.toLowerCase().endsWith(".jar")).find(a=>!a.toLowerCase().endsWith("-sources.jar")&&!a.toLowerCase().endsWith("-javadoc.jar")&&!a.toLowerCase().endsWith("-plain.jar"));if(i)return w.join(r,i)}return null}commandArgsFor(e,o){if(e==="gradle"){let r=this.shouldUseGradleNoDaemon()?["--no-daemon"]:[];return o==="init"?[...r,"dependencies"]:o==="dev"?[...r,"bootRun"]:o==="test"?[...r,"test"]:[...r,"bootJar"]}return o==="init"?["-B","-q","-DskipTests","dependency:go-offline"]:o==="dev"?["spring-boot:run"]:o==="test"?["test"]:["-DskipTests","package"]}detectBuildTool(e){return this.isGradleProject(e)?"gradle":"maven"}async checkPrereqs(){let e=process.cwd(),o=this.resolveJavaCommand(e),r=await this.runCommand(o,["-version"],e);if(r!==0)return {exitCode:r,message:"JDK 21+ is required. Ensure java is on PATH or JAVA_HOME/bin/java is available."};if(this.isMavenProject(e)){let l=this.readRequiredJavaMajor(e),c=await this.detectInstalledJavaMajor(o,e);if(c!==null&&c<l)return {exitCode:1,message:`Detected Java ${c}, but project requires Java ${l}+.`};let f=w.join(process.env.JAVA_HOME||"","release");if(process.env.JAVA_HOME&&j.existsSync(f))try{let p=j.readFileSync(f,"utf-8").match(/^JAVA_VERSION="([^"]+)"/m),d=this.parseMajorJavaVersion(p?.[1]);if(d!==null&&d<l)return {exitCode:1,message:`Detected JAVA_HOME version ${d}, but project requires Java ${l}+.`}}catch{}}if(this.isMavenProject(e)||this.isGradleProject(e)){let l=this.detectBuildTool(e),c=l==="gradle"?["--version"]:["-version"],f=await this.runBuildTool(e,c);return f.exitCode!==0?f:l==="maven"&&!this.inspectJavaProject(e).hasMavenWrapper?this.checkSystemMavenVersion(e):f}let n=this.findWorkspaceRoot(e);if(n&&n===e){let l=this.discoverWorkspaceJavaProjects(n);if(l.length>0){let c=l.reduce((p,d)=>Math.max(p,this.readRequiredJavaMajor(d)),0);if(c>0){let p=await this.detectInstalledJavaMajor(o,e);if(p!==null&&p<c){let d=l.filter(u=>this.readRequiredJavaMajor(u)>p).map(u=>w.relative(e,u)).join(", ");return {exitCode:1,message:`Detected Java ${p}, but workspace project(s) [${d}] require Java ${c}+.`}}}let f=false,g=false;for(let p of l){let d=this.inspectJavaProject(p);d.hasMavenProject&&!d.hasMavenWrapper&&(f=true),d.hasGradleProject&&!d.hasGradleWrapper&&(g=true);}if(f){let p=await this.withJavaCacheEnv(e,async()=>this.runCommand("mvn",["-version"],e));if(p!==0)return {exitCode:p,message:"Maven is required for one or more workspace Java projects without Maven Wrapper. Install Maven 3.9+, or add mvnw/mvnw.cmd to those projects."};let d=await this.checkSystemMavenVersion(e);if(d.exitCode!==0)return d}if(g){let p=await this.withJavaCacheEnv(e,async()=>this.runCommand("gradle",["--version"],e));if(p!==0)return {exitCode:p,message:"Gradle is required for one or more workspace Java projects without Gradle Wrapper. Install Gradle 8+, or add gradlew/gradlew.bat to those projects."}}return {exitCode:0}}}let i=await this.withJavaCacheEnv(e,async()=>this.runCommand("mvn",["-version"],e));if(i===0){let l=await this.checkSystemMavenVersion(e);return l.exitCode!==0?l:{exitCode:0}}let a=await this.withJavaCacheEnv(e,async()=>this.runCommand("gradle",["--version"],e));return a===0?{exitCode:0}:{exitCode:i||a||1,message:"Neither Maven nor Gradle is available on PATH. Install one of them, or use mvnw/gradlew wrappers in project roots."}}async warmSetupCache(e){return this.withJavaCacheEnv(e,async()=>{try{let o=process.env.MAVEN_OPTS?.match(/-Dmaven\.repo\.local=([^\s]+)/)?.[1];return o&&j.mkdirSync(o,{recursive:true}),process.env.GRADLE_USER_HOME&&j.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 o=this.resolveJarPath(e);if(o)return {exitCode:await this.runCommand(this.resolveJavaCommand(e),["-jar",o],e)};let r=await this.runBuild(e);if(r.exitCode!==0)return r;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 runLint(e){if(Be(e,"lint"))return {exitCode:await this.runCommand("make",["lint"],e)};let o=w.join(e,"pom.xml");return j.existsSync(o)&&j.readFileSync(o,"utf-8").includes("checkstyle")?this.runBuildTool(e,["checkstyle:check"]):{exitCode:1,message:"No Java lint tooling detected. Add a Makefile lint target or configure checkstyle in Maven/Gradle."}}async runFormat(e){return Be(e,"format")?{exitCode:await this.runCommand("make",["format"],e)}:["build.gradle","build.gradle.kts"].map(r=>w.join(e,r)).filter(r=>j.existsSync(r)).some(r=>j.readFileSync(r,"utf-8").includes("spotless"))?this.runBuildTool(e,["spotlessApply"]):{exitCode:1,message:"No Java format tooling detected. Add a Makefile format target or configure spotless in Gradle."}}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 Ao=class{constructor(e){this.runCommand=e;}runCommand;runtime="node";async run(e,o,r){return {exitCode:await this.runCommand(e,o,r)}}findWorkspaceRoot(e){let o=e;for(;;){if(j.existsSync(w.join(o,".rapidkit-workspace")))return o;let r=w.dirname(o);if(r===o)break;o=r;}return null}resolveDependencyMode(e){let o=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(o==="shared-runtime-caches"||o==="shared-node-deps"||o==="isolated")return o;let r=this.findWorkspaceRoot(e);if(!r)return "isolated";let n=w.join(r,".rapidkit","policies.yml");if(!j.existsSync(n))return "isolated";try{let l=j.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(l==="shared-runtime-caches"||l==="shared-node-deps"||l==="isolated")return l}catch{}return "isolated"}withDependencyEnv(e,o,r){let n=this.resolveDependencyMode(e),i=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),a=n==="isolated"?w.join(e,".rapidkit","cache","node"):w.join(i||e,".rapidkit","cache","node"),l=process.env.npm_config_cache,c=process.env.npm_config_store_dir,f=process.env.RAPIDKIT_DEP_SHARING_MODE,g=process.env.RAPIDKIT_WORKSPACE_PATH;return process.env.RAPIDKIT_DEP_SHARING_MODE=n,i&&(process.env.RAPIDKIT_WORKSPACE_PATH=i),o==="pnpm"?(process.env.npm_config_store_dir=w.join(a,"pnpm-store"),process.env.npm_config_cache=w.join(a,"pnpm-cache")):o==="yarn"?process.env.npm_config_cache=w.join(a,"yarn-cache"):process.env.npm_config_cache=w.join(a,"npm-cache"),r().finally(()=>{typeof l>"u"?delete process.env.npm_config_cache:process.env.npm_config_cache=l,typeof c>"u"?delete process.env.npm_config_store_dir:process.env.npm_config_store_dir=c,typeof f>"u"?delete process.env.RAPIDKIT_DEP_SHARING_MODE:process.env.RAPIDKIT_DEP_SHARING_MODE=f,typeof g>"u"?delete process.env.RAPIDKIT_WORKSPACE_PATH:process.env.RAPIDKIT_WORKSPACE_PATH=g;})}detectPackageManager(e){if(j.existsSync(w.join(e,"package-lock.json")))return "npm";if(j.existsSync(w.join(e,"pnpm-lock.yaml")))return "pnpm";if(j.existsSync(w.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 j.existsSync(w.join(e,"package-lock.json"))||j.existsSync(w.join(e,"pnpm-lock.yaml"))||j.existsSync(w.join(e,"yarn.lock"))}availablePackageManagers(e){let o=this.detectPackageManager(e);return this.hasPinnedPackageManager(e)?[o]:[o,...["npm","pnpm","yarn"].filter(n=>n!==o&&this.commandAvailable(n))]}commandAvailable(e){let o=e$4(e);return spawnSync(o.command,[...o.prefixArgs,"--version"],{stdio:"ignore",shell:c$4(),env:g$4()}).status===0}scriptArgs(e,o){return e==="npm"?["run-script",o,"--foreground-scripts"]:["run",o]}async runScriptWithFallback(e,o){let r={exitCode:1};for(let n of this.availablePackageManagers(e))if(r=await this.withDependencyEnv(e,n,()=>this.run(n,this.scriptArgs(n,o),e)),r.exitCode===0)return r;return r}async runLifecycle(e,o){let r=a$4(e),n=i$1(e,r),i=g$2(e,o,{framework:n.key});return i?this.runScriptWithFallback(e,i.scriptName):{exitCode:1,message:`No npm script available for \`${o}\`. Add a "${o}" script to package.json.`}}async checkPrereqs(){return this.run("node",["--version"],process.cwd())}async warmSetupCache(e){let o=this.detectPackageManager(e);return this.withDependencyEnv(e,o,async()=>{try{return process.env.npm_config_cache&&j.mkdirSync(process.env.npm_config_cache,{recursive:true}),o==="pnpm"&&process.env.npm_config_store_dir&&j.mkdirSync(process.env.npm_config_store_dir,{recursive:true}),{exitCode:0}}catch{return {exitCode:1,message:"Failed to prepare Node cache directories"}}})}async initProject(e){let o=this.detectPackageManager(e),r=this.resolveDependencyMode(e),n=r==="shared-runtime-caches"||r==="shared-node-deps"?["install","--prefer-offline"]:["install"];return this.withDependencyEnv(e,o,()=>this.run(o,n,e))}async runDev(e){return this.runLifecycle(e,"dev")}async runTest(e){return this.runLifecycle(e,"test")}async runBuild(e){return this.runLifecycle(e,"build")}async runStart(e){return this.runLifecycle(e,"start")}async runLint(e){return this.runLifecycle(e,"lint")}async runFormat(e){return this.runLifecycle(e,"format")}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 Io=class{constructor(e){this.runCore=e;}runCore;runtime="python";async run(e,o){return {exitCode:await this.withPythonCacheEnv(o,()=>this.runCore(e,o))}}findWorkspaceRoot(e){let o=e;for(;;){if(j.existsSync(w.join(o,".rapidkit-workspace")))return o;let r=w.dirname(o);if(r===o)break;o=r;}return null}resolveDependencyMode(e){let o=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(o==="shared-runtime-caches"||o==="shared-node-deps"||o==="isolated")return o;let r=this.findWorkspaceRoot(e);if(!r)return "isolated";let n=w.join(r,".rapidkit","policies.yml");if(!j.existsSync(n))return "isolated";try{let l=j.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(l==="shared-runtime-caches"||l==="shared-node-deps"||l==="isolated")return l}catch{}return "isolated"}withPythonCacheEnv(e,o){let r=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=r==="shared-runtime-caches"?w.join(n||e,".rapidkit","cache","python"):w.join(e,".rapidkit","cache","python"),a=process.env.PIP_CACHE_DIR,l=process.env.POETRY_CACHE_DIR;return process.env.PIP_CACHE_DIR=w.join(i,"pip"),process.env.POETRY_CACHE_DIR=w.join(i,"poetry"),o().finally(()=>{typeof a>"u"?delete process.env.PIP_CACHE_DIR:process.env.PIP_CACHE_DIR=a,typeof l>"u"?delete process.env.POETRY_CACHE_DIR:process.env.POETRY_CACHE_DIR=l;})}async checkPrereqs(){let e=process.cwd(),o=await this.run(["doctor","check"],e);return o.exitCode===0?o:this.run(["doctor"],e)}async initProject(e){return this.run(["init"],e)}async runDev(e){return this.run(["dev"],e)}async runTest(e){return this.run(["test"],e)}async runBuild(e){return this.run(["build"],e)}async runStart(e){return this.run(["start"],e)}async doctorHints(e){return ['Run "npx rapidkit doctor workspace" for a full workspace scan.','Use "npx rapidkit init" after adding or changing modules.','Use workspace launcher "./rapidkit" to avoid environment drift.']}};function Rc(){let t={...process.env},e=t.PATH||"";if(e){let o=e.split(w.delimiter).filter(r=>!r.replace(/\\/g,"/").includes("/.pyenv/shims")).join(w.delimiter);t.PATH=o;}return t.PYENV_VERSION="system",t.POETRY_PYTHON=t.POETRY_PYTHON||h$4(),typeof t.RAPIDKIT_SKIP_LOCK_SYNC>"u"&&(t.RAPIDKIT_SKIP_LOCK_SYNC="1"),t}function Fe(t,e){return t==="go"?new Eo((o,r,n)=>e.runCommandInCwd(o,r,n)):t==="node"?new Ao((o,r,n)=>e.runCommandInCwd(o,r,n)):t==="java"?new _o((o,r,n)=>e.runCommandInCwd(o,r,n)):t==="dotnet"?new Ro((o,r,n)=>e.runCommandInCwd(o,r,n)):new Io((o,r)=>e.runCoreRapidkit(o,{cwd:r,env:Rc()}))}var ui=w.join(ls.homedir(),".rapidkit","cache"),mi=1440*60*1e3;function Mr(){let t=process.env.RAPIDKIT_CACHE_DIR?.trim();if(t)return t;let e=process.env.VITEST_WORKER_ID?.trim();return e?w.join(ui,`vitest-${e}`):ui}var Oo=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 w.join(Mr(),`${this.getCacheKey(e)}.json`)}getTempCachePath(e){let o=`${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`;return `${e}.${o}.tmp`}async get(e,o="1.0"){let r=this.memoryCache.get(e);if(r&&r.version===o&&Date.now()-r.timestamp<mi)return f.debug(`Cache hit (memory): ${e}`),r.data;try{let n=this.getCachePath(e),i=await promises.readFile(n,"utf-8"),a=JSON.parse(i);if(a.version===o&&Date.now()-a.timestamp<mi)return f.debug(`Cache hit (disk): ${e}`),this.memoryCache.set(e,a),a.data;await promises.unlink(n).catch(()=>{});}catch{f.debug(`Cache miss: ${e}`);}return null}async set(e,o,r="1.0"){let n={data:o,timestamp:Date.now(),version:r};this.memoryCache.set(e,n);try{await promises.mkdir(Mr(),{recursive:true});let i=this.getCachePath(e),a=this.getTempCachePath(i);await promises.writeFile(a,JSON.stringify(n),"utf-8"),await promises.rename(a,i),f.debug(`Cache set: ${e}`);}catch(i){f.debug(`Cache write failed: ${e}`,i);}}async invalidate(e){this.memoryCache.delete(e);try{let o=this.getCachePath(e);await promises.unlink(o),f.debug(`Cache invalidated: ${e}`);}catch{}}async clear(){this.memoryCache.clear();try{let e=Mr(),o=await promises.readdir(e);await Promise.all(o.map(r=>promises.unlink(w.join(e,r)))),f.debug("Cache cleared");}catch{}}};var No=["list","sync","registry","foundation","model","snapshot","diff","impact","verify","graph","watch","context","agent-sync","remediation-plan","explain","why","trace","feedback","mcp","policy","contract","share","export","archive","hydrate","import","run","init"],Mo=["model","snapshot","diff","impact","verify","context","agent-sync","remediation-plan","explain","why","trace"];function fi(t){return Mo.includes(t)}var gi="rapidkit-runtime-command-surface-v1";var hi="doctor-remediation-plan-v2";function Do(){return {runtimeCommandSurface:gi,cliLogEvent:c$7,freshnessMetadata:a$j,factFreshness:c$6,blockerResolution:a$i,workspaceModel:j$3,workspaceImpact:e$2,workspaceVerify:c$5,workspaceContext:a$h,workspaceDependencyGraph:i$3,workspaceIntelligenceHistory:a$g,agentCustomizationPack:l$3,workspaceOperationalSkill:a$f,workspaceSkillsIndex:b$a,workspaceExplain:a$e,agentActionOutcome:a$d,doctorRemediationPlan:hi,artifactRemediationPlan:a$c,doctorFixResult:a$b}}var Ic=["catalog","pulse","nova","orbit","atlas","vertex","summit","beacon","ledger","flux","nexus","apex","harbor","forge","spark","portal","studio","canvas","quantum","vault","zenith","compass","vector","catalyst","saas","commerce","radar","stellar","prism","cedar","momentum","signal","cipher","lumen","trail","ridge"],$c={"fastapi.standard":"api","fastapi.ddd":"api","nestjs.standard":"api","springboot.standard":"service","gofiber.standard":"api","gogin.standard":"api","dotnet.webapi.clean":"api"},Oc={nextjs:"web",remix:"app","vite-react":"web","vite-vue":"web","vite-svelte":"web","vite-solid":"web","vite-vanilla":"app",nuxt:"app",angular:"app",astro:"site",sveltekit:"app"};function Nc(t){return t[Math.floor(Math.random()*t.length)]}function Dr(t){let e=Nc(Ic),o=k$1(t);if(o){let i=Oc[o.id]??"app";return `${e}-${i}`}let r=p(t),n=r?$c[r.id]??"service":"app";return `${e}-${n}`}async function Wc(t){let e=await promises.readFile(t);return createHash("sha256").update(e).digest("hex")}async function yi(t,e){await E.outputFile(t,`${JSON.stringify(e,null,2)}
|
|
150
|
-
`,"utf-8");}function
|
|
151
|
-
`,"utf-8"),n}function Uc(t,e){if(!e?.enabled)return {headers:{}};let o=process.env[e.hmacKeyEnv];if(!o)return {headers:{},error:`Evidence signing key env is missing: ${e.hmacKeyEnv}`};let r=(e.algorithm||"sha256").toLowerCase(),n=e.headerName||"x-rapidkit-evidence-signature",i=createHmac(r,o).update(JSON.stringify(t)).digest("hex");return {headers:{[n]:i,"x-rapidkit-evidence-signature-alg":r}}}async function Vc(t,e,o){let r=(o.algorithm||"sha256").toLowerCase(),n=Je(t,o.publicKeyPath);if(!await E.pathExists(n))return {verified:false,algorithm:r,publicKeyPath:n,publicKeyFingerprint:"",signature:o.signature,message:`Public key not found: ${n}`};try{let i=await promises.readFile(n,"utf-8"),a=await promises.readFile(e),l=createVerify(r);l.update(a),l.end();let c=Buffer.from(o.signature,"base64"),f=l.verify(i,c),g=createHash("sha256").update(i).digest("hex");return {verified:f,algorithm:r,publicKeyPath:n,publicKeyFingerprint:g,signature:o.signature,message:f?"Attestation verified.":"Attestation signature verification failed."}}catch(i){return {verified:false,algorithm:r,publicKeyPath:n,publicKeyFingerprint:"",signature:o.signature,message:`Attestation verification error: ${i.message}`}}}async function Bc(t,e,o,r){let n=process.env.RAPIDKIT_SIGSTORE_MOCK;if(n==="success")return {verified:true,tlogVerified:r.requireTransparencyLog,message:"Sigstore verification passed (mock).",identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:o.bundlePath||null,certificatePath:o.certificatePath||null,signaturePath:o.signaturePath||null};if(n==="fail")return {verified:false,tlogVerified:false,message:"Sigstore verification failed (mock).",identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:o.bundlePath||null,certificatePath:o.certificatePath||null,signaturePath:o.signaturePath||null};let i=o.signaturePath?Je(t,o.signaturePath):null;if(!i||!await E.pathExists(i))return {verified:false,tlogVerified:false,message:"Sigstore signaturePath is missing or not found.",identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:o.bundlePath||null,certificatePath:o.certificatePath||null,signaturePath:i};let a=["verify-blob",e,"--signature",i],l=o.certificatePath?Je(t,o.certificatePath):null;l&&a.push("--certificate",l);let c=o.bundlePath?Je(t,o.bundlePath):null;c&&a.push("--bundle",c);let f=o.keyPath?Je(t,o.keyPath):null;f&&a.push("--key",f),o.identity&&a.push("--certificate-identity",o.identity),o.issuer&&a.push("--certificate-oidc-issuer",o.issuer),o.rekorUrl&&a.push("--rekor-url",o.rekorUrl),r.requireTransparencyLog||a.push("--insecure-ignore-tlog");try{let g=await execa("cosign",a,{reject:false});return g.exitCode===0?{verified:true,tlogVerified:r.requireTransparencyLog,message:"Sigstore verification passed.",identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:c,certificatePath:l,signaturePath:i}:{verified:false,tlogVerified:false,message:`Sigstore verification failed: ${g.stderr||g.stdout||"unknown error"}`,identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:c,certificatePath:l,signaturePath:i}}catch(g){return {verified:false,tlogVerified:false,message:`Sigstore verification error: ${g.message}`,identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:c,certificatePath:l,signaturePath:i}}}async function Hc(t,e){let o=e.algorithm||"sha256",r=Je(t,e.policyPath),n=Je(t,e.signaturePath),i=Je(t,e.publicKeyPath);if(!await E.pathExists(r))return {verified:false,message:`Governance policy bundle not found: ${r}`,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 a=await promises.readFile(r,"utf-8"),l=(await promises.readFile(n,"utf-8")).trim(),c=await promises.readFile(i,"utf-8"),f=createVerify(o);return f.update(a),f.end(),f.verify(c,Buffer.from(l,"base64"))?{verified:true,message:"Governance policy bundle verified.",policies:JSON.parse(a).policies||{}}:{verified:false,message:"Governance policy bundle signature verification failed.",policies:null}}catch(a){return {verified:false,message:`Governance policy bundle verification error: ${a.message}`,policies:null}}}async function Tr(t,e){let o=[],r={syncedArtifacts:0,verifiedArtifacts:0,rotatedFiles:0,lockWritten:false,governanceBundleVerified:false,transparencyEvidenceWritten:false,transparencyEvidenceRecords:0,evidenceExported:false,evidenceExportTarget:null},n=w.join(t,".rapidkit"),i=w.join(n,"mirror-config.json"),a=w.join(n,"mirror.lock"),l=w.join(n,"mirror","artifacts"),c=w.join(n,"reports"),f=await Jc(t);if(!await E.pathExists(i))return o.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: .rapidkit/mirror-config.json not found."}),{checks:o,details:r};let g={};try{g=JSON.parse(await promises.readFile(i,"utf-8"));}catch{return o.push({id:"mirror.lifecycle.config",status:"failed",message:"Mirror lifecycle failed: invalid JSON in mirror-config.json."}),{checks:o,details:r}}if(!(e.forceRun===true||e.ciMode||e.offlineMode||g.mode==="offline-only"))return o.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: not in ci/offline mode."}),{checks:o,details:r};await E.ensureDir(l);let d=Math.max(0,g.prefetch?.retries??2),u=Math.max(0,g.prefetch?.backoffMs??250),m=Math.max(1e3,g.prefetch?.timeoutMs??15e3),h=g.security?.requireAttestation===true,k=g.security?.requireSigstore===true,P=g.security?.requireTransparencyLog===true,v=g.security?.requireSignedGovernance===true,y=g.security?.evidenceExport,S=(process.env.RAPIDKIT_ENV||g.security?.governance?.environment||"dev").toLowerCase(),b=g.security?.governance?.policies||{};if(g.security?.governanceBundle){let O=await Hc(t,g.security.governanceBundle);if(o.push({id:"governance.bundle.verify",status:O.verified?"passed":"failed",message:O.message}),O.verified&&O.policies)b=O.policies,r.governanceBundleVerified=true;else if(v)return {checks:o,details:r}}let A=b[S],D=P||A?.requireTransparencyLog===true,K=[],Y=Array.isArray(g.artifacts)?g.artifacts:[],$=[];for(let O=0;O<Y.length;O+=1){let H=Y[O],R=H.id||`artifact-${O+1}`,Z=H.source?Je(t,H.source):null,me=Fc(H,R),q=w.join(l,me),Q=false,ve={sourceType:"path",source:Z||H.url||"unknown",host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true};if(Z&&await E.pathExists(Z))await E.ensureDir(w.dirname(q)),await E.copyFile(Z,q),r.syncedArtifacts+=1,Q=true,ve={sourceType:"path",source:Z,host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true},o.push({id:`mirror.sync.${R}`,status:"passed",message:`Mirrored artifact ${R} from source path.`});else if(H.url){let De="";try{De=new URL(H.url).hostname.toLowerCase();}catch{o.push({id:`mirror.prefetch.${R}`,status:"failed",message:`Invalid URL for ${R}: ${H.url}`});continue}if(!(process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||f.has(De))){o.push({id:`mirror.prefetch.trust.${R}`,status:"failed",message:`Untrusted mirror host for ${R}: ${De}. Add host to .rapidkit/trusted-sources.lock or set RAPIDKIT_TRUSTED_SOURCES=1.`});continue}if(e.offlineMode&&(await E.pathExists(q)?(Q=true,ve={sourceType:"url",source:H.url,host:De,fetchedAt:new Date().toISOString(),attempts:0,trusted:true},o.push({id:`mirror.prefetch.${R}`,status:"passed",message:`Offline mode reused existing mirrored artifact ${R}.`})):o.push({id:`mirror.prefetch.${R}`,status:"failed",message:`Offline mode cannot prefetch remote artifact ${R} without an existing mirrored copy.`}),!Q))continue;if(!Q){let je=null,Ye=0;for(let x=1;x<=d+1;x+=1){Ye=x;try{await Lc(H.url,q,m),r.syncedArtifacts+=1,Q=true,ve={sourceType:"url",source:H.url,host:De,fetchedAt:new Date().toISOString(),attempts:Ye,trusted:true},o.push({id:`mirror.prefetch.${R}`,status:"passed",message:Ye>1?`Prefetched artifact ${R} from ${De} after ${Ye} attempts.`:`Prefetched artifact ${R} from ${De}.`});break}catch(N){if(je=N,x<=d){await wi(u*x);continue}}}if(!Q){o.push({id:`mirror.prefetch.${R}`,status:"failed",message:`Failed to prefetch ${R} after ${d+1} attempt(s): ${je?.message||"unknown error"}`});continue}}if(!Q){o.push({id:`mirror.prefetch.${R}`,status:"failed",message:`Failed to prefetch ${R}.`});continue}}if(!Q){H.required||e.offlineMode?o.push({id:`mirror.sync.${R}`,status:"failed",message:`Mirror source missing for ${R}${Z?`: ${Z}`:""}`}):o.push({id:`mirror.sync.${R}`,status:"skipped",message:`Mirror source not found for optional artifact ${R}.`});continue}let at=await Wc(q);if(H.sha256&&H.sha256.toLowerCase()!==at.toLowerCase()){o.push({id:`mirror.verify.${R}`,status:"failed",message:`Checksum mismatch for ${R}.`});continue}r.verifiedArtifacts+=1,o.push({id:`mirror.verify.${R}`,status:"passed",message:`Checksum verified for ${R}.`});let Pe=H.attestation?await Vc(t,q,H.attestation):null;if(H.attestation){if(o.push({id:`mirror.attest.${R}`,status:Pe?.verified?"passed":"failed",message:Pe?.message||"Attestation verification failed."}),!Pe?.verified)continue}else if(h){o.push({id:`mirror.attest.${R}`,status:"failed",message:`Attestation is required but missing for ${R}.`});continue}else o.push({id:`mirror.attest.${R}`,status:"skipped",message:`No attestation provided for ${R}.`});let xe=H.attestation?.sigstore,T=xe?await Bc(t,q,xe,{requireTransparencyLog:D}):null;if(xe){if(o.push({id:`mirror.sigstore.${R}`,status:T?.verified?"passed":"failed",message:T?.message||"Sigstore verification failed."}),K.push({artifactId:R,verified:!!T?.verified,tlogVerified:!!T?.tlogVerified,identity:T?.identity||null,issuer:T?.issuer||null,rekorUrl:T?.rekorUrl||null,timestamp:new Date().toISOString(),environment:S}),!T?.verified)continue}else if(k){o.push({id:`mirror.sigstore.${R}`,status:"failed",message:`Sigstore attestation is required but missing for ${R}.`});continue}else o.push({id:`mirror.sigstore.${R}`,status:"skipped",message:`No Sigstore attestation provided for ${R}.`});if(xe&&T?.verified&&A){let De=A.allowedIdentities||[];if(De.length>0){let je=!!T.identity&&De.includes(T.identity);if(o.push({id:`mirror.sigstore.policy.identity.${R}`,status:je?"passed":"failed",message:je?`Sigstore identity policy passed for ${R} in ${S}.`:`Sigstore identity policy failed for ${R} in ${S}.`}),!je)continue}let gt=A.allowedIssuers||[];if(gt.length>0){let je=!!T.issuer&>.includes(T.issuer);if(o.push({id:`mirror.sigstore.policy.issuer.${R}`,status:je?"passed":"failed",message:je?`Sigstore issuer policy passed for ${R} in ${S}.`:`Sigstore issuer policy failed for ${R} in ${S}.`}),!je)continue}let At=A.allowedRekorUrls||[];if(At.length>0){let je=!!T.rekorUrl&&At.includes(T.rekorUrl);if(o.push({id:`mirror.sigstore.policy.rekor.${R}`,status:je?"passed":"failed",message:je?`Sigstore Rekor policy passed for ${R} in ${S}.`:`Sigstore Rekor policy failed for ${R} in ${S}.`}),!je)continue}}else A&&o.push({id:`mirror.sigstore.policy.${R}`,status:"skipped",message:`Sigstore governance policy configured for ${S} but no verified Sigstore attestation for ${R}.`});let ct=await promises.stat(q);$.push({id:R,path:w.relative(t,q),sha256:at,size:ct.size,provenance:ve,attestation:{detached:{provided:!!H.attestation,verified:Pe?.verified||false,algorithm:Pe?.algorithm||null,publicKeyPath:Pe?.publicKeyPath||null,publicKeyFingerprint:Pe?.publicKeyFingerprint||null,signature:Pe?.signature||null,verifiedAt:Pe?.verified?new Date().toISOString():null},sigstore:{provided:!!xe,verified:T?.verified||false,tlogVerified:T?.tlogVerified||false,identity:T?.identity||null,issuer:T?.issuer||null,rekorUrl:T?.rekorUrl||null,bundlePath:T?.bundlePath||null,certificatePath:T?.certificatePath||null,signaturePath:T?.signaturePath||null,verifiedAt:T?.verified?new Date().toISOString():null}}});}let G=g.retention?.keepLast;if(typeof G=="number"&&G>0){let H=(await promises.readdir(l,{withFileTypes:true})).filter(R=>R.isFile()).map(R=>w.join(l,R.name));if(H.length>G){let R=await Promise.all(H.map(async me=>({filePath:me,stat:await promises.stat(me)})));R.sort((me,q)=>q.stat.mtimeMs-me.stat.mtimeMs);let Z=R.slice(G);for(let me of Z)await promises.unlink(me.filePath),r.rotatedFiles+=1;}}o.push({id:"mirror.rotate",status:"passed",message:r.rotatedFiles>0?`Mirror retention rotation removed ${r.rotatedFiles} file(s).`:"Mirror retention rotation completed with no removals."});let Ae={schemaVersion:"1.0",generatedAt:new Date().toISOString(),mode:g.mode||null,environment:S,artifacts:$};if(await promises.writeFile(a,`${JSON.stringify(Ae,null,2)}
|
|
152
|
-
`,"utf-8"),r.lockWritten=true,o.push({id:"mirror.lock.write",status:"passed",message:`Mirror lock updated at ${
|
|
153
|
-
`,"utf-8"),r.evidenceExported=true,r.evidenceExportTarget=q,o.push({id:"sigstore.evidence.export.file",status:"passed",message:`Transparency evidence exported to file sink ${q}.`});}catch(q){o.push({id:"sigstore.evidence.export.file",status:"failed",message:`Evidence file export failed: ${q.message}`});}else if(y.target==="http")if(!y.endpoint)o.push({id:"sigstore.evidence.export.http",status:"failed",message:"Evidence export target=http requires security.evidenceExport.endpoint."});else {let q=Math.max(0,y.retries??0),Q=Math.max(0,y.backoffMs??500),ve=Uc(O,y.signing);ve.error&&o.push({id:"sigstore.evidence.export.http",status:"failed",message:ve.error});try{let at=y.authTokenEnv?process.env[y.authTokenEnv]:void 0,Pe=false,xe=null;for(let T=1;T<=q+1;T+=1)try{if(ve.error)throw new Error(ve.error);await Kc(y.endpoint,O,me,at,ve.headers),r.evidenceExported=true,r.evidenceExportTarget=y.endpoint,o.push({id:"sigstore.evidence.export.http",status:"passed",message:T>1?`Transparency evidence exported to HTTP endpoint ${y.endpoint} after ${T} attempts.`:`Transparency evidence exported to HTTP endpoint ${y.endpoint}.`}),Pe=true;break}catch(ct){xe=ct,T<=q&&await wi(Q*T);}if(!Pe)throw xe||new Error("unknown evidence export error")}catch(at){let Pe=`Evidence HTTP export failed: ${at.message}`;o.push({id:"sigstore.evidence.export.http",status:"failed",message:Pe});try{let xe=await Gc(t,y.deadLetterPath,O,Pe);o.push({id:"sigstore.evidence.export.deadletter",status:"passed",message:`Evidence export failure persisted to dead-letter sink ${xe}.`});}catch(xe){o.push({id:"sigstore.evidence.export.deadletter",status:"failed",message:`Evidence dead-letter write failed: ${xe.message}`});}}}if(y.failOnError&&o.some(Q=>Q.status==="failed"&&(Q.id==="sigstore.evidence.export.file"||Q.id==="sigstore.evidence.export.http")))return {checks:o,details:r}}else o.push({id:"sigstore.evidence.export",status:"skipped",message:"Central evidence export not configured (security.evidenceExport.enabled=false)."});}else o.push({id:"sigstore.evidence.write",status:"skipped",message:"No Sigstore records available for transparency evidence output."}),o.push({id:"sigstore.evidence.export",status:"skipped",message:"Central evidence export skipped because no transparency evidence records exist."});return {checks:o,details:r}}function To(t){let e=k$2(t.detection.runtime),o=o$2({runtime:t.detection.runtime,moduleSupport:t.moduleSupport,projectPath:t.projectPath,framework:t.detection.key}),r=[];r.push({id:"framework-detection",status:t.detection.key==="unknown"?"warn":"pass",message:t.detection.key==="unknown"?"RapidKit could not confidently identify the project 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}),r.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}),r.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."}),r.push({id:"lifecycle-commands",status:o.lifecycleCommands.length>1?"pass":"warn",message:o.lifecycleCommands.length>1?`Lifecycle commands available: ${o.lifecycleCommands.join(", ")}.`:"Only help-level lifecycle support is available for this runtime today.",recommendation:o.lifecycleCommands.length>1?void 0:"Add runtime scripts or a RapidKit runtime adapter before relying on dev/test/build/start."});let n=r.some(a=>a.status==="fail"),i=r.some(a=>a.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,...t.projectKind?{kind:t.projectKind}:{},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:o.lifecycleCommands,unsupportedLifecycleCommands:o.unsupportedLifecycleCommands,moduleCommands:o.moduleCommands},checks:r}}function Wo(t){return t.existingProjectJson?.module_support===true?true:t.enableModules!==true?false:k$2(t.detection.runtime).moduleCommands}function ji(t){return t.replace(/\\/g,"/")}function qc(t,e){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,80)||e}function zc(t,e){let o=ji(w.relative(t,e));return !o||o.startsWith("..")?true:o.split("/").filter(Boolean).some(r=>r==="..")}function Gt(t){let e=ji(w.relative(t.workspacePath,t.projectPath)),o=zc(t.workspacePath,t.projectPath),r=qc(t.projectName,w.basename(t.projectPath)),n=o?`external/${r}`:e||r;return {relativePath:e||n,contractRelativePath:n,isExternal:o}}function Si(t){return t.trim().toLowerCase().replace(/\.git$/i,"").replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,64)}function Qc(t){let e=t.trim();if(!e)return "imported-project";let o=e.replace(/\\/g,"/").replace(/\/+$/,"").split("/"),r=o[o.length-1]||e,n=r.split(":"),i=(n[n.length-1]||r).replace(/\.git$/i,"");return Si(i)||"imported-project"}function Fr(t){let e=t.trim();return e.includes("://")||e.startsWith("git@")}function Xc(t){return Fr(t)?"git-url":"local-folder"}async function Zc(t,e){let o=Si(e)||"imported-project",r=0;for(;;){let n=r===0?o:r===1?`${o}-imported`:`${o}-imported-${r}`,i=w.join(t,n);if(!await E__default.pathExists(i))return i;r+=1;}}function el(t,e){let o=w.resolve(t),r=w.resolve(e),n=w.relative(o,r);return n===""||n.length>0&&!n.startsWith("..")&&!w.isAbsolute(n)}function tl(t,e){if(el(t,e))throw new Error("Import source must be outside the current workspace root.")}function ol(t){return t.startsWith(".env")?![".env.example",".env.sample",".env.template",".env.defaults",".env.dist"].includes(t):false}function rl(t){let e=w.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)||ol(e)||e.endsWith(".pem")||e.endsWith(".key"))}async function nl(t){let e=w.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 sl(t){let e=new Date().toISOString(),o=typeof t.existingProjectJson?.name=="string"?t.existingProjectJson.name:w.basename(t.projectPath),r=Gt({workspacePath:t.workspacePath,projectPath:t.projectPath,projectName:o}),n=r.contractRelativePath,i=w.join(t.projectPath,".rapidkit","project.json"),a=w.join(t.projectPath,".rapidkit","import.json"),l=w.join(t.projectPath,".rapidkit","import-readiness.json"),c=Wo({existingProjectJson:t.existingProjectJson,detection:t.detection,enableModules:t.enableModules}),f=Array.isArray(t.existingProjectJson?.modules)?t.existingProjectJson.modules:[],g=t.existingProjectJson?.contracts&&typeof t.existingProjectJson.contracts=="object"&&!Array.isArray(t.existingProjectJson.contracts)?t.existingProjectJson.contracts:{owns:[],apis:[],publishes:[],consumes:[],dependsOn:[],env:[]},p={...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:w.basename(t.projectPath),slug:typeof t.existingProjectJson?.slug=="string"?t.existingProjectJson.slug:w.basename(t.projectPath),kind:t.projectKind,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:f,contracts:g,import:{managed_by:"rapidkit-npm",source_type:t.sourceType,imported_at:e,relative_path:n,discovered_relative_path:r.relativePath,is_external:r.isExternal,detection:{framework:t.detection.key,runtime:t.detection.runtime,confidence:t.detection.confidence,support_tier:t.detection.supportTier,source:t.detection.source}}},d={schema_version:"1.0",kind:"rapidkit.imported_project",imported_at:e,managed_by:"rapidkit-npm",source:{type:t.sourceType,name:w.basename(t.projectPath)},project:{name:p.name,slug:p.slug,relative_path:n,kind:t.projectKind,module_support:c},detection:{framework:t.detection.key,framework_display_name:t.detection.displayName,runtime:t.detection.runtime,kind:t.projectKind,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}},u=To({projectName:String(p.name),relativePath:n,projectKind:t.projectKind,source:t.sourceType,detection:t.detection,moduleSupport:c,projectPath:t.projectPath,generatedAt:new Date(e)});return await E__default.ensureDir(w.dirname(i)),await E__default.writeJson(i,p,{spaces:2}),await E__default.writeJson(a,d,{spaces:2}),await E__default.writeJson(l,u,{spaces:2}),{projectJsonPath:i,importJsonPath:a,importReadinessPath:l,moduleSupport:c}}async function il(t,e){let o={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 b$9(t,[o]);}async function xi(t){await E__default.pathExists(t)&&await E__default.remove(t);}async function Ci(t,e){await xi(e),await c$3(t,[e]);}async function Ri(t){let e=w.resolve(t.workspacePath),o=t.source.trim(),r=t.sourceType??Xc(o),n=t.name??(r==="git-url"?Qc(o):w.basename(o)),i=await Zc(e,n),a=false;try{if(r==="local-folder"){let u=w.resolve(o),m=await E__default.stat(u).catch(()=>null);if(!m||!m.isDirectory())throw new Error("Import source is not a directory.");tl(e,u),a=true,await E__default.copy(u,i,{overwrite:false,errorOnExist:true,filter:rl});}else a=true,await execa("git",["clone","--depth","1",o,i],{timeout:12e4});let l=await nl(i),c=i$1(i,l),f=await h$3(i,l),g=await sl({workspacePath:e,projectPath:i,sourceType:r,detection:c,existingProjectJson:l,projectKind:f,enableModules:t.enableModules}),p=Gt({workspacePath:e,projectPath:i,projectName:w.basename(i)}),d={name:w.basename(i),path:i,relativePath:p.contractRelativePath,stack:c.importStack,runtime:c.runtime,framework:c.key,frameworkDisplayName:c.displayName,supportTier:c.supportTier,moduleSupport:g.moduleSupport,confidence:c.confidence,source:r,projectJsonPath:g.projectJsonPath,importJsonPath:g.importJsonPath,importReadinessPath:g.importReadinessPath};return await il(e,d),d}catch(l){if(a)try{await xi(i);}catch(c){let f=l instanceof Error?l.message:String(l),g=c instanceof Error?c.message:String(c);throw new Error(`Import failed: ${f}. Rollback also failed: ${g}`)}throw l}}function al(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,64)}function cl(t,e){return w.resolve(t)===w.resolve(e)}async function ll(t){let e=w.join(t,".rapidkit","project.json");if(!await E__default.pathExists(e))return null;try{return await E__default.readJson(e)}catch{return null}}function dl(t){let e=Array.isArray(t.existingProjectJson?.modules)?t.existingProjectJson.modules:[],o=t.existingProjectJson?.contracts&&typeof t.existingProjectJson.contracts=="object"&&!Array.isArray(t.existingProjectJson.contracts)?t.existingProjectJson.contracts:{owns:[],apis:[],publishes:[],consumes:[],dependsOn:[],env:[]};return {...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:t.projectName,slug:typeof t.existingProjectJson?.slug=="string"?t.existingProjectJson.slug:t.projectName,kind:t.projectKind,runtime:t.detection.runtime,framework:t.detection.key,kit:typeof t.existingProjectJson?.kit=="string"?t.existingProjectJson.kit:`adopted.${t.detection.key}`,kit_name:typeof t.existingProjectJson?.kit_name=="string"?t.existingProjectJson.kit_name:`adopted.${t.detection.key}`,engine:typeof t.existingProjectJson?.engine=="string"?t.existingProjectJson.engine:"npm",module_support:t.moduleSupport,modules:e,contracts:o,adoption:{managed_by:"rapidkit-npm",mode:"linked",adopted_at:t.adoptedAt,relative_path:t.contractRelativePath,discovered_relative_path:t.discoveredRelativePath,is_external:t.isExternal,detection:{framework:t.detection.key,runtime:t.detection.runtime,confidence:t.detection.confidence,support_tier:t.detection.supportTier,source:t.detection.source}}}}async function Ei(t,e,o){let r=w.join(e,".rapidkit","project.json"),n=w.join(e,".rapidkit","adopt.json"),i=w.join(e,".rapidkit","adopt-readiness.json");o?await E__default.writeJson(r,o,{spaces:2}):await E__default.pathExists(r)&&await E__default.remove(r),await E__default.pathExists(n)&&await E__default.remove(n),await E__default.pathExists(i)&&await E__default.remove(i);let{removeImportedProjectsRegistryEntries:a}=await import('./imported-projects-registry-ZOCHFWMK.js');await a(t,[e]);}async function _i(t){let e=w.resolve(t.workspacePath),o=w.resolve(t.source),r=await E__default.stat(o).catch(()=>null);if(!r||!r.isDirectory())throw new Error("Adopt source is not a directory.");if(cl(e,o))throw new Error("Adopt source cannot be the workspace root itself.");let n=await ll(o),i=i$1(o,n),a=await h$3(o,n),l=al(t.name||(typeof n?.name=="string"?n.name:"")||w.basename(o))||"adopted-project",c=Gt({workspacePath:e,projectPath:o,projectName:l}),f=(t.now??new Date).toISOString(),g=w.join(o,".rapidkit","project.json"),p=w.join(o,".rapidkit","adopt.json"),d=w.join(o,".rapidkit","adopt-readiness.json"),u=Wo({existingProjectJson:n,detection:i,enableModules:t.enableModules}),m=dl({projectName:l,contractRelativePath:c.contractRelativePath,isExternal:c.isExternal,discoveredRelativePath:c.relativePath,detection:i,existingProjectJson:n,projectKind:a,moduleSupport:u,adoptedAt:f}),h={schema_version:"1.0",kind:"rapidkit.adopted_project",adopted_at:f,managed_by:"rapidkit-npm",mode:"linked",workspace:{path:e},project:{name:l,path:o,relative_path:c.contractRelativePath,discovered_relative_path:c.relativePath,is_external:c.isExternal,kind:a,module_support:u},detection:{framework:i.key,framework_display_name:i.displayName,runtime:i.runtime,kind:a,confidence:i.confidence,support_tier:i.supportTier,import_stack:i.importStack,source:i.source},policy:{moved_source:false,copied_source:false,module_mutation_enabled:u,workspace_contract:"linked-project"}},k=To({projectName:l,relativePath:c.contractRelativePath,projectKind:a,source:"adopted-local",detection:i,moduleSupport:u,projectPath:o,generatedAt:new Date(f)});if(t.dryRun!==true){await E__default.ensureDir(w.dirname(g)),await E__default.writeJson(g,m,{spaces:2}),await E__default.writeJson(p,h,{spaces:2}),await E__default.writeJson(d,k,{spaces:2});let P={name:l,path:o,relativePath:c.contractRelativePath,relationship:"adopted",stack:i.importStack,runtime:i.runtime,framework:i.key,frameworkDisplayName:i.displayName,supportTier:i.supportTier,moduleSupport:u,confidence:i.confidence,source:"adopted-local",importedAt:f};await b$9(e,[P]);}return {name:l,path:o,relativePath:c.relativePath,contractRelativePath:c.contractRelativePath,isExternal:c.isExternal,relationship:"adopted",stack:i.importStack,runtime:i.runtime,framework:i.key,frameworkDisplayName:i.displayName,supportTier:i.supportTier,moduleSupport:u,confidence:i.confidence,projectJsonPath:g,adoptJsonPath:p,adoptReadinessPath:d,wroteFiles:t.dryRun!==true}}function Jr(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 ml(t){let e=t.trim().toLowerCase();return e?e.startsWith("fastapi")?"fastapi":e.startsWith("nestjs")?"nestjs":null:null}function Me(t,e){let o=t.indexOf(e);if(o>=0&&o+1<t.length)return t[o+1];let r=t.find(n=>n.startsWith(`${e}=`));if(r)return r.slice(e.length+1)}function Xr(){return i$4()}function Ii(){let t={...process.env},e=t.PATH||"";return e&&(t.PATH=e.split(w.delimiter).filter(o=>!o.replace(/\\/g,"/").includes("/.pyenv/shims")).join(w.delimiter)),t.PYENV_VERSION="system",t.POETRY_PYTHON||(t.POETRY_PYTHON=h$4()),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 fl(t){return l$2(w.join(t,".venv"))}async function zi(t,e){return await z(t,["--version"],e)===0}async function ft(t){let e=w.join(t,"go.mod");if(await E__default.pathExists(e))return "go";let o=w.join(t,"pom.xml"),r=w.join(t,"build.gradle"),n=w.join(t,"build.gradle.kts");if(await E__default.pathExists(o)||await E__default.pathExists(r)||await E__default.pathExists(n))return "java";if((await E__default.pathExists(t)?await j.promises.readdir(t,{withFileTypes:true}):[]).some(p=>p.isFile()&&p.name.toLowerCase().endsWith(".sln")))return "dotnet";let a=w.join(t,"src");if(await E__default.pathExists(a)&&(await j.promises.readdir(a,{withFileTypes:true})).some(d=>d.isFile()&&d.name.toLowerCase().endsWith(".csproj")))return "dotnet";let l=w.join(t,"package.json");if(await E__default.pathExists(l))return "node";let c=w.join(t,"pyproject.toml"),f=w.join(t,"requirements.txt"),g=w.join(t,"poetry.lock");return await E__default.pathExists(c)||await E__default.pathExists(f)||await E__default.pathExists(g)?"python":null}async function gl(t){for(let e of Xr())if(await z(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function Yi(t){for(let e of Xr())if(await z(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function hl(t){let e=l$2(w.join(t,".venv"));if(!await E__default.pathExists(e)){let i=await Yi(t);if(i!==0)return i}if(!await zi("poetry",t))return 0;let r=await z("poetry",["config","virtualenvs.in-project","true","--local"],t);if(r!==0)return r;let n=await z("poetry",["env","use",e],t);return n!==0?n:0}async function yl(t){let e=l$2(w.join(t,".venv"));if(!await E__default.pathExists(e)){let n=await Yi(t);if(n!==0)return n}await z(e,["-m","pip","install","--upgrade","pip","setuptools","wheel"],t);let o=w.join(t,"requirements.txt");if(await E__default.pathExists(o)&&await z(e,["-m","pip","install","-r","requirements.txt"],t)===0)return 0;let r=w.join(t,"pyproject.toml");return await E__default.pathExists(r)&&(await z(e,["-m","pip","install","-e","."],t)===0||await z(e,["-m","pip","install","."],t)===0)?0:1}async function Lr(t,e){return await hl(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(w.join(t,".venv"))?0:(console.log(s.yellow("\u26A0\uFE0F Python init fallback: installing dependencies directly into project .venv")),await yl(t))}async function Kr(t){let e=await mt("init",t);if(e===0)return 0;let o=["npm","pnpm","yarn"];for(let r of o){if(!await zi(r,t))continue;if(await z(r,["install"],t)===0)return console.log(s.green(`\u2705 Node init fallback succeeded with ${r} install`)),0}return e}function wl(t,e){let o=n=>/^\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?$/.test(n),r=Me([...e],"--port");if(r&&!/^\d+$/.test(r.trim()))return "Invalid --port. Expected numeric TCP port, e.g. 8080";if(t==="springboot.standard"){let n=Me([...e],"--java-version"),i=Me([...e],"--spring-boot-version"),a=Me([...e],"--springdoc-version"),l=Me([...e],"--group-id"),c=Me([...e],"--package-name");if(n&&!/^\d+$/.test(n.trim()))return "Invalid --java-version. Expected major version number, e.g. 21";if(i&&!o(i.trim()))return "Invalid --spring-boot-version. Expected semantic version, e.g. 3.5.0";if(a&&!o(a.trim()))return "Invalid --springdoc-version. Expected semantic version, e.g. 2.8.9";if(l&&!/^[A-Za-z0-9_.-]+$/.test(l.trim()))return "Invalid --group-id. Use dot-separated Java package identifiers only.";if(c&&!/^[A-Za-z0-9_.-]+$/.test(c.trim()))return "Invalid --package-name. Use dot-separated Java package identifiers only."}if(t==="dotnet.webapi.clean"){let n=Me([...e],"--target-framework"),i=Me([...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 Br(t$1){if(t$1[0]!=="create"||t$1[1]!=="project")return 1;let e=t$1[2],o=p(e),r=t$1[3];if(!o||o.owner!=="npm")return 1;if(!r)return process.stderr.write(`Usage: ${o.createUsage??"rapidkit create project <kit> <name> [--output <dir>]"}
|
|
154
|
-
`),1;try{h(r);}catch(
|
|
155
|
-
`),1}let n=
|
|
156
|
-
`),1;let i=
|
|
157
|
-
`),1;await
|
|
158
|
-
`),1}}async function
|
|
149
|
+
${o.stderr||""}`);return r?this.isMavenVersionAtLeast(r,[3,9,0])?{exitCode:0}:{exitCode:1,message:`Maven ${r.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 o=j.existsSync(v.join(e,"pom.xml")),r=j.existsSync(v.join(e,"mvnw"))||j.existsSync(v.join(e,"mvnw.cmd")),n=j.existsSync(v.join(e,"build.gradle"))||j.existsSync(v.join(e,"build.gradle.kts"))||j.existsSync(v.join(e,"settings.gradle"))||j.existsSync(v.join(e,"settings.gradle.kts")),i=j.existsSync(v.join(e,"gradlew"))||j.existsSync(v.join(e,"gradlew.bat"));return {hasMavenProject:o||r,hasMavenWrapper:r,hasGradleProject:n||i,hasGradleWrapper:i}}findWorkspaceRoot(e){let o=e;for(;;){if(j.existsSync(v.join(o,".rapidkit-workspace")))return o;let r=v.dirname(o);if(r===o)break;o=r;}return null}resolveDependencyMode(e){let o=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(o==="shared-runtime-caches"||o==="shared-node-deps"||o==="isolated")return o;let r=this.findWorkspaceRoot(e);if(!r)return "isolated";let n=v.join(r,".rapidkit","policies.yml");if(!j.existsSync(n))return "isolated";try{let l=j.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(l==="shared-runtime-caches"||l==="shared-node-deps"||l==="isolated")return l}catch{}return "isolated"}buildToolCommand(e){return this.isGradleProject(e)?this.gradleCommand(e):this.mavenCommand(e)}mavenCommand(e){let o=v.join(e,"mvnw.cmd");if(process.platform==="win32"&&j.existsSync(o))return {command:o,baseArgs:[]};let r=v.join(e,"mvnw");return j.existsSync(r)?this.ensureWrapperExecutable(r)?{command:r,baseArgs:[]}:{command:"sh",baseArgs:[r]}:{command:"mvn",baseArgs:[]}}gradleCommand(e){let o=v.join(e,"gradlew.bat");if(process.platform==="win32"&&j.existsSync(o))return {command:o,baseArgs:[]};let r=v.join(e,"gradlew");return j.existsSync(r)?this.ensureWrapperExecutable(r)?{command:r,baseArgs:[]}:{command:"sh",baseArgs:[r]}:{command:"gradle",baseArgs:[]}}isGradleProject(e){return this.inspectJavaProject(e).hasGradleProject}isMavenProject(e){return this.inspectJavaProject(e).hasMavenProject}discoverWorkspaceJavaProjects(e){let o=[],r=new Set,n=[e];for(;n.length>0;){let i=n.shift();if(!i||r.has(i))continue;r.add(i);let a=[];try{a=j.readdirSync(i,{withFileTypes:true});}catch{continue}for(let l of a){if(!l.isDirectory()||l.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(l.name))continue;let c=v.join(i,l.name),u=this.inspectJavaProject(c);(u.hasMavenProject||u.hasGradleProject)&&o.push(c),n.push(c);}}return o}withJavaCacheEnv(e,o){let r=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=r==="shared-runtime-caches"?v.join(n||e,".rapidkit","cache","java","m2"):v.join(e,".rapidkit","cache","java","m2"),a=r==="shared-runtime-caches"?v.join(n||e,".rapidkit","cache","java","gradle"):v.join(e,".rapidkit","cache","java","gradle"),l=process.env.MAVEN_OPTS,c=process.env.GRADLE_USER_HOME,u=`-Dmaven.repo.local=${i}`;return process.env.MAVEN_OPTS=l?`${l} ${u}`:u,process.env.GRADLE_USER_HOME=a,o().finally(()=>{typeof l>"u"?delete process.env.MAVEN_OPTS:process.env.MAVEN_OPTS=l,typeof c>"u"?delete process.env.GRADLE_USER_HOME:process.env.GRADLE_USER_HOME=c;})}async runBuildTool(e,o,r=true){return this.withJavaCacheEnv(e,async()=>{try{let{command:n,baseArgs:i}=this.buildToolCommand(e),a=await this.runCommand(n,[...i,...o],e);if(a===0||!r)return {exitCode:a};let l=j.existsSync(v.join(e,"pom.xml")),c=j.existsSync(v.join(e,"build.gradle"))||j.existsSync(v.join(e,"build.gradle.kts"));return {exitCode:a,message:l||c?"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 o=[v.join(e,"target"),v.join(e,"build","libs")];for(let r of o){if(!j.existsSync(r))continue;let i=j.readdirSync(r).filter(a=>a.toLowerCase().endsWith(".jar")).find(a=>!a.toLowerCase().endsWith("-sources.jar")&&!a.toLowerCase().endsWith("-javadoc.jar")&&!a.toLowerCase().endsWith("-plain.jar"));if(i)return v.join(r,i)}return null}commandArgsFor(e,o){if(e==="gradle"){let r=this.shouldUseGradleNoDaemon()?["--no-daemon"]:[];return o==="init"?[...r,"dependencies"]:o==="dev"?[...r,"bootRun"]:o==="test"?[...r,"test"]:[...r,"bootJar"]}return o==="init"?["-B","-q","-DskipTests","dependency:go-offline"]:o==="dev"?["spring-boot:run"]:o==="test"?["test"]:["-DskipTests","package"]}detectBuildTool(e){return this.isGradleProject(e)?"gradle":"maven"}async checkPrereqs(){let e=process.cwd(),o=this.resolveJavaCommand(e),r=await this.runCommand(o,["-version"],e);if(r!==0)return {exitCode:r,message:"JDK 21+ is required. Ensure java is on PATH or JAVA_HOME/bin/java is available."};if(this.isMavenProject(e)){let l=this.readRequiredJavaMajor(e),c=await this.detectInstalledJavaMajor(o,e);if(c!==null&&c<l)return {exitCode:1,message:`Detected Java ${c}, but project requires Java ${l}+.`};let u=v.join(process.env.JAVA_HOME||"","release");if(process.env.JAVA_HOME&&j.existsSync(u))try{let d=j.readFileSync(u,"utf-8").match(/^JAVA_VERSION="([^"]+)"/m),p=this.parseMajorJavaVersion(d?.[1]);if(p!==null&&p<l)return {exitCode:1,message:`Detected JAVA_HOME version ${p}, but project requires Java ${l}+.`}}catch{}}if(this.isMavenProject(e)||this.isGradleProject(e)){let l=this.detectBuildTool(e),c=l==="gradle"?["--version"]:["-version"],u=await this.runBuildTool(e,c);return u.exitCode!==0?u:l==="maven"&&!this.inspectJavaProject(e).hasMavenWrapper?this.checkSystemMavenVersion(e):u}let n=this.findWorkspaceRoot(e);if(n&&n===e){let l=this.discoverWorkspaceJavaProjects(n);if(l.length>0){let c=l.reduce((d,p)=>Math.max(d,this.readRequiredJavaMajor(p)),0);if(c>0){let d=await this.detectInstalledJavaMajor(o,e);if(d!==null&&d<c){let p=l.filter(f=>this.readRequiredJavaMajor(f)>d).map(f=>v.relative(e,f)).join(", ");return {exitCode:1,message:`Detected Java ${d}, but workspace project(s) [${p}] require Java ${c}+.`}}}let u=false,m=false;for(let d of l){let p=this.inspectJavaProject(d);p.hasMavenProject&&!p.hasMavenWrapper&&(u=true),p.hasGradleProject&&!p.hasGradleWrapper&&(m=true);}if(u){let d=await this.withJavaCacheEnv(e,async()=>this.runCommand("mvn",["-version"],e));if(d!==0)return {exitCode:d,message:"Maven is required for one or more workspace Java projects without Maven Wrapper. Install Maven 3.9+, or add mvnw/mvnw.cmd to those projects."};let p=await this.checkSystemMavenVersion(e);if(p.exitCode!==0)return p}if(m){let d=await this.withJavaCacheEnv(e,async()=>this.runCommand("gradle",["--version"],e));if(d!==0)return {exitCode:d,message:"Gradle is required for one or more workspace Java projects without Gradle Wrapper. Install Gradle 8+, or add gradlew/gradlew.bat to those projects."}}return {exitCode:0}}}let i=await this.withJavaCacheEnv(e,async()=>this.runCommand("mvn",["-version"],e));if(i===0){let l=await this.checkSystemMavenVersion(e);return l.exitCode!==0?l:{exitCode:0}}let a=await this.withJavaCacheEnv(e,async()=>this.runCommand("gradle",["--version"],e));return a===0?{exitCode:0}:{exitCode:i||a||1,message:"Neither Maven nor Gradle is available on PATH. Install one of them, or use mvnw/gradlew wrappers in project roots."}}async warmSetupCache(e){return this.withJavaCacheEnv(e,async()=>{try{let o=process.env.MAVEN_OPTS?.match(/-Dmaven\.repo\.local=([^\s]+)/)?.[1];return o&&j.mkdirSync(o,{recursive:true}),process.env.GRADLE_USER_HOME&&j.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 o=this.resolveJarPath(e);if(o)return {exitCode:await this.runCommand(this.resolveJavaCommand(e),["-jar",o],e)};let r=await this.runBuild(e);if(r.exitCode!==0)return r;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 runLint(e){if(Ue(e,"lint"))return {exitCode:await this.runCommand("make",["lint"],e)};let o=v.join(e,"pom.xml");return j.existsSync(o)&&j.readFileSync(o,"utf-8").includes("checkstyle")?this.runBuildTool(e,["checkstyle:check"]):{exitCode:1,message:"No Java lint tooling detected. Add a Makefile lint target or configure checkstyle in Maven/Gradle."}}async runFormat(e){return Ue(e,"format")?{exitCode:await this.runCommand("make",["format"],e)}:["build.gradle","build.gradle.kts"].map(r=>v.join(e,r)).filter(r=>j.existsSync(r)).some(r=>j.readFileSync(r,"utf-8").includes("spotless"))?this.runBuildTool(e,["spotlessApply"]):{exitCode:1,message:"No Java format tooling detected. Add a Makefile format target or configure spotless in Gradle."}}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 Wo=class{constructor(e){this.runCommand=e;}runCommand;runtime="node";async run(e,o,r){return {exitCode:await this.runCommand(e,o,r)}}findWorkspaceRoot(e){let o=e;for(;;){if(j.existsSync(v.join(o,".rapidkit-workspace")))return o;let r=v.dirname(o);if(r===o)break;o=r;}return null}resolveDependencyMode(e){let o=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(o==="shared-runtime-caches"||o==="shared-node-deps"||o==="isolated")return o;let r=this.findWorkspaceRoot(e);if(!r)return "isolated";let n=v.join(r,".rapidkit","policies.yml");if(!j.existsSync(n))return "isolated";try{let l=j.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(l==="shared-runtime-caches"||l==="shared-node-deps"||l==="isolated")return l}catch{}return "isolated"}withDependencyEnv(e,o,r){let n=this.resolveDependencyMode(e),i=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),a=n==="isolated"?v.join(e,".rapidkit","cache","node"):v.join(i||e,".rapidkit","cache","node"),l=process.env.npm_config_cache,c=process.env.npm_config_store_dir,u=process.env.RAPIDKIT_DEP_SHARING_MODE,m=process.env.RAPIDKIT_WORKSPACE_PATH;return process.env.RAPIDKIT_DEP_SHARING_MODE=n,i&&(process.env.RAPIDKIT_WORKSPACE_PATH=i),o==="pnpm"?(process.env.npm_config_store_dir=v.join(a,"pnpm-store"),process.env.npm_config_cache=v.join(a,"pnpm-cache")):o==="yarn"?process.env.npm_config_cache=v.join(a,"yarn-cache"):process.env.npm_config_cache=v.join(a,"npm-cache"),r().finally(()=>{typeof l>"u"?delete process.env.npm_config_cache:process.env.npm_config_cache=l,typeof c>"u"?delete process.env.npm_config_store_dir:process.env.npm_config_store_dir=c,typeof u>"u"?delete process.env.RAPIDKIT_DEP_SHARING_MODE:process.env.RAPIDKIT_DEP_SHARING_MODE=u,typeof m>"u"?delete process.env.RAPIDKIT_WORKSPACE_PATH:process.env.RAPIDKIT_WORKSPACE_PATH=m;})}detectPackageManager(e){if(j.existsSync(v.join(e,"package-lock.json")))return "npm";if(j.existsSync(v.join(e,"pnpm-lock.yaml")))return "pnpm";if(j.existsSync(v.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 j.existsSync(v.join(e,"package-lock.json"))||j.existsSync(v.join(e,"pnpm-lock.yaml"))||j.existsSync(v.join(e,"yarn.lock"))}availablePackageManagers(e){let o=this.detectPackageManager(e);return this.hasPinnedPackageManager(e)?[o]:[o,...["npm","pnpm","yarn"].filter(n=>n!==o&&this.commandAvailable(n))]}commandAvailable(e){let o=e$5(e);return spawnSync(o.command,[...o.prefixArgs,"--version"],{stdio:"ignore",shell:c$4(),env:g$4()}).status===0}scriptArgs(e,o){return e==="npm"?["run-script",o,"--foreground-scripts"]:["run",o]}async runScriptWithFallback(e,o){let r={exitCode:1};for(let n of this.availablePackageManagers(e))if(r=await this.withDependencyEnv(e,n,()=>this.run(n,this.scriptArgs(n,o),e)),r.exitCode===0)return r;return r}async runLifecycle(e,o){let r=d$4(e),n=i$1(e,r),i=n$3(e,o,{framework:n.key});return i?this.runScriptWithFallback(e,i.scriptName):{exitCode:1,message:`No npm script available for \`${o}\`. Add a "${o}" script to package.json.`}}async checkPrereqs(){return this.run("node",["--version"],process.cwd())}async warmSetupCache(e){let o=this.detectPackageManager(e);return this.withDependencyEnv(e,o,async()=>{try{return process.env.npm_config_cache&&j.mkdirSync(process.env.npm_config_cache,{recursive:true}),o==="pnpm"&&process.env.npm_config_store_dir&&j.mkdirSync(process.env.npm_config_store_dir,{recursive:true}),{exitCode:0}}catch{return {exitCode:1,message:"Failed to prepare Node cache directories"}}})}async initProject(e){let o=this.detectPackageManager(e),r=this.resolveDependencyMode(e),n=r==="shared-runtime-caches"||r==="shared-node-deps"?["install","--prefer-offline"]:["install"];return this.withDependencyEnv(e,o,()=>this.run(o,n,e))}async runDev(e){return this.runLifecycle(e,"dev")}async runTest(e){return this.runLifecycle(e,"test")}async runBuild(e){return this.runLifecycle(e,"build")}async runStart(e){return this.runLifecycle(e,"start")}async runLint(e){return this.runLifecycle(e,"lint")}async runFormat(e){return this.runLifecycle(e,"format")}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 Fo=class{constructor(e){this.runCore=e;}runCore;runtime="python";async run(e,o){return {exitCode:await this.withPythonCacheEnv(o,()=>this.runCore(e,o))}}findWorkspaceRoot(e){let o=e;for(;;){if(j.existsSync(v.join(o,".rapidkit-workspace")))return o;let r=v.dirname(o);if(r===o)break;o=r;}return null}resolveDependencyMode(e){let o=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(o==="shared-runtime-caches"||o==="shared-node-deps"||o==="isolated")return o;let r=this.findWorkspaceRoot(e);if(!r)return "isolated";let n=v.join(r,".rapidkit","policies.yml");if(!j.existsSync(n))return "isolated";try{let l=j.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(l==="shared-runtime-caches"||l==="shared-node-deps"||l==="isolated")return l}catch{}return "isolated"}withPythonCacheEnv(e,o){let r=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=r==="shared-runtime-caches"?v.join(n||e,".rapidkit","cache","python"):v.join(e,".rapidkit","cache","python"),a=process.env.PIP_CACHE_DIR,l=process.env.POETRY_CACHE_DIR;return process.env.PIP_CACHE_DIR=v.join(i,"pip"),process.env.POETRY_CACHE_DIR=v.join(i,"poetry"),o().finally(()=>{typeof a>"u"?delete process.env.PIP_CACHE_DIR:process.env.PIP_CACHE_DIR=a,typeof l>"u"?delete process.env.POETRY_CACHE_DIR:process.env.POETRY_CACHE_DIR=l;})}async checkPrereqs(){let e=process.cwd(),o=await this.run(["doctor","check"],e);return o.exitCode===0?o:this.run(["doctor"],e)}async initProject(e){return this.run(["init"],e)}async runDev(e){return this.run(["dev"],e)}async runTest(e){return this.run(["test"],e)}async runBuild(e){return this.run(["build"],e)}async runStart(e){return this.run(["start"],e)}async doctorHints(e){return ['Run "npx rapidkit doctor workspace" for a full workspace scan.','Use "npx rapidkit init" after adding or changing modules.','Use workspace launcher "./rapidkit" to avoid environment drift.']}};function Vc(){let t={...process.env},e=t.PATH||"";if(e){let o=e.split(v.delimiter).filter(r=>!r.replace(/\\/g,"/").includes("/.pyenv/shims")).join(v.delimiter);t.PATH=o;}return t.PYENV_VERSION="system",t.POETRY_PYTHON=t.POETRY_PYTHON||h$4(),typeof t.RAPIDKIT_SKIP_LOCK_SYNC>"u"&&(t.RAPIDKIT_SKIP_LOCK_SYNC="1"),t}function Ne(t,e){return t==="go"?new Do((o,r,n)=>e.runCommandInCwd(o,r,n)):t==="node"?new Wo((o,r,n)=>e.runCommandInCwd(o,r,n)):t==="java"?new To((o,r,n)=>e.runCommandInCwd(o,r,n)):t==="dotnet"?new No((o,r,n)=>e.runCommandInCwd(o,r,n)):new Fo((o,r)=>e.runCoreRapidkit(o,{cwd:r,env:Vc()}))}var Ci=v.join(js.homedir(),".rapidkit","cache"),Ri=1440*60*1e3;function Ur(){let t=process.env.RAPIDKIT_CACHE_DIR?.trim();if(t)return t;let e=process.env.VITEST_WORKER_ID?.trim();return e?v.join(Ci,`vitest-${e}`):Ci}var Jo=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 v.join(Ur(),`${this.getCacheKey(e)}.json`)}getTempCachePath(e){let o=`${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`;return `${e}.${o}.tmp`}async get(e,o="1.0"){let r=this.memoryCache.get(e);if(r&&r.version===o&&Date.now()-r.timestamp<Ri)return f.debug(`Cache hit (memory): ${e}`),r.data;try{let n=this.getCachePath(e),i=await promises.readFile(n,"utf-8"),a=JSON.parse(i);if(a.version===o&&Date.now()-a.timestamp<Ri)return f.debug(`Cache hit (disk): ${e}`),this.memoryCache.set(e,a),a.data;await promises.unlink(n).catch(()=>{});}catch{f.debug(`Cache miss: ${e}`);}return null}async set(e,o,r="1.0"){let n={data:o,timestamp:Date.now(),version:r};this.memoryCache.set(e,n);try{await promises.mkdir(Ur(),{recursive:true});let i=this.getCachePath(e),a=this.getTempCachePath(i);await promises.writeFile(a,JSON.stringify(n),"utf-8"),await promises.rename(a,i),f.debug(`Cache set: ${e}`);}catch(i){f.debug(`Cache write failed: ${e}`,i);}}async invalidate(e){this.memoryCache.delete(e);try{let o=this.getCachePath(e);await promises.unlink(o),f.debug(`Cache invalidated: ${e}`);}catch{}}async clear(){this.memoryCache.clear();try{let e=Ur(),o=await promises.readdir(e);await Promise.all(o.map(r=>promises.unlink(v.join(e,r)))),f.debug("Cache cleared");}catch{}}};var Ko=["list","sync","registry","foundation","model","snapshot","diff","impact","verify","graph","watch","context","agent-sync","remediation-plan","explain","why","trace","feedback","mcp","policy","contract","share","export","archive","hydrate","import","run","init"],Go=["model","snapshot","diff","impact","verify","context","agent-sync","remediation-plan","explain","why","trace"];function Ei(t){return Go.includes(t)}var _i="rapidkit-runtime-command-surface-v1";var Ai="doctor-remediation-plan-v2";function Uo(){return {runtimeCommandSurface:_i,cliLogEvent:c$7,freshnessMetadata:a$j,factFreshness:c$6,blockerResolution:a$i,workspaceModel:j$3,workspaceImpact:e$3,workspaceVerify:c$5,workspaceContext:a$h,workspaceDependencyGraph:i$3,workspaceIntelligenceHistory:a$g,agentCustomizationPack:l$3,workspaceOperationalSkill:a$f,workspaceSkillsIndex:b$a,workspaceExplain:a$e,agentActionOutcome:a$d,doctorRemediationPlan:Ai,artifactRemediationPlan:a$c,doctorFixResult:a$b}}var zc=["catalog","pulse","nova","orbit","atlas","vertex","summit","beacon","ledger","flux","nexus","apex","harbor","forge","spark","portal","studio","canvas","quantum","vault","zenith","compass","vector","catalyst","saas","commerce","radar","stellar","prism","cedar","momentum","signal","cipher","lumen","trail","ridge"],Yc={"fastapi.standard":"api","fastapi.ddd":"api","nestjs.standard":"api","springboot.standard":"service","gofiber.standard":"api","gogin.standard":"api","dotnet.webapi.clean":"api"},Qc={nextjs:"web",remix:"app","vite-react":"web","vite-vue":"web","vite-svelte":"web","vite-solid":"web","vite-vanilla":"app",nuxt:"app",angular:"app",astro:"site",sveltekit:"app"};function Xc(t){return t[Math.floor(Math.random()*t.length)]}function Vr(t){let e=Xc(zc),o=k$2(t);if(o){let i=Qc[o.id]??"app";return `${e}-${i}`}let r=a$5(t),n=r?Yc[r.id]??"service":"app";return `${e}-${n}`}async function ol(t){let e=await promises.readFile(t);return createHash("sha256").update(e).digest("hex")}async function Ii(t,e){await E.outputFile(t,`${JSON.stringify(e,null,2)}
|
|
150
|
+
`,"utf-8");}function De(t,e){return v.isAbsolute(e)?e:v.join(t,e)}function rl(t,e){if(t.target)return t.target;if(t.source)return v.basename(t.source);if(t.url)try{let o=new URL(t.url).pathname,r=v.basename(o);if(r&&r!=="/")return r}catch{}return `${e}.artifact`}async function nl(t){let e=v.join(t,".rapidkit","trusted-sources.lock"),o=new Set(["localhost","127.0.0.1"]);if(!await E.pathExists(e))return o;try{let n=(await promises.readFile(e,"utf-8")).split(/\r?\n/).map(i=>i.trim()).filter(i=>i.length>0&&!i.startsWith("#"));for(let i of n)o.add(i.toLowerCase());}catch{}return o}async function sl(t,e,o){await E.ensureDir(v.dirname(e)),await new Promise((r,n)=>{let a=(t.startsWith("https://")?Di:Ni).get(t,l=>{if(!l.statusCode||l.statusCode<200||l.statusCode>=300){n(new Error(`HTTP ${l.statusCode||"unknown"}`)),l.resume();return}let c=createWriteStream(e);l.pipe(c),c.on("finish",()=>{c.close(),r();}),c.on("error",u=>{n(u);});});a.setTimeout(o,()=>{a.destroy(new Error(`Request timeout after ${o}ms`));}),a.on("error",l=>{n(l);});});}async function il(t,e,o,r,n){let i=new URL(t),a=JSON.stringify(e),l=i.protocol==="https:"?Di:Ni;await new Promise((c,u)=>{let m=l.request({method:"POST",hostname:i.hostname,port:i.port||(i.protocol==="https:"?443:80),path:`${i.pathname}${i.search}`,headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(a),...r?{Authorization:`Bearer ${r}`}:{},...n||{}}},d=>{if(!d.statusCode||d.statusCode<200||d.statusCode>=300){u(new Error(`HTTP ${d.statusCode||"unknown"}`)),d.resume();return}d.resume(),c();});m.setTimeout(o,()=>{m.destroy(new Error(`Request timeout after ${o}ms`));}),m.on("error",d=>{u(d);}),m.write(a),m.end();});}function $i(t){return new Promise(e=>setTimeout(e,t))}async function al(t,e,o,r){let n=De(t,e||".rapidkit/reports/evidence-export-dead-letter.ndjson");return await E.ensureDir(v.dirname(n)),await promises.appendFile(n,`${JSON.stringify({timestamp:new Date().toISOString(),reason:r,payload:o})}
|
|
151
|
+
`,"utf-8"),n}function cl(t,e){if(!e?.enabled)return {headers:{}};let o=process.env[e.hmacKeyEnv];if(!o)return {headers:{},error:`Evidence signing key env is missing: ${e.hmacKeyEnv}`};let r=(e.algorithm||"sha256").toLowerCase(),n=e.headerName||"x-rapidkit-evidence-signature",i=createHmac(r,o).update(JSON.stringify(t)).digest("hex");return {headers:{[n]:i,"x-rapidkit-evidence-signature-alg":r}}}async function ll(t,e,o){let r=(o.algorithm||"sha256").toLowerCase(),n=De(t,o.publicKeyPath);if(!await E.pathExists(n))return {verified:false,algorithm:r,publicKeyPath:n,publicKeyFingerprint:"",signature:o.signature,message:`Public key not found: ${n}`};try{let i=await promises.readFile(n,"utf-8"),a=await promises.readFile(e),l=createVerify(r);l.update(a),l.end();let c=Buffer.from(o.signature,"base64"),u=l.verify(i,c),m=createHash("sha256").update(i).digest("hex");return {verified:u,algorithm:r,publicKeyPath:n,publicKeyFingerprint:m,signature:o.signature,message:u?"Attestation verified.":"Attestation signature verification failed."}}catch(i){return {verified:false,algorithm:r,publicKeyPath:n,publicKeyFingerprint:"",signature:o.signature,message:`Attestation verification error: ${i.message}`}}}async function dl(t,e,o,r){let n=process.env.RAPIDKIT_SIGSTORE_MOCK;if(n==="success")return {verified:true,tlogVerified:r.requireTransparencyLog,message:"Sigstore verification passed (mock).",identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:o.bundlePath||null,certificatePath:o.certificatePath||null,signaturePath:o.signaturePath||null};if(n==="fail")return {verified:false,tlogVerified:false,message:"Sigstore verification failed (mock).",identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:o.bundlePath||null,certificatePath:o.certificatePath||null,signaturePath:o.signaturePath||null};let i=o.signaturePath?De(t,o.signaturePath):null;if(!i||!await E.pathExists(i))return {verified:false,tlogVerified:false,message:"Sigstore signaturePath is missing or not found.",identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:o.bundlePath||null,certificatePath:o.certificatePath||null,signaturePath:i};let a=["verify-blob",e,"--signature",i],l=o.certificatePath?De(t,o.certificatePath):null;l&&a.push("--certificate",l);let c=o.bundlePath?De(t,o.bundlePath):null;c&&a.push("--bundle",c);let u=o.keyPath?De(t,o.keyPath):null;u&&a.push("--key",u),o.identity&&a.push("--certificate-identity",o.identity),o.issuer&&a.push("--certificate-oidc-issuer",o.issuer),o.rekorUrl&&a.push("--rekor-url",o.rekorUrl),r.requireTransparencyLog||a.push("--insecure-ignore-tlog");try{let m=await execa("cosign",a,{reject:false});return m.exitCode===0?{verified:true,tlogVerified:r.requireTransparencyLog,message:"Sigstore verification passed.",identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:c,certificatePath:l,signaturePath:i}:{verified:false,tlogVerified:false,message:`Sigstore verification failed: ${m.stderr||m.stdout||"unknown error"}`,identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:c,certificatePath:l,signaturePath:i}}catch(m){return {verified:false,tlogVerified:false,message:`Sigstore verification error: ${m.message}`,identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:c,certificatePath:l,signaturePath:i}}}async function pl(t,e){let o=e.algorithm||"sha256",r=De(t,e.policyPath),n=De(t,e.signaturePath),i=De(t,e.publicKeyPath);if(!await E.pathExists(r))return {verified:false,message:`Governance policy bundle not found: ${r}`,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 a=await promises.readFile(r,"utf-8"),l=(await promises.readFile(n,"utf-8")).trim(),c=await promises.readFile(i,"utf-8"),u=createVerify(o);return u.update(a),u.end(),u.verify(c,Buffer.from(l,"base64"))?{verified:true,message:"Governance policy bundle verified.",policies:JSON.parse(a).policies||{}}:{verified:false,message:"Governance policy bundle signature verification failed.",policies:null}}catch(a){return {verified:false,message:`Governance policy bundle verification error: ${a.message}`,policies:null}}}async function Br(t,e){let o=[],r={syncedArtifacts:0,verifiedArtifacts:0,rotatedFiles:0,lockWritten:false,governanceBundleVerified:false,transparencyEvidenceWritten:false,transparencyEvidenceRecords:0,evidenceExported:false,evidenceExportTarget:null},n=v.join(t,".rapidkit"),i=v.join(n,"mirror-config.json"),a=v.join(n,"mirror.lock"),l=v.join(n,"mirror","artifacts"),c=v.join(n,"reports"),u=await nl(t);if(!await E.pathExists(i))return o.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: .rapidkit/mirror-config.json not found."}),{checks:o,details:r};let m={};try{m=JSON.parse(await promises.readFile(i,"utf-8"));}catch{return o.push({id:"mirror.lifecycle.config",status:"failed",message:"Mirror lifecycle failed: invalid JSON in mirror-config.json."}),{checks:o,details:r}}if(!(e.forceRun===true||e.ciMode||e.offlineMode||m.mode==="offline-only"))return o.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: not in ci/offline mode."}),{checks:o,details:r};await E.ensureDir(l);let p=Math.max(0,m.prefetch?.retries??2),f=Math.max(0,m.prefetch?.backoffMs??250),g=Math.max(1e3,m.prefetch?.timeoutMs??15e3),y=m.security?.requireAttestation===true,w=m.security?.requireSigstore===true,P=m.security?.requireTransparencyLog===true,k=m.security?.requireSignedGovernance===true,h=m.security?.evidenceExport,S=(process.env.RAPIDKIT_ENV||m.security?.governance?.environment||"dev").toLowerCase(),b=m.security?.governance?.policies||{};if(m.security?.governanceBundle){let K=await pl(t,m.security.governanceBundle);if(o.push({id:"governance.bundle.verify",status:K.verified?"passed":"failed",message:K.message}),K.verified&&K.policies)b=K.policies,r.governanceBundleVerified=true;else if(k)return {checks:o,details:r}}let A=b[S],N=P||A?.requireTransparencyLog===true,H=[],Y=Array.isArray(m.artifacts)?m.artifacts:[],U=[];for(let K=0;K<Y.length;K+=1){let V=Y[K],R=V.id||`artifact-${K+1}`,ee=V.source?De(t,V.source):null,de=rl(V,R),q=v.join(l,de),pe=false,ve={sourceType:"path",source:ee||V.url||"unknown",host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true};if(ee&&await E.pathExists(ee))await E.ensureDir(v.dirname(q)),await E.copyFile(ee,q),r.syncedArtifacts+=1,pe=true,ve={sourceType:"path",source:ee,host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true},o.push({id:`mirror.sync.${R}`,status:"passed",message:`Mirrored artifact ${R} from source path.`});else if(V.url){let _e="";try{_e=new URL(V.url).hostname.toLowerCase();}catch{o.push({id:`mirror.prefetch.${R}`,status:"failed",message:`Invalid URL for ${R}: ${V.url}`});continue}if(!(process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||u.has(_e))){o.push({id:`mirror.prefetch.trust.${R}`,status:"failed",message:`Untrusted mirror host for ${R}: ${_e}. Add host to .rapidkit/trusted-sources.lock or set RAPIDKIT_TRUSTED_SOURCES=1.`});continue}if(e.offlineMode&&(await E.pathExists(q)?(pe=true,ve={sourceType:"url",source:V.url,host:_e,fetchedAt:new Date().toISOString(),attempts:0,trusted:true},o.push({id:`mirror.prefetch.${R}`,status:"passed",message:`Offline mode reused existing mirrored artifact ${R}.`})):o.push({id:`mirror.prefetch.${R}`,status:"failed",message:`Offline mode cannot prefetch remote artifact ${R} without an existing mirrored copy.`}),!pe))continue;if(!pe){let me=null,ze=0;for(let x=1;x<=p+1;x+=1){ze=x;try{await sl(V.url,q,g),r.syncedArtifacts+=1,pe=true,ve={sourceType:"url",source:V.url,host:_e,fetchedAt:new Date().toISOString(),attempts:ze,trusted:true},o.push({id:`mirror.prefetch.${R}`,status:"passed",message:ze>1?`Prefetched artifact ${R} from ${_e} after ${ze} attempts.`:`Prefetched artifact ${R} from ${_e}.`});break}catch($){if(me=$,x<=p){await $i(f*x);continue}}}if(!pe){o.push({id:`mirror.prefetch.${R}`,status:"failed",message:`Failed to prefetch ${R} after ${p+1} attempt(s): ${me?.message||"unknown error"}`});continue}}if(!pe){o.push({id:`mirror.prefetch.${R}`,status:"failed",message:`Failed to prefetch ${R}.`});continue}}if(!pe){V.required||e.offlineMode?o.push({id:`mirror.sync.${R}`,status:"failed",message:`Mirror source missing for ${R}${ee?`: ${ee}`:""}`}):o.push({id:`mirror.sync.${R}`,status:"skipped",message:`Mirror source not found for optional artifact ${R}.`});continue}let it=await ol(q);if(V.sha256&&V.sha256.toLowerCase()!==it.toLowerCase()){o.push({id:`mirror.verify.${R}`,status:"failed",message:`Checksum mismatch for ${R}.`});continue}r.verifiedArtifacts+=1,o.push({id:`mirror.verify.${R}`,status:"passed",message:`Checksum verified for ${R}.`});let ue=V.attestation?await ll(t,q,V.attestation):null;if(V.attestation){if(o.push({id:`mirror.attest.${R}`,status:ue?.verified?"passed":"failed",message:ue?.message||"Attestation verification failed."}),!ue?.verified)continue}else if(y){o.push({id:`mirror.attest.${R}`,status:"failed",message:`Attestation is required but missing for ${R}.`});continue}else o.push({id:`mirror.attest.${R}`,status:"skipped",message:`No attestation provided for ${R}.`});let ge=V.attestation?.sigstore,M=ge?await dl(t,q,ge,{requireTransparencyLog:N}):null;if(ge){if(o.push({id:`mirror.sigstore.${R}`,status:M?.verified?"passed":"failed",message:M?.message||"Sigstore verification failed."}),H.push({artifactId:R,verified:!!M?.verified,tlogVerified:!!M?.tlogVerified,identity:M?.identity||null,issuer:M?.issuer||null,rekorUrl:M?.rekorUrl||null,timestamp:new Date().toISOString(),environment:S}),!M?.verified)continue}else if(w){o.push({id:`mirror.sigstore.${R}`,status:"failed",message:`Sigstore attestation is required but missing for ${R}.`});continue}else o.push({id:`mirror.sigstore.${R}`,status:"skipped",message:`No Sigstore attestation provided for ${R}.`});if(ge&&M?.verified&&A){let _e=A.allowedIdentities||[];if(_e.length>0){let me=!!M.identity&&_e.includes(M.identity);if(o.push({id:`mirror.sigstore.policy.identity.${R}`,status:me?"passed":"failed",message:me?`Sigstore identity policy passed for ${R} in ${S}.`:`Sigstore identity policy failed for ${R} in ${S}.`}),!me)continue}let ht=A.allowedIssuers||[];if(ht.length>0){let me=!!M.issuer&&ht.includes(M.issuer);if(o.push({id:`mirror.sigstore.policy.issuer.${R}`,status:me?"passed":"failed",message:me?`Sigstore issuer policy passed for ${R} in ${S}.`:`Sigstore issuer policy failed for ${R} in ${S}.`}),!me)continue}let Nt=A.allowedRekorUrls||[];if(Nt.length>0){let me=!!M.rekorUrl&&Nt.includes(M.rekorUrl);if(o.push({id:`mirror.sigstore.policy.rekor.${R}`,status:me?"passed":"failed",message:me?`Sigstore Rekor policy passed for ${R} in ${S}.`:`Sigstore Rekor policy failed for ${R} in ${S}.`}),!me)continue}}else A&&o.push({id:`mirror.sigstore.policy.${R}`,status:"skipped",message:`Sigstore governance policy configured for ${S} but no verified Sigstore attestation for ${R}.`});let at=await promises.stat(q);U.push({id:R,path:v.relative(t,q),sha256:it,size:at.size,provenance:ve,attestation:{detached:{provided:!!V.attestation,verified:ue?.verified||false,algorithm:ue?.algorithm||null,publicKeyPath:ue?.publicKeyPath||null,publicKeyFingerprint:ue?.publicKeyFingerprint||null,signature:ue?.signature||null,verifiedAt:ue?.verified?new Date().toISOString():null},sigstore:{provided:!!ge,verified:M?.verified||false,tlogVerified:M?.tlogVerified||false,identity:M?.identity||null,issuer:M?.issuer||null,rekorUrl:M?.rekorUrl||null,bundlePath:M?.bundlePath||null,certificatePath:M?.certificatePath||null,signaturePath:M?.signaturePath||null,verifiedAt:M?.verified?new Date().toISOString():null}}});}let J=m.retention?.keepLast;if(typeof J=="number"&&J>0){let V=(await promises.readdir(l,{withFileTypes:true})).filter(R=>R.isFile()).map(R=>v.join(l,R.name));if(V.length>J){let R=await Promise.all(V.map(async de=>({filePath:de,stat:await promises.stat(de)})));R.sort((de,q)=>q.stat.mtimeMs-de.stat.mtimeMs);let ee=R.slice(J);for(let de of ee)await promises.unlink(de.filePath),r.rotatedFiles+=1;}}o.push({id:"mirror.rotate",status:"passed",message:r.rotatedFiles>0?`Mirror retention rotation removed ${r.rotatedFiles} file(s).`:"Mirror retention rotation completed with no removals."});let Se={schemaVersion:"1.0",generatedAt:new Date().toISOString(),mode:m.mode||null,environment:S,artifacts:U};if(await promises.writeFile(a,`${JSON.stringify(Se,null,2)}
|
|
152
|
+
`,"utf-8"),r.lockWritten=true,o.push({id:"mirror.lock.write",status:"passed",message:`Mirror lock updated at ${v.relative(t,a)}.`}),r.transparencyEvidenceRecords=H.length,H.length>0){let K={schemaVersion:"1.0",generatedAt:new Date().toISOString(),environment:S,records:H},V=new Date().toISOString().replace(/[:.]/g,"-"),R=v.join(c,`transparency-evidence-${V}.json`),ee=v.join(c,"transparency-evidence.latest.json");if(await E.ensureDir(c),await Ii(R,K),await Ii(ee,K),r.transparencyEvidenceWritten=true,o.push({id:"sigstore.evidence.write",status:"passed",message:`Transparency evidence written to ${v.relative(t,ee)}.`}),h?.enabled){let de=Math.max(1e3,h.timeoutMs??1e4);if(h.target==="file")if(!h.filePath)o.push({id:"sigstore.evidence.export.file",status:"failed",message:"Evidence export target=file requires security.evidenceExport.filePath."});else try{let q=De(t,h.filePath);await E.ensureDir(v.dirname(q)),await promises.appendFile(q,`${JSON.stringify(K)}
|
|
153
|
+
`,"utf-8"),r.evidenceExported=true,r.evidenceExportTarget=q,o.push({id:"sigstore.evidence.export.file",status:"passed",message:`Transparency evidence exported to file sink ${q}.`});}catch(q){o.push({id:"sigstore.evidence.export.file",status:"failed",message:`Evidence file export failed: ${q.message}`});}else if(h.target==="http")if(!h.endpoint)o.push({id:"sigstore.evidence.export.http",status:"failed",message:"Evidence export target=http requires security.evidenceExport.endpoint."});else {let q=Math.max(0,h.retries??0),pe=Math.max(0,h.backoffMs??500),ve=cl(K,h.signing);ve.error&&o.push({id:"sigstore.evidence.export.http",status:"failed",message:ve.error});try{let it=h.authTokenEnv?process.env[h.authTokenEnv]:void 0,ue=false,ge=null;for(let M=1;M<=q+1;M+=1)try{if(ve.error)throw new Error(ve.error);await il(h.endpoint,K,de,it,ve.headers),r.evidenceExported=true,r.evidenceExportTarget=h.endpoint,o.push({id:"sigstore.evidence.export.http",status:"passed",message:M>1?`Transparency evidence exported to HTTP endpoint ${h.endpoint} after ${M} attempts.`:`Transparency evidence exported to HTTP endpoint ${h.endpoint}.`}),ue=true;break}catch(at){ge=at,M<=q&&await $i(pe*M);}if(!ue)throw ge||new Error("unknown evidence export error")}catch(it){let ue=`Evidence HTTP export failed: ${it.message}`;o.push({id:"sigstore.evidence.export.http",status:"failed",message:ue});try{let ge=await al(t,h.deadLetterPath,K,ue);o.push({id:"sigstore.evidence.export.deadletter",status:"passed",message:`Evidence export failure persisted to dead-letter sink ${ge}.`});}catch(ge){o.push({id:"sigstore.evidence.export.deadletter",status:"failed",message:`Evidence dead-letter write failed: ${ge.message}`});}}}if(h.failOnError&&o.some(pe=>pe.status==="failed"&&(pe.id==="sigstore.evidence.export.file"||pe.id==="sigstore.evidence.export.http")))return {checks:o,details:r}}else o.push({id:"sigstore.evidence.export",status:"skipped",message:"Central evidence export not configured (security.evidenceExport.enabled=false)."});}else o.push({id:"sigstore.evidence.write",status:"skipped",message:"No Sigstore records available for transparency evidence output."}),o.push({id:"sigstore.evidence.export",status:"skipped",message:"Central evidence export skipped because no transparency evidence records exist."});return {checks:o,details:r}}function Vo(t){let e=a$l(t.detection.runtime),o=o$2({runtime:t.detection.runtime,moduleSupport:t.moduleSupport,projectPath:t.projectPath,framework:t.detection.key}),r=[];r.push({id:"framework-detection",status:t.detection.key==="unknown"?"warn":"pass",message:t.detection.key==="unknown"?"RapidKit could not confidently identify the project 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}),r.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}),r.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."}),r.push({id:"lifecycle-commands",status:o.lifecycleCommands.length>1?"pass":"warn",message:o.lifecycleCommands.length>1?`Lifecycle commands available: ${o.lifecycleCommands.join(", ")}.`:"Only help-level lifecycle support is available for this runtime today.",recommendation:o.lifecycleCommands.length>1?void 0:"Add runtime scripts or a RapidKit runtime adapter before relying on dev/test/build/start."});let n=r.some(a=>a.status==="fail"),i=r.some(a=>a.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,...t.projectKind?{kind:t.projectKind}:{},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:o.lifecycleCommands,unsupportedLifecycleCommands:o.unsupportedLifecycleCommands,moduleCommands:o.moduleCommands},checks:r}}function ul(t){if(typeof t?.kit_name=="string")return t.kit_name;if(typeof t?.kit=="string")return t.kit}function Bo(t){if(t.existingProjectJson?.module_support===true){let e=ul(t.existingProjectJson),o=e?a$5(e):void 0;return o?.owner==="core"&&o.moduleSupport===true}return false}function Ti(t){return t.replace(/\\/g,"/")}function ml(t,e){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,80)||e}function fl(t,e){let o=Ti(v.relative(t,e));return !o||o.startsWith("..")?true:o.split("/").filter(Boolean).some(r=>r==="..")}function zt(t){let e=Ti(v.relative(t.workspacePath,t.projectPath)),o=fl(t.workspacePath,t.projectPath),r=ml(t.projectName,v.basename(t.projectPath)),n=o?`external/${r}`:e||r;return {relativePath:e||n,contractRelativePath:n,isExternal:o}}var Li={"python-only":"python","node-only":"node","go-only":"go","java-only":"java","dotnet-only":"dotnet"},yl={python:"Python",node:"Node",go:"Go",java:"Java",dotnet:".NET",php:"PHP",ruby:"Ruby",rust:"Rust",elixir:"Elixir",clojure:"Clojure",scala:"Scala",kotlin:"Kotlin",deno:"Deno",bun:"Bun",c:"C",cpp:"C++",unknown:"Unknown"},hl={python:"python-only",node:"node-only",go:"go-only",java:"java-only",dotnet:"dotnet-only"},Wi=["node","deno","bun","python","go","java","kotlin","scala","dotnet","php","ruby","rust","elixir","clojure","c","cpp","unknown"];function qr(t){return t==="bun"||t==="deno"?"node":t==="kotlin"||t==="scala"?"java":t}function zr(t){return typeof t!="string"||t.trim().length===0?"minimal":t.trim().toLowerCase()}function Qt(t){if(typeof t!="string")return "unknown";let e=t.trim().toLowerCase();return e==="python"||e==="node"||e==="go"||e==="java"||e==="dotnet"||e==="php"||e==="ruby"||e==="rust"||e==="elixir"||e==="clojure"||e==="scala"||e==="kotlin"||e==="deno"||e==="bun"||e==="c"||e==="cpp"?e:e==="c++"||e==="cplusplus"||e==="cc"||e==="clang++"||e==="g++"?"cpp":e==="clang"||e==="gcc"?"c":"unknown"}function Ho(t){let e=new Set;for(let o of t)e.add(Qt(o));return [...e].sort((o,r)=>Wi.indexOf(o)-Wi.indexOf(r))}function wl(t){let e=Ho(t).filter(o=>o!=="unknown");if(e.length!==0)return e.length===1?hl[e[0]]:"polyglot"}function Fi(t,e={}){return `npx rapidkit bootstrap --profile ${t}${e.ci?" --ci --json":""}`}function kl(t,e){return t?"none":e==="strict"?"error":"warning"}function Xt(t){let e=t.ok?void 0:wl(t.runtimes)??"polyglot";return {ok:t.ok,checkId:t.checkId,status:t.ok?"passed":"failed",profile:t.profile,runtimes:t.runtimes,message:t.message,recommendedProfile:e,recommendedCommand:e?Fi(e):void 0,ciRecommendedCommand:e?Fi(e,{ci:true}):void 0,severity:kl(t.ok,t.mode)}}function mt(t){let e=zr(t.profile),o=Ho(t.runtimes),r=t.mode??"warn",n=Li[e];if(n){let i=o.length===0||o.every(a=>qr(a)===n);return Xt({ok:i,checkId:`profile.${e}`,profile:e,runtimes:o,message:i?`${e} profile validated for discovered projects.`:`${e} profile mismatch: detected runtimes [${o.join(", ")}].`,mode:r})}if(e==="minimal"){let i=o.filter(c=>c!=="unknown"),l=new Set(i.map(c=>qr(c))).size<=1;return Xt({ok:l,checkId:"profile.minimal",profile:e,runtimes:o,message:l?"minimal profile is compatible with detected runtime mix.":`minimal profile mismatch: multiple runtimes detected [${i.join(", ")}].`,mode:r})}return Xt({ok:true,checkId:`profile.${e}`,profile:e,runtimes:o,message:`${e} profile accepts the detected runtime mix.`,mode:r})}function nt(t){let e=zr(t.profile),o=Qt(t.runtime),r=t.mode??"warn",n=Li[e];if(!n||o==="unknown")return Xt({ok:true,checkId:`profile.${e}`,profile:e,runtimes:[o],message:o==="unknown"?`Project "${t.subjectLabel}" runtime is unknown; profile compatibility will be checked by workspace doctor.`:`${e} profile accepts project "${t.subjectLabel}".`,mode:r});let i=qr(o)===n;return Xt({ok:i,checkId:`profile.${e}`,profile:e,runtimes:i?[o]:Ho([n,o]),message:i?`Project "${t.subjectLabel}" is compatible with workspace profile "${e}".`:`Project "${t.subjectLabel}" is ${yl[o]}, but workspace profile is "${e}".`,mode:r})}async function $t(t){let e=v.join(t,".rapidkit","policies.yml");if(!await E__default.pathExists(e))return "warn";try{return (await E__default.readFile(e,"utf-8")).match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]==="strict"?"strict":"warn"}catch{return "warn"}}async function Ot(t){let e=v.join(t,".rapidkit","workspace.json");if(!await E__default.pathExists(e))return "minimal";try{let o=await E__default.readJson(e);return zr(o.profile)}catch{return "minimal"}}async function ft(t,e={}){let o=new Set,r=[],n=new Set,i=[t];for(;i.length>0;){let a=i.pop();if(!a||n.has(a))continue;n.add(a);let l=[];try{l=await j.promises.readdir(a,{withFileTypes:true});}catch{continue}for(let c of l){if(!c.isDirectory()||c.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(c.name))continue;let u=v.join(a,c.name),m=v.join(u,".rapidkit","context.json"),d=v.join(u,".rapidkit","project.json");if(await E__default.pathExists(m)||await E__default.pathExists(d)){r.push(u);continue}i.push(u);}}for(let a of r){let l=d$4(a);o.add(Qt(i$1(a,l).runtime));}for(let a of await a$k(t))o.add(Qt(a.runtime));for(let a of e.additionalRuntimes??[])o.add(Qt(a));return Ho(o)}function qo(t,e={}){let o=e.ci?t.ciRecommendedCommand:t.recommendedCommand;return o?`Recommended: ${o}`:null}function Ji(t){return t.trim().toLowerCase().replace(/\.git$/i,"").replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,64)}function Pl(t){let e=t.trim();if(!e)return "imported-project";let o=e.replace(/\\/g,"/").replace(/\/+$/,"").split("/"),r=o[o.length-1]||e,n=r.split(":"),i=(n[n.length-1]||r).replace(/\.git$/i,"");return Ji(i)||"imported-project"}function Yr(t){let e=t.trim();return e.includes("://")||e.startsWith("git@")}function bl(t){return Yr(t)?"git-url":"local-folder"}async function jl(t,e){let o=Ji(e)||"imported-project",r=0;for(;;){let n=r===0?o:r===1?`${o}-imported`:`${o}-imported-${r}`,i=v.join(t,n);if(!await E__default.pathExists(i))return i;r+=1;}}function Sl(t,e){let o=v.resolve(t),r=v.resolve(e),n=v.relative(o,r);return n===""||n.length>0&&!n.startsWith("..")&&!v.isAbsolute(n)}function xl(t,e){if(Sl(t,e))throw new Error("Import source must be outside the current workspace root.")}function Cl(t){return t.startsWith(".env")?![".env.example",".env.sample",".env.template",".env.defaults",".env.dist"].includes(t):false}function Rl(t){let e=v.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)||Cl(e)||e.endsWith(".pem")||e.endsWith(".key"))}async function El(t){let e=v.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 _l(t){let e=new Date().toISOString(),o=typeof t.existingProjectJson?.name=="string"?t.existingProjectJson.name:v.basename(t.projectPath),r=zt({workspacePath:t.workspacePath,projectPath:t.projectPath,projectName:o}),n=r.contractRelativePath,i=v.join(t.projectPath,".rapidkit","project.json"),a=v.join(t.projectPath,".rapidkit","import.json"),l=v.join(t.projectPath,".rapidkit","import-readiness.json"),c=Bo({existingProjectJson:t.existingProjectJson}),u=Array.isArray(t.existingProjectJson?.modules)?t.existingProjectJson.modules:[],m=t.existingProjectJson?.contracts&&typeof t.existingProjectJson.contracts=="object"&&!Array.isArray(t.existingProjectJson.contracts)?t.existingProjectJson.contracts:{owns:[],apis:[],publishes:[],consumes:[],dependsOn:[],env:[]},d={...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:v.basename(t.projectPath),slug:typeof t.existingProjectJson?.slug=="string"?t.existingProjectJson.slug:v.basename(t.projectPath),kind:t.projectKind,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:u,contracts:m,import:{managed_by:"rapidkit-npm",source_type:t.sourceType,imported_at:e,relative_path:n,discovered_relative_path:r.relativePath,is_external:r.isExternal,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:v.basename(t.projectPath)},project:{name:d.name,slug:d.slug,relative_path:n,kind:t.projectKind,module_support:c},detection:{framework:t.detection.key,framework_display_name:t.detection.displayName,runtime:t.detection.runtime,kind:t.projectKind,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,profile_compatibility:{ok:t.profileCompatibility.ok,profile:t.profileCompatibility.profile,runtimes:t.profileCompatibility.runtimes,message:t.profileCompatibility.message,recommended_profile:t.profileCompatibility.recommendedProfile,recommended_command:t.profileCompatibility.recommendedCommand}}},f=Vo({projectName:String(d.name),relativePath:n,projectKind:t.projectKind,source:t.sourceType,detection:t.detection,moduleSupport:c,projectPath:t.projectPath,generatedAt:new Date(e)});return await E__default.ensureDir(v.dirname(i)),await E__default.writeJson(i,d,{spaces:2}),await E__default.writeJson(a,p,{spaces:2}),await E__default.writeJson(l,f,{spaces:2}),{projectJsonPath:i,importJsonPath:a,importReadinessPath:l,moduleSupport:c}}async function Al(t,e){let o={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 b$9(t,[o]);}async function Ki(t){await E__default.pathExists(t)&&await E__default.remove(t);}async function Gi(t,e){await Ki(e),await c$2(t,[e]);}async function Ui(t){let e=v.resolve(t.workspacePath),o=t.source.trim(),r=t.sourceType??bl(o),n=t.name??(r==="git-url"?Pl(o):v.basename(o)),i=await jl(e,n),a=false;try{if(r==="local-folder"){let k=v.resolve(o),h=await E__default.stat(k).catch(()=>null);if(!h||!h.isDirectory())throw new Error("Import source is not a directory.");xl(e,k),a=true,await E__default.copy(k,i,{overwrite:false,errorOnExist:true,filter:Rl});}else a=true,await execa("git",["clone","--depth","1",o,i],{timeout:12e4});let l=await El(i),c=i$1(i,l),u=await h$3(i,l),[m,d]=await Promise.all([Ot(e),t.profilePolicyMode?Promise.resolve(t.profilePolicyMode):$t(e)]),p=nt({profile:m,runtime:c.runtime,subjectLabel:v.basename(i),mode:d}),f=mt({profile:m,runtimes:await ft(e,{additionalRuntimes:[c.runtime]}),mode:d}),g=p.ok?f:p;if(!g.ok&&d==="strict")throw new Error(g.message);let y=await _l({workspacePath:e,projectPath:i,sourceType:r,detection:c,existingProjectJson:l,projectKind:u,profileCompatibility:g}),w=zt({workspacePath:e,projectPath:i,projectName:v.basename(i)}),P={name:v.basename(i),path:i,relativePath:w.contractRelativePath,stack:c.importStack,runtime:c.runtime,framework:c.key,frameworkDisplayName:c.displayName,supportTier:c.supportTier,moduleSupport:y.moduleSupport,confidence:c.confidence,source:r,projectJsonPath:y.projectJsonPath,importJsonPath:y.importJsonPath,importReadinessPath:y.importReadinessPath,profileCompatibility:g};return await Al(e,P),P}catch(l){if(a)try{await Ki(i);}catch(c){let u=l instanceof Error?l.message:String(l),m=c instanceof Error?c.message:String(c);throw new Error(`Import failed: ${u}. Rollback also failed: ${m}`)}throw l}}function Il(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,64)}function $l(t,e){return v.resolve(t)===v.resolve(e)}async function Ol(t){let e=v.join(t,".rapidkit","project.json");if(!await E__default.pathExists(e))return null;try{return await E__default.readJson(e)}catch{return null}}function Ml(t){let e=Array.isArray(t.existingProjectJson?.modules)?t.existingProjectJson.modules:[],o=t.existingProjectJson?.contracts&&typeof t.existingProjectJson.contracts=="object"&&!Array.isArray(t.existingProjectJson.contracts)?t.existingProjectJson.contracts:{owns:[],apis:[],publishes:[],consumes:[],dependsOn:[],env:[]};return {...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:t.projectName,slug:typeof t.existingProjectJson?.slug=="string"?t.existingProjectJson.slug:t.projectName,kind:t.projectKind,runtime:t.detection.runtime,framework:t.detection.key,kit:typeof t.existingProjectJson?.kit=="string"?t.existingProjectJson.kit:`adopted.${t.detection.key}`,kit_name:typeof t.existingProjectJson?.kit_name=="string"?t.existingProjectJson.kit_name:`adopted.${t.detection.key}`,engine:typeof t.existingProjectJson?.engine=="string"?t.existingProjectJson.engine:"npm",module_support:t.moduleSupport,modules:e,contracts:o,adoption:{managed_by:"rapidkit-npm",mode:"linked",adopted_at:t.adoptedAt,relative_path:t.contractRelativePath,discovered_relative_path:t.discoveredRelativePath,is_external:t.isExternal,detection:{framework:t.detection.key,runtime:t.detection.runtime,confidence:t.detection.confidence,support_tier:t.detection.supportTier,source:t.detection.source}}}}async function Vi(t,e,o){let r=v.join(e,".rapidkit","project.json"),n=v.join(e,".rapidkit","adopt.json"),i=v.join(e,".rapidkit","adopt-readiness.json");o?await E__default.writeJson(r,o,{spaces:2}):await E__default.pathExists(r)&&await E__default.remove(r),await E__default.pathExists(n)&&await E__default.remove(n),await E__default.pathExists(i)&&await E__default.remove(i);let{removeImportedProjectsRegistryEntries:a}=await import('./imported-projects-registry-ZOCHFWMK.js');await a(t,[e]);}async function Bi(t){let e=v.resolve(t.workspacePath),o=v.resolve(t.source),r=await E__default.stat(o).catch(()=>null);if(!r||!r.isDirectory())throw new Error("Adopt source is not a directory.");if($l(e,o))throw new Error("Adopt source cannot be the workspace root itself.");let n=await Ol(o),i=i$1(o,n),a=await h$3(o,n),l=Il(t.name||(typeof n?.name=="string"?n.name:"")||v.basename(o))||"adopted-project",c=zt({workspacePath:e,projectPath:o,projectName:l}),u=(t.now??new Date).toISOString(),m=v.join(o,".rapidkit","project.json"),d=v.join(o,".rapidkit","adopt.json"),p=v.join(o,".rapidkit","adopt-readiness.json"),f=Bo({existingProjectJson:n}),[g,y]=await Promise.all([Ot(e),t.profilePolicyMode?Promise.resolve(t.profilePolicyMode):$t(e)]),w=nt({profile:g,runtime:i.runtime,subjectLabel:l,mode:y}),P=mt({profile:g,runtimes:await ft(e,{additionalRuntimes:[i.runtime]}),mode:y}),k=w.ok?P:w;if(!k.ok&&y==="strict")throw new Error(k.message);let h=Ml({projectName:l,contractRelativePath:c.contractRelativePath,isExternal:c.isExternal,discoveredRelativePath:c.relativePath,detection:i,existingProjectJson:n,projectKind:a,moduleSupport:f,adoptedAt:u}),S={schema_version:"1.0",kind:"rapidkit.adopted_project",adopted_at:u,managed_by:"rapidkit-npm",mode:"linked",workspace:{path:e},project:{name:l,path:o,relative_path:c.contractRelativePath,discovered_relative_path:c.relativePath,is_external:c.isExternal,kind:a,module_support:f},detection:{framework:i.key,framework_display_name:i.displayName,runtime:i.runtime,kind:a,confidence:i.confidence,support_tier:i.supportTier,import_stack:i.importStack,source:i.source},policy:{moved_source:false,copied_source:false,module_mutation_enabled:f,workspace_contract:"linked-project",profile_compatibility:{ok:k.ok,profile:k.profile,runtimes:k.runtimes,message:k.message,recommended_profile:k.recommendedProfile,recommended_command:k.recommendedCommand}}},b=Vo({projectName:l,relativePath:c.contractRelativePath,projectKind:a,source:"adopted-local",detection:i,moduleSupport:f,projectPath:o,generatedAt:new Date(u)});if(t.dryRun!==true){await E__default.ensureDir(v.dirname(m)),await E__default.writeJson(m,h,{spaces:2}),await E__default.writeJson(d,S,{spaces:2}),await E__default.writeJson(p,b,{spaces:2});let A={name:l,path:o,relativePath:c.contractRelativePath,relationship:"adopted",stack:i.importStack,runtime:i.runtime,framework:i.key,frameworkDisplayName:i.displayName,supportTier:i.supportTier,moduleSupport:f,confidence:i.confidence,source:"adopted-local",importedAt:u};await b$9(e,[A]);}return {name:l,path:o,relativePath:c.relativePath,contractRelativePath:c.contractRelativePath,isExternal:c.isExternal,relationship:"adopted",stack:i.importStack,runtime:i.runtime,framework:i.key,frameworkDisplayName:i.displayName,supportTier:i.supportTier,moduleSupport:f,confidence:i.confidence,projectJsonPath:m,adoptJsonPath:d,adoptReadinessPath:p,profileCompatibility:k,wroteFiles:t.dryRun!==true}}function Qr(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 Tl(t){let e=t.trim().toLowerCase();return e?e.startsWith("fastapi")?"fastapi":e.startsWith("nestjs")?"nestjs":null:null}function Ee(t,e){let o=t.indexOf(e);if(o>=0&&o+1<t.length)return t[o+1];let r=t.find(n=>n.startsWith(`${e}=`));if(r)return r.slice(e.length+1)}async function qi(t){let e=Z(process.cwd()),o=t.trim().toLowerCase();if(!e||!o)return true;try{let[r,n]=await Promise.all([Ot(e),$t(e)]),i=a$5(o),l=k$2(o)?"node":i?.runtime??"python",c=nt({profile:r,runtime:l,subjectLabel:o,mode:n}),u=mt({profile:r,runtimes:await ft(e,{additionalRuntimes:[l]}),mode:n}),m=c.ok?u:c;if(m.ok)return true;let d=qo(m);if(n==="strict")return console.log(s.red(`\u274C Profile violation (strict mode): ${m.message}`)),d&&console.log(s.gray(`\u{1F4A1} ${d}`)),false;console.log(s.yellow(`\u26A0\uFE0F Profile warning: ${m.message}`)),d&&console.log(s.gray(`\u{1F4A1} ${d}`));}catch{}return true}function dn(){return i$4()}function zi(){let t={...process.env},e=t.PATH||"";return e&&(t.PATH=e.split(v.delimiter).filter(o=>!o.replace(/\\/g,"/").includes("/.pyenv/shims")).join(v.delimiter)),t.PYENV_VERSION="system",t.POETRY_PYTHON||(t.POETRY_PYTHON=h$4()),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 Wl(t){return l$4(v.join(t,".venv"))}async function ma(t,e){return await B(t,["--version"],e)===0}async function yt(t){let e=v.join(t,"go.mod");if(await E__default.pathExists(e))return "go";let o=v.join(t,"pom.xml"),r=v.join(t,"build.gradle"),n=v.join(t,"build.gradle.kts");if(await E__default.pathExists(o)||await E__default.pathExists(r)||await E__default.pathExists(n))return "java";if((await E__default.pathExists(t)?await j.promises.readdir(t,{withFileTypes:true}):[]).some(d=>d.isFile()&&d.name.toLowerCase().endsWith(".sln")))return "dotnet";let a=v.join(t,"src");if(await E__default.pathExists(a)&&(await j.promises.readdir(a,{withFileTypes:true})).some(p=>p.isFile()&&p.name.toLowerCase().endsWith(".csproj")))return "dotnet";let l=v.join(t,"package.json");if(await E__default.pathExists(l))return "node";let c=v.join(t,"pyproject.toml"),u=v.join(t,"requirements.txt"),m=v.join(t,"poetry.lock");return await E__default.pathExists(c)||await E__default.pathExists(u)||await E__default.pathExists(m)?"python":null}async function Fl(t){for(let e of dn())if(await B(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function fa(t){for(let e of dn())if(await B(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function Ll(t){let e=l$4(v.join(t,".venv"));if(!await E__default.pathExists(e)){let i=await fa(t);if(i!==0)return i}if(!await ma("poetry",t))return 0;let r=await B("poetry",["config","virtualenvs.in-project","true","--local"],t);if(r!==0)return r;let n=await B("poetry",["env","use",e],t);return n!==0?n:0}async function Jl(t){let e=l$4(v.join(t,".venv"));if(!await E__default.pathExists(e)){let n=await fa(t);if(n!==0)return n}await B(e,["-m","pip","install","--upgrade","pip","setuptools","wheel"],t);let o=v.join(t,"requirements.txt");if(await E__default.pathExists(o)&&await B(e,["-m","pip","install","-r","requirements.txt"],t)===0)return 0;let r=v.join(t,"pyproject.toml");return await E__default.pathExists(r)&&(await B(e,["-m","pip","install","-e","."],t)===0||await B(e,["-m","pip","install","."],t)===0)?0:1}async function Xr(t,e){return await Ll(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(v.join(t,".venv"))?0:(console.log(s.yellow("\u26A0\uFE0F Python init fallback: installing dependencies directly into project .venv")),await Jl(t))}async function Zr(t){let e=await gt("init",t);if(e===0)return 0;let o=["npm","pnpm","yarn"];for(let r of o){if(!await ma(r,t))continue;if(await B(r,["install"],t)===0)return console.log(s.green(`\u2705 Node init fallback succeeded with ${r} install`)),0}return e}function Kl(t,e){let o=n=>/^\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?$/.test(n),r=Ee([...e],"--port");if(r&&!/^\d+$/.test(r.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"),a=Ee([...e],"--springdoc-version"),l=Ee([...e],"--group-id"),c=Ee([...e],"--package-name");if(n&&!/^\d+$/.test(n.trim()))return "Invalid --java-version. Expected major version number, e.g. 21";if(i&&!o(i.trim()))return "Invalid --spring-boot-version. Expected semantic version, e.g. 3.5.0";if(a&&!o(a.trim()))return "Invalid --springdoc-version. Expected semantic version, e.g. 2.8.9";if(l&&!/^[A-Za-z0-9_.-]+$/.test(l.trim()))return "Invalid --group-id. Use dot-separated Java package identifiers only.";if(c&&!/^[A-Za-z0-9_.-]+$/.test(c.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 rn(t){if(t[0]!=="create"||t[1]!=="project")return 1;let e=t[2],o=a$5(e),r=t[3];if(!o||o.owner!=="npm")return 1;if(!r)return process.stderr.write(`Usage: ${o.createUsage??"rapidkit create project <kit> <name> [--output <dir>]"}
|
|
154
|
+
`),1;try{h(r);}catch(u){let m=u instanceof Error?u.message:String(u);return process.stderr.write(`${m}
|
|
155
|
+
`),1}let n=Kl(o.id,t);if(n)return process.stderr.write(`${n}
|
|
156
|
+
`),1;let i=Ee(t,"--output")||process.cwd(),a=v.resolve(i,r),l=t.includes("--skip-git")||t.includes("--no-git"),c=t.includes("--skip-install");try{let{default:u}=await import('fs-extra');if(await u.ensureDir(v.dirname(a)),await u.pathExists(a))return process.stderr.write(`\u274C Directory "${a}" already exists
|
|
157
|
+
`),1;await u.ensureDir(a),await e$2(o,{projectName:r,projectPath:a,args:t,skipGit:l,skipInstall:c});let m=Z(process.cwd());if(m){let{syncWorkspaceProjects:d}=await import('./workspace-MPKEUHFP.js');await d(m,true);}return 0}catch(u){return process.stderr.write(`RapidKit ${o.id} generator failed: ${u?.message??u}
|
|
158
|
+
`),1}}async function Yi(t){let e=k$2(t[2]);if(!e)return 1;try{let o=await o$1({args:t});if(!o.dryRun){let r=Z(process.cwd()),n=false;r||(r=(await pn()).workspacePath,n=true);let{registerProjectInWorkspace:i,registerWorkspace:a,syncWorkspaceProjects:l}=await import('./workspace-MPKEUHFP.js'),c=i$5({workspacePath:r,result:o});await a(r,v.basename(r)),await b$9(r,[c]),await i(r,o.projectName,o.projectPath),await l(r,true),await qe(r,{silent:true}),n&&(console.log(s.gray(`\u2139\uFE0F Project created outside a RapidKit workspace \u2014 linked to managed workspace "${f$5}" (${c.relationship}).`)),console.log(s.gray(` Registry: ${v.join(p$1(),"workspaces.json")}`)),console.log(s.gray(" Tip: run from inside a workspace next time, or create one with `rapidkit create workspace`.")));}return 0}catch(o){return process.stderr.write(`RapidKit ${e.kitId} generator failed: ${o?.message??o}
|
|
159
159
|
`),t[3]||process.stderr.write(`Usage: ${n$2(e.id)}
|
|
160
|
-
`),1}}async function
|
|
160
|
+
`),1}}async function zo(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\`.
|
|
161
161
|
Reason: ${e}.
|
|
162
162
|
Install Python 3.10+ to use the interactive wizard and full kit catalog.
|
|
163
163
|
`),1;let n=t[2],i=t[3];if(!n||!i)return process.stderr.write(`Usage: rapidkit create project <kit> <name> [--output <dir>]
|
|
164
164
|
Tip: offline fallback supports only fastapi* and nestjs* kits.
|
|
165
|
-
`),1;let a=
|
|
165
|
+
`),1;let a=Tl(n);if(!a)return process.stderr.write(`RapidKit (npm) could not run the Python core engine to create this kit.
|
|
166
166
|
Reason: ${e}.
|
|
167
167
|
Requested kit: ${n}
|
|
168
168
|
Offline fallback only supports: fastapi.standard, nestjs.standard (and their shorthands).
|
|
169
169
|
Install Python 3.10+ to access all kits.
|
|
170
|
-
`),1;let l=
|
|
171
|
-
`),1;let
|
|
172
|
-
`),1}}function
|
|
170
|
+
`),1;let l=Ee(t,"--output")||process.cwd(),c=v.resolve(l,i),u=t.includes("--skip-git")||t.includes("--no-git"),m=t.includes("--skip-install");try{if(await E__default.ensureDir(v.dirname(c)),await E__default.pathExists(c))return process.stderr.write(`\u274C Directory "${c}" already exists
|
|
171
|
+
`),1;let d="pip",p=Z(process.cwd());if(p)try{let{readWorkspaceMarker:g}=await import('./workspace-marker-5GAJSOFP.js'),y=await g(p);y?.metadata?.npm?.installMethod&&(d=y.metadata.npm.installMethod,f.debug(`Detected workspace engine: ${d}`));}catch(g){f.debug("Failed to read workspace marker",g);}else f.debug("No workspace found, using default engine: pip");await E__default.ensureDir(c);let{generateDemoKit:f$1}=await import('./demo-kit-4NCHGEA6.js');if(await f$1(c,{project_name:i,template:a,kit_name:n,skipGit:u,skipInstall:m,engine:d}),p){let{syncWorkspaceProjects:g}=await import('./workspace-MPKEUHFP.js');await g(p,true),await qe(p,{silent:true});}return 0}catch(d){return process.stderr.write(`RapidKit (npm) offline fallback failed: ${d?.message??d}
|
|
172
|
+
`),1}}function Gl(t){let e=t.requested||"requested stack";if(process.stderr.write(`${s.yellow("RapidKit native create is not available for this request yet.")}
|
|
173
173
|
`),process.stderr.write(s.gray(`Requested: ${e}
|
|
174
174
|
`)),process.stderr.write(s.gray(`Lane: ${t.lane} (${t.status})
|
|
175
175
|
`)),process.stderr.write(s.gray(`Reason: ${t.reason}
|
|
176
176
|
`)),t.officialCommands?.length){process.stderr.write(s.gray(`External generator candidates:
|
|
177
177
|
`));for(let o of t.officialCommands)process.stderr.write(s.gray(` - ${o}
|
|
178
|
-
`));}process.stderr.write(s.gray("Use an external generator if needed, then run `npx rapidkit adopt <project-path>` to add Workspace Intelligence.\n"));}async function
|
|
178
|
+
`));}process.stderr.write(s.gray("Use an external generator if needed, then run `npx rapidkit adopt <project-path>` to add Workspace Intelligence.\n"));}async function ga(t){let e$1=t[0]==="create"&&t[1]==="frontend",o=m$2(t);if(o&&(t=o),e$1&&!l$2(t[2]))return process.stderr.write(`Unknown frontend generator: ${t[2]?.replace(/^frontend\./,"")}
|
|
179
179
|
`),process.stderr.write(`Usage: ${n$2()}
|
|
180
|
-
`),1;if(process.env.RAPIDKIT_FORCE_OFFLINE_CREATE_FALLBACK==="1"&&t[0]==="create")return
|
|
181
|
-
`),1;try{h(
|
|
182
|
-
`),1;throw
|
|
183
|
-
`),
|
|
184
|
-
`),1;let
|
|
185
|
-
`),1}try{if(t[0]==="create"&&t[1]==="project"){if(t.includes("--help")||t.includes("-h"))try{return await d$
|
|
186
|
-
`),1}if(!t[2]||t[2].startsWith("-")){process.stdin.isTTY&&a$1("create project");let{kitChoice:
|
|
187
|
-
`),f.debug(`Synced Python version ${
|
|
188
|
-
`),1)}}if(t[0]==="create"&&t[1]!=="project")try{await d$
|
|
189
|
-
`),1)}return await d$
|
|
190
|
-
`),1)}}var
|
|
180
|
+
`),1;if(process.env.RAPIDKIT_FORCE_OFFLINE_CREATE_FALLBACK==="1"&&t[0]==="create")return zo(t,"PYTHON_NOT_FOUND");let r=new Set(["--yes","-y","--skip-git","--skip-install","--debug","--dry-run","--no-update-check","--create-workspace","--no-workspace","--here","--output"]);if(t[0]==="create"&&(!t[1]||t[1].startsWith("-"))){let n=t.includes("--yes")||t.includes("-y"),i=t.slice(1),a;!process.stdin.isTTY||n?(a="workspace",process.stdin.isTTY&&console.log(s.gray("\u2139\uFE0F No subcommand provided for `create`; defaulting to `create workspace`."))):(process.stdin.isTTY&&a$1("create"),a=(await b$3([{type:"rawlist",name:"createTarget",message:"What do you want to create?",choices:[{name:"workspace",value:"workspace"},{name:"project",value:"project"}]}])).createTarget);let l=["create",a,...i];return await ga(l)}if(t[0]==="create"&&t[1]==="workspace")try{let n$1=t.includes("--yes")||t.includes("-y"),i=t.includes("--skip-git")||t.includes("--no-git"),a=t.includes("--skip-python-engine")||t.includes("--no-python-engine"),l$1=t.includes("--dry-run"),c=t[2]&&!t[2].startsWith("-")?t[2]:void 0,u=Ee(t,"--install-method"),m$1=u==="poetry"||u==="venv"||u==="pipx"?u:void 0,d=Ee(t,"--profile"),p=d==="minimal"||d==="java-only"||d==="go-only"||d==="dotnet-only"||d==="python-only"||d==="node-only"||d==="polyglot"||d==="enterprise"?d:void 0,f=c;if(f||(n$1?f="my-workspace":(process.stdin.isTTY&&a$1("create workspace"),f=(await b$3([{type:"input",name:"workspaceName",message:"Workspace name:",default:"my-workspace"}])).workspaceName)),!f||!f.trim())return process.stderr.write(`Workspace name is required.
|
|
181
|
+
`),1;try{h(f);}catch(S){if(S instanceof a$2)return process.stderr.write(`${S.message}
|
|
182
|
+
`),1;throw S}let g=await n(t,{hasYes:n$1}),y=l(f.trim(),{argv:t,outputParent:g});l$1||await E__default.ensureDir(v.dirname(y));let w=h$1(f.trim());if(!l$1&&(m(w,y,{outputParent:g})&&w&&await E__default.pathExists(w)||await E__default.pathExists(y)))return process.stderr.write(`\u274C Workspace "${f}" already exists
|
|
183
|
+
`),w&&w!==y&&process.stderr.write(` Found at: ${w}
|
|
184
|
+
`),1;let P=await b$2(),k$1=P.author||process.env.USER||"RapidKit User";if(!n$1){let S=await b$3([{type:"input",name:"author",message:"Author name:",default:k$1}]);S.author?.trim()&&(k$1=S.author.trim());}let{createProject:h$2}=await import('./create-TPFUONHK.js');return await h$2(f,{skipGit:i,skipPythonEngine:a,yes:n$1,dryRun:l$1,userConfig:{...P,author:k$1},installMethod:m$1,profile:p,parentDirectory:v.dirname(y)}),l$1||(console.log(s.gray(`\u2139\uFE0F Workspace root: ${y}`)),console.log(s.gray(` Next: ${k(y)} && npx rapidkit create project`))),0}catch(n){return process.stderr.write(`RapidKit (npm) failed to create workspace: ${n?.message??n}
|
|
185
|
+
`),1}try{if(t[0]==="create"&&t[1]==="project"){if(t.includes("--help")||t.includes("-h"))try{return await d$5(),await e(["create","project","--help"],{cwd:process.cwd()})}catch(k){return process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${k?.message??k}
|
|
186
|
+
`),1}if(!t[2]||t[2].startsWith("-")){process.stdin.isTTY&&a$1("create project");let{kitChoice:k}=await b$3([{type:"rawlist",name:"kitChoice",message:"Select a kit to scaffold:",choices:a$7()}]);if(d$1(k)||l$2(k)){let b=Vr(k),{projectName:A}=await b$3([{type:"input",name:"projectName",message:"Project name:",default:b,validate:J=>J.trim().length>0||"Project name is required"}]),N=t.slice(2).filter(J=>J.startsWith("-")),H=["create","project",k,A.trim(),...N];if(!await qi(k))return 1;let Y=l$2(k)?await Yi(H):await rn(H),U=Z(process.cwd());return Y===0&&U&&await qe(U),Y}let h=Vr(k),{projectName:S}=await b$3([{type:"input",name:"projectName",message:"Project name:",default:h,validate:b=>b.trim().length>0||"Project name is required"}]);t.splice(2,0,k,S.trim());}let i=t[2],a=f$3({kitId:i,framework:i,runtime:i});if(g$2(a))return Gl(a),1;if(!await qi(t[2]||""))return 1;if(d$1(t[2])){let k=await rn(t),h=Z(process.cwd());return k===0&&h&&await qe(h),k}if(l$2(t[2]))return await Yi(t);let l=t.includes("--create-workspace"),c=t.includes("--no-workspace"),u=t.includes("--yes")||t.includes("-y"),m=t.includes("--skip-git")||t.includes("--no-git");if(!!!an(process.cwd())){let{registerWorkspaceAtPath:k}=await import('./create-TPFUONHK.js');if(l)await k(process.cwd(),{skipGit:m,yes:u,userConfig:await b$2()});else if(!c)if(u)await k(process.cwd(),{skipGit:m,yes:true,userConfig:await b$2()});else {let{createWs:h}=await b$3([{type:"confirm",name:"createWs",message:"This project will be created outside a RapidKit workspace. Create and register a workspace here?",default:true}]);h&&await k(process.cwd(),{skipGit:m,yes:false,userConfig:await b$2()});}}let f$1=[...t.filter(k=>{let h=k.split("=")[0];return !r.has(k)&&!r.has(h)})],g=Z(process.cwd()),P=t.includes("--skip-install")||!!g?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0;try{await d$5();let k=await e(f$1,{cwd:process.cwd(),env:P});if(k===0&&g&&!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"))),k===0){let h=g||Z(process.cwd());if(h){try{let b=t[3];if(b){let A=t.indexOf("--output"),N=A>=0?t[A+1]:".",H=v.resolve(process.cwd(),N,b),Y=v.join(h,".python-version"),U=v.join(H,".python-version");if(j.existsSync(Y)&&j.existsSync(H)){let J=j.readFileSync(Y,"utf-8");j.writeFileSync(U,J.trim()+`
|
|
187
|
+
`),f.debug(`Synced Python version ${J.trim()} from workspace to ${b}`);}}}catch(b){f.debug("Could not sync Python version from workspace:",b);}let{syncWorkspaceProjects:S}=await import('./workspace-MPKEUHFP.js');await S(h,true),await qe(h);}}return k}catch(k){let h=Qr(k);return h?await zo(f$1,h):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${k?.message??k}
|
|
188
|
+
`),1)}}if(t[0]==="create"&&t[1]!=="project")try{await d$5();let n=await e(t,{cwd:process.cwd()});if(n===0){let i=Z(process.cwd());if(i){let{syncWorkspaceProjects:a}=await import('./workspace-MPKEUHFP.js');await a(i,true);}}return n}catch(n){let i=Qr(n);return i?await zo(t,i):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${n?.message??n}
|
|
189
|
+
`),1)}return await d$5(),await e(t,{cwd:process.cwd()})}catch(n){let i=Qr(n);return i?await zo(t,i):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${n?.message??n}
|
|
190
|
+
`),1)}}var Qi=["init","dev","start","build","test","docs","lint","format","create","help","--help","-h"],ya=["analyze","readiness","doctor","autopilot","pipeline","import","adopt","snapshot","workspace","bootstrap","setup","cache","mirror","ai","config","product","infra","shell","commands"],Ul=["analyze","readiness","doctor","autopilot","pipeline","import","adopt","snapshot","workspace","ai","config","product","infra","shell","commands"],Vl=["bootstrap","setup","cache","mirror"],Bl=[["project","commands"],["project","archives"],["project","archive"],["project","restore"],["project","delete"]],Hl=["init"],ql=k$1,Xi=[...ql,...l$1];function zl(t){return !!t&&ya.includes(t)}function ha(t){let e=t[0],o=t[1];return Bl.some(([r,n])=>e!==r?false:o?o===n:true)}function eo(t){return zl(t[0])||ha(t)}function Yl(t){return !!t&&Ul.includes(t)}function Zi(t){return Yl(t[0])||ha(t)}function ea(t){return !!t&&Vl.includes(t)}function Ql(t=process.env){let e=t.npm_config_user_agent||"",o=t.npm_execpath||"",r=t.npm_command||"";return e.startsWith("npm/")||e.includes(" npx/")||/(?:^|[/\\])npx(?:\.cmd)?$/i.test(o)||/(?:^|[/\\])npm(?:\.cmd)?$/i.test(o)||r==="exec"||r==="x"||r==="run-script"}function wa(t={}){let e=q(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"}`));}var ka="rapidkit-command-capabilities-v1",Xl="rapidkit-version-v1";function Zl(){return {schemaVersion:Xl,cli:"rapidkit-npm",version:b(),node:process.version,platform:process.platform,capabilitiesSchemaVersion:ka,contracts:Uo()}}function ed(){let t=[...ya,"project"],e=["version","create","add","list","info","upgrade","diff","merge","optimize","license","checkpoint","reconcile","rollback","uninstall","frameworks","modules"],o=["init","dev","start","build","test","lint","format","help"],r=[...Ko],n=[...Go];return {schemaVersion:ka,scope:"global",cli:"rapidkit-npm",version:b(),cwd:process.cwd(),contracts:Uo(),commands:{npmOwned:t,coreBacked:e,projectScoped:o},workspace:{command:"workspace",subcommands:r,intelligenceSubcommands:n},commandMap:Object.fromEntries([...t.map(i=>[i,{command:i,owner:"npm-wrapper",status:"supported",scope:i==="project"?"project-introspection":"workspace"}]),...e.map(i=>[i,{command:i,owner:"python-core",status:"delegated",scope:"core"}]),...o.map(i=>[i,{command:i,owner:"runtime-adapter",status:i==="help"?"supported":"runtime-dependent",scope:"project"}])])}}function td(t={}){let e=ed();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(s.magenta(`Workspace intelligence: ${e.workspace.intelligenceSubcommands.join(", ")}`)),console.log(""),console.log(s.gray("Tip: run `rapidkit project commands --json` inside a project."));}function nn(t){return s$1(t)?(wa({json:t.includes("--json")||t.includes("--ci")}),true):false}function sn(t$1){let e=q(process.cwd());if(!e.projectRoot)return false;let o=r(t$1,process.cwd());if(!o||o.status!=="unsupported")return false;console.error(s.red(t(o,e))),process.exit(1);}function We(t){return j.existsSync(v.join(t,".rapidkit-workspace"))||j.existsSync(v.join(t,".rapidkit","workspace.json"))}function va(t){let e=t;for(;;){let o=v.join(e,".rapidkit","context.json");if(j.existsSync(o))return o;let r=v.dirname(e);if(r===e)break;e=r;}return null}function an(t){let e=t,o=v.resolve(tmpdir());for(;;){let r=v.join(e,".rapidkit-workspace");if(j.existsSync(r)&&v.resolve(e)!==o)return r;let n=v.dirname(e);if(n===e)break;e=n;}return null}function Z(t){let e=t,o=v.resolve(tmpdir());for(;;){let r=v.join(e,".rapidkit-workspace");if(j.existsSync(r)&&v.resolve(e)!==o)return e;let n=v.dirname(e);if(n===e)break;e=n;}return null}async function qe(t,e){try{let{syncWorkspaceContract:o}=await import('./workspace-contract-OO4GMENV.js'),r=await o({workspacePath:t});if(!e?.silent&&(r.addedProjects.length>0||r.updatedProjects.length>0)&&console.log(s.gray(`\u2139\uFE0F Workspace contract synced (${r.contract.projects.length} project(s)).`)),!e?.silent&&r.verification.status!=="passed"){console.log(s.yellow("\u26A0\uFE0F Workspace contract verification failed after project sync."));for(let n of r.verification.violations)console.log(s.gray(` Violation: ${n}`));console.log(s.white(" Next: npx rapidkit workspace contract inspect"));}}catch(o){e?.silent||console.log(s.yellow(`\u26A0\uFE0F Workspace contract sync skipped: ${o.message}`));}}async function od(t,e=process.cwd(),o$1=process.platform){if(!(!!t.workspaceFlag||t.scope==="workspace")||!b$1(o$1))return {detected:false};let n=o(e,o$1);for(let i of n){if(!await E__default.pathExists(i))continue;let a=i.toLowerCase();if(a.endsWith("rapidkit.cmd")||a.endsWith("rapidkit.exe"))return {detected:true,candidatePath:i,reason:"Found workspace-local rapidkit launcher on Windows."}}return {detected:false}}function rd(t){let e=t;for(;;){let o=v.join(e,".rapidkit-workspace"),r=v.join(e,".rapidkit","workspace.json");if(!j.existsSync(o)&&j.existsSync(r))return e;let n=v.dirname(e);if(n===e)break;e=n;}return null}var Pa={enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true};function nd(t){return t&&t.match(/^[\t ]*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]==="strict"?"strict":"warn"}function Zt(t,e){let o=t.match(new RegExp(`^[\\t ]*${e}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return o?o[1]==="true":Pa[e]}function ta(t){let e=t??"";return {mode:nd(e),dependency_sharing_mode:ba(e),rules:{enforce_workspace_marker:Zt(e,"enforce_workspace_marker"),enforce_toolchain_lock:Zt(e,"enforce_toolchain_lock"),disallow_untrusted_tool_sources:Zt(e,"disallow_untrusted_tool_sources"),enforce_compatibility_matrix:Zt(e,"enforce_compatibility_matrix"),require_mirror_lock_for_offline:Zt(e,"require_mirror_lock_for_offline")}}}function oa(t,e,o){let r=`${e}: ${o}`,n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`^[\\t ]*${n}:\\s*.*$`,"m");if(i.test(t))return t.replace(i,r);let a=/^[\t ]*rules:\s*(?:#.*)?$/m;return a.test(t)?t.replace(a,`${r}
|
|
191
191
|
rules:`):`${t.endsWith(`
|
|
192
192
|
`)?t:`${t}
|
|
193
193
|
`}${r}
|
|
194
|
-
`}function
|
|
194
|
+
`}function sd(t,e,o){let r=` ${e}: ${o?"true":"false"}`,n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`^[\\t ]+${n}:\\s*.*$`,"m");if(i.test(t))return t.replace(i,r);let a=/^[\t ]*rules:\s*(?:#.*)?$/m;return a.test(t)?t.replace(a,`rules:
|
|
195
195
|
${r}`):`${t.endsWith(`
|
|
196
196
|
`)?t:`${t}
|
|
197
197
|
`}rules:
|
|
198
198
|
${r}
|
|
199
|
-
`}function
|
|
200
|
-
`)}async function
|
|
199
|
+
`}function id(){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(`
|
|
200
|
+
`)}async function ra(t){let e=v.join(t,".rapidkit","policies.yml");return await E__default.pathExists(e)?j.promises.readFile(e,"utf-8"):id()}async function ad(t,e){let o=v.join(t,".rapidkit"),r=v.join(o,"policies.yml");await E__default.ensureDir(o);let n=e.endsWith(`
|
|
201
201
|
`)?e:`${e}
|
|
202
|
-
`;await j.promises.writeFile(r,n,"utf-8");}function
|
|
203
|
-
`);try{return
|
|
204
|
-
`),1}}let
|
|
205
|
-
`):""}catch{return ""}},
|
|
206
|
-
`),b=spawn(c,
|
|
207
|
-
`),
|
|
208
|
-
`),process.env.RAPIDKIT_SUPPRESS_RUN_COMMAND_OUTPUT!=="1"&&(
|
|
209
|
-
`)),
|
|
210
|
-
`,"utf-8");}async function Ll(t,e,o){let r=process.env.RAPIDKIT_TEST_IMPORT_SYNC_FAIL==="1"&&(process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"),n=e.workspace?w.resolve(e.workspace):null,i=n??oe(process.cwd()),a=false,l=false;if(n){if(!Ke(n)){let p=`Workspace path is not a valid RapidKit workspace: ${n}`;return e.json?console.log(JSON.stringify({error:p},null,2)):console.log(s.red(`\u274C ${p}`)),1}}else if(!i||!Ke(i)){let p=await en();i=p.workspacePath,a=true,l=p.created;}if(!i||!Ke(i)){let p="Not inside a RapidKit workspace";return e.json?console.log(JSON.stringify({error:p},null,2)):(console.log(s.red(`\u274C ${p}`)),console.log(s.gray("\u{1F4A1} Run this command from a workspace root or pass --workspace <path>."))),1}let c=`cd ${i}`,f=o?.syncWorkspaceProjects??(async p=>{if(r)throw new Error("forced sync failure for command-level import rollback test");let{syncWorkspaceProjects:d}=await import('./workspace-5DKOA7TN.js');await d(p,true),await ze(p,{silent:true});}),g=o?.rollbackImportedProjectImport??Ci;try{let p=await Ri({workspacePath:i,source:t,name:e.name,sourceType:e.git===true?"git-url":void 0,enableModules:e.enableModules});try{await f(i);}catch(d){await g(i,p.path);try{await f(i);}catch{}throw new Error(`Workspace sync failed after import and the imported project was rolled back: ${d instanceof Error?d.message:String(d)}`)}return e.json?(console.log(JSON.stringify({workspacePath:i,workspaceResolution:a?"default-auto":n?"explicit":"nearest",defaultWorkspaceCreated:a?l:false,suggestedCdCommand:c,importedProject:p},null,2)),0):(a&&console.log(s.yellow(`\u2139 Imported outside a workspace, so RapidKit used the default workspace: ${i}`)),console.log(s.green(`\u2714 Imported project: ${p.name}`)),console.log(s.gray(` Workspace: ${i}`)),console.log(s.gray(` Destination: ${p.path}`)),console.log(s.gray(` Stack: ${p.stack} (${p.confidence})`)),console.log(s.gray(` Source: ${e.git===true||Fr(t)?"git-url":"local-folder"}`)),console.log(s.gray(` Next shell step: ${c}`)),0)}catch(p){let d=p instanceof Error?p.message:String(p);return e.json?console.log(JSON.stringify({error:d},null,2)):console.log(s.red(`\u274C Import failed: ${d}`)),1}}async function Kl(t,e,o){let r=w.resolve(t||process.cwd()),n=e.workspace?w.resolve(e.workspace):null,i=n??oe(process.cwd()),a=false,l=false;if(n){if(!Ke(n)){let u=`Workspace path is not a valid RapidKit workspace: ${n}`;return e.json?console.log(JSON.stringify({error:u},null,2)):console.log(s.red(`\u274C ${u}`)),1}}else if(!i||!Ke(i)){let u=await en();i=u.workspacePath,a=true,l=u.created;}if(!i||!Ke(i)){let u="Not inside a RapidKit workspace";return e.json?console.log(JSON.stringify({error:u},null,2)):(console.log(s.red(`\u274C ${u}`)),console.log(s.gray("\u{1F4A1} Run this command from a workspace root or pass --workspace <path>."))),1}let c=process.env.RAPIDKIT_TEST_ADOPT_SYNC_FAIL==="1"&&(process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"),f=o?.syncWorkspaceProjects??(async u=>{if(c)throw new Error("forced sync failure for command-level adopt rollback test");let{syncWorkspaceProjects:m}=await import('./workspace-5DKOA7TN.js');await m(u,true),await ze(u,{silent:true});}),g=o?.registerProjectInWorkspace??(async(u,m,h)=>{let{registerProjectInWorkspace:k}=await import('./workspace-5DKOA7TN.js');await k(u,m,h);}),p=o?.registerWorkspace??(async(u,m)=>{let{registerWorkspace:h}=await import('./workspace-5DKOA7TN.js');await h(u,m);}),d=o?.rollbackAdoptedProjectImport??Ei;try{let u=w.join(r,".rapidkit","project.json"),m=await E__default.pathExists(u)?await E__default.readJson(u):null,h=await _i({workspacePath:i,source:r,name:e.name,dryRun:e.dryRun===true,enableModules:e.enableModules});if(e.dryRun!==true)try{await p(i,w.basename(i)),await g(i,h.name,h.path),await f(i);}catch(k){throw await d(i,h.path,m),new Error(`Workspace sync failed after adopt and adoption metadata was rolled back: ${k instanceof Error?k.message:String(k)}`)}return e.json?(console.log(JSON.stringify({workspacePath:i,workspaceResolution:a?"default-auto":n?"explicit":"nearest",defaultWorkspaceCreated:a?l:false,dryRun:e.dryRun===true,adoptedProject:h},null,2)),0):(a&&console.log(s.yellow(`\u2139 Adopted outside a workspace, so RapidKit used the default workspace: ${i}`)),e.dryRun===true&&console.log(s.yellow("\u2139 Dry run: no adoption files were written.")),console.log(s.green(`\u2714 Adopted project: ${h.name}`)),console.log(s.gray(` Workspace: ${i}`)),console.log(s.gray(` Project: ${h.path}`)),console.log(s.gray(" Mode: linked (source was not moved or copied)")),console.log(s.gray(` Stack: ${h.stack} (${h.confidence})`)),console.log(s.gray(` Report: ${h.adoptReadinessPath}`)),console.log(s.gray(" Next: npx rapidkit workspace model --json")),0)}catch(u){let m=u instanceof Error?u.message:String(u);return e.json?console.log(JSON.stringify({error:m},null,2)):console.log(s.red(`\u274C Adopt failed: ${m}`)),1}}async function Yr(t){let e=new Set(["python-only","polyglot","enterprise"]),o=Gl(),r="minimal";try{let a=w.join(t,".rapidkit","workspace.json");r=JSON.parse(await j.promises.readFile(a,"utf-8")).profile??"minimal";}catch{r="minimal";}if(!await(async()=>{if(e.has(r))return true;let a=await Zr(t);if(a.length===0)return false;for(let l of a){let c=a$4(l),f=c?.module_support;if(!(b$6(c,l)||d$3(c,l)||e$1(c,l))&&f!==false)return f$2(c,l)||c$2(c,l),true}return false})())return 0;let i="poetry";try{let{readWorkspaceMarker:a}=await import('./workspace-marker-HAC7BMEG.js'),c=(await a(t))?.metadata?.npm?.installMethod;(c==="poetry"||c==="venv"||c==="pipx"||c==="pip")&&(i=c);}catch{}if(i==="poetry"||i==="venv"){let a=w.join(t,"pyproject.toml"),l=false;try{l=(await j.promises.readFile(a,"utf-8")).includes("rapidkit-core");}catch{l=false;}let c=process.env.RAPIDKIT_DEV_PATH,f=c?await E__default.pathExists(c):false;if(l){let g=fl(t);if(!await E__default.pathExists(g)){let u=await gl(t);if(u!==0)return u}let d=await z(g,f&&c?["-m","pip","install",c,"--quiet","--disable-pip-version-check"]:["-m","pip","install","rapidkit-core","--quiet","--disable-pip-version-check"],t,{timeoutMs:o});if(d!==0)return d}else {let g=await z("poetry",["install","--no-root"],t,{timeoutMs:o});if(g!==0)return g;let p=await z("poetry",["add","rapidkit-core"],t,{timeoutMs:o});if(p!==0)return p}try{let{writeWorkspaceLauncher:g}=await import('./create-P3USIH52.js');await g(t,i==="venv"?"venv":"poetry");}catch{}return 0}return 0}function Gl(){let t=process.env.RAPIDKIT_WORKSPACE_DEPS_TIMEOUT_MS;if(t){let e=Number.parseInt(t,10);if(Number.isFinite(e)&&e>0)return e}return 12e4}async function Zr(t){let e=[],o=new Set,r=[t];for(;r.length>0;){let n=r.pop();if(!n||o.has(n))continue;o.add(n);let i=[];try{i=await j.promises.readdir(n,{withFileTypes:true});}catch{continue}for(let a of i){if(!a.isDirectory()||a.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(a.name))continue;let l=w.join(n,a.name),c=w.join(l,".rapidkit","context.json"),f=w.join(l,".rapidkit","project.json");if(await E__default.pathExists(c)||await E__default.pathExists(f)){e.push(l);continue}r.push(l);}}return e}function Ul(t){return i$6(t)}async function en(){let t=j$2(),e=w.basename(t),o=Ke(t);await E__default.ensureDir(w.join(t,".rapidkit")),await b$8(t,d$5(e,b()));let r=w.join(t,".rapidkit","workspace.json");return await E__default.pathExists(r)||await He(r,{name:e,workspace_name:e,profile:"minimal",createdAt:new Date().toISOString(),createdBy:"rapidkit-npm-import-fallback"}),{workspacePath:t,created:!o}}async function Gr(t){let o=await Fe("go",{runCommandInCwd:z,runCoreRapidkit:e}).initProject(t);return te(o)}function te(t){return t.message&&console.log(s.red(`\u274C ${t.message}`)),t.exitCode}async function mt(t,e$1){let o=Fe("node",{runCommandInCwd:z,runCoreRapidkit:e});if(t==="init"){let n=await o.initProject(e$1);return te(n)}if(t==="dev"){let n=await o.runDev(e$1);return te(n)}if(t==="test"){let n=await o.runTest(e$1);return te(n)}if(t==="build"){let n=await o.runBuild(e$1);return te(n)}if(t==="lint"){let n=await o.runLint?.(e$1);return te(n??{exitCode:1,message:"Lint is not supported."})}if(t==="format"){let n=await o.runFormat?.(e$1);return te(n??{exitCode:1,message:"Format is not supported."})}let r=await o.runStart(e$1);return te(r)}async function qe(t,e$1){let o=Fe("java",{runCommandInCwd:z,runCoreRapidkit:e});if(t==="init"){let n=await o.initProject(e$1);return te(n)}if(t==="dev"){let n=await o.runDev(e$1);return te(n)}if(t==="test"){let n=await o.runTest(e$1);return te(n)}if(t==="build"){let n=await o.runBuild(e$1);return te(n)}if(t==="lint"){let n=await o.runLint?.(e$1);return te(n??{exitCode:1,message:"Lint is not supported."})}if(t==="format"){let n=await o.runFormat?.(e$1);return te(n??{exitCode:1,message:"Format is not supported."})}let r=await o.runStart(e$1);return te(r)}function Ur(t,e,o){let r=o.filter(n=>n.status==="failed").map(n=>{let i=n.id||"check";return n.message?`${i}: ${n.message}`:i}).slice(0,12);return f$4(t,{commandId:"bootstrap",exitCode:e,generatedAt:typeof t.timestamp=="string"?t.timestamp:new Date().toISOString(),blockers:r,runId:e$3()})}async function Ji(t,e=Qr){let o=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof o>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let i=function(x){if(!x)return null;let N=x.trim().toLowerCase();return N==="minimal"||N==="java-only"||N==="go-only"||N==="dotnet-only"||N==="python-only"||N==="node-only"||N==="polyglot"||N==="enterprise"?N:null},a=function(x){let Ge=x.match(/^\s*mode:\s*([a-zA-Z]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase()==="strict"?"strict":"warn",Ce=(le,Ie)=>{let Te=x.match(new RegExp(`^\\s*${le}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return Te?Te[1].toLowerCase()==="true":Ie};return {mode:Ge,dependency_sharing_mode:na(x),rules:{enforce_workspace_marker:Ce("enforce_workspace_marker",true),enforce_toolchain_lock:Ce("enforce_toolchain_lock",false),disallow_untrusted_tool_sources:Ce("disallow_untrusted_tool_sources",false),enforce_compatibility_matrix:Ce("enforce_compatibility_matrix",false),require_mirror_lock_for_offline:Ce("require_mirror_lock_for_offline",true)}}};let l=["init"],c,f=false,g=false,p=false,d=false;for(let x=1;x<t.length;x+=1){let N=t[x];if(N==="--ci"){f=true;continue}if(N==="--offline"){g=true;continue}if(N==="--json"){p=true;continue}if(N==="--compliance-only"){d=true;continue}if(N==="--profile"){let ee=t[x+1];if(!ee||ee.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] [--compliance-only]")),1;c=ee,x+=1;continue}if(N.startsWith("--profile=")){c=N.slice(10);continue}l.push(N);}let u=i(c);if(c&&!u)return console.log(s.red(`Invalid profile: ${c}. Use one of: minimal, java-only, go-only, dotnet-only, python-only, node-only, polyglot, enterprise.`)),1;let m=process.cwd(),h=l.slice(1).filter(x=>!x.startsWith("-"));if(h.length>0){let x=w.resolve(m,h[0]),N=a$4(x),ee=j.existsSync(x)?await ft(x):"unknown";if(!Ke(x)&&(b$6(N,x)||d$3(N,x)||e$1(N,x)||c$2(N,x)||f$2(N,x)||ee!=="unknown"))return await e(l)}let k=w.join(m,".rapidkit-workspace"),P=w.join(m,".rapidkit","workspace.json"),v;!j.existsSync(k)&&j.existsSync(P)?v=m:(v=oe(m),v||(v=Ol(m)));let y=[],S=null,b=null;if(v)try{let x=w.join(v,".rapidkit","workspace.json"),N=await j.promises.readFile(x,"utf-8"),ee=JSON.parse(N);b=i(ee.profile);}catch{b=null;}let A=["minimal","java-only","python-only","node-only","go-only","dotnet-only","polyglot","enterprise"],D={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"},K=u;if(!!v&&!u&&!f&&!p&&!!process.stdin.isTTY&&!!process.stdout.isTTY&&process.env.VITEST!=="true"&&process.env.VITEST!=="1"){let x=b||"minimal",{chosenProfile:N}=await b$3([{type:"rawlist",name:"chosenProfile",message:`Select workspace profile for bootstrap (current: ${x})`,choices:A.map(ee=>({name:ee===x?`${D[ee]} \u2190 current`:D[ee],value:ee})),default:A.indexOf(x)}]);K=N;}let $=K||b||"minimal";if(v)try{let N=$==="python-only"||$==="polyglot"||$==="enterprise"?"poetry":"venv",ee;try{let Ie=(await j.promises.readFile(w.join(v,".python-version"),"utf-8")).trim();Ie&&(ee=Ie);}catch{}let{syncWorkspaceFoundationFiles:Ge}=await import('./create-P3USIH52.js'),Ce=await Ge(v,{workspaceName:w.basename(v),installMethod:N,pythonVersion:ee,profile:$,writeMarker:true,writeGitignore:true,onlyIfMissing:true});y.push({id:"workspace.legacy.sync",status:Ce.length>0?"passed":"skipped",message:Ce.length>0?`Legacy workspace foundation synchronized: ${Ce.join(", ")}`:"Workspace foundation files are already up to date."});}catch(x){y.push({id:"workspace.legacy.sync",status:"failed",message:`Failed to synchronize legacy workspace foundation files: ${x.message}`});}if(v&&K&&K!==b)try{let x=w.join(v,".rapidkit","workspace.json"),N=await j.promises.readFile(x,"utf-8"),ee=JSON.parse(N);ee.profile=K,await j.promises.writeFile(x,JSON.stringify(ee,null,2)+`
|
|
211
|
-
`,"utf-8");}catch{}let
|
|
212
|
-
`):(console.log(s.red("\u274C Bootstrap blocked by strict policy checks.")),console.log(s.gray(`Compliance report: ${q}`))),1}if(
|
|
213
|
-
`),1}let
|
|
214
|
-
`);else {let x=
|
|
215
|
-
`):console.log(s.yellow("Usage: rapidkit setup <python|node|go|java|dotnet> [--warm-deps]")),1;let n=async(
|
|
216
|
-
`,"utf-8");}return process.stdout.write(`${JSON.stringify({command:"setup",runtime:e$1,result:
|
|
217
|
-
`),
|
|
218
|
-
${
|
|
219
|
-
${
|
|
220
|
-
${
|
|
202
|
+
`;await j.promises.writeFile(r,n,"utf-8");}function cd(t){let e=t.trim().toLowerCase();return e==="true"||e==="1"||e==="on"?true:e==="false"||e==="0"||e==="off"?false:null}function ba(t){if(!t)return "isolated";let o=t.match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();return o==="shared-runtime-caches"||o==="shared-node-deps"||o==="isolated"?o:"isolated"}function ja(t){if(!t)return {mode:"isolated",status:"skipped",message:"No policies.yml found; dependency_sharing_mode defaults to isolated."};let e=t.match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m);if(!e)return {mode:"isolated",status:"skipped",message:"dependency_sharing_mode is not set; defaulting to isolated."};let o=e[1].toLowerCase();return o==="isolated"||o==="shared-runtime-caches"||o==="shared-node-deps"?{mode:o,status:"passed",message:`dependency_sharing_mode is valid: ${o}.`}:{mode:"isolated",status:"failed",message:`Invalid dependency_sharing_mode: ${o}. Use one of: isolated, shared-runtime-caches, shared-node-deps.`}}async function Sa(t,e){let o=Z(t),r=o?v.join(o,".rapidkit","policies.yml"):null,n="isolated";if(r&&await E__default.pathExists(r))try{let l=await j.promises.readFile(r,"utf-8"),c=ja(l);if(c.status==="failed")return console.log(s.red(`\u274C ${c.message}`)),{ok:false,code:1};n=c.mode;}catch{return console.log(s.red("\u274C Failed to read workspace policy file (.rapidkit/policies.yml).")),{ok:false,code:1}}let i=process.env.RAPIDKIT_DEP_SHARING_MODE,a=process.env.RAPIDKIT_WORKSPACE_PATH;process.env.RAPIDKIT_DEP_SHARING_MODE=n,o&&(process.env.RAPIDKIT_WORKSPACE_PATH=o);try{return {ok:true,value:await e()}}finally{typeof i>"u"?delete process.env.RAPIDKIT_DEP_SHARING_MODE:process.env.RAPIDKIT_DEP_SHARING_MODE=i,typeof a>"u"?delete process.env.RAPIDKIT_WORKSPACE_PATH:process.env.RAPIDKIT_WORKSPACE_PATH=a;}}async function B(t,e,o,r={}){let{buildPackageRunnerSubprocessEnv:n,resolvePackageRunnerInvocation:i}=await import('./platform-capabilities-TSLK667K.js'),a=ld(t,e,o),l=a?{command:process.execPath,prefixArgs:["-e",a]}:i(t),c=l.command,u=a?l.prefixArgs:[...l.prefixArgs,...e],m=n();if(a){process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] runCommandInCwd.nodeEval=${JSON.stringify({cwd:o,scriptBytes:a.length})}
|
|
203
|
+
`);try{return Dl.runInThisContext(a,{filename:v.join(o,"package.json#script")}),0}catch(w){return process.stderr.write(`${w instanceof Error?w.stack||w.message:String(w)}
|
|
204
|
+
`),1}}let p=!(process.argv.includes("--json")||process.env.RAPIDKIT_WORKSPACE_RUN_CHILD==="1"||process.env.RAPIDKIT_SUPPRESS_RUN_COMMAND_OUTPUT==="1")&&t==="npm"&&(e[0]==="run"||e[0]==="run-script"||e[0]==="install"),f=()=>{let w=m.npm_config_cache;if(!w)return "";let P=v.join(w,"_logs");try{let h=j.readdirSync(P).filter(b=>b.endsWith(".log")).map(b=>{let A=v.join(P,b);return {filePath:A,mtimeMs:j.statSync(A).mtimeMs}}).sort((b,A)=>A.mtimeMs-b.mtimeMs)[0]?.filePath;return h?j.readFileSync(h,"utf-8").split(/\r?\n/).map(b=>b.trim()).filter(b=>/(?:^|\s)(?:npm\s+)?(?:error|verbose\s+(?:stack|cwd|os|node|npm|exit|code))\b/i.test(b)).slice(0,12).join(`
|
|
205
|
+
`):""}catch{return ""}},g=Number.parseInt(process.env.RAPIDKIT_CHILD_COMMAND_TIMEOUT_MS||"",10),y=r.timeoutMs&&r.timeoutMs>0?r.timeoutMs:Number.isFinite(g)&&g>0?g:void 0;return await new Promise(w=>{let P=[],k=[],h=false,S=null,b=null,A=()=>{try{b?.stdout?.destroy();}catch{}try{b?.stderr?.destroy();}catch{}try{b?.stdin?.destroy();}catch{}try{b?.removeAllListeners("close"),b?.removeAllListeners("error"),b?.unref();}catch{}};process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] runCommandInCwd=${JSON.stringify({executable:c,args:u,cwd:o,directNodeEvalScript:a!==null,npmEnv:Object.fromEntries(Object.entries(m).filter(([N])=>["npm_config_if_present","npm_config_ignore_scripts","npm_config_loglevel","npm_config_silent","npm_config_json","npm_lifecycle_event","npm_lifecycle_script"].includes(N)))})}
|
|
206
|
+
`),b=spawn(c,u,{stdio:p?"inherit":["ignore","pipe","pipe"],cwd:o,shell:c$4(),env:m,detached:!b$1()}),y&&y>0&&(S=setTimeout(()=>{if(!h){if(h=true,!b$1()&&b.pid)try{process.kill(-b.pid,"SIGTERM");}catch{b.kill("SIGTERM");}else b.kill("SIGTERM");A(),process.env.RAPIDKIT_SUPPRESS_RUN_COMMAND_OUTPUT!=="1"&&process.stderr.write(`RapidKit command timed out after ${y}ms: ${c} ${u.join(" ")}
|
|
207
|
+
`),w(124);}},y)),p||(b.stdout?.on("data",N=>{P.push(N);}),b.stderr?.on("data",N=>{k.push(N);})),b.on("close",N=>{if(h)return;h=true,S&&clearTimeout(S);let H=Buffer.concat(P),Y=Buffer.concat(k),U=N&&N!==0&&H.length===0&&Y.length===0&&t==="npm"?f():"";process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] runCommandInCwd.close=${JSON.stringify({code:N,stdoutBytes:H.length,stderrBytes:Y.length,npmFailureExcerptBytes:U.length})}
|
|
208
|
+
`),process.env.RAPIDKIT_SUPPRESS_RUN_COMMAND_OUTPUT!=="1"&&(H.length>0&&process.stdout.write(H),Y.length>0?process.stderr.write(Y):U&&process.stderr.write(`${U}
|
|
209
|
+
`)),w(N??1);}),b.on("error",()=>{h||(h=true,S&&clearTimeout(S),w(1));});})}function ld(t,e,o){if(t!=="npm")return null;let r=e[0];if(r!=="run"&&r!=="run-script")return null;let n=e.find((a,l)=>l>0&&!a.startsWith("-"));if(!n)return null;let i=v.join(o,"package.json");if(!j.existsSync(i))return null;try{let l=JSON.parse(j.readFileSync(i,"utf8")).scripts?.[n];return typeof l!="string"?null:dd(l)}catch{return null}}function dd(t){let e=t.trim(),o=e.match(/^node\s+(?:-e|--eval)\s+"((?:\\.|[^"\\])*)"$/);if(o)return o[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\");let r=e.match(/^node\s+(?:-e|--eval)\s+'((?:\\.|[^'\\])*)'$/);return r?r[1].replace(/\\'/g,"'").replace(/\\\\/g,"\\"):null}async function Be(t,e){await E__default.outputFile(t,`${JSON.stringify(e,null,2)}
|
|
210
|
+
`,"utf-8");}async function pd(t,e,o){let r=process.env.RAPIDKIT_TEST_IMPORT_SYNC_FAIL==="1"&&(process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"),n=e.workspace?v.resolve(e.workspace):null,i=n??Z(process.cwd()),a=false,l=false;if(n){if(!We(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||!We(i)){let d=await pn();i=d.workspacePath,a=true,l=d.created;}if(!i||!We(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 c=`cd ${i}`,u=o?.syncWorkspaceProjects??(async d=>{if(r)throw new Error("forced sync failure for command-level import rollback test");let{syncWorkspaceProjects:p}=await import('./workspace-MPKEUHFP.js');await p(d,true),await qe(d,{silent:true});}),m=o?.rollbackImportedProjectImport??Gi;try{let d=await Ui({workspacePath:i,source:t,name:e.name,sourceType:e.git===true?"git-url":void 0});try{await u(i);}catch(p){await m(i,d.path);try{await u(i);}catch{}throw new Error(`Workspace sync failed after import and the imported project was rolled back: ${p instanceof Error?p.message:String(p)}`)}if(e.json)return console.log(JSON.stringify({workspacePath:i,workspaceResolution:a?"default-auto":n?"explicit":"nearest",defaultWorkspaceCreated:a?l:false,suggestedCdCommand:c,importedProject:d},null,2)),0;if(a&&console.log(s.yellow(`\u2139 Imported outside a workspace, so RapidKit used the default workspace: ${i}`)),console.log(s.green(`\u2714 Imported project: ${d.name}`)),console.log(s.gray(` Workspace: ${i}`)),console.log(s.gray(` Destination: ${d.path}`)),console.log(s.gray(` Stack: ${d.stack} (${d.confidence})`)),console.log(s.gray(` Source: ${e.git===true||Yr(t)?"git-url":"local-folder"}`)),!d.profileCompatibility.ok){let p=qo(d.profileCompatibility);console.log(s.yellow(` Profile warning: ${d.profileCompatibility.message}`)),p&&console.log(s.gray(` ${p}`));}return console.log(s.gray(` Next shell step: ${c}`)),0}catch(d){let p=d instanceof Error?d.message:String(d);return e.json?console.log(JSON.stringify({error:p},null,2)):console.log(s.red(`\u274C Import failed: ${p}`)),1}}async function ud(t,e,o){let r=v.resolve(t||process.cwd()),n=e.workspace?v.resolve(e.workspace):null,i=n??Z(process.cwd()),a=false,l=false;if(n){if(!We(n)){let f=`Workspace path is not a valid RapidKit workspace: ${n}`;return e.json?console.log(JSON.stringify({error:f},null,2)):console.log(s.red(`\u274C ${f}`)),1}}else if(!i||!We(i)){let f=await pn();i=f.workspacePath,a=true,l=f.created;}if(!i||!We(i)){let f="Not inside a RapidKit workspace";return e.json?console.log(JSON.stringify({error:f},null,2)):(console.log(s.red(`\u274C ${f}`)),console.log(s.gray("\u{1F4A1} Run this command from a workspace root or pass --workspace <path>."))),1}let c=process.env.RAPIDKIT_TEST_ADOPT_SYNC_FAIL==="1"&&(process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"),u=o?.syncWorkspaceProjects??(async f=>{if(c)throw new Error("forced sync failure for command-level adopt rollback test");let{syncWorkspaceProjects:g}=await import('./workspace-MPKEUHFP.js');await g(f,true),await qe(f,{silent:true});}),m=o?.registerProjectInWorkspace??(async(f,g,y)=>{let{registerProjectInWorkspace:w}=await import('./workspace-MPKEUHFP.js');await w(f,g,y);}),d=o?.registerWorkspace??(async(f,g)=>{let{registerWorkspace:y}=await import('./workspace-MPKEUHFP.js');await y(f,g);}),p=o?.rollbackAdoptedProjectImport??Vi;try{let f=v.join(r,".rapidkit","project.json"),g=await E__default.pathExists(f)?await E__default.readJson(f):null,y=await Bi({workspacePath:i,source:r,name:e.name,dryRun:e.dryRun===true});if(e.dryRun!==true)try{await d(i,v.basename(i)),await m(i,y.name,y.path),await u(i);}catch(w){throw await p(i,y.path,g),new Error(`Workspace sync failed after adopt and adoption metadata was rolled back: ${w instanceof Error?w.message:String(w)}`)}if(e.json)return console.log(JSON.stringify({workspacePath:i,workspaceResolution:a?"default-auto":n?"explicit":"nearest",defaultWorkspaceCreated:a?l:false,dryRun:e.dryRun===true,adoptedProject:y},null,2)),0;if(a&&console.log(s.yellow(`\u2139 Adopted outside a workspace, so RapidKit used the default workspace: ${i}`)),e.dryRun===true&&console.log(s.yellow("\u2139 Dry run: no adoption files were written.")),console.log(s.green(`\u2714 Adopted project: ${y.name}`)),console.log(s.gray(` Workspace: ${i}`)),console.log(s.gray(` Project: ${y.path}`)),console.log(s.gray(" Mode: linked (source was not moved or copied)")),console.log(s.gray(` Stack: ${y.stack} (${y.confidence})`)),!y.profileCompatibility.ok){let w=qo(y.profileCompatibility);console.log(s.yellow(` Profile warning: ${y.profileCompatibility.message}`)),w&&console.log(s.gray(` ${w}`));}return console.log(s.gray(` Report: ${y.adoptReadinessPath}`)),console.log(s.gray(" Next: npx rapidkit workspace model --json")),0}catch(f){let g=f instanceof Error?f.message:String(f);return e.json?console.log(JSON.stringify({error:g},null,2)):console.log(s.red(`\u274C Adopt failed: ${g}`)),1}}async function cn(t){let e=new Set(["python-only","polyglot","enterprise"]),o=md(),r="minimal",n=false;try{let c=v.join(t,".rapidkit","workspace.json"),u=JSON.parse(await j.promises.readFile(c,"utf-8"));r=u.profile??"minimal",n=u.bootstrap_note==="python-engine-skipped"||u.engine?.python_core?.status==="skipped";}catch{r="minimal";}if(!await(async()=>{if(!n&&e.has(r))return true;let c=await xa(t);if(c.length===0)return false;for(let u of c){let m=d$4(u),d=m?.module_support,p=j$1(u);if(n){if(p?.moduleSupport===true)return true;continue}if(!(e$1(m,u)||g$1(m,u)||h$2(m,u))&&d!==false)return i(m,u)||f$2(m,u),true}return false})())return 0;let a="poetry";try{let{readWorkspaceMarker:c}=await import('./workspace-marker-5GAJSOFP.js'),m=(await c(t))?.metadata?.npm?.installMethod;(m==="poetry"||m==="venv"||m==="pipx"||m==="pip")&&(a=m);}catch{}let l=async()=>{let c=Wl(t);if(!await E__default.pathExists(c)){let p=await Fl(t);if(p!==0)return p}let u=process.env.RAPIDKIT_DEV_PATH,d=(u?await E__default.pathExists(u):false)&&u?["-m","pip","install",u,"--quiet","--disable-pip-version-check"]:["-m","pip","install","rapidkit-core","--quiet","--disable-pip-version-check"];return await B(c,d,t,{timeoutMs:o})};if(a==="venv"){let c=await l();if(c!==0)return c}else if(a==="poetry"){let c=v.join(t,"pyproject.toml"),u=false;try{u=(await j.promises.readFile(c,"utf-8")).includes("rapidkit-core");}catch{u=false;}if(u){let m=await l();if(m!==0)return m}else {let m=await B("poetry",["install","--no-root"],t,{timeoutMs:o});if(m!==0)return m;let d=await B("poetry",["add","rapidkit-core"],t,{timeoutMs:o});if(d!==0)return d}}else return 0;try{let{writeWorkspaceLauncher:c}=await import('./create-TPFUONHK.js');await c(t,a==="venv"?"venv":"poetry");}catch{}try{let{markWorkspacePythonEngineInstalled:c}=await import('./workspace-python-engine-state-AEEZ7QYB.js');await c(t,{installMethod:a==="venv"?"venv":"poetry",venvPath:".venv"});}catch{}return 0}function md(){let t=process.env.RAPIDKIT_WORKSPACE_DEPS_TIMEOUT_MS;if(t){let e=Number.parseInt(t,10);if(Number.isFinite(e)&&e>0)return e}return 12e4}async function xa(t){let e=[],o=new Set,r=[t];for(;r.length>0;){let n=r.pop();if(!n||o.has(n))continue;o.add(n);let i=[];try{i=await j.promises.readdir(n,{withFileTypes:true});}catch{continue}for(let a of i){if(!a.isDirectory()||a.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(a.name))continue;let l=v.join(n,a.name),c=v.join(l,".rapidkit","context.json"),u=v.join(l,".rapidkit","project.json");if(await E__default.pathExists(c)||await E__default.pathExists(u)){e.push(l);continue}r.push(l);}}return e}function fd(t){return i$6(t)}async function pn(){let t=j$2(),e=v.basename(t),o=We(t);await E__default.ensureDir(v.join(t,".rapidkit")),await b$8(t,d$6(e,b()));let r=v.join(t,".rapidkit","workspace.json");return await E__default.pathExists(r)||await Be(r,{name:e,workspace_name:e,profile:"minimal",createdAt:new Date().toISOString(),createdBy:"rapidkit-npm-import-fallback"}),{workspacePath:t,created:!o}}async function en(t){let o=await Ne("go",{runCommandInCwd:B,runCoreRapidkit:e}).initProject(t);return X(o)}function X(t){return t.message&&console.log(s.red(`\u274C ${t.message}`)),t.exitCode}async function gt(t,e$1){let o=Ne("node",{runCommandInCwd:B,runCoreRapidkit:e});if(t==="init"){let n=await o.initProject(e$1);return X(n)}if(t==="dev"){let n=await o.runDev(e$1);return X(n)}if(t==="test"){let n=await o.runTest(e$1);return X(n)}if(t==="build"){let n=await o.runBuild(e$1);return X(n)}if(t==="lint"){let n=await o.runLint?.(e$1);return X(n??{exitCode:1,message:"Lint is not supported."})}if(t==="format"){let n=await o.runFormat?.(e$1);return X(n??{exitCode:1,message:"Format is not supported."})}let r=await o.runStart(e$1);return X(r)}async function He(t,e$1){let o=Ne("java",{runCommandInCwd:B,runCoreRapidkit:e});if(t==="init"){let n=await o.initProject(e$1);return X(n)}if(t==="dev"){let n=await o.runDev(e$1);return X(n)}if(t==="test"){let n=await o.runTest(e$1);return X(n)}if(t==="build"){let n=await o.runBuild(e$1);return X(n)}if(t==="lint"){let n=await o.runLint?.(e$1);return X(n??{exitCode:1,message:"Lint is not supported."})}if(t==="format"){let n=await o.runFormat?.(e$1);return X(n??{exitCode:1,message:"Format is not supported."})}let r=await o.runStart(e$1);return X(r)}function tn(t,e,o){let r=o.filter(n=>n.status==="failed").map(n=>{let i=n.id||"check";return n.message?`${i}: ${n.message}`:i}).slice(0,12);return f$4(t,{commandId:"bootstrap",exitCode:e,generatedAt:typeof t.timestamp=="string"?t.timestamp:new Date().toISOString(),blockers:r,runId:e$4()})}async function na(t,e=ln){let o=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof o>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let i$1=function(x){if(!x)return null;let $=x.trim().toLowerCase();return $==="minimal"||$==="java-only"||$==="go-only"||$==="dotnet-only"||$==="python-only"||$==="node-only"||$==="polyglot"||$==="enterprise"?$:null},a=function(x){let Fe=x.match(/^\s*mode:\s*([a-zA-Z]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase()==="strict"?"strict":"warn",ye=(se,be)=>{let Ae=x.match(new RegExp(`^\\s*${se}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return Ae?Ae[1].toLowerCase()==="true":be};return {mode:Fe,dependency_sharing_mode:ba(x),rules:{enforce_workspace_marker:ye("enforce_workspace_marker",true),enforce_toolchain_lock:ye("enforce_toolchain_lock",false),disallow_untrusted_tool_sources:ye("disallow_untrusted_tool_sources",false),enforce_compatibility_matrix:ye("enforce_compatibility_matrix",false),require_mirror_lock_for_offline:ye("require_mirror_lock_for_offline",true)}}};let l=["init"],c,u=false,m=false,d=false,p=false;for(let x=1;x<t.length;x+=1){let $=t[x];if($==="--ci"){u=true;continue}if($==="--offline"){m=true;continue}if($==="--json"){d=true;continue}if($==="--compliance-only"){p=true;continue}if($==="--profile"){let Q=t[x+1];if(!Q||Q.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] [--compliance-only]")),1;c=Q,x+=1;continue}if($.startsWith("--profile=")){c=$.slice(10);continue}l.push($);}let f=i$1(c);if(c&&!f)return console.log(s.red(`Invalid profile: ${c}. Use one of: minimal, java-only, go-only, dotnet-only, python-only, node-only, polyglot, enterprise.`)),1;let g=process.cwd(),y=l.slice(1).filter(x=>!x.startsWith("-"));if(y.length>0){let x=v.resolve(g,y[0]),$=d$4(x),Q=j.existsSync(x)?await yt(x):"unknown";if(!We(x)&&(e$1($,x)||g$1($,x)||h$2($,x)||f$2($,x)||i($,x)||Q!=="unknown"))return await e(l)}let w=v.join(g,".rapidkit-workspace"),P=v.join(g,".rapidkit","workspace.json"),k;!j.existsSync(w)&&j.existsSync(P)?k=g:(k=Z(g),k||(k=rd(g)));let h=[],S=null,b=null;if(k)try{let x=v.join(k,".rapidkit","workspace.json"),$=await j.promises.readFile(x,"utf-8"),Q=JSON.parse($);b=i$1(Q.profile);}catch{b=null;}let A=["minimal","java-only","python-only","node-only","go-only","dotnet-only","polyglot","enterprise"],N={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"},H=f;if(!!k&&!f&&!u&&!d&&!!process.stdin.isTTY&&!!process.stdout.isTTY&&process.env.VITEST!=="true"&&process.env.VITEST!=="1"){let x=b||"minimal",{chosenProfile:$}=await b$3([{type:"rawlist",name:"chosenProfile",message:`Select workspace profile for bootstrap (current: ${x})`,choices:A.map(Q=>({name:Q===x?`${N[Q]} \u2190 current`:N[Q],value:Q})),default:A.indexOf(x)}]);H=$;}let U=H||b||"minimal";if(k)try{let $=U==="python-only"||U==="polyglot"||U==="enterprise"?"poetry":"venv",Q;try{let be=(await j.promises.readFile(v.join(k,".python-version"),"utf-8")).trim();be&&(Q=be);}catch{}let{syncWorkspaceFoundationFiles:Fe}=await import('./create-TPFUONHK.js'),ye=await Fe(k,{workspaceName:v.basename(k),installMethod:$,pythonVersion:Q,profile:U,writeMarker:true,writeGitignore:true,onlyIfMissing:true});h.push({id:"workspace.legacy.sync",status:ye.length>0?"passed":"skipped",message:ye.length>0?`Legacy workspace foundation synchronized: ${ye.join(", ")}`:"Workspace foundation files are already up to date."});}catch(x){h.push({id:"workspace.legacy.sync",status:"failed",message:`Failed to synchronize legacy workspace foundation files: ${x.message}`});}if(k&&H&&H!==b)try{let x=v.join(k,".rapidkit","workspace.json"),$=await j.promises.readFile(x,"utf-8"),Q=JSON.parse($);Q.profile=H,await j.promises.writeFile(x,JSON.stringify(Q,null,2)+`
|
|
211
|
+
`,"utf-8");}catch{}let J={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}},Se=null;if(k)try{let x=await j.promises.readFile(v.join(k,".rapidkit","policies.yml"),"utf-8");Se=x,J=a(x);}catch{h.push({id:"policy.file",status:"skipped",message:"No workspace policy file found; using default bootstrap policy."});}else h.push({id:"workspace.detect",status:"skipped",message:"No workspace marker found; bootstrap runs in project/single-path mode."});if(k){let x=ja(Se);J.dependency_sharing_mode=x.mode,h.push({id:"policy.schema.dependency_sharing_mode",status:x.status,message:x.message}),h.push({id:"policy.dependency_sharing_mode.effective",status:"passed",message:J.dependency_sharing_mode==="isolated"?"Effective dependency mode: isolated (default secure mode).":J.dependency_sharing_mode==="shared-node-deps"?"Effective dependency mode: shared-node-deps (Node projects share workspace-level caches).":"Effective dependency mode: shared-runtime-caches (Node/Python/Go share workspace-level caches)."});let $=j.existsSync(v.join(k,".rapidkit-workspace"));h.push({id:"policy.enforce_workspace_marker",status:!J.rules.enforce_workspace_marker||$?"passed":"failed",message:!J.rules.enforce_workspace_marker||$?"Workspace marker policy satisfied.":"Workspace marker policy failed: .rapidkit-workspace is missing."});let Q=j.existsSync(v.join(k,".rapidkit","toolchain.lock"));h.push({id:"policy.enforce_toolchain_lock",status:!J.rules.enforce_toolchain_lock||Q?"passed":"failed",message:!J.rules.enforce_toolchain_lock||Q?"Toolchain lock policy satisfied.":"Toolchain lock policy failed: .rapidkit/toolchain.lock is missing."});let Fe=process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||j.existsSync(v.join(k,".rapidkit","trusted-sources.lock"));h.push({id:"policy.disallow_untrusted_tool_sources",status:!J.rules.disallow_untrusted_tool_sources||Fe?"passed":"failed",message:!J.rules.disallow_untrusted_tool_sources||Fe?"Trusted tool sources policy satisfied.":"Trusted tool sources policy failed: set RAPIDKIT_TRUSTED_SOURCES=1 or provide .rapidkit/trusted-sources.lock."});let ye=v.join(k,".rapidkit","compatibility-matrix.json"),se=j.existsSync(ye),be=J.rules.enforce_compatibility_matrix;if(h.push({id:"policy.enforce_compatibility_matrix",status:!be||se?"passed":"failed",message:!be||se?"Compatibility matrix policy satisfied.":"Compatibility matrix policy failed: .rapidkit/compatibility-matrix.json is missing."}),se)try{let Ye=await j.promises.readFile(ye,"utf-8"),Tt=JSON.parse(Ye),mn=!!Tt&&typeof Tt=="object";h.push({id:"compatibility.matrix.parse",status:mn?"passed":"failed",message:mn?"Compatibility matrix parsed successfully.":"Compatibility matrix parse failed: invalid JSON object."});}catch{h.push({id:"compatibility.matrix.parse",status:"failed",message:"Compatibility matrix parse failed: invalid JSON."});}let Ae=v.join(k,".rapidkit","mirror-config.json"),Dt=v.join(k,".rapidkit","mirror.lock"),Xo=j.existsSync(Ae),Zo=j.existsSync(Dt),un={};if(Xo)try{un=JSON.parse(await j.promises.readFile(Ae,"utf-8")),h.push({id:"mirror.config.parse",status:"passed",message:"Mirror configuration parsed successfully."});}catch{h.push({id:"mirror.config.parse",status:"failed",message:"Mirror configuration parse failed: invalid JSON in .rapidkit/mirror-config.json."});}let er=await Br(k,{ciMode:u,offlineMode:m});if(h.push(...er.checks.map(Ye=>({id:Ye.id,status:Ye.status,message:Ye.message}))),S=er.details,er.details.lockWritten&&(Zo=true),m){let Ye=process.env.RAPIDKIT_MIRROR_ENABLED==="1"||un.enabled===true;h.push({id:"offline.mirror.enabled",status:Ye?"passed":"failed",message:Ye?"Offline mode mirror is enabled.":'Offline mode requires mirror enablement (set RAPIDKIT_MIRROR_ENABLED=1 or .rapidkit/mirror-config.json {"enabled": true}).'});let Tt=J.rules.require_mirror_lock_for_offline;h.push({id:"offline.mirror.lock",status:!Tt||Zo?"passed":"failed",message:!Tt||Zo?"Offline mode mirror lock policy satisfied.":"Offline mode mirror lock policy failed: .rapidkit/mirror.lock is missing."});}else h.push({id:"offline.mirror.enabled",status:"skipped",message:"Offline mirror checks skipped (offline mode is disabled)."});let oo=mt({profile:U,runtimes:await ft(k),mode:J.mode});oo.profile!=="enterprise"?h.push({id:oo.checkId,status:oo.status,message:oo.message}):(h.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."}),h.push({id:"profile.enterprise.compatibility-matrix",status:se?"passed":"failed",message:se?"enterprise profile has compatibility matrix.":"enterprise profile requires .rapidkit/compatibility-matrix.json."}),h.push({id:"profile.enterprise.mirror-config",status:Xo?"passed":"failed",message:Xo?"enterprise profile has mirror configuration.":"enterprise profile requires .rapidkit/mirror-config.json."}));}u&&(process.env.RAPIDKIT_BOOTSTRAP_CI="1"),m&&(process.env.RAPIDKIT_OFFLINE_MODE="1");let V=h.some(x=>x.id.startsWith("policy.schema.")&&x.status==="failed")||J.mode==="strict"&&h.some(x=>x.status==="failed"),R=k||g,ee=v.join(R,".rapidkit","reports"),de=new Date().toISOString().replace(/[:.]/g,"-"),q=v.join(ee,`bootstrap-compliance-${de}.json`),pe=v.join(ee,"bootstrap-compliance.latest.json"),ve={command:"bootstrap",timestamp:new Date().toISOString(),workspacePath:k,profile:U,options:{ci:u,offline:m,strict:J.mode==="strict"},policyMode:J.mode,policyRules:J.rules,mirrorLifecycle:S,checks:h};if(V){let x=tn({...ve,result:"blocked",initExitCode:null},1,h);return await E__default.ensureDir(ee),await Be(q,x),await Be(pe,x),d?process.stdout.write(`${JSON.stringify(x,null,2)}
|
|
212
|
+
`):(console.log(s.red("\u274C Bootstrap blocked by strict policy checks.")),console.log(s.gray(`Compliance report: ${q}`))),1}if(d&&U==="enterprise"&&!u){let x=tn({...ve,result:"blocked",initExitCode:null,complianceOnly:false,bootstrapRuntimeSkipped:{reason:"enterprise JSON bootstrap requires --ci for deterministic non-interactive execution.",nextAction:"npx rapidkit bootstrap --profile enterprise --ci --json"}},1,h);return await E__default.ensureDir(ee),await Be(q,x),await Be(pe,x),process.stdout.write(`${JSON.stringify(x,null,2)}
|
|
213
|
+
`),1}let ue=async x=>{let $=process.stdout.write.bind(process.stdout),Q=process.stderr.write.bind(process.stderr),Fe=[],ye=[];process.stdout.write=((se,be,Ae)=>{let Dt=typeof be=="function"?be:typeof Ae=="function"?Ae:void 0;return Fe.push(typeof se=="string"?se:se instanceof Uint8Array?Buffer.from(se).toString("utf8"):String(se)),Dt?.(),true}),process.stderr.write=((se,be,Ae)=>{let Dt=typeof be=="function"?be:typeof Ae=="function"?Ae:void 0;return ye.push(typeof se=="string"?se:se instanceof Uint8Array?Buffer.from(se).toString("utf8"):String(se)),Dt?.(),true});try{return {exitCode:await x(),stdout:Fe.join(""),stderr:ye.join("")}}finally{process.stdout.write=$,process.stderr.write=Q;}},ge=x=>{let $=x.split(/\r?\n/).map(Q=>Q.trim()).filter(Boolean);return {bytes:Buffer.byteLength(x),excerpt:$.slice(0,12)}},M=0,at;if(!(d&&p))if(d){let x=await ue(()=>e(l));M=x.exitCode,at={captured:true,stdout:ge(x.stdout),stderr:ge(x.stderr)};}else M=await e(l);let ht=h.filter(x=>x.status==="failed").length,Nt=M!==0?"failed":ht>0?"ok_with_warnings":"ok",me=M!==0?M:ht>0?1:0,ze=tn({...ve,result:Nt,initExitCode:M,complianceOnly:d&&p,...at?{initOutput:at}:{}},me,h);if(await E__default.ensureDir(ee),await Be(q,ze),await Be(pe,ze),k&&M===0)try{let{syncWorkspaceProjects:x}=await import('./workspace-MPKEUHFP.js');await x(k,d),await qe(k,{silent:d});}catch{}if(d)process.stdout.write(`${JSON.stringify(ze,null,2)}
|
|
214
|
+
`);else {let x=h.filter($=>$.status==="failed").length;x>0&&console.log(s.yellow(`\u26A0\uFE0F Bootstrap completed with ${x} policy/profile warnings.`)),console.log(s.gray(`Compliance report: ${q}`));}return M}finally{typeof o>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=o;}}async function sa(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$1=(t[1]||"").toLowerCase(),o=t.includes("--json"),r=t.includes("--warm-deps")||t.includes("--warm-dependencies");if(!e$1||!["python","node","go","java","dotnet"].includes(e$1))return o?process.stdout.write(`${JSON.stringify({command:"setup",result:"error",error:"Usage: rapidkit setup <python|node|go|java|dotnet> [--warm-deps]"},null,2)}
|
|
215
|
+
`):console.log(s.yellow("Usage: rapidkit setup <python|node|go|java|dotnet> [--warm-deps]")),1;let n=async(p,f)=>{if(p==="node"){if(!j.existsSync(v.join(f,"package.json")))return {exitCode:0,message:"Node warm-up skipped: package.json not found in current directory."};let y=j.existsSync(v.join(f,"pnpm-lock.yaml")),w=j.existsSync(v.join(f,"yarn.lock"));return y?{exitCode:await B("pnpm",["install","--lockfile-only","--ignore-scripts"],f)}:w?{exitCode:await B("yarn",["install","--ignore-scripts"],f)}:{exitCode:await B("npm",["install","--package-lock-only","--ignore-scripts"],f)}}if(p==="go")return j.existsSync(v.join(f,"go.mod"))?{exitCode:await B("go",["mod","download"],f)}:{exitCode:0,message:"Go warm-up skipped: go.mod not found in current directory."};if(p==="java"){let g=j.existsSync(v.join(f,"pom.xml")),y=j.existsSync(v.join(f,"build.gradle"))||j.existsSync(v.join(f,"build.gradle.kts")),w=v.join(f,process.platform==="win32"?"gradlew.bat":"gradlew"),P=j.existsSync(w);return !g&&!y?{exitCode:0,message:"Java warm-up skipped: pom.xml or build.gradle not found in current directory."}:g?{exitCode:await B("mvn",["-B","-q","-DskipTests","dependency:go-offline"],f)}:{exitCode:await B(P?w:"gradle",["--no-daemon","dependencies"],f)}}return p==="dotnet"?(()=>{let y=[{dir:f,depth:0}],w=new Set(["bin","obj",".git","node_modules",".rapidkit"]);for(;y.length>0;){let P=y.shift();if(!P||P.depth>3)continue;let k=[];try{k=j.readdirSync(P.dir,{withFileTypes:true});}catch{continue}for(let h of k)if(h.isFile()){let S=h.name.toLowerCase();if(S.endsWith(".sln")||S.endsWith(".csproj"))return true}else h.isDirectory()&&!w.has(h.name)&&y.push({dir:v.join(P.dir,h.name),depth:P.depth+1});}return false})()?{exitCode:await B("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."}};if(o){let p=process.env.RAPIDKIT_SUPPRESS_RUN_COMMAND_OUTPUT;process.env.RAPIDKIT_SUPPRESS_RUN_COMMAND_OUTPUT="1";try{let g=await Ne(e$1,{runCommandInCwd:B,runCoreRapidkit:async(P,k)=>(await g$3(P,{...k,cwd:void 0})).exitCode}).checkPrereqs(),y=Z(process.cwd()),w=null;if(e$1==="node"&&g.exitCode===0&&(w=process.version),y&&w){let P=v.join(y,".rapidkit","toolchain.lock"),k={};try{k=JSON.parse(await j.promises.readFile(P,"utf-8"));}catch{}(!k.runtime||typeof k.runtime!="object")&&(k.runtime={}),k.runtime[e$1]={version:w,detectedAt:new Date().toISOString()},await E__default.ensureDir(v.dirname(P)),await j.promises.writeFile(P,JSON.stringify(k,null,2)+`
|
|
216
|
+
`,"utf-8");}return process.stdout.write(`${JSON.stringify({command:"setup",runtime:e$1,result:g.exitCode===0?"ok":"failed",exitCode:g.exitCode,workspacePath:y,version:w,warmDeps:r},null,2)}
|
|
217
|
+
`),g.exitCode}finally{typeof p>"u"?delete process.env.RAPIDKIT_SUPPRESS_RUN_COMMAND_OUTPUT:process.env.RAPIDKIT_SUPPRESS_RUN_COMMAND_OUTPUT=p;}}let i=Ne(e$1,{runCommandInCwd:B,runCoreRapidkit:(p,f)=>e(p,{...f,cwd:void 0})}),a=await i.checkPrereqs(),l=await i.doctorHints(process.cwd()),c=Z(process.cwd()),u=c||process.cwd(),m=null,d=async()=>e$1!=="java"||!c?[]:m||(m=(await xa(c)).filter(f=>{let g=d$4(f);return g$1(g,f)}),m);if(a.exitCode===0){console.log(s.green(`\u2705 ${e$1} prerequisites look good.`));let p=["python","node","go","java","dotnet"].filter(f=>f!==e$1).join("/");if(console.log(s.gray(` Scope: validated ${e$1} runtime only. ${p} checks are optional unless your workspace profile uses them.`)),e$1==="python"&&console.log(s.gray(" Note: Poetry is recommended, but venv/pipx-based flows are supported in workspace creation.")),i.warmSetupCache&&((await i.warmSetupCache(u)).exitCode===0?console.log(s.gray(` ${e$1} cache warm-up completed.`)):console.log(s.yellow(` ${e$1} cache warm-up skipped (non-fatal).`))),r)if(e$1==="java"&&c){let f=await d();if(f.length>0){let g=0,y=0,w=0;for(let P of f){let k=await n("java",P),h=/skipped/i.test(k.message||""),S=v.relative(c,P)||v.basename(P);k.message&&console.log(s.gray(` [${S}] ${k.message}`)),k.exitCode===0&&!h?g+=1:k.exitCode===0&&h?w+=1:y+=1;}g>0&&console.log(s.gray(` java dependency warm-up completed for ${g} project(s) (--warm-deps).`)),y>0&&console.log(s.yellow(` java dependency warm-up failed for ${y} project(s) (non-fatal).`)),g===0&&y===0&&w>0&&console.log(s.gray(" java dependency warm-up skipped for discovered workspace projects."));}else {let g=await n("java",u),y=/skipped/i.test(g.message||"");g.message&&console.log(s.gray(` ${g.message}`)),g.exitCode===0&&!y?console.log(s.gray(` ${e$1} dependency warm-up completed (--warm-deps).`)):g.exitCode!==0&&console.log(s.yellow(` ${e$1} dependency warm-up failed (non-fatal).`));}}else {let f=await n(e$1,u),g=/skipped/i.test(f.message||"");f.message&&console.log(s.gray(` ${f.message}`)),f.exitCode===0&&!g?console.log(s.gray(` ${e$1} dependency warm-up completed (--warm-deps).`)):f.exitCode!==0&&console.log(s.yellow(` ${e$1} dependency warm-up failed (non-fatal).`));}if(c)try{let f=v.join(c,".rapidkit","toolchain.lock"),g={};try{g=JSON.parse(await j.promises.readFile(f,"utf-8"));}catch{}(!g.runtime||typeof g.runtime!="object")&&(g.runtime={});let y=g.runtime;if(e$1==="python"){let w=null;try{let{execa:P}=await import('execa');for(let k of dn()){let S=await P(k,k==="py"?["-3","--version"]:["--version"],{cwd:c,stdio:"pipe",reject:false,timeout:3e3});if(S.exitCode===0){let A=(S.stdout||S.stderr||"").match(/Python\s+(\S+)/);if(w=A?A[1]:null,w)break}}}catch{}y.python={...y.python||{},version:w,last_setup:new Date().toISOString()};}else if(e$1==="node")y.node={...y.node||{},version:process.version,last_setup:new Date().toISOString()};else if(e$1==="go"){let w=null;try{let{execa:P}=await import('execa'),h=((await P("go",["version"],{cwd:c,stdio:"pipe"})).stdout||"").match(/go(\d+\.\d+(?:\.\d+)?)/i);w=h?h[1]:null;}catch{}y.go={...y.go||{},version:w,last_setup:new Date().toISOString()};}else if(e$1==="java"){let w=null,P=null,k=null,h=await d(),b=j.existsSync(v.join(u,"pom.xml"))||j.existsSync(v.join(u,"build.gradle"))||j.existsSync(v.join(u,"build.gradle.kts"))?u:h[0]||u;try{let{execa:A}=await import('execa'),N=await A("java",["-version"],{cwd:c,stdio:"pipe",reject:false,timeout:3e3}),Y=`${N.stdout||""}
|
|
218
|
+
${N.stderr||""}`.match(/version\s+"([^"]+)"/i);w=Y?Y[1]:null;let U=j.existsSync(v.join(b,"pom.xml")),J=j.existsSync(v.join(b,"build.gradle"))||j.existsSync(v.join(b,"build.gradle.kts"));if(U){P="maven";let Se=(()=>{let ee=v.join(b,"mvnw.cmd");if(process.platform==="win32"&&j.existsSync(ee))return ee;let de=v.join(b,"mvnw");return j.existsSync(de)?de:"mvn"})(),K=await A(Se,["-version"],{cwd:b,stdio:"pipe",reject:false,timeout:3e3}),R=`${K.stdout||""}
|
|
219
|
+
${K.stderr||""}`.match(/Apache Maven\s+(\S+)/i);k=R?R[1]:null;}else if(J){P="gradle";let Se=(()=>{let ee=v.join(b,"gradlew.bat");if(process.platform==="win32"&&j.existsSync(ee))return ee;let de=v.join(b,"gradlew");return j.existsSync(de)?de:"gradle"})(),K=await A(Se,["--version"],{cwd:b,stdio:"pipe",reject:false,timeout:3e3}),R=`${K.stdout||""}
|
|
220
|
+
${K.stderr||""}`.match(/Gradle\s+(\S+)/i);k=R?R[1]:null;}}catch{}y.java={...y.java||{},version:w,build_tool:P,build_tool_version:k,last_setup:new Date().toISOString()};}else if(e$1==="dotnet"){let w=null;try{let{execa:P}=await import('execa'),h=((await P("dotnet",["--version"],{cwd:c,stdio:"pipe",reject:false,timeout:3e3})).stdout||"").trim();w=h.length>0?h:null;}catch{}y.dotnet={...y.dotnet||{},version:w,sdk:w,last_setup:new Date().toISOString()};}g.updated_at=new Date().toISOString(),await j.promises.writeFile(f,JSON.stringify(g,null,2)+`
|
|
221
221
|
`,"utf-8"),console.log(s.gray(" toolchain.lock updated (.rapidkit/toolchain.lock)"));}catch{}}else console.log(s.red(`\u274C ${e$1} prerequisites check failed.`));if(l.length>0){console.log(s.gray(`
|
|
222
|
-
Hints:`));for(let
|
|
223
|
-
`)){let r=o.trim(),n=r.match(/^strategy:\s*(\S+)/);n&&(e.strategy=n[1].replace(/['"]]/g,""));let i=r.match(/^prune_on_bootstrap:\s*(true|false)/);i&&(e.prune_on_bootstrap=i[1]==="true");let a=r.match(/^self_heal:\s*(true|false)/);a&&(e.self_heal=a[1]==="true");let l=r.match(/^verify_integrity:\s*(true|false)/);l&&(e.verify_integrity=l[1]==="true");}return e}async function
|
|
222
|
+
Hints:`));for(let p of l)console.log(s.gray(`- ${p}`));}return a.exitCode}function gd(t){let e={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};for(let o of t.split(`
|
|
223
|
+
`)){let r=o.trim(),n=r.match(/^strategy:\s*(\S+)/);n&&(e.strategy=n[1].replace(/['"]]/g,""));let i=r.match(/^prune_on_bootstrap:\s*(true|false)/);i&&(e.prune_on_bootstrap=i[1]==="true");let a=r.match(/^self_heal:\s*(true|false)/);a&&(e.self_heal=a[1]==="true");let l=r.match(/^verify_integrity:\s*(true|false)/);l&&(e.verify_integrity=l[1]==="true");}return e}async function ia(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(),o=t.includes("--json"),r=t.includes("--dry-run"),n=Jo.getInstance(),i=Z(process.cwd()),a={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};if(i)try{let l=await j.promises.readFile(v.join(i,".rapidkit","cache-config.yml"),"utf-8");a=gd(l);}catch{}if(e==="status"){let l={command:"cache",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:i,cache:{enabled:true,strategy:a.strategy,selfHeal:a.self_heal,pruneOnBootstrap:a.prune_on_bootstrap,verifyIntegrity:a.verify_integrity,inMemory:true}};return o?(process.stdout.write(`${JSON.stringify(l,null,2)}
|
|
224
224
|
`),0):(console.log(s.cyan("RapidKit cache is enabled")),console.log(s.cyan("RapidKit cache status")),i?(console.log(s.gray(` Workspace: ${i}`)),console.log(s.gray(` Strategy: ${a.strategy}`)),console.log(s.gray(` Self-heal: ${a.self_heal}`)),console.log(s.gray(` Prune on bootstrap:${a.prune_on_bootstrap}`)),console.log(s.gray(` Verify integrity: ${a.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)}return e==="clear"?(await n.clear(),o?(process.stdout.write(`${JSON.stringify({command:"cache",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:i,cache:{cleared:true,strategy:a.strategy}},null,2)}
|
|
225
225
|
`),0):(console.log(s.green("Cache clear completed")),console.log(s.green("\u2705 Cache cleared (all entries removed).")),0)):e==="prune"?(r||await n.clear(),o?(process.stdout.write(`${JSON.stringify({command:"cache",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:i,dryRun:r,cache:{pruned:!r,strategy:a.strategy,pruneOnBootstrap:a.prune_on_bootstrap},nextActions:a.prune_on_bootstrap?[]:["Set prune_on_bootstrap: true in .rapidkit/cache-config.yml to auto-prune on bootstrap."]},null,2)}
|
|
226
226
|
`),0):r?(console.log(s.green("Cache prune dry run completed")),console.log(s.gray(" No cache entries were removed.")),0):(console.log(s.green("\u2705 Cache pruned (stale entries removed).")),a.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"?a.self_heal?(await n.clear(),o?(process.stdout.write(`${JSON.stringify({command:"cache",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:i,cache:{repaired:true,selfHeal:a.self_heal,verifyIntegrity:a.verify_integrity}},null,2)}
|
|
227
227
|
`),0):(console.log(s.green("\u2705 Cache repaired (self-heal applied, stale entries evicted).")),a.verify_integrity&&console.log(s.gray(" Integrity verification is enabled in cache-config.yml.")),0)):o?(process.stdout.write(`${JSON.stringify({command:"cache",action:e,result:"skipped",timestamp:new Date().toISOString(),workspacePath:i,reason:"self_heal is disabled in .rapidkit/cache-config.yml",cache:{selfHeal:a.self_heal,verifyIntegrity:a.verify_integrity}},null,2)}
|
|
228
|
-
`),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
|
|
229
|
-
`),0):(console.log(s.cyan(`Policy file: ${a}`)),console.log(s.gray(` mode: ${
|
|
228
|
+
`),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 yd(t,e,o,r,n=false){let i=(e||"show").toLowerCase(),a=v.join(t,".rapidkit","policies.yml");if(i==="show"||i==="status"||i==="get"){let d=await ra(t),p=ta(d);return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"ok",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,policy:p},null,2)}
|
|
229
|
+
`),0):(console.log(s.cyan(`Policy file: ${a}`)),console.log(s.gray(` mode: ${p.mode}`)),console.log(s.gray(` dependency_sharing_mode: ${p.dependency_sharing_mode}`)),console.log(s.gray(" rules:")),console.log(s.gray(` enforce_workspace_marker: ${p.rules.enforce_workspace_marker}`)),console.log(s.gray(` enforce_toolchain_lock: ${p.rules.enforce_toolchain_lock}`)),console.log(s.gray(` disallow_untrusted_tool_sources: ${p.rules.disallow_untrusted_tool_sources}`)),console.log(s.gray(` enforce_compatibility_matrix: ${p.rules.enforce_compatibility_matrix}`)),console.log(s.gray(` require_mirror_lock_for_offline: ${p.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(i!=="set")return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"error",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,error:{code:"workspace.policy.unknown_action",message:`Unknown workspace policy action: ${e||""}`},allowedActions:["show","status","get","set"]},null,2)}
|
|
230
230
|
`),1):(console.log(s.red(`Unknown workspace policy action: ${e||""}`)),console.log(s.gray("Available: show, set")),1);if(!o||typeof r>"u")return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"error",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,error:{code:"workspace.policy.missing_arguments",message:"Usage: rapidkit workspace policy set <key> <value>"},allowedKeys:["mode","dependency_sharing_mode","rules.enforce_workspace_marker","rules.enforce_toolchain_lock","rules.disallow_untrusted_tool_sources","rules.enforce_compatibility_matrix","rules.require_mirror_lock_for_offline"]},null,2)}
|
|
231
|
-
`),1):(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 l=o.trim(),
|
|
232
|
-
`),1):(console.log(s.red("\u274C Invalid mode. Use: warn | strict")),1);
|
|
233
|
-
`),1):(console.log(s.red("\u274C Invalid dependency_sharing_mode. Use: isolated | shared-runtime-caches | shared-node-deps")),1);
|
|
234
|
-
`),1):(console.log(s.red(`\u274C Unknown policy rule: ${
|
|
235
|
-
`),1):(console.log(s.red("\u274C Rule values must be boolean: true | false")),1);
|
|
236
|
-
`),1):(console.log(s.red(`\u274C Unknown policy key: ${l}`)),1);await
|
|
237
|
-
`),0):(console.log(s.green(`\u2705 Updated ${l} in .rapidkit/policies.yml`)),console.log(s.gray(` mode: ${
|
|
238
|
-
`,"utf-8"),o||console.log(s.gray(" mirror-config.json created with defaults (.rapidkit/mirror-config.json)"));}catch{}let
|
|
239
|
-
`),0):(console.log(s.cyan("RapidKit mirror status")),console.log(s.gray(`Workspace: ${r}`)),console.log(s.gray(`Config: ${
|
|
240
|
-
`),1;console.log(s.red("\u274C Mirror verify failed."));for(let
|
|
241
|
-
`),1;console.log(s.yellow(`\u26A0\uFE0F Mirror ${e} completed with ${
|
|
242
|
-
`),0):e==="rotate"?(console.log(s.green(`\u2705 Mirror rotate completed. Rotated files: ${
|
|
243
|
-
`).toLowerCase(),A=b.includes("\\.rapidkit\\rapidkit"),
|
|
244
|
-
`);for(let Y of
|
|
245
|
-
`);process.exit(1);}}let
|
|
246
|
-
`);for(let S of
|
|
247
|
-
`);process.exit(1);}}if(P&&r&&
|
|
231
|
+
`),1):(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 l=o.trim(),u=await ra(t);if(l==="mode"){let d=r.trim().toLowerCase();if(d!=="warn"&&d!=="strict")return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"error",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,error:{code:"workspace.policy.invalid_mode",message:"Invalid mode. Use: warn | strict"}},null,2)}
|
|
232
|
+
`),1):(console.log(s.red("\u274C Invalid mode. Use: warn | strict")),1);u=oa(u,"mode",`${d} # "warn" or "strict"`);}else if(l==="dependency_sharing_mode"){let d=r.trim().toLowerCase();if(d!=="isolated"&&d!=="shared-runtime-caches"&&d!=="shared-node-deps")return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"error",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,error:{code:"workspace.policy.invalid_dependency_sharing_mode",message:"Invalid dependency_sharing_mode. Use: isolated | shared-runtime-caches | shared-node-deps"}},null,2)}
|
|
233
|
+
`),1):(console.log(s.red("\u274C Invalid dependency_sharing_mode. Use: isolated | shared-runtime-caches | shared-node-deps")),1);u=oa(u,"dependency_sharing_mode",`${d} # "isolated" or "shared-runtime-caches" or "shared-node-deps"`);}else if(l.startsWith("rules.")){let d=l.slice(6);if(!(d in Pa))return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"error",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,error:{code:"workspace.policy.unknown_rule",message:`Unknown policy rule: ${d}`}},null,2)}
|
|
234
|
+
`),1):(console.log(s.red(`\u274C Unknown policy rule: ${d}`)),1);let p=cd(r);if(p===null)return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"error",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,error:{code:"workspace.policy.invalid_boolean",message:"Rule values must be boolean: true | false"}},null,2)}
|
|
235
|
+
`),1):(console.log(s.red("\u274C Rule values must be boolean: true | false")),1);u=sd(u,d,p);}else return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"error",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,error:{code:"workspace.policy.unknown_key",message:`Unknown policy key: ${l}`}},null,2)}
|
|
236
|
+
`),1):(console.log(s.red(`\u274C Unknown policy key: ${l}`)),1);await ad(t,u);let m=ta(u);return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"ok",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,updatedKey:l,policy:m},null,2)}
|
|
237
|
+
`),0):(console.log(s.green(`\u2705 Updated ${l} in .rapidkit/policies.yml`)),console.log(s.gray(` mode: ${m.mode}`)),console.log(s.gray(` dependency_sharing_mode: ${m.dependency_sharing_mode}`)),console.log(s.gray(" Tip: run `npx rapidkit workspace policy show` to inspect all values.")),0)}async function aa(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(),o=t.includes("--json"),r=Z(process.cwd());if(!r)return console.log(s.red("\u274C Not inside a RapidKit workspace")),console.log(s.gray("\u{1F4A1} Run this command from within a workspace directory")),1;let n=v.join(r,".rapidkit"),i=v.join(n,"mirror-config.json"),a=v.join(n,"mirror.lock"),l=v.join(n,"mirror","artifacts"),c=v.join(n,"reports");async function u(d){let p=new Date().toISOString().replace(/[:.]/g,"-"),f=v.join(c,`mirror-ops-${p}.json`),g=v.join(c,"mirror-ops.latest.json");await E__default.ensureDir(c),await Be(f,d),await Be(g,d);}async function m(){let d=await E__default.pathExists(i),p=await E__default.pathExists(a),f=0;return await E__default.pathExists(l)&&(f=(await j.promises.readdir(l,{withFileTypes:true})).filter(g=>g.isFile()).length),{configExists:d,lockExists:p,artifactsCount:f}}if(e==="status"){if(!await E__default.pathExists(i))try{let P={schema_version:"1.0",enabled:false,strategy:"on-demand",artifacts:[],created_at:new Date().toISOString(),note:"Auto-generated by rapidkit mirror status. Set enabled: true and add artifact entries to activate mirroring."};await E__default.ensureDir(n),await j.promises.writeFile(i,JSON.stringify(P,null,2)+`
|
|
238
|
+
`,"utf-8"),o||console.log(s.gray(" mirror-config.json created with defaults (.rapidkit/mirror-config.json)"));}catch{}let p=await E__default.pathExists(i),f=await E__default.pathExists(l),g=await E__default.pathExists(a),y=f?(await j.promises.readdir(l,{withFileTypes:true})).filter(P=>P.isFile()).length:0,w={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:r,mirror:{configExists:p,lockExists:g,artifactsCount:y}};return await u(w),o?(process.stdout.write(`${JSON.stringify(w,null,2)}
|
|
239
|
+
`),0):(console.log(s.cyan("RapidKit mirror status")),console.log(s.gray(`Workspace: ${r}`)),console.log(s.gray(`Config: ${p?"present":"missing"} (${i})`)),console.log(s.gray(`Lock: ${g?"present":"missing"} (${a})`)),console.log(s.gray(`Artifacts: ${y}`)),0)}if(e==="sync"||e==="verify"||e==="rotate"){let d=await Br(r,{ciMode:true,offlineMode:e==="verify",forceRun:true}),p=d.checks.filter(y=>y.status==="failed"),f=d.checks.some(y=>y.id.startsWith("mirror.verify.")&&y.status==="failed");if(e==="verify"&&f){let y={command:"mirror",action:e,result:"failed",timestamp:new Date().toISOString(),workspacePath:r,mirror:await m(),details:d.details,checks:d.checks};if(await u(y),o)return process.stdout.write(`${JSON.stringify(y,null,2)}
|
|
240
|
+
`),1;console.log(s.red("\u274C Mirror verify failed."));for(let w of d.checks.filter(P=>P.id.startsWith("mirror.verify.")))console.log(s.gray(`- ${w.id}: ${w.message}`));return 1}if(p.length>0){let y={command:"mirror",action:e,result:"failed",timestamp:new Date().toISOString(),workspacePath:r,mirror:await m(),details:d.details,checks:d.checks};if(await u(y),o)return process.stdout.write(`${JSON.stringify(y,null,2)}
|
|
241
|
+
`),1;console.log(s.yellow(`\u26A0\uFE0F Mirror ${e} completed with ${p.length} issue(s).`));for(let w of p)console.log(s.gray(`- ${w.id}: ${w.message}`));return 1}let g={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:r,mirror:await m(),details:d.details,checks:d.checks};return await u(g),o?(process.stdout.write(`${JSON.stringify(g,null,2)}
|
|
242
|
+
`),0):e==="rotate"?(console.log(s.green(`\u2705 Mirror rotate completed. Rotated files: ${d.details.rotatedFiles}.`)),0):e==="verify"?(console.log(s.green(`\u2705 Mirror verify completed. Verified artifacts: ${d.details.verifiedArtifacts}.`)),0):(console.log(s.green(`\u2705 Mirror sync completed. Synced artifacts: ${d.details.syncedArtifacts}.`)),0)}return console.log(s.yellow("Usage: rapidkit mirror <status|sync|verify|rotate> [--json]")),1}async function ln(t){let e$2=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof e$2>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let o=process.cwd(),r=await Sa(o,async()=>{let n=Z(o),i$1=Ne("python",{runCommandInCwd:B,runCoreRapidkit:e}),a=Ne("dotnet",{runCommandInCwd:B,runCoreRapidkit:e}),l=t.slice(1).filter(g=>!g.startsWith("-"));if(l.length>0){let g=v.resolve(o,l[0]),y=d$4(g),w=await yt(g);return e$1(y,g)||w==="go"?await en(g):g$1(y,g)||w==="java"?await He("init",g):h$2(y,g)||w==="dotnet"?X(await a.initProject(g)):f$2(y,g)||w==="node"?await Zr(g):i(y,g)||w==="python"?await Xr(g,i$1):await e(t,{cwd:o})}let c=d$4(o),u=!!Z(o)&&o===Z(o);if(!u&&e$1(c,o))return await en(o);let m=await yt(o);if(!u&&(g$1(c,o)||m==="java"))return await He("init",o);if(!u&&(h$2(c,o)||m==="dotnet"))return X(await a.initProject(o));if(!u&&(f$2(c,o)||m==="node"))return await Zr(o);if(!u&&(i(c,o)||m==="python"))return await Xr(o,i$1);let d=n||Z(o),p=va(o),f=p?v.dirname(v.dirname(p)):null;if(f&&f!==d){let g=d$4(f),y=await yt(f);return e$1(g,f)||y==="go"?await en(f):g$1(g,f)||y==="java"?await He("init",f):h$2(g,f)||y==="dotnet"?X(await a.initProject(f)):f$2(g,f)||y==="node"?await Zr(f):i(g,f)||y==="python"?await Xr(f,i$1):await e(["init"],{cwd:f})}if(d&&o===d){console.log(s.yellow("\u26A0\uFE0F Running `npx rapidkit init` at workspace root.")),console.log(s.gray(" Root `init`, `workspace init`, and `workspace run init` now share the same full-init flow:\n workspace-profile dependencies first, then project dependency initialization.\n"));let g=await cn(d);if(g!==0)return g;let{runWorkspaceStage:y}=await import('./workspace-run-NULA72JV.js');return (await y({workspacePath:d,stage:"init",affected:false,blastRadius:false,parallel:false,continueOnError:false,strict:false,json:false,enforceGates:false})).summary.exitCode}if(!d){let g$1=await b$2(),y=g(),{name:w}=fd(y);await E__default.ensureDir(y);let{createProject:P}=await import('./create-TPFUONHK.js');return await P(w,{yes:true,userConfig:g$1,parentDirectory:y}),0}return await e(t,{cwd:o})});return r.ok?r.value:r.code}finally{typeof e$2>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=e$2;}}async function ca(t){let e=Z(t);if(!e)return [];let o="warn";try{let c=await j.promises.readFile(v.join(e,".rapidkit","policies.yml"),"utf-8");(c.match(/^\s*enforcement_mode:\s*(warn|strict)\s*(?:#.*)?$/m)??c.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m))?.[1]==="strict"&&(o="strict");}catch{return []}if(o!=="strict")return [];let r=[],n=v.join(e,".rapidkit","toolchain.lock");if(!j.existsSync(n))return r.push("toolchain.lock is missing \u2014 run `rapidkit bootstrap` first (strict mode requires a reproducible toolchain)."),r;let i$2={};try{i$2=JSON.parse(await j.promises.readFile(n,"utf-8"));}catch{return r.push("toolchain.lock is invalid JSON \u2014 regenerate it with `rapidkit bootstrap` before running commands in strict mode."),r}let a=i$2.runtime??{},l=d$4(t);e$1(l,t)&&!a.go?.version?r.push("go.version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."):f$2(l,t)&&!a.node?.version?r.push("node.version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."):g$1(l,t)&&!a.java?.version?r.push("java.version is not pinned in toolchain.lock \u2014 run `rapidkit setup java` first."):h$2(l,t)&&!a.dotnet?.version?r.push("dotnet.version is not pinned in toolchain.lock \u2014 run `rapidkit setup dotnet` first."):i(l,t)&&!a.python?.version&&r.push("python.version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");try{let u=JSON.parse(await j.promises.readFile(v.join(e,".rapidkit","workspace.json"),"utf-8")).profile??"",m=i$1(t,l),d=nt({profile:u,runtime:m.runtime,subjectLabel:v.basename(t),mode:"strict"});d.ok||r.push(`${d.message} Update the workspace profile or use a polyglot workspace.`);}catch{}return r}async function hd(){let t=async h=>{if(!b$1()||!h.toLowerCase().endsWith(".cmd"))return false;try{let b=(await E__default.readFile(h,"utf8")).replace(/\r\n/g,`
|
|
243
|
+
`).toLowerCase(),A=b.includes("\\.rapidkit\\rapidkit"),N=b.includes("\\.rapidkit\\rapidkit.cmd")||b.includes("\\.rapidkit\\rapidkit.exe")||b.includes("\\.venv\\scripts\\rapidkit.exe");return A&&!N}catch{return false}},e$2=process.cwd(),o$1=process.argv.slice(2),r=o$1[0],n=r==="init",i$1=new Set(k$1),a=!r||r==="--help"||r==="-h"||r==="help",l=We(e$2),c=j.existsSync(v.join(e$2,".rapidkit","project.json")),u=d$4(e$2),m=await yt(e$2),d=e$1(u,e$2)||f$2(u,e$2)||i(u,e$2)||g$1(u,e$2)||h$2(u,e$2)||c$3(m??void 0),p=!!r&&i$1.has(r)&&d,f$1=process.env.RAPIDKIT_LOCAL_LAUNCHER_BYPASS==="1";if(eo(o$1)||o$1[0]==="create")return false;if(nn(o$1))return true;if(o$1[0]==="init"&&l&&!c)return false;if(sn(o$1))return true;try{let h=r==="shell"&&o$1[1]==="activate",S=r==="create",b=await ws(e$2,{cwd:e$2,timeoutMs:1200});if(b.ok&&b.data?.isRapidkitProject&&b.data.engine==="python"){let A=S||eo(o$1);if(!a&&!h&&!A&&!n&&!p&&mr(o$1)){if(r&&Xi.includes(r)){let H=await ca(e$2).catch(()=>[]);if(H.length>0){process.stderr.write(s.red("\u274C Strict policy violations prevent running this command:")+`
|
|
244
|
+
`);for(let Y of H)process.stderr.write(s.red(` \u2022 ${Y}`)+`
|
|
245
|
+
`);process.exit(1);}}let N=await e(process.argv.slice(2),{cwd:e$2});process.exit(N);}}}catch{}let g=va(e$2),y=b$1(),w=f$1?[]:o(e$2),P=null;for(let h of w)if(await E__default.pathExists(h)){if(await t(h)){f.warn(`Skipping legacy/broken Windows launcher candidate: ${h}. Falling back to core bridge.`);continue}P=h;break}let k=r==="create";if(r==="init"&&l&&!c)return false;if(r&&Xi.includes(r)){let h=await ca(e$2);if(h.length>0){process.stderr.write(s.red("\u274C Strict policy violations prevent running this command:")+`
|
|
246
|
+
`);for(let S of h)process.stderr.write(s.red(` \u2022 ${S}`)+`
|
|
247
|
+
`);process.exit(1);}}if(P&&r&&Qi.includes(r)&&!k&&!n&&!p){f.debug(`Delegating to local CLI: ${P} ${o$1.join(" ")}`);let h=r==="init"?zi():process.env,S=spawn(P,o$1,{stdio:"inherit",cwd:e$2,shell:y,env:h});return S.on("close",b=>{process.exit(b??0);}),S.on("error",b=>{f.error(`Failed to run local rapidkit: ${b.message}`),process.exit(1);}),true}if(g&&await E__default.pathExists(g))try{let h=await E__default.readJson(g);if(vs(h.engine)){let S=o$1[0],b=f$1?[]:o(e$2),A=null;for(let N of b)if(await E__default.pathExists(N)){if(await t(N)){f.warn(`Skipping legacy/broken Windows launcher candidate: ${N}. Falling back to core bridge.`);continue}A=N;break}if(A&&S&&Qi.includes(S)&&S!=="init"&&!p){f.debug(`Delegating to local CLI (early detection): ${A} ${o$1.join(" ")}`);let N=S==="init"?zi():process.env,H=spawn(A,o$1,{stdio:"inherit",cwd:e$2,env:N});return H.on("close",Y=>process.exit(Y??0)),H.on("error",Y=>{f.error(`Failed to run local rapidkit: ${Y.message}`),process.exit(1);}),true}if(S==="shell"&&o$1[1]==="activate"){let N=b$1()?`# RapidKit: activation snippet (PowerShell)
|
|
248
248
|
$venv = ".venv"
|
|
249
249
|
if (Test-Path "$venv\\Scripts\\Activate.ps1") { . "$venv\\Scripts\\Activate.ps1" }
|
|
250
250
|
$env:RAPIDKIT_PROJECT_ROOT = (Get-Location).Path
|
|
@@ -264,12 +264,12 @@ export RAPIDKIT_PROJECT_ROOT="$(pwd)"
|
|
|
264
264
|
export PATH="$(pwd)/.rapidkit:$(pwd):$PATH"
|
|
265
265
|
`;console.log(s.green.bold(`
|
|
266
266
|
\u2705 Activation snippet \u2014 run the following to activate this project in your current shell:
|
|
267
|
-
`)),console.log(
|
|
267
|
+
`)),console.log(N),console.log(s.gray(`
|
|
268
268
|
\u{1F4A1} After activation you can run: rapidkit dev
|
|
269
|
-
`)),process.exit(0);}if(!a&&!
|
|
269
|
+
`)),process.exit(0);}if(!a&&!eo(o$1)&&S!=="init"&&!p&&mr(o$1)){let N=await e(o$1,{cwd:e$2});process.exit(N);}}}catch{}return false}var st=null,Yo=false,oe=new Command,wd=process.env.RAPIDKIT_SHOW_LEGACY==="1"||process.env.RAPIDKIT_SHOW_LEGACY?.toLowerCase()==="true";async function kd(t){if(t.length===0)return false;let e=t[0],o=t[1];if(s$1(t)||Hl.includes(e))return false;if(l$1.includes(e)){if(e==="lint"||e==="format"){let n=d$4(process.cwd()),i$2=await yt(process.cwd());if(f$2(n,process.cwd())||i$2==="node"){let a=i$1(process.cwd(),n);if(n$3(process.cwd(),e,{framework:a.key})!==null)return false}if(i(n,process.cwd())||i$2==="python")return true;if(p(process.cwd()))return false}return true}if(eo(t)||e==="shell"&&o==="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 r=await i$2();return ur(e,r)?true:t.some(n=>pr.has(n))?false:r?r.has(e):!!(a$8.has(e)||t.length>1)}oe.name("rapidkit").description("Create RapidKit workspaces and projects").version(b());var vd=b$1()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev",Pd=v.join(g(),"my-workspace");oe.addHelpText("beforeAll",`RapidKit NPM CLI
|
|
270
270
|
|
|
271
271
|
Create workspaces, scaffold projects, and manage your development toolchain.
|
|
272
|
-
`);
|
|
272
|
+
`);oe.addHelpText("afterAll",`
|
|
273
273
|
Workspace Setup Commands
|
|
274
274
|
rapidkit bootstrap Bootstrap projects in workspace (--profile java-only|python-only|node-only|go-only|dotnet-only|polyglot|enterprise)
|
|
275
275
|
rapidkit analyze Analyze workspace/project health and generate enterprise evidence
|
|
@@ -299,9 +299,9 @@ Quick start:
|
|
|
299
299
|
npx rapidkit my-workspace # Create workspace in ~/rapidkit/workspaces
|
|
300
300
|
npx rapidkit my-workspace --here # Create workspace in the current directory
|
|
301
301
|
npx rapidkit create workspace --output .
|
|
302
|
-
cd ${
|
|
302
|
+
cd ${Pd} # Or cd my-workspace when using --here
|
|
303
303
|
npx rapidkit create project # Interactive kit picker
|
|
304
|
-
${
|
|
304
|
+
${vd} # Install deps + run
|
|
305
305
|
|
|
306
306
|
Notes:
|
|
307
307
|
--here Create workspace in the current directory (alias for --output .)
|
|
@@ -310,34 +310,35 @@ Notes:
|
|
|
310
310
|
It is different from core --skip-essentials (essential module installation).
|
|
311
311
|
|
|
312
312
|
Use "rapidkit help <command>" for more information.
|
|
313
|
-
`);
|
|
313
|
+
`);oe.argument("[name]","Name of the workspace or project directory").addOption(new Option("-t, --template <template>","Legacy: create a project with template (fastapi, nestjs, springboot, gofiber, gogin, dotnet) instead of a workspace").hideHelp()).option("-y, --yes","Skip prompts and use defaults").option("--author <name>","Author/team name for workspace metadata").option("--here","Create workspace in the current directory (same as --output .)").option("--output <dir>","Parent directory for the new workspace folder").addOption(new Option("--skip-git","Skip git initialization").hideHelp()).addOption(new Option("--skip-python-engine","Create a Python-aware workspace without installing rapidkit-core now").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$1)=>{try{e$1.debug&&(f.setDebug(true),f.debug("Debug mode enabled"));let o=await b$2();f.debug("User config loaded",o);let r=await c();f.debug("RapidKit config loaded",r);let n$1=d(o,r,{author:e$1.author,pythonVersion:void 0,skipGit:e$1.skipGit});f.debug("Merged config",n$1),e$1.updateCheck!==false&&await a(),a$1("workspace"),t||(Ca(),process.exit(0));try{h(t);}catch(c){throw c instanceof a$2&&(f.error(`
|
|
314
314
|
\u274C ${c.message}`),c.details&&f.warn(`\u{1F4A1} ${c.details}
|
|
315
|
-
`),process.exit(1)),c}let i=!!e$1.template,a$3;i||(e$1.here?a$3=process.cwd():e$1.output?a$3=
|
|
315
|
+
`),process.exit(1)),c}let i=!!e$1.template,a$3;i||(e$1.here?a$3=process.cwd():e$1.output?a$3=v.resolve(e$1.output):a$3=await n([],{hasYes:e$1.yes}));let l$1=i?v.resolve(process.cwd(),t):l(t,{outputParent:a$3});if(st=l$1,!e$1.dryRun){i||await E__default.ensureDir(v.dirname(l$1));let c=i?void 0:h$1(t);(!i&&m(c,l$1,{outputParent:a$3})&&c&&await E__default.pathExists(c)||await E__default.pathExists(l$1))&&(f.error(`
|
|
316
316
|
\u274C Directory "${t}" already exists`),c&&c!==l$1&&console.log(s.gray(` Found at: ${c}`)),console.log(s.cyan(`
|
|
317
317
|
\u{1F4A1} Choose a different name or delete the existing directory.
|
|
318
318
|
`)),process.exit(1));}if(e$1.dryRun){console.log(s.cyan(`
|
|
319
319
|
\u{1F50D} Dry-run mode - showing what would be created:
|
|
320
320
|
`)),console.log(s.white("\u{1F4C2} Path:"),l$1),console.log(s.white("\u{1F4E6} Type:"),i?`Project (${e$1.template})`:"Workspace"),console.log();return}if(!e$1.yes&&!i?await b$3([{type:"input",name:"author",message:"Author name:",default:process.env.USER||"RapidKit User"}]):e$1.yes&&console.log(s.gray(`Using default values (--yes flag)
|
|
321
|
-
`)),i){let c=String(e$1.template||"").trim(),
|
|
322
|
-
`),f.debug(`Synced Python version ${b.trim()} from workspace to project`);}}catch(b){f.debug("Could not sync Python version from workspace:",b);}}if(!e$1.skipInstall){let
|
|
323
|
-
`),f.debug(`Re-synced Python version ${A.trim()} after init`);}}catch(A){f.debug("Could not re-sync Python version after init:",A);}}}}else {let{createProject:c}=await import('./create-
|
|
321
|
+
`)),i){let c=String(e$1.template||"").trim(),u=b$4(c);if(d$1(u)){let k=await rn(["create","project",u,t,...e$1.skipGit?["--skip-git"]:[]]);k!==0&&process.exit(k);return}if(!!!an(process.cwd())){let{registerWorkspaceAtPath:k}=await import('./create-TPFUONHK.js');if(e$1.createWorkspace)await k(process.cwd(),{skipGit:e$1.skipGit,yes:e$1.yes,userConfig:o});else if(!e$1.noWorkspace)if(e$1.yes)await k(process.cwd(),{skipGit:e$1.skipGit,yes:true,userConfig:o});else {let{createWs:h}=await b$3([{type:"confirm",name:"createWs",message:"This project will be created outside a RapidKit workspace. Create and register a workspace here?",default:true}]);h&&await k(process.cwd(),{skipGit:e$1.skipGit,yes:false,userConfig:o});}}let d=["create","project",u,t,"--output",process.cwd()];e$1.yes&&d.push("--yes");let p=Z(process.cwd()),f$2=!!e$1.skipInstall,g=f$2||!!p;f$2&&d.push("--skip-essentials");let y=g?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0,w=await f$1(d,{cwd:process.cwd(),env:y});w!==0&&process.exit(w),p&&!e$1.skipInstall&&(console.log(s.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(s.white(" Next: cd <project-name> && npx rapidkit init")));let P=an(process.cwd());if(P){let k=v.dirname(P),h=v.join(k,".python-version"),S=v.join(l$1,".python-version");try{if(await E__default.pathExists(h)){let b=j.readFileSync(h,"utf-8");j.writeFileSync(S,b.trim()+`
|
|
322
|
+
`),f.debug(`Synced Python version ${b.trim()} from workspace to project`);}}catch(b){f.debug("Could not sync Python version from workspace:",b);}}if(!e$1.skipInstall){let k=await e(["init",l$1],{cwd:process.cwd()});if(k!==0&&process.exit(k),P){let h=v.dirname(P),S=v.join(h,".python-version"),b=v.join(l$1,".python-version");try{if(await E__default.pathExists(S)){let A=j.readFileSync(S,"utf-8");j.writeFileSync(b,A.trim()+`
|
|
323
|
+
`),f.debug(`Re-synced Python version ${A.trim()} after init`);}}catch(A){f.debug("Could not re-sync Python version after init:",A);}}}}else {let{createProject:c}=await import('./create-TPFUONHK.js');await c(t,{skipGit:e$1.skipGit,skipPythonEngine:e$1.skipPythonEngine,dryRun:e$1.dryRun,yes:e$1.yes,userConfig:n$1,installMethod:e$1.installMethod,profile:e$1.profile,parentDirectory:v.dirname(l$1)}),console.log(s.gray(`\u2139\uFE0F Workspace root: ${l$1}`)),console.log(s.gray(` Next: ${k(l$1)} && npx rapidkit create project`));}}catch(o){o instanceof a$2?(f.error(`
|
|
324
324
|
\u274C ${o.message}`),o.details&&f.warn(`\u{1F4A1} ${o.details}`),f.debug("Error code:",o.code)):(f.error(`
|
|
325
|
-
\u274C An unexpected error occurred:`),console.error(o)),process.exit(1);}finally{it=null;}});_s(ie);Ns(ie);ci(ie);ie.command("commands").description("Show effective RapidKit command ownership and runtime support").option("--json","Emit machine-readable JSON output").action(async t=>{Il({json:t.json});});ie.command("analyze").description("Analyze workspace/project health and generate enterprise-ready evidence").option("--workspace <path>","Workspace/root path to analyze").option("--json","Output as JSON").option("--output <file>","Write JSON report to a file").option("--strict","Treat warnings as blocking in the verdict").action(async t=>{try{let{runAnalyze:e,printAnalyzeReport:o}=await import('./analyze-JYHEGUSH.js'),r=await e({workspacePath:t.workspace,json:t.json===true,output:t.output,strict:t.strict===true});t.json?console.log(JSON.stringify(r,null,2)):o(r),r.summary.verdict==="blocked"&&process.exit(2);}catch(e){let o=e instanceof Error?e.message:String(e);t.json?console.log(JSON.stringify({schemaVersion:"rapidkit-analyze-error-v1",ok:false,error:{message:o}},null,2)):console.error(s.red(`Analyze failed: ${o}`)),process.exit(1);}});ps(ie);ie.command("shell <action>").description("Shell helpers (activate virtualenv in current shell)").action(async t=>{t!=="activate"&&(console.log(s.red(`Unknown shell command: ${t}`)),process.exit(1));let e=process.cwd();function o(c){let f=c;for(;;){let g=w.join(f,".rapidkit","context.json");if(j.existsSync(g))return g;let p=w.dirname(f);if(p===f)break;f=p;}return null}let r=o(e);function n(c){let f=c;for(;;){let g=w.join(f,".venv"),p=w.join(f,".rapidkit","activate");if(j.existsSync(p)||j.existsSync(g))return {venv:g,activateFile:p};let d=w.dirname(f);if(d===f)break;f=d;}return null}let i=n(e);!r&&!i&&(console.log(s.yellow("No RapidKit project found in this directory")),process.exit(1));let a;i&&j.existsSync(i.activateFile)?a=i.activateFile:i&&j.existsSync(i.venv)?a=n$1(i.venv):(console.log(s.yellow("No virtual environment found")),process.exit(1));let l=b$1();console.log(l?`call "${a}"`:`. "${a}"`);});ie.command("readiness").description("\u{1F6A6} Generate machine-readable release readiness summary (env + doctor + analyze + verify + dependency)").option("--json","Output readiness result in JSON format").option("--strict","Exit with code 1 unless overall readiness is pass").option("--skip-verify","Skip verify gate (use for workspaces without extension verify artifacts)").action(async t=>{await b$4({json:t.json,strict:t.strict,skipVerify:t.skipVerify});});ie.command("pipeline").description("\u{1F517} Run governance pipeline: sync \u2192 doctor \u2192 analyze \u2192 readiness \u2192 autopilot (writes pipeline-last-run.json)").option("--json","Output pipeline report as JSON").option("--strict","Treat warnings as blocking and propagate non-zero exit codes").option("--skip-verify","Skip readiness verify gate").option("--skip-analyze","Skip analyze stage").option("--skip-autopilot","Skip autopilot release stage").option("--autopilot-mode <mode>","Autopilot mode when stage is enabled: audit | safe-fix | enforce","audit").option("--no-agent-sync","Skip cross-tool agent grounding sync after pipeline evidence write").option("--agent-sync","Force agent grounding sync after pipeline (default when report is written)").action(async t=>{let e=String(t.autopilotMode||"audit").trim().toLowerCase();["audit","safe-fix","enforce"].includes(e)||(console.log(s.red(`Invalid autopilot mode: ${t.autopilotMode}`)),process.exit(1));let{runPipelineCommand:o}=await import('./pipeline-SU3FJUKI.js');await o({json:t.json===true,strict:t.strict===true,skipVerify:t.skipVerify===true,skipAnalyze:t.skipAnalyze===true,skipAutopilot:t.skipAutopilot===true,autopilotMode:e,noAgentSync:t.noAgentSync===true,agentSync:t.agentSync===true?true:t.noAgentSync?false:void 0});});ie.command("autopilot <action>").description("Run end-to-end release autopilot workflows").option("--mode <mode>","Autopilot mode: audit | safe-fix | enforce","audit").option("--json","Emit machine-readable JSON output").option("--output <file>","Write autopilot report to an additional output path").option("--since <ref>","Git ref for affected project selection (default: HEAD~1)").option("--parallel","Run workspace stage execution in parallel").option("--max-workers <count>","Maximum parallel workers").action(async(t,e)=>{t!=="release"&&(console.log(s.red(`Unknown autopilot action: ${t}`)),console.log(s.gray("Available: release")),process.exit(1));let o=String(e.mode||"audit").trim().toLowerCase();["audit","safe-fix","enforce"].includes(o)||(console.log(s.red(`Invalid autopilot mode: ${e.mode}`)),console.log(s.gray("Allowed modes: audit | safe-fix | enforce")),process.exit(1));let r=Number(e.maxWorkers??""),n=Number.isFinite(r)?Math.max(1,Math.trunc(r)):void 0,{runAutopilotRelease:i}=await import('./autopilot-release-ZADU63OD.js'),a;try{a=await i({workspacePath:process.cwd(),mode:o,since:e.since,parallel:e.parallel===true,maxWorkers:n,json:e.json===true,output:e.output});}catch(l){let c=l instanceof Error?l.message:String(l);console.log(s.red(`Autopilot release failed: ${c}`)),process.exit(3);}e.json&&console.log(JSON.stringify(a,null,2)),a.summary.exitCode!==0&&process.exit(a.summary.exitCode);});ie.command("import <source>").description("Import a local backend project folder or clone a git repository into the current workspace").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--name <projectName>","Override imported project folder name").option("--enable-modules","Enable Core module/template commands for supported runtimes").option("--git","Force source to be treated as a git repository URL").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{let o=await Ll(t,e);o!==0&&process.exit(o);});ie.command("adopt [source]").description("Adopt an existing local project into a RapidKit workspace without moving or copying source").option("--workspace <path>","Workspace root path (defaults to nearest or managed default)").option("--name <projectName>","Override adopted project name").option("--enable-modules","Enable Core module/template commands for supported runtimes").option("--dry-run","Preview adoption without writing project or registry metadata").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{let o=await Kl(t,e);o!==0&&process.exit(o);});var Lo=ie.command("snapshot").description("Create, list, and restore RapidKit workspace snapshots");Lo.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 o=await xt({workspacePath:e.workspace,name:t,reason:e.reason,includeProjects:e.includeProjects===true});if(e.json){console.log(JSON.stringify(o,null,2));return}console.log(s.green(`\u2714 Workspace snapshot created: ${o.manifest.name}`)),console.log(s.gray(` Mode: ${o.manifest.mode}`)),console.log(s.gray(` Path: ${o.snapshotPath}`));}catch(o){console.log(s.red(`\u274C Snapshot create failed: ${o.message}`)),process.exit(1);}});Lo.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 Fs({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 o of e)console.log(s.cyan(o.name)),console.log(s.gray(` ${o.createdAt} | ${o.mode} | ${o.projects.length} project(s)`)),console.log(s.gray(` ${o.snapshotPath}`));}catch(e){console.log(s.red(`\u274C Snapshot list failed: ${e.message}`)),process.exit(1);}});Lo.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 o=await Ws({workspacePath:e.workspace,name:t});if(e.json){console.log(JSON.stringify(o,null,2));return}console.log(s.cyan(`Snapshot: ${o.manifest.name}`)),console.log(s.gray(` Mode: ${o.manifest.mode}`)),console.log(s.gray(` Created: ${o.manifest.createdAt}`)),console.log(s.gray(` Projects: ${o.manifest.projects.length}`)),console.log(s.gray(` Files: ${o.estimatedFileCount}`)),console.log(s.gray(` Bytes: ${o.estimatedBytes}`)),console.log(s.gray(` Path: ${o.snapshotPath}`));}catch(o){console.log(s.red(`\u274C Snapshot inspect failed: ${o.message}`)),process.exit(1);}});Lo.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 o=await Js({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(o,null,2));return}o.dryRun?console.log(s.cyan(`Snapshot restore dry-run: ${t}`)):console.log(s.green(`\u2714 Workspace snapshot restored: ${t}`)),console.log(s.gray(` Snapshot: ${o.snapshotPath}`)),console.log(s.gray(` Restored paths: ${o.restoredPaths.join(", ")}`)),o.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${o.safetySnapshotPath}`));}catch(o){console.log(s.red(`\u274C Snapshot restore failed: ${o.message}`)),process.exit(1);}});var Bt=ie.command("project").description("Safe workspace project lifecycle operations");Bt.command("commands").description("Show effective commands supported by the current RapidKit project").option("--json","Emit machine-readable JSON output").action(async t=>{ea({json:t.json});});Bt.command("archives").description("List archived workspace projects").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--json","Emit machine-readable JSON output").action(async t=>{try{let e=await Pr({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 o of e)console.log(s.cyan(o.projectName)),console.log(s.gray(` Archived: ${o.archivedAt}`)),console.log(s.gray(` Path: ${o.archivePath}`)),o.reason&&console.log(s.gray(` Reason: ${o.reason}`));}catch(e){console.log(s.red(`\u274C Project archive list failed: ${e.message}`)),process.exit(1);}});Bt.command("archive <project>").description("Move a project into .rapidkit/archive with a safety snapshot").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--reason <text>","Reason recorded in the archive manifest").option("--dry-run","Show what would be archived without changing files").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let o=await br({workspacePath:e.workspace,project:t,reason:e.reason,dryRun:e.dryRun===true||process.argv.includes("--dry-run")});if(e.json){console.log(JSON.stringify(o,null,2));return}console.log(o.dryRun?s.cyan(`Project archive dry-run: ${o.projectName}`):s.green(`\u2714 Project archived: ${o.projectName}`)),console.log(s.gray(` From: ${o.projectPath}`)),o.archivePath&&console.log(s.gray(` To: ${o.archivePath}`)),o.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${o.safetySnapshotPath}`));}catch(o){console.log(s.red(`\u274C Project archive failed: ${o.message}`)),process.exit(1);}});Bt.command("restore <archive>").description("Restore an archived project back into the workspace").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--name <projectName>","Restore using a new project folder name").option("--reason <text>","Reason recorded in the audit log").option("--force","Overwrite an existing restore target").option("--dry-run","Show what would be restored without changing files").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let o=await Vs({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(o,null,2));return}console.log(o.dryRun?s.cyan(`Project restore dry-run: ${o.projectName}`):s.green(`\u2714 Project restored: ${o.projectName}`)),console.log(s.gray(` From: ${o.archivePath}`)),console.log(s.gray(` To: ${o.projectPath}`)),o.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${o.safetySnapshotPath}`));}catch(o){console.log(s.red(`\u274C Project restore failed: ${o.message}`)),process.exit(1);}});Bt.command("delete <project>").description("Archive by default; permanently delete only with --permanent and exact --confirm").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--reason <text>","Reason recorded in the safety snapshot/archive manifest").option("--permanent","Permanently delete the project directory").option("--confirm <projectName>","Required exact project name for --permanent").option("--dry-run","Show what would be deleted without changing files").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let o=await Us({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(o,null,2));return}let r=o.action==="archive"?"archived":"deleted";console.log(o.dryRun?s.cyan(`Project ${r} dry-run: ${o.projectName}`):s.green(`\u2714 Project ${r}: ${o.projectName}`)),console.log(s.gray(` Path: ${o.projectPath}`)),o.archivePath&&console.log(s.gray(` Archive: ${o.archivePath}`)),o.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${o.safetySnapshotPath}`));}catch(o){console.log(s.red(`\u274C Project delete failed: ${o.message}`)),process.exit(1);}});ie.command("doctor [scope]").description("\u{1FA7A} Check RapidKit system health by default; use workspace or project for scoped checks").option("--workspace [path]","Check entire workspace, optionally from an explicit workspace path").option("--project","Check only the current project (or nearest parent project)").option("--json","Output results in JSON format (for CI/CD pipelines)").option("--strict","Exit 1 on health errors or warnings (workspace/project scope)").option("--ci","CI gate: exit 1 on errors, exit 2 on warnings only").option("--profile <profile>","Doctor policy profile: local | ci | release | enterprise-strict").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 o=new Set(["local","ci","release","enterprise-strict"]);e.profile&&!o.has(e.profile)&&(console.log(s.red(`Invalid doctor profile: ${e.profile}. Use local, ci, release, or enterprise-strict.`)),process.exit(1));let r=await $l({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:n}=await import('./doctor-KYNACWFC.js'),i=await n({...e,workspace:e.workspace||t==="workspace",project:e.project||t==="project",strict:e.strict===true,ci:e.ci===true,profile:e.profile});i!==0&&process.exit(i);});ie.command("workspace <action> [subaction] [key] [value]").description(`Manage RapidKit workspaces (list, sync, policy, share, export, run, intelligence)
|
|
325
|
+
\u274C An unexpected error occurred:`),console.error(o)),process.exit(1);}finally{st=null;}});Gs(oe);qs(oe);bi(oe);oe.command("commands").description("Show effective RapidKit command ownership and runtime support").option("--json","Emit machine-readable JSON output").action(async t=>{td({json:t.json});});oe.command("analyze").description("Analyze workspace/project health and generate enterprise-ready evidence").option("--workspace <path>","Workspace/root path to analyze").option("--json","Output as JSON").option("--output <file>","Write JSON report to a file").option("--strict","Treat warnings as blocking in the verdict").action(async t=>{try{let{runAnalyze:e,printAnalyzeReport:o}=await import('./analyze-XSPWKPA4.js'),r=await e({workspacePath:t.workspace,json:t.json===true,output:t.output,strict:t.strict===true});t.json?console.log(JSON.stringify(r,null,2)):o(r),r.summary.verdict==="blocked"&&process.exit(2);}catch(e){let o=e instanceof Error?e.message:String(e);t.json?console.log(JSON.stringify({schemaVersion:"rapidkit-analyze-error-v1",ok:false,error:{message:o}},null,2)):console.error(s.red(`Analyze failed: ${o}`)),process.exit(1);}});xs(oe);oe.command("shell <action>").description("Shell helpers (activate virtualenv in current shell)").action(async t=>{t!=="activate"&&(console.log(s.red(`Unknown shell command: ${t}`)),process.exit(1));let e=process.cwd();function o(c){let u=c;for(;;){let m=v.join(u,".rapidkit","context.json");if(j.existsSync(m))return m;let d=v.dirname(u);if(d===u)break;u=d;}return null}let r=o(e);function n(c){let u=c;for(;;){let m=v.join(u,".venv"),d=v.join(u,".rapidkit","activate");if(j.existsSync(d)||j.existsSync(m))return {venv:m,activateFile:d};let p=v.dirname(u);if(p===u)break;u=p;}return null}let i=n(e);!r&&!i&&(console.log(s.yellow("No RapidKit project found in this directory")),process.exit(1));let a;i&&j.existsSync(i.activateFile)?a=i.activateFile:i&&j.existsSync(i.venv)?a=n$1(i.venv):(console.log(s.yellow("No virtual environment found")),process.exit(1));let l=b$1();console.log(l?`call "${a}"`:`. "${a}"`);});oe.command("readiness").description("\u{1F6A6} Generate machine-readable release readiness summary (env + doctor + analyze + verify + dependency)").option("--json","Output readiness result in JSON format").option("--strict","Exit with code 1 unless overall readiness is pass").option("--skip-verify","Skip verify gate (use for workspaces without extension verify artifacts)").action(async t=>{await b$5({json:t.json,strict:t.strict,skipVerify:t.skipVerify});});oe.command("pipeline").description("\u{1F517} Run governance pipeline: sync \u2192 doctor \u2192 analyze \u2192 readiness \u2192 autopilot (writes pipeline-last-run.json)").option("--json","Output pipeline report as JSON").option("--strict","Treat warnings as blocking and propagate non-zero exit codes").option("--skip-verify","Skip readiness verify gate").option("--skip-analyze","Skip analyze stage").option("--skip-autopilot","Skip autopilot release stage").option("--autopilot-mode <mode>","Autopilot mode when stage is enabled: audit | safe-fix | enforce","audit").option("--no-agent-sync","Skip cross-tool agent grounding sync after pipeline evidence write").option("--agent-sync","Force agent grounding sync after pipeline (default when report is written)").action(async t=>{let e=String(t.autopilotMode||"audit").trim().toLowerCase();["audit","safe-fix","enforce"].includes(e)||(console.log(s.red(`Invalid autopilot mode: ${t.autopilotMode}`)),process.exit(1));let{runPipelineCommand:o}=await import('./pipeline-PX6ZUINW.js');await o({json:t.json===true,strict:t.strict===true,skipVerify:t.skipVerify===true,skipAnalyze:t.skipAnalyze===true,skipAutopilot:t.skipAutopilot===true,autopilotMode:e,noAgentSync:t.noAgentSync===true,agentSync:t.agentSync===true?true:t.noAgentSync?false:void 0});});oe.command("autopilot <action>").description("Run end-to-end release autopilot workflows").option("--mode <mode>","Autopilot mode: audit | safe-fix | enforce","audit").option("--json","Emit machine-readable JSON output").option("--output <file>","Write autopilot report to an additional output path").option("--since <ref>","Git ref for affected project selection (default: HEAD~1)").option("--parallel","Run workspace stage execution in parallel").option("--max-workers <count>","Maximum parallel workers").action(async(t,e)=>{t!=="release"&&(console.log(s.red(`Unknown autopilot action: ${t}`)),console.log(s.gray("Available: release")),process.exit(1));let o=String(e.mode||"audit").trim().toLowerCase();["audit","safe-fix","enforce"].includes(o)||(console.log(s.red(`Invalid autopilot mode: ${e.mode}`)),console.log(s.gray("Allowed modes: audit | safe-fix | enforce")),process.exit(1));let r=Number(e.maxWorkers??""),n=Number.isFinite(r)?Math.max(1,Math.trunc(r)):void 0,{runAutopilotRelease:i}=await import('./autopilot-release-5J55NPXF.js'),a;try{a=await i({workspacePath:process.cwd(),mode:o,since:e.since,parallel:e.parallel===true,maxWorkers:n,json:e.json===true,output:e.output});}catch(l){let c=l instanceof Error?l.message:String(l);console.log(s.red(`Autopilot release failed: ${c}`)),process.exit(3);}e.json&&console.log(JSON.stringify(a,null,2)),a.summary.exitCode!==0&&process.exit(a.summary.exitCode);});oe.command("import <source>").description("Import a local backend project folder or clone a git repository into the current workspace").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--name <projectName>","Override imported project folder name").option("--enable-modules","Preserve Core module/template commands only when imported RapidKit metadata already supports them").option("--git","Force source to be treated as a git repository URL").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{let o=await pd(t,e);o!==0&&process.exit(o);});oe.command("adopt [source]").description("Adopt an existing local project into a RapidKit workspace without moving or copying source").option("--workspace <path>","Workspace root path (defaults to nearest or managed default)").option("--name <projectName>","Override adopted project name").option("--enable-modules","Preserve Core module/template commands only when adopted RapidKit metadata already supports them").option("--dry-run","Preview adoption without writing project or registry metadata").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{let o=await ud(t,e);o!==0&&process.exit(o);});var Qo=oe.command("snapshot").description("Create, list, and restore RapidKit workspace snapshots");Qo.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 o=await Rt({workspacePath:e.workspace,name:t,reason:e.reason,includeProjects:e.includeProjects===true});if(e.json){console.log(JSON.stringify(o,null,2));return}console.log(s.green(`\u2714 Workspace snapshot created: ${o.manifest.name}`)),console.log(s.gray(` Mode: ${o.manifest.mode}`)),console.log(s.gray(` Path: ${o.snapshotPath}`));}catch(o){console.log(s.red(`\u274C Snapshot create failed: ${o.message}`)),process.exit(1);}});Qo.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 Zs({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 o of e)console.log(s.cyan(o.name)),console.log(s.gray(` ${o.createdAt} | ${o.mode} | ${o.projects.length} project(s)`)),console.log(s.gray(` ${o.snapshotPath}`));}catch(e){console.log(s.red(`\u274C Snapshot list failed: ${e.message}`)),process.exit(1);}});Qo.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 o=await Xs({workspacePath:e.workspace,name:t});if(e.json){console.log(JSON.stringify(o,null,2));return}console.log(s.cyan(`Snapshot: ${o.manifest.name}`)),console.log(s.gray(` Mode: ${o.manifest.mode}`)),console.log(s.gray(` Created: ${o.manifest.createdAt}`)),console.log(s.gray(` Projects: ${o.manifest.projects.length}`)),console.log(s.gray(` Files: ${o.estimatedFileCount}`)),console.log(s.gray(` Bytes: ${o.estimatedBytes}`)),console.log(s.gray(` Path: ${o.snapshotPath}`));}catch(o){console.log(s.red(`\u274C Snapshot inspect failed: ${o.message}`)),process.exit(1);}});Qo.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 o=await ei({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(o,null,2));return}o.dryRun?console.log(s.cyan(`Snapshot restore dry-run: ${t}`)):console.log(s.green(`\u2714 Workspace snapshot restored: ${t}`)),console.log(s.gray(` Snapshot: ${o.snapshotPath}`)),console.log(s.gray(` Restored paths: ${o.restoredPaths.join(", ")}`)),o.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${o.safetySnapshotPath}`));}catch(o){console.log(s.red(`\u274C Snapshot restore failed: ${o.message}`)),process.exit(1);}});var to=oe.command("project").description("Safe workspace project lifecycle operations");to.command("commands").description("Show effective commands supported by the current RapidKit project").option("--json","Emit machine-readable JSON output").action(async t=>{wa({json:t.json});});to.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 Ar({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 o of e)console.log(s.cyan(o.projectName)),console.log(s.gray(` Archived: ${o.archivedAt}`)),console.log(s.gray(` Path: ${o.archivePath}`)),o.reason&&console.log(s.gray(` Reason: ${o.reason}`));}catch(e){console.log(s.red(`\u274C Project archive list failed: ${e.message}`)),process.exit(1);}});to.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 o=await Ir({workspacePath:e.workspace,project:t,reason:e.reason,dryRun:e.dryRun===true||process.argv.includes("--dry-run")});if(e.json){console.log(JSON.stringify(o,null,2));return}console.log(o.dryRun?s.cyan(`Project archive dry-run: ${o.projectName}`):s.green(`\u2714 Project archived: ${o.projectName}`)),console.log(s.gray(` From: ${o.projectPath}`)),o.archivePath&&console.log(s.gray(` To: ${o.archivePath}`)),o.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${o.safetySnapshotPath}`));}catch(o){console.log(s.red(`\u274C Project archive failed: ${o.message}`)),process.exit(1);}});to.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 o=await si({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(o,null,2));return}console.log(o.dryRun?s.cyan(`Project restore dry-run: ${o.projectName}`):s.green(`\u2714 Project restored: ${o.projectName}`)),console.log(s.gray(` From: ${o.archivePath}`)),console.log(s.gray(` To: ${o.projectPath}`)),o.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${o.safetySnapshotPath}`));}catch(o){console.log(s.red(`\u274C Project restore failed: ${o.message}`)),process.exit(1);}});to.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 o=await ni({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(o,null,2));return}let r=o.action==="archive"?"archived":"deleted";console.log(o.dryRun?s.cyan(`Project ${r} dry-run: ${o.projectName}`):s.green(`\u2714 Project ${r}: ${o.projectName}`)),console.log(s.gray(` Path: ${o.projectPath}`)),o.archivePath&&console.log(s.gray(` Archive: ${o.archivePath}`)),o.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${o.safetySnapshotPath}`));}catch(o){console.log(s.red(`\u274C Project delete failed: ${o.message}`)),process.exit(1);}});oe.command("doctor [scope]").description("\u{1FA7A} Check RapidKit system health by default; use workspace or project for scoped checks").option("--workspace [path]","Check entire workspace, optionally from an explicit workspace path").option("--project","Check only the current project (or nearest parent project)").option("--json","Output results in JSON format (for CI/CD pipelines)").option("--strict","Exit 1 on health errors or warnings (workspace/project scope)").option("--ci","CI gate: exit 1 on errors, exit 2 on warnings only").option("--profile <profile>","Doctor policy profile: local | ci | release | enterprise-strict").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 o=new Set(["local","ci","release","enterprise-strict"]);e.profile&&!o.has(e.profile)&&(console.log(s.red(`Invalid doctor profile: ${e.profile}. Use local, ci, release, or enterprise-strict.`)),process.exit(1));let r=await od({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:n}=await import('./doctor-O2B3XNAB.js'),i=await n({...e,workspace:e.workspace||t==="workspace",project:e.project||t==="project",strict:e.strict===true,ci:e.ci===true,profile:e.profile});i!==0&&process.exit(i);});oe.command("workspace <action> [subaction] [key] [value]").description(`Manage RapidKit workspaces (list, sync, policy, share, export, run, intelligence)
|
|
326
326
|
workspace run <stage> \u2014 fleet stage execution across discovered projects
|
|
327
327
|
stages: init | test | build | start | <custom-from-context>
|
|
328
328
|
workspace explain|why \u2014 blocker/project narrative (--write for artifact)
|
|
329
329
|
workspace trace \u2014 diff \u2192 blast radius \u2192 gates narrative (--from <diff>)
|
|
330
|
-
workspace mcp serve \u2014 read-mostly stdio MCP bridge over workspace evidence`).option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--output <file>","Output file path for workspace share bundle").option("--from <file>","Input workspace model snapshot/report for workspace diff").option("--from-impact <file>","Input workspace impact report for workspace verify (defaults to last-run impact)").option("--include-paths","Include absolute paths in workspace share bundle").option("--write","Write workspace intelligence artifact to .rapidkit/reports").option("--include-evidence","Read status metadata from referenced evidence reports").option("--scan-depth <count>","Observable project discovery depth for large monorepos").option("--cache","Reuse cached workspace model when inputs are unchanged (keyed by inputsHash)").option("--incremental","Rebuild only changed projects and re-infer only their incident graph edges (graph-aware)").option("--once","For workspace watch: do the initial in-memory build and exit (no watcher)").option("--for-agent [agent]","Build an agent-ready workspace context pack").option("--agent-sync","After --write on context, sync cross-tool agent grounding files (AGENTS.md, Copilot, Cursor, Claude)").option("--no-agent-sync","Skip automatic agent grounding sync after context --write").option("--target <targets>","Agent customization targets for agent-sync (all|vscode|agents,copilot,cursor,claude,codex,orca)").option("--preset <preset>","Agent customization pack preset for agent-sync (minimal|enterprise)").option("--refresh-context","Rebuild workspace-context-agent.json during agent-sync").option("--experimental-hooks","Generate advisory VS Code agent hook design files during enterprise agent-sync").option("--hydrate-prompts","Hydrate matching Copilot prompt files with workspace-specific verification steps during agent-sync").option("--scope <scope>","Scope workspace intelligence output, e.g. project:<name>").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("--refresh","Publish workspace registry summary before reading status").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("--reuse-passed","Skip projects that already passed this stage in workspace-run-last.json").option("--json","Emit machine-readable JSON output").option("--ci","Build CI-oriented command plans where supported").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,o,r){let n=this.opts(),i=c=>{let g=(n.workspace?w.resolve(n.workspace):null)??a$6(process.cwd())??oe(process.cwd());(!g||!Ke(g))&&(console.log(s.red("\u274C Not inside a RapidKit workspace")),console.log(s.gray("\u{1F4A1} Run from a workspace directory or pass --workspace <path>.")),process.exit(1));let p=w.resolve(process.cwd()),d=w.resolve(g);return p!==d&&!n.json&&console.log(s.gray(`\u2139 Using workspace root ${g} for "${c}" (current directory: ${p}).`)),g},a=c=>process.argv.includes(c),l=()=>{if(!n.scanDepth)return;let c=Number.parseInt(n.scanDepth,10);return Number.isFinite(c)?c:void 0};if((fi(t)||t==="trace"||t==="feedback"||t==="mcp")&&d$1({action:t,status:"started",message:`workspace ${t} started`,metadata:{json:n.json===true||a("--json"),strict:n.strict===true||a("--strict")}}),t==="list"){let{listWorkspaces:c}=await import('./workspace-5DKOA7TN.js');await c({json:n.json===true||a("--json")});}else if(t==="model"){let c=i("model"),{buildWorkspaceModelCached:f,buildWorkspaceModelIncremental:g,writeWorkspaceModel:p}=await import('./workspace-model-YAC5BKLL.js'),d=n.incremental===true||a("--incremental"),u=n.cache===true||a("--cache")||d,m={workspacePath:c,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:l(),strict:n.strict===true||a("--strict")},h,k;if(d){let y=await g(m);h=y.model,k=y.mode;}else {let y=await f({...m,cache:u});h=y.model,k=y.cache;}let P;(n.write===true||a("--write"))&&(P=await p(h,c));let v=(n.strict===true||a("--strict"))&&h.validation?.status!=="passed";if(n.json){console.log(JSON.stringify({...h,...P?{outputPath:P}:{}},null,2)),v&&process.exit(1);return}console.log(s.green(`\u2714 Workspace model: ${h.workspace.name}`)),d?console.log(s.gray(` Build: ${k} (incremental)`)):u&&console.log(s.gray(` Cache: ${k}`)),console.log(s.gray(` Projects: ${h.summary.projectCount}`)),console.log(s.gray(` Runtimes: ${h.summary.runtimes.join(", ")||"none"}`)),console.log(s.gray(` Frameworks: ${h.summary.frameworks.join(", ")||"none"}`)),console.log(s.gray(` Workspace type: ${h.identity.workspaceType}`)),console.log(s.gray(` Validation: ${h.validation?.status??"unknown"} (${h.validation?.errors??0} error, ${h.validation?.warnings??0} warning)`)),console.log(P?s.gray(` Written: ${P}`):s.gray(" Add --write to persist .rapidkit/reports/workspace-model.json")),v&&process.exit(1);}else if(t==="agent-sync"){let c=i("agent-sync"),{syncWorkspaceAgentGrounding:f,parseAgentGroundingTargets:g}=await import('./workspace-agent-sync-HZ4UBSZ2.js'),p=n.strict===true||a("--strict"),d=n.write===true||a("--write"),u=a("--dry-run"),m=await f({workspacePath:c,scope:n.scope,agent:n.forAgent,write:d&&!u,dryRun:u,strict:p,preset:n.preset==="minimal"?"minimal":"enterprise",refreshContext:n.refreshContext===true||a("--refresh-context")||a("--refresh"),targets:g(n.target),experimentalHooks:n.experimentalHooks===true||a("--experimental-hooks"),hydratePrompts:n.hydratePrompts===true||a("--hydrate-prompts"),staleAfterHours:24});if(n.json)console.log(JSON.stringify(m,null,2));else {console.log(s.green(`\u2714 Agent grounding ${d&&!u?"synced":"planned"}`)),console.log(s.gray(` Index: ${m.indexPath}`)),m.contextPath&&console.log(s.gray(` Context: ${m.contextPath}`)),m.blockers.length>0&&console.log(s.yellow(` Blockers: ${m.blockers.slice(0,3).join(" \xB7 ")}`));let h=d&&!u?m.writtenFiles:m.skippedFiles;if(h.length>0&&console.log(s.gray(` Files: ${h.join(", ")}`)),m.strictViolations.length>0)for(let k of m.strictViolations)console.log(s.red(`\u274C ${k}`));}p&&m.strictViolations.length>0&&process.exit(1);}else if(t==="remediation-plan"){let c=i("remediation-plan"),{buildArtifactRemediationPlan:f,writeArtifactRemediationPlan:g}=await import('./artifact-remediation-plan-HRR3WH7T.js'),p=await f({workspacePath:c,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),ciMode:n.ci===true||a("--ci")}),d;if((n.write===true||a("--write"))&&(d=await g(p,c)),n.json===true||a("--json")){console.log(JSON.stringify({...p,...d?{outputPath:d}:{}},null,2));return}console.log(s.green(`\u2714 Artifact remediation plan: ${p.workspace.name}`)),console.log(s.gray(` Artifacts scanned: ${p.summary.artifactsScanned}`)),console.log(s.gray(` Cards covered: ${p.summary.cardsCovered}`)),console.log(s.gray(` CI mode: ${p.source.ciMode?"yes":"no"}`)),console.log(s.gray(` Actions: ${p.summary.totalActions}`)),console.log(s.gray(` Risk: safe=${p.summary.risk.safe}, guarded=${p.summary.risk.guarded}, invasive=${p.summary.risk.invasive}`));for(let u of p.actions.slice(0,8))console.log(s.gray(` \u2022 ${u.cardId}: ${u.title} (${u.mode}, ${u.risk})`));p.actions.length>8&&console.log(s.gray(` \u2026 ${p.actions.length-8} more action(s)`)),console.log(d?s.gray(` Written: ${d}`):s.gray(" Add --write to persist .rapidkit/reports/artifact-remediation-plan-last-run.json"));}else if(t==="context"){let c=i("context");n.forAgent!==true&&typeof n.forAgent!="string"&&e!=="agent"&&(console.log(s.red("\u274C workspace context currently requires --for-agent")),console.log(s.gray(" npx rapidkit workspace context --for-agent --json [--scope project:<name>]")),process.exit(1));let{buildWorkspaceAgentContext:f,writeWorkspaceAgentContext:g}=await import('./workspace-context-R3XWWLFP.js'),p=n.strict===true||a("--strict"),d=await f({workspacePath:c,agent:n.forAgent||o||e,scope:n.scope,includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:l(),strict:false}),u,m;if((n.write===true||a("--write"))&&(u=await g(d,c),(n.agentSync===true||a("--agent-sync")||n.noAgentSync!==true)&&!a("--no-agent-sync"))){let{syncWorkspaceAgentGrounding:P,parseAgentGroundingTargets:v}=await import('./workspace-agent-sync-HZ4UBSZ2.js');if(m=await P({workspacePath:c,scope:n.scope,agent:d.agent,write:true,refreshContext:false,strict:p,preset:n.preset==="minimal"?"minimal":"enterprise",targets:v(n.target)}),n.json||console.log(s.gray(` Agent grounding synced: ${m.writtenFiles.length} file(s) updated`)),p&&m.strictViolations.length>0){for(let y of m.strictViolations)console.log(s.red(`\u274C ${y}`));process.exit(1);}}let h=p&&d.validation.status!=="passed";if(n.json){console.log(JSON.stringify({...d,...u?{outputPath:u}:{},...m?{agentGroundingSync:m}:{}},null,2)),h&&process.exit(1);return}if(console.log(s.green(`\u2714 Workspace context: ${d.workspace.name}`)),console.log(s.gray(` Agent: ${d.agent}`)),console.log(s.gray(` Scope: ${d.scope.activeProject??d.scope.requested}`)),console.log(s.gray(` Projects included: ${d.projects.length}`)),console.log(s.gray(` Safe commands: ${d.safeCommands.length}`)),console.log(s.gray(` Validation: ${d.validation.status} (${d.validation.errors} error, ${d.validation.warnings} warning)`)),console.log(u?s.gray(` Written: ${u}`):s.gray(" Add --write to persist .rapidkit/reports/workspace-context-agent.json")),h){for(let k of d.validation.issues)console.log(s.red(`\u274C ${k.severity}:${k.code}:${k.target}`));process.exit(1);}}else if(t==="snapshot"){let c=i("snapshot"),{buildWorkspaceModelSnapshot:f,writeWorkspaceModelSnapshot:g}=await import('./workspace-intelligence-5BBKUJAG.js'),p=await f({workspacePath:c,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:l()}),d=await g(p,c);if(n.json){console.log(JSON.stringify({...p,outputPath:d},null,2));return}console.log(s.green(`\u2714 Workspace model snapshot: ${p.model.workspace.name}`)),console.log(s.gray(` Hash: ${p.modelHash}`)),console.log(s.gray(` Projects: ${p.model.summary.projectCount}`)),console.log(s.gray(` Workspace type: ${p.model.identity.workspaceType}`)),console.log(s.gray(` Written: ${d}`));}else if(t==="diff"){let c=i("diff"),f=n.from||e;f||((n.json===true||a("--json"))&&(console.log(JSON.stringify({schemaVersion:"workspace-diff-error-v1",command:"workspace diff",status:"error",workspacePath:c,error:{code:"workspace.diff.from.required",message:"workspace diff requires --from <snapshot-or-model-report|git[:ref]>."},examples:["npx rapidkit workspace diff --from .rapidkit/reports/workspace-model-snapshot.json --json","npx rapidkit workspace diff --from .rapidkit/reports/workspace-model.json --json","npx rapidkit workspace diff --from git --json"]},null,2)),process.exit(1)),console.log(s.red("\u274C workspace diff requires --from <snapshot-or-model-report|git[:ref]>")),console.log(s.gray(" npx rapidkit workspace diff --from .rapidkit/reports/workspace-model-snapshot.json --json")),console.log(s.gray(" npx rapidkit workspace diff --from .rapidkit/reports/workspace-model.json --json")),console.log(s.gray(" npx rapidkit workspace impact --from .rapidkit/reports/workspace-model-diff-last-run.json --json")),console.log(s.gray(" npx rapidkit workspace diff --from git --json (uses snapshot baseline + git working tree)")),process.exit(1));let{diffWorkspaceModel:g,writeWorkspaceModelDiff:p}=await import('./workspace-intelligence-5BBKUJAG.js'),d;try{d=await g({workspacePath:c,fromPath:f,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:l()});}catch(h){throw (n.json===true||a("--json"))&&(console.log(JSON.stringify({schemaVersion:"workspace-diff-error-v1",command:"workspace diff",status:"error",workspacePath:c,fromPath:f,error:{code:"workspace.diff.input_unreadable",message:h.message},nextActions:["npx rapidkit workspace snapshot create --json","npx rapidkit workspace diff --from .rapidkit/reports/workspace-model-snapshot.json --json"]},null,2)),process.exit(1)),h}let u=await p(d,c);if(n.json){console.log(JSON.stringify({...d,outputPath:u},null,2));return}let m=d.summary.changed?s.yellow:s.green;console.log(m(`\u2714 Workspace model diff: ${d.summary.changed?"changed":"clean"}`)),console.log(s.gray(` From: ${d.fromRef}`)),console.log(s.gray(` Added projects: ${d.summary.addedProjects}`)),console.log(s.gray(` Removed projects: ${d.summary.removedProjects}`)),console.log(s.gray(` Changed projects: ${d.summary.changedProjects}`)),console.log(s.gray(` Workspace changes: ${d.summary.workspaceChanges}`)),console.log(s.gray(` Validation changes: ${d.summary.validationChanges}`)),d.git?.available&&console.log(s.gray(` Git: ${d.git.dirty?"dirty":"clean"} (${d.summary.gitChangedFiles} mapped change(s))`));for(let h of d.changes.slice(0,12))console.log(s.gray(` \u2022 ${h.type} ${h.target}: ${h.message}`));d.changes.length>12&&console.log(s.gray(` \u2026 ${d.changes.length-12} more change(s)`)),console.log(s.gray(` Written: ${u}`));}else if(t==="impact"){let c=i("impact"),f=n.from||e;f||((n.json===true||a("--json"))&&(console.log(JSON.stringify({schemaVersion:"workspace-impact-error-v1",command:"workspace impact",status:"error",workspacePath:c,error:{code:"workspace.impact.from.required",message:"workspace impact requires --from <workspace-diff-report>."},examples:["npx rapidkit workspace diff --from .rapidkit/reports/workspace-model-snapshot.json --json","npx rapidkit workspace impact --from .rapidkit/reports/workspace-model-diff-last-run.json --json"]},null,2)),process.exit(1)),console.log(s.red("\u274C workspace impact requires --from <snapshot-model-or-diff-report>")),console.log(s.gray(" npx rapidkit workspace impact --from .rapidkit/reports/workspace-model-diff-last-run.json --json")),process.exit(1));let{buildWorkspaceImpact:g,writeWorkspaceImpact:p}=await import('./workspace-intelligence-5BBKUJAG.js'),d;try{d=await g({workspacePath:c,fromPath:f,scope:n.scope,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:l()});}catch(h){throw (n.json===true||a("--json"))&&(console.log(JSON.stringify({schemaVersion:"workspace-impact-error-v1",command:"workspace impact",status:"error",workspacePath:c,fromPath:f,error:{code:"workspace.impact.input_unreadable",message:h.message},nextActions:["npx rapidkit workspace snapshot create --json","npx rapidkit workspace diff --from .rapidkit/reports/workspace-model-snapshot.json --json","npx rapidkit workspace impact --from .rapidkit/reports/workspace-model-diff-last-run.json --json"]},null,2)),process.exit(1)),h}let u=await p(d,c);if(n.json){console.log(JSON.stringify({...d,outputPath:u},null,2));return}let m=d.summary.risk==="critical"||d.summary.risk==="high"?s.red:d.summary.risk==="medium"?s.yellow:s.green;console.log(m(`\u2714 Workspace impact: ${d.summary.risk}`)),console.log(s.gray(` From: ${d.fromRef}`)),console.log(s.gray(` Affected projects: ${d.summary.affectedProjects}`)),console.log(s.gray(` Workspace items: ${d.summary.workspaceItems}`)),console.log(s.gray(` Recommended commands: ${d.summary.recommendedCommands}`));for(let h of d.affectedProjects.slice(0,8))console.log(s.gray(` \u2022 ${h.title}: ${h.summary}`));d.affectedProjects.length>8&&console.log(s.gray(` \u2026 ${d.affectedProjects.length-8} more project(s)`)),console.log(s.gray(` Written: ${u}`));}else if(t==="verify"){let c=i("verify"),{buildWorkspaceVerify:f,writeWorkspaceVerify:g,evaluateWorkspaceVerifyGate:p}=await import('./workspace-verify-5RZSDKGR.js'),d=await f({workspacePath:c,fromImpactPath:n.fromImpact||e,scope:n.scope,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:l()}),u=await g(d,c),m=p(d,{strict:n.strict===true||a("--strict")}),h=m.exitCode,{recordWorkspaceHistory:k,historyEntryFromVerify:P}=await import('./workspace-history-DSCH7PQZ.js');if(await k(c,P(d,m.passed)),n.json){console.log(JSON.stringify({...d,gate:m,outputPath:u},null,2)),h!==0&&process.exit(h);return}let v=d.summary.verdict==="ready"?s.green:d.summary.verdict==="needs-attention"?s.yellow:s.red;console.log(v(`\u2714 Workspace verify: ${d.summary.verdict}`)),console.log(s.gray(` Freshness: ${d.freshness.verdict}`)),console.log(s.gray(` Impact risk: ${d.impact.risk}`)),console.log(s.gray(` Steps: ${d.steps.length}`)),console.log(s.gray(` Passed ${d.summary.stepsPassed}, warn ${d.summary.stepsWarn}, failed ${d.summary.stepsFailed}, missing ${d.summary.stepsMissing}`));for(let y of d.steps.slice(0,10))console.log(s.gray(` \u2022 ${y.id}: ${y.status} \u2014 ${y.message}`));if(d.steps.length>10&&console.log(s.gray(` \u2026 ${d.steps.length-10} more step(s)`)),d.policyViolations.length>0){console.log(s.gray(` Policy (${d.policyMode}): ${d.policyViolations.length} violation(s)`));for(let y of d.policyViolations.slice(0,5)){let S=y.severity==="error"?s.red("\u2717"):s.yellow("!");console.log(` ${S} [${y.source}] ${y.code}: ${y.message}`);}}console.log(s.gray(` Gate (${m.mode}): ${m.passed?"passed":"blocked"}`));for(let y of m.reasons.slice(0,5))console.log(s.red(` \u2717 ${y}`));console.log(s.gray(` Written: ${u}`)),h!==0&&process.exit(h);}else if(t==="graph"){let c=i("graph"),{buildWorkspaceModel:f}=await import('./workspace-model-YAC5BKLL.js'),{buildGraphEmit:g,renderGraphDot:p,renderGraphMermaid:d,explainGraphNode:u}=await import('./workspace-graph-2A5THUCI.js'),h=(await f({workspacePath:c,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:l()})).graph,k=(e||"emit").toLowerCase();if(h||(n.json&&(console.log(JSON.stringify({command:"workspace graph",action:k,result:"error",workspacePath:c,timestamp:new Date().toISOString(),error:{code:"workspace.graph.missing",message:"Workspace model did not produce a dependency graph."}},null,2)),process.exit(1)),console.log(s.red("\u274C Workspace model did not produce a dependency graph.")),process.exit(1)),k==="dot"){console.log(p(h));return}if(k==="mermaid"){console.log(d(h));return}if(k==="explain"){let v=(n.scope?.replace(/^project:/,"")||o||"").trim();v||(n.json&&(console.log(JSON.stringify({command:"workspace graph explain",result:"error",workspacePath:c,timestamp:new Date().toISOString(),error:{code:"workspace.graph.explain.missing_project",message:"workspace graph explain requires a project."},usage:["npx rapidkit workspace graph explain <project> --json","npx rapidkit workspace graph explain --scope project:<name> --json"]},null,2)),process.exit(1)),console.log(s.red("\u274C workspace graph explain requires a project.")),console.log(s.gray(" npx rapidkit workspace graph explain <project> --json")),console.log(s.gray(" npx rapidkit workspace graph explain --scope project:<name>")),process.exit(1));let y=u(h,v);if(n.json){console.log(JSON.stringify(y,null,2)),y.found||process.exit(1);return}y.found||(console.log(s.red(`\u274C Project not found in dependency graph: ${v}`)),process.exit(1)),console.log(s.green(`\u2714 Graph explain: ${y.project}`)),y.centrality&&console.log(s.gray(` Centrality: fanIn ${y.centrality.fanIn}, fanOut ${y.centrality.fanOut}, reach ${y.centrality.reach}, betweenness ${y.centrality.betweenness}${y.centrality.isHotspot?" (hotspot)":""}`)),console.log(s.gray(` Direct dependents: ${y.directDependents.join(", ")||"none"}`)),console.log(s.gray(` Direct dependencies: ${y.directDependencies.join(", ")||"none"}`)),console.log(s.gray(` Blast radius (transitive dependents): ${y.transitiveDependents.length}`));for(let S of y.transitiveDependents.slice(0,10))console.log(s.gray(` \u2022 ${S.id} (d${S.distance}, via ${S.via??"\u2014"})`));return}let P=g(h);if(n.json){console.log(JSON.stringify(P,null,2));return}console.log(s.green("\u2714 Workspace dependency graph")),console.log(s.gray(` Nodes: ${P.graph.stats.nodeCount}`)),console.log(s.gray(` Edges: ${P.graph.stats.edgeCount} (inferred ${P.graph.stats.inferredEdges}, contract ${P.graph.stats.contractEdges}, manual ${P.graph.stats.manualEdges})`)),console.log(s.gray(` Integrity: ${P.integrity.ok?"ok":"issues"} (cycles ${P.integrity.stats.cycleCount}, dangling ${P.integrity.stats.danglingCount}, orphans ${P.integrity.stats.orphanCount})`)),console.log(s.gray(` Hotspots: ${P.hotspots.join(", ")||"none"}`)),console.log(s.gray(" Render: workspace graph dot | workspace graph mermaid"));}else if(t==="watch"){let c=i("watch"),{runWorkspaceWatch:f}=await import('./workspace-watch-P2PGSYDD.js'),g=n.once===true||a("--once"),p=n.json===true,d=new AbortController,u=()=>d.abort();process.once("SIGINT",u),process.once("SIGTERM",u),p||console.log(s.green("\u2714 Workspace watch (model + graph kept in memory)")),await f({workspacePath:c,once:g,signal:d.signal,buildOptions:{workspacePath:c,observableScanDepth:l()},onProgress:m=>{p||console.error(s.gray(` ${m}`));},emit:m=>{if(p){console.log(JSON.stringify(m));return}if(m.kind==="ready"){console.log(s.gray(` Ready: ${m.graph.nodeCount} nodes, ${m.graph.edgeCount} edges (hash ${m.modelHash.slice(0,12)})`));return}if(m.kind==="error"){console.error(s.red(` \u2717 Rebuild failed: ${m.error??"unknown error"}`));return}if(m.kind==="unchanged"){console.log(s.gray(` No structural change (${m.mode}, ${m.durationMs}ms)`));return}let h=[];m.changedProjects.length>0&&h.push(`changed: ${m.changedProjects.join(", ")}`),m.addedProjects.length>0&&h.push(`added: ${m.addedProjects.join(", ")}`),m.removedProjects.length>0&&h.push(`removed: ${m.removedProjects.join(", ")}`),m.graph.edgesAdded.length>0&&h.push(`+${m.graph.edgesAdded.length} edges`),m.graph.edgesRemoved.length>0&&h.push(`-${m.graph.edgesRemoved.length} edges`),console.log(s.cyan(` \u21BB Changed (${m.mode}, ${m.durationMs}ms): ${h.join("; ")||"structure updated"}`));}}),process.removeListener("SIGINT",u),process.removeListener("SIGTERM",u),!p&&!g&&console.log(s.gray(" Watch stopped."));return}else if(t==="sync"){let c=i("sync"),{syncWorkspaceProjects:f}=await import('./workspace-5DKOA7TN.js');n.json||console.log(s.cyan(`\u{1F4C2} Scanning workspace: ${w.basename(c)}`));let g=await f(c,n.json===true);await ze(c,{silent:n.json===true});let{readWorkspaceRegistrySummary:p}=await import('./workspace-registry-summary-X5WRUU3T.js'),d=await p(c);n.json&&console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-sync-v1",workspacePath:c,registry:g,contractSynced:true,registrySummary:d},null,2));}else if(t==="registry"){let c=i("registry"),f=e||"status";f!=="status"&&(console.log(s.red(`\u274C Unknown workspace registry action: ${f}`)),console.log(s.gray(" npx rapidkit workspace registry status [--refresh] [--json]")),process.exit(1));let{publishWorkspaceRegistrySummary:g,readWorkspaceRegistrySummary:p,resolveWorkspaceRegisteredProjects:d}=await import('./workspace-registry-summary-X5WRUU3T.js'),m=n.refresh===true||a("--refresh")||n.force===true||a("--force")?await g(c):await p(c)||await g(c);if(n.json){console.log(JSON.stringify(m,null,2));return}let h=await d(c);console.log(s.cyan("Workspace registry")),console.log(s.gray(` Authority: ${m.authority}`)),console.log(s.gray(` Projects: ${m.projectCount}`)),console.log(s.gray(` Summary: ${m.registrySummaryPath}`)),h.summary.projectCount===0&&console.log(s.yellow(" No registered projects \u2014 run workspace sync after adding projects."));}else if(t==="foundation"){let c=i("foundation"),f=e||"ensure";f!=="ensure"&&(console.log(s.red(`\u274C Unknown workspace foundation action: ${f}`)),console.log(s.gray(" npx rapidkit workspace foundation ensure [--force] [--json]")),process.exit(1));let{ensureWorkspaceFoundation:g}=await import('./workspace-foundation-H6IPS4MW.js'),p=await g(c,{force:n.force===true||a("--force")});if(n.json){console.log(JSON.stringify(p,null,2));return}p.created.length>0?console.log(s.green(`\u2714 Workspace foundation ensured: ${p.created.join(", ")}`)):console.log(s.gray("Workspace foundation files are already up to date."));}else if(t==="policy"){let c=i("policy"),f=await Bl(c,e,o,r,n.json===true||a("--json"));f!==0&&process.exit(f);}else if(t==="contract"){let c=i("contract"),{buildWorkspaceContractGraph:f,readWorkspaceContract:g,verifyWorkspaceContract:p,writeWorkspaceContract:d,WORKSPACE_CONTRACT_PATH:u}=await import('./workspace-contract-OO4GMENV.js'),m=e||"inspect",h=n.output;try{if(m==="init"){let k=await d({workspacePath:c,outputPath:h,force:n.force===true||a("--force")});if(n.json){console.log(JSON.stringify(k,null,2));return}console.log(s.green(`\u2714 Workspace contract initialized: ${k.contractPath}`)),console.log(s.gray(` Projects: ${k.contract.projects.length}`));return}if(m==="inspect"){let k=await g({workspacePath:c,contractPath:h});if(n.json){console.log(JSON.stringify(k,null,2));return}console.log(s.green(`\u2714 Workspace contract: ${k.contractPath}`)),console.log(s.gray(` Workspace: ${k.contract.workspace.name}`)),console.log(s.gray(` Projects: ${k.contract.projects.length}`)),console.log(s.gray(` Schema: v${k.contract.schemaVersion}`));return}if(m==="verify"){let k=await p({workspacePath:c,contractPath:h,strict:n.strict===true||a("--strict")}),{writeWorkspaceContractVerifyEvidence:P}=await import('./workspace-contract-OO4GMENV.js'),v=await P({workspacePath:c,result:k});if(n.json)console.log(JSON.stringify({...k,evidencePath:v},null,2));else {let y=k.status==="passed"?s.green:s.red;console.log(y(`\u2714 Workspace contract verification ${k.status}: ${k.contractPath}`)),console.log(s.gray(` Projects: ${k.projectCount}`));for(let S of k.checks){let b=S.status==="passed"?"\u2714":"\u2718";console.log(s.gray(` ${b} ${S.id}: ${S.message}`));}for(let S of k.violations)console.log(s.gray(` Violation: ${S}`));}(k.status==="failed"||k.status!=="passed"&&n.strict)&&process.exit(1);return}if(m==="graph"){let k=await f({workspacePath:c,contractPath:h});if(n.json){console.log(JSON.stringify(k,null,2));return}console.log(s.green(`\u2714 Workspace contract graph: ${k.contractPath}`)),console.log(s.gray(` Workspace: ${k.graph.workspace.name}`)),console.log(s.gray(` Projects: ${k.graph.summary.projectCount}`)),console.log(s.gray(` Dependencies: ${k.graph.summary.dependencyEdges}`)),console.log(s.gray(` Event links: ${k.graph.summary.eventEdges}`)),console.log(s.gray(` Ports: ${k.graph.summary.portCount}`));for(let P of k.graph.nodes){let v=P.ports.map(y=>`${y.name}:${y.port}`).join(", ")||"none";console.log(s.gray(` \u2022 ${P.id} (${P.runtime||"unknown"}${P.framework?`/${P.framework}`:""}) ports=${v}`));}for(let P of k.graph.edges){let v=P.type==="event"?`event:${P.label}`:P.label;console.log(s.gray(` ${P.from} -> ${P.to} [${v}]`));}return}console.log(s.red(`\u274C Unknown workspace contract action: ${m}`)),console.log(s.white(` npx rapidkit workspace contract init|inspect|verify|graph [--output ${u}]`)),process.exit(1);}catch(k){n.json&&(console.log(JSON.stringify({command:`workspace contract ${m}`,result:"error",workspacePath:c,timestamp:new Date().toISOString(),error:{code:`workspace.contract.${m}.failed`,message:k.message}},null,2)),process.exit(1)),console.log(s.red(`\u274C Workspace contract ${m} failed: ${k.message}`)),process.exit(1);}}else if(t==="share"){let c=i("share"),f=n.output||e,{createWorkspaceShareBundle:g}=await import('./workspace-5DKOA7TN.js'),p=await g(c,{outputPath:f,includePaths:n.includePaths===true,includeDoctorEvidence:n.doctor!==false,includeBlueprint:n.blueprint!==false});if(n.json){console.log(JSON.stringify({command:"workspace share",result:"ok",timestamp:new Date().toISOString(),workspacePath:c,bundlePath:p,options:{includePaths:n.includePaths===true,includeDoctorEvidence:n.doctor!==false,includeBlueprint:n.blueprint!==false}},null,2));return}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 c=i("export"),{exportWorkspaceArchive:f}=await import('./workspace-archive-EJIGYKSR.js'),g=await f({workspacePath:c,outputPath:n.output||e,includeEnv:n.includeEnv===true||a("--include-env")});if(n.json){console.log(JSON.stringify(g,null,2));return}let p=(g.bytesWritten/(1024*1024)).toFixed(2);console.log(s.green(`\u2714 Workspace archive exported: ${g.archivePath}`)),console.log(s.gray(` Files: ${g.manifest.files.length}`)),console.log(s.gray(` Size: ${p} MB`)),g.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 c=o;c||(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:f,inspectWorkspaceArchive:g,verifyWorkspaceArchive:p}=await import('./workspace-archive-EJIGYKSR.js');try{if(e==="inspect"){let u=await g({archivePathOrUrl:c});if(n.json){console.log(JSON.stringify(u,null,2));return}let m=(u.totalBytes/(1024*1024)).toFixed(2);console.log(s.green(`\u2714 Workspace archive: ${u.archivePath}`)),console.log(s.gray(` Workspace: ${u.manifest.workspaceName}`)),console.log(s.gray(` Exported: ${u.manifest.exportedAt}`)),console.log(s.gray(` Exporter: ${u.manifest.exportedBy||"unknown"}`)),console.log(s.gray(` Files: ${u.fileCount}`)),console.log(s.gray(` Payload: ${m} MB`));return}if(e==="doctor"){let u=await f({archivePathOrUrl:c,strict:n.strict===true||a("--strict")});if(n.json)console.log(JSON.stringify(u,null,2));else {let m=u.status==="passed"?s.green:u.status==="warning"?s.yellow:s.red;console.log(m(`\u2714 Workspace archive doctor ${u.status}: ${u.archivePath}`)),console.log(s.gray(` Workspace: ${u.workspaceName}`)),console.log(s.gray(` Files: ${u.fileCount}`));for(let h of u.checks){let k=h.status==="passed"?"\u2714":h.status==="warning"?"\u26A0":"\u2718";console.log(s.gray(` ${k} ${h.id}: ${h.message}`));}for(let h of u.recommendedActions)console.log(s.gray(` Next: ${h}`));}(u.status==="failed"||u.status==="warning"&&n.strict)&&process.exit(1);return}let d=await p({archivePathOrUrl:c,requireChecksums:n.strict===true||a("--strict")});if(n.json)console.log(JSON.stringify(d,null,2));else if(d.status==="passed")console.log(s.green(`\u2714 Workspace archive verified: ${d.archivePath}`)),console.log(s.gray(` Files: ${d.verifiedFiles}/${d.fileCount}`));else {let u=d.status==="failed"?s.red:s.yellow;console.log(u(`\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(m=>m.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){n.json&&(console.log(JSON.stringify({schemaVersion:"workspace-archive-error-v1",command:`workspace archive ${e}`,status:"error",timestamp:new Date().toISOString(),archivePathOrUrl:c,error:{code:`workspace.archive.${e}.failed`,message:d.message}},null,2)),process.exit(1)),console.log(s.red(`\u274C Workspace archive ${e} failed: ${d.message}`)),process.exit(1);}}else if(t==="hydrate"||t==="import"){let c=e;c||(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:f}=await import('./workspace-archive-EJIGYKSR.js');try{let g=await f({archivePathOrUrl:c,outputPath:n.output,force:n.force===true||a("--force"),dryRun:n.dryRun===true||a("--dry-run"),strict:n.strict===true||a("--strict")});if(n.json){console.log(JSON.stringify(g,null,2));return}console.log(s.green(g.dryRun?`\u2714 Workspace archive hydrate preview: ${g.outputPath}`:`\u2714 Workspace archive hydrated: ${g.outputPath}`)),console.log(s.gray(` Files: ${g.files.length}`)),g.manifest?.workspaceName&&console.log(s.gray(` Workspace: ${g.manifest.workspaceName}`));}catch(g){n.json&&(console.log(JSON.stringify({schemaVersion:"workspace-archive-error-v1",command:`workspace ${t}`,status:"error",timestamp:new Date().toISOString(),archivePathOrUrl:c,outputPath:n.output??null,dryRun:n.dryRun===true||a("--dry-run"),error:{code:`workspace.${t}.failed`,message:g.message}},null,2)),process.exit(1)),console.log(s.red(`\u274C Workspace ${t} failed: ${g.message}`)),process.exit(1);}}else if(t==="run"){let c=i(`run ${e||""}`.trim()),f=new Set(["init","test","build","start"]),g=e?.trim()??"";g||(console.log(s.red(`Unknown workspace run stage: ${e||"(none provided)"}`)),console.log(s.gray("Available stages: init | test | build | start | <custom-from-context>")),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(" \u2022 custom \u2014 any stage key declared in .rapidkit/context.json commands")),console.log(s.gray(" Note: dev is excluded \u2014 it is a local-only primitive, not a CI stage")),process.exit(2)),f.has(g)||(!/^[a-z][a-z0-9_-]*$/i.test(g)||g==="dev"||g==="stop")&&(console.log(s.red(`Unknown workspace run stage: ${g}`)),console.log(s.gray("Available stages: init | test | build | start | <custom-from-context>")),process.exit(2));let p=Number(n.maxWorkers??""),d=Number.isFinite(p)?Math.max(1,Math.trunc(p)):void 0;if(g==="init"&&n.json!==true){let h=await Yr(c);h!==0&&process.exit(h);}let{runWorkspaceStage:u}=await import('./workspace-run-P5UOJSLQ.js'),m=await u({workspacePath:c,stage:g,scope:n.scope,affected:n.affected===true,blastRadius:n.blastRadius===true,since:n.since,parallel:n.parallel===true,maxWorkers:d,continueOnError:n.continueOnError===true,strict:n.strict===true,json:n.json===true,enforceGates:n.gates,reusePassed:n.reusePassed===true});n.json&&console.log(JSON.stringify(m,null,2)),m.summary.exitCode!==0&&process.exit(m.summary.exitCode);}else if(t==="explain"||t==="why"){let c=i(t),{parseWorkspaceExplainTarget:f}=await import('./workspace-explain-contract-24RQ7KIW.js'),{buildWorkspaceExplain:g,writeWorkspaceExplainReport:p}=await import('./workspace-explain-5RDFGHUN.js'),d=(e??o??"").trim();!d&&n.scope&&(d=n.scope.startsWith("project:")?n.scope:`project:${n.scope}`),d||(console.log(s.red(`\u274C workspace ${t} requires a target.`)),console.log(s.gray(" npx rapidkit workspace explain project:<name>|release-blocked [--json] [--write]")),console.log(s.gray(" npx rapidkit workspace why <project>|release-blocked [--json]")),process.exit(1));let u=f(d);u||(console.log(s.red(`\u274C Invalid explain target: ${d}`)),process.exit(1));let m=await g({workspacePath:c,target:u}),h=n.write===true||a("--write"),k;if(h&&(k=await p(m,c,t==="why"?"why":"explain")),n.json){console.log(JSON.stringify({...m,outputPath:k},null,2));return}console.log(s.green(`\u2714 Workspace ${t==="why"?"why":"explain"}: ${m.summary}`));for(let P of m.sections)console.log(s.bold(`
|
|
331
|
-
${P.title}`)),console.log(P.body);
|
|
332
|
-
Written: ${
|
|
333
|
-
${P.title}`)),console.log(P.body);
|
|
334
|
-
Written: ${
|
|
330
|
+
workspace mcp serve \u2014 read-mostly stdio MCP bridge over workspace evidence`).option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--output <file>","Output file path for workspace share bundle").option("--from <file>","Input workspace model snapshot/report for workspace diff").option("--from-impact <file>","Input workspace impact report for workspace verify (defaults to last-run impact)").option("--include-paths","Include absolute paths in workspace share bundle").option("--write","Write workspace intelligence artifact to .rapidkit/reports").option("--include-evidence","Read status metadata from referenced evidence reports").option("--scan-depth <count>","Observable project discovery depth for large monorepos").option("--cache","Reuse cached workspace model when inputs are unchanged (keyed by inputsHash)").option("--incremental","Rebuild only changed projects and re-infer only their incident graph edges (graph-aware)").option("--once","For workspace watch: do the initial in-memory build and exit (no watcher)").option("--for-agent [agent]","Build an agent-ready workspace context pack").option("--agent-sync","After --write on context, sync cross-tool agent grounding files (AGENTS.md, Copilot, Cursor, Claude)").option("--no-agent-sync","Skip automatic agent grounding sync after context --write").option("--target <targets>","Agent customization targets for agent-sync (all|vscode|agents,copilot,cursor,claude,codex,orca)").option("--preset <preset>","Agent customization pack preset for agent-sync (minimal|enterprise)").option("--refresh-context","Rebuild workspace-context-agent.json during agent-sync").option("--experimental-hooks","Generate advisory VS Code agent hook design files during enterprise agent-sync").option("--hydrate-prompts","Hydrate matching Copilot prompt files with workspace-specific verification steps during agent-sync").option("--scope <scope>","Scope workspace intelligence output, e.g. project:<name>").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("--refresh","Publish workspace registry summary before reading status").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("--reuse-passed","Skip projects that already passed this stage in workspace-run-last.json").option("--json","Emit machine-readable JSON output").option("--ci","Build CI-oriented command plans where supported").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,o,r){let n=this.opts(),i=c=>{let m=(n.workspace?v.resolve(n.workspace):null)??a$6(process.cwd())??Z(process.cwd());(!m||!We(m))&&(console.log(s.red("\u274C Not inside a RapidKit workspace")),console.log(s.gray("\u{1F4A1} Run from a workspace directory or pass --workspace <path>.")),process.exit(1));let d=v.resolve(process.cwd()),p=v.resolve(m);return d!==p&&!n.json&&console.log(s.gray(`\u2139 Using workspace root ${m} for "${c}" (current directory: ${d}).`)),m},a=c=>process.argv.includes(c),l=()=>{if(!n.scanDepth)return;let c=Number.parseInt(n.scanDepth,10);return Number.isFinite(c)?c:void 0};if((Ei(t)||t==="trace"||t==="feedback"||t==="mcp")&&d$2({action:t,status:"started",message:`workspace ${t} started`,metadata:{json:n.json===true||a("--json"),strict:n.strict===true||a("--strict")}}),t==="list"){let{listWorkspaces:c}=await import('./workspace-MPKEUHFP.js');await c({json:n.json===true||a("--json")});}else if(t==="model"){let c=i("model"),{buildWorkspaceModelCached:u,buildWorkspaceModelIncremental:m,writeWorkspaceModel:d}=await import('./workspace-model-IDRCH3VI.js'),p=n.incremental===true||a("--incremental"),f=n.cache===true||a("--cache")||p,g={workspacePath:c,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:l(),strict:n.strict===true||a("--strict")},y,w;if(p){let h=await m(g);y=h.model,w=h.mode;}else {let h=await u({...g,cache:f});y=h.model,w=h.cache;}let P;(n.write===true||a("--write"))&&(P=await d(y,c));let k=(n.strict===true||a("--strict"))&&y.validation?.status!=="passed";if(n.json){console.log(JSON.stringify({...y,...P?{outputPath:P}:{}},null,2)),k&&process.exit(1);return}console.log(s.green(`\u2714 Workspace model: ${y.workspace.name}`)),p?console.log(s.gray(` Build: ${w} (incremental)`)):f&&console.log(s.gray(` Cache: ${w}`)),console.log(s.gray(` Projects: ${y.summary.projectCount}`)),console.log(s.gray(` Runtimes: ${y.summary.runtimes.join(", ")||"none"}`)),console.log(s.gray(` Frameworks: ${y.summary.frameworks.join(", ")||"none"}`)),console.log(s.gray(` Workspace type: ${y.identity.workspaceType}`)),console.log(s.gray(` Validation: ${y.validation?.status??"unknown"} (${y.validation?.errors??0} error, ${y.validation?.warnings??0} warning)`)),console.log(P?s.gray(` Written: ${P}`):s.gray(" Add --write to persist .rapidkit/reports/workspace-model.json")),k&&process.exit(1);}else if(t==="agent-sync"){let c=i("agent-sync"),{syncWorkspaceAgentGrounding:u,parseAgentGroundingTargets:m}=await import('./workspace-agent-sync-XD32GG5V.js'),d=n.strict===true||a("--strict"),p=n.write===true||a("--write"),f=a("--dry-run"),g=await u({workspacePath:c,scope:n.scope,agent:n.forAgent,write:p&&!f,dryRun:f,strict:d,preset:n.preset==="minimal"?"minimal":"enterprise",refreshContext:n.refreshContext===true||a("--refresh-context")||a("--refresh"),targets:m(n.target),experimentalHooks:n.experimentalHooks===true||a("--experimental-hooks"),hydratePrompts:n.hydratePrompts===true||a("--hydrate-prompts"),staleAfterHours:24});if(n.json)console.log(JSON.stringify(g,null,2));else {console.log(s.green(`\u2714 Agent grounding ${p&&!f?"synced":"planned"}`)),console.log(s.gray(` Index: ${g.indexPath}`)),g.contextPath&&console.log(s.gray(` Context: ${g.contextPath}`)),g.blockers.length>0&&console.log(s.yellow(` Blockers: ${g.blockers.slice(0,3).join(" \xB7 ")}`));let y=p&&!f?g.writtenFiles:g.skippedFiles;if(y.length>0&&console.log(s.gray(` Files: ${y.join(", ")}`)),g.strictViolations.length>0)for(let w of g.strictViolations)console.log(s.red(`\u274C ${w}`));}d&&g.strictViolations.length>0&&process.exit(1);}else if(t==="remediation-plan"){let c=i("remediation-plan"),{buildArtifactRemediationPlan:u,writeArtifactRemediationPlan:m}=await import('./artifact-remediation-plan-HRR3WH7T.js'),d=await u({workspacePath:c,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),ciMode:n.ci===true||a("--ci")}),p;if((n.write===true||a("--write"))&&(p=await m(d,c)),n.json===true||a("--json")){console.log(JSON.stringify({...d,...p?{outputPath:p}:{}},null,2));return}console.log(s.green(`\u2714 Artifact remediation plan: ${d.workspace.name}`)),console.log(s.gray(` Artifacts scanned: ${d.summary.artifactsScanned}`)),console.log(s.gray(` Cards covered: ${d.summary.cardsCovered}`)),console.log(s.gray(` CI mode: ${d.source.ciMode?"yes":"no"}`)),console.log(s.gray(` Actions: ${d.summary.totalActions}`)),console.log(s.gray(` Risk: safe=${d.summary.risk.safe}, guarded=${d.summary.risk.guarded}, invasive=${d.summary.risk.invasive}`));for(let f of d.actions.slice(0,8))console.log(s.gray(` \u2022 ${f.cardId}: ${f.title} (${f.mode}, ${f.risk})`));d.actions.length>8&&console.log(s.gray(` \u2026 ${d.actions.length-8} more action(s)`)),console.log(p?s.gray(` Written: ${p}`):s.gray(" Add --write to persist .rapidkit/reports/artifact-remediation-plan-last-run.json"));}else if(t==="context"){let c=i("context");n.forAgent!==true&&typeof n.forAgent!="string"&&e!=="agent"&&(console.log(s.red("\u274C workspace context currently requires --for-agent")),console.log(s.gray(" npx rapidkit workspace context --for-agent --json [--scope project:<name>]")),process.exit(1));let{buildWorkspaceAgentContext:u,writeWorkspaceAgentContext:m}=await import('./workspace-context-QFES7YBC.js'),d=n.strict===true||a("--strict"),p=await u({workspacePath:c,agent:n.forAgent||o||e,scope:n.scope,includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:l(),strict:false}),f,g;if((n.write===true||a("--write"))&&(f=await m(p,c),(n.agentSync===true||a("--agent-sync")||n.noAgentSync!==true)&&!a("--no-agent-sync"))){let{syncWorkspaceAgentGrounding:P,parseAgentGroundingTargets:k}=await import('./workspace-agent-sync-XD32GG5V.js');if(g=await P({workspacePath:c,scope:n.scope,agent:p.agent,write:true,refreshContext:false,strict:d,preset:n.preset==="minimal"?"minimal":"enterprise",targets:k(n.target)}),n.json||console.log(s.gray(` Agent grounding synced: ${g.writtenFiles.length} file(s) updated`)),d&&g.strictViolations.length>0){for(let h of g.strictViolations)console.log(s.red(`\u274C ${h}`));process.exit(1);}}let y=d&&p.validation.status!=="passed";if(n.json){console.log(JSON.stringify({...p,...f?{outputPath:f}:{},...g?{agentGroundingSync:g}:{}},null,2)),y&&process.exit(1);return}if(console.log(s.green(`\u2714 Workspace context: ${p.workspace.name}`)),console.log(s.gray(` Agent: ${p.agent}`)),console.log(s.gray(` Scope: ${p.scope.activeProject??p.scope.requested}`)),console.log(s.gray(` Projects included: ${p.projects.length}`)),console.log(s.gray(` Safe commands: ${p.safeCommands.length}`)),console.log(s.gray(` Validation: ${p.validation.status} (${p.validation.errors} error, ${p.validation.warnings} warning)`)),console.log(f?s.gray(` Written: ${f}`):s.gray(" Add --write to persist .rapidkit/reports/workspace-context-agent.json")),y){for(let w of p.validation.issues)console.log(s.red(`\u274C ${w.severity}:${w.code}:${w.target}`));process.exit(1);}}else if(t==="snapshot"){let c=i("snapshot"),{buildWorkspaceModelSnapshot:u,writeWorkspaceModelSnapshot:m}=await import('./workspace-intelligence-FJP5ONDB.js'),d=await u({workspacePath:c,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:l()}),p=await m(d,c);if(n.json){console.log(JSON.stringify({...d,outputPath:p},null,2));return}console.log(s.green(`\u2714 Workspace model snapshot: ${d.model.workspace.name}`)),console.log(s.gray(` Hash: ${d.modelHash}`)),console.log(s.gray(` Projects: ${d.model.summary.projectCount}`)),console.log(s.gray(` Workspace type: ${d.model.identity.workspaceType}`)),console.log(s.gray(` Written: ${p}`));}else if(t==="diff"){let c=i("diff"),u=n.from||e;u||((n.json===true||a("--json"))&&(console.log(JSON.stringify({schemaVersion:"workspace-diff-error-v1",command:"workspace diff",status:"error",workspacePath:c,error:{code:"workspace.diff.from.required",message:"workspace diff requires --from <snapshot-or-model-report|git[:ref]>."},examples:["npx rapidkit workspace diff --from .rapidkit/reports/workspace-model-snapshot.json --json","npx rapidkit workspace diff --from .rapidkit/reports/workspace-model.json --json","npx rapidkit workspace diff --from git --json"]},null,2)),process.exit(1)),console.log(s.red("\u274C workspace diff requires --from <snapshot-or-model-report|git[:ref]>")),console.log(s.gray(" npx rapidkit workspace diff --from .rapidkit/reports/workspace-model-snapshot.json --json")),console.log(s.gray(" npx rapidkit workspace diff --from .rapidkit/reports/workspace-model.json --json")),console.log(s.gray(" npx rapidkit workspace impact --from .rapidkit/reports/workspace-model-diff-last-run.json --json")),console.log(s.gray(" npx rapidkit workspace diff --from git --json (uses snapshot baseline + git working tree)")),process.exit(1));let{diffWorkspaceModel:m,writeWorkspaceModelDiff:d}=await import('./workspace-intelligence-FJP5ONDB.js'),p;try{p=await m({workspacePath:c,fromPath:u,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:l()});}catch(y){throw (n.json===true||a("--json"))&&(console.log(JSON.stringify({schemaVersion:"workspace-diff-error-v1",command:"workspace diff",status:"error",workspacePath:c,fromPath:u,error:{code:"workspace.diff.input_unreadable",message:y.message},nextActions:["npx rapidkit workspace snapshot create --json","npx rapidkit workspace diff --from .rapidkit/reports/workspace-model-snapshot.json --json"]},null,2)),process.exit(1)),y}let f=await d(p,c);if(n.json){console.log(JSON.stringify({...p,outputPath:f},null,2));return}let g=p.summary.changed?s.yellow:s.green;console.log(g(`\u2714 Workspace model diff: ${p.summary.changed?"changed":"clean"}`)),console.log(s.gray(` From: ${p.fromRef}`)),console.log(s.gray(` Added projects: ${p.summary.addedProjects}`)),console.log(s.gray(` Removed projects: ${p.summary.removedProjects}`)),console.log(s.gray(` Changed projects: ${p.summary.changedProjects}`)),console.log(s.gray(` Workspace changes: ${p.summary.workspaceChanges}`)),console.log(s.gray(` Validation changes: ${p.summary.validationChanges}`)),p.git?.available&&console.log(s.gray(` Git: ${p.git.dirty?"dirty":"clean"} (${p.summary.gitChangedFiles} mapped change(s))`));for(let y of p.changes.slice(0,12))console.log(s.gray(` \u2022 ${y.type} ${y.target}: ${y.message}`));p.changes.length>12&&console.log(s.gray(` \u2026 ${p.changes.length-12} more change(s)`)),console.log(s.gray(` Written: ${f}`));}else if(t==="impact"){let c=i("impact"),u=n.from||e;u||((n.json===true||a("--json"))&&(console.log(JSON.stringify({schemaVersion:"workspace-impact-error-v1",command:"workspace impact",status:"error",workspacePath:c,error:{code:"workspace.impact.from.required",message:"workspace impact requires --from <workspace-diff-report>."},examples:["npx rapidkit workspace diff --from .rapidkit/reports/workspace-model-snapshot.json --json","npx rapidkit workspace impact --from .rapidkit/reports/workspace-model-diff-last-run.json --json"]},null,2)),process.exit(1)),console.log(s.red("\u274C workspace impact requires --from <snapshot-model-or-diff-report>")),console.log(s.gray(" npx rapidkit workspace impact --from .rapidkit/reports/workspace-model-diff-last-run.json --json")),process.exit(1));let{buildWorkspaceImpact:m,writeWorkspaceImpact:d}=await import('./workspace-intelligence-FJP5ONDB.js'),p;try{p=await m({workspacePath:c,fromPath:u,scope:n.scope,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:l()});}catch(y){throw (n.json===true||a("--json"))&&(console.log(JSON.stringify({schemaVersion:"workspace-impact-error-v1",command:"workspace impact",status:"error",workspacePath:c,fromPath:u,error:{code:"workspace.impact.input_unreadable",message:y.message},nextActions:["npx rapidkit workspace snapshot create --json","npx rapidkit workspace diff --from .rapidkit/reports/workspace-model-snapshot.json --json","npx rapidkit workspace impact --from .rapidkit/reports/workspace-model-diff-last-run.json --json"]},null,2)),process.exit(1)),y}let f=await d(p,c);if(n.json){console.log(JSON.stringify({...p,outputPath:f},null,2));return}let g=p.summary.risk==="critical"||p.summary.risk==="high"?s.red:p.summary.risk==="medium"?s.yellow:s.green;console.log(g(`\u2714 Workspace impact: ${p.summary.risk}`)),console.log(s.gray(` From: ${p.fromRef}`)),console.log(s.gray(` Affected projects: ${p.summary.affectedProjects}`)),console.log(s.gray(` Workspace items: ${p.summary.workspaceItems}`)),console.log(s.gray(` Recommended commands: ${p.summary.recommendedCommands}`));for(let y of p.affectedProjects.slice(0,8))console.log(s.gray(` \u2022 ${y.title}: ${y.summary}`));p.affectedProjects.length>8&&console.log(s.gray(` \u2026 ${p.affectedProjects.length-8} more project(s)`)),console.log(s.gray(` Written: ${f}`));}else if(t==="verify"){let c=i("verify"),{buildWorkspaceVerify:u,writeWorkspaceVerify:m,evaluateWorkspaceVerifyGate:d}=await import('./workspace-verify-K4RSQIXT.js'),p=await u({workspacePath:c,fromImpactPath:n.fromImpact||e,scope:n.scope,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:l()}),f=await m(p,c),g=d(p,{strict:n.strict===true||a("--strict")}),y=g.exitCode,{recordWorkspaceHistory:w,historyEntryFromVerify:P}=await import('./workspace-history-DSCH7PQZ.js');if(await w(c,P(p,g.passed)),n.json){console.log(JSON.stringify({...p,gate:g,outputPath:f},null,2)),y!==0&&process.exit(y);return}let k=p.summary.verdict==="ready"?s.green:p.summary.verdict==="needs-attention"?s.yellow:s.red;console.log(k(`\u2714 Workspace verify: ${p.summary.verdict}`)),console.log(s.gray(` Freshness: ${p.freshness.verdict}`)),console.log(s.gray(` Impact risk: ${p.impact.risk}`)),console.log(s.gray(` Steps: ${p.steps.length}`)),console.log(s.gray(` Passed ${p.summary.stepsPassed}, warn ${p.summary.stepsWarn}, failed ${p.summary.stepsFailed}, missing ${p.summary.stepsMissing}`));for(let h of p.steps.slice(0,10))console.log(s.gray(` \u2022 ${h.id}: ${h.status} \u2014 ${h.message}`));if(p.steps.length>10&&console.log(s.gray(` \u2026 ${p.steps.length-10} more step(s)`)),p.policyViolations.length>0){console.log(s.gray(` Policy (${p.policyMode}): ${p.policyViolations.length} violation(s)`));for(let h of p.policyViolations.slice(0,5)){let S=h.severity==="error"?s.red("\u2717"):s.yellow("!");console.log(` ${S} [${h.source}] ${h.code}: ${h.message}`);}}console.log(s.gray(` Gate (${g.mode}): ${g.passed?"passed":"blocked"}`));for(let h of g.reasons.slice(0,5))console.log(s.red(` \u2717 ${h}`));console.log(s.gray(` Written: ${f}`)),y!==0&&process.exit(y);}else if(t==="graph"){let c=i("graph"),{buildWorkspaceModel:u}=await import('./workspace-model-IDRCH3VI.js'),{buildGraphEmit:m,renderGraphDot:d,renderGraphMermaid:p,explainGraphNode:f}=await import('./workspace-graph-2A5THUCI.js'),y=(await u({workspacePath:c,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:l()})).graph,w=(e||"emit").toLowerCase();if(y||(n.json&&(console.log(JSON.stringify({command:"workspace graph",action:w,result:"error",workspacePath:c,timestamp:new Date().toISOString(),error:{code:"workspace.graph.missing",message:"Workspace model did not produce a dependency graph."}},null,2)),process.exit(1)),console.log(s.red("\u274C Workspace model did not produce a dependency graph.")),process.exit(1)),w==="dot"){console.log(d(y));return}if(w==="mermaid"){console.log(p(y));return}if(w==="explain"){let k=(n.scope?.replace(/^project:/,"")||o||"").trim();k||(n.json&&(console.log(JSON.stringify({command:"workspace graph explain",result:"error",workspacePath:c,timestamp:new Date().toISOString(),error:{code:"workspace.graph.explain.missing_project",message:"workspace graph explain requires a project."},usage:["npx rapidkit workspace graph explain <project> --json","npx rapidkit workspace graph explain --scope project:<name> --json"]},null,2)),process.exit(1)),console.log(s.red("\u274C workspace graph explain requires a project.")),console.log(s.gray(" npx rapidkit workspace graph explain <project> --json")),console.log(s.gray(" npx rapidkit workspace graph explain --scope project:<name>")),process.exit(1));let h=f(y,k);if(n.json){console.log(JSON.stringify(h,null,2)),h.found||process.exit(1);return}h.found||(console.log(s.red(`\u274C Project not found in dependency graph: ${k}`)),process.exit(1)),console.log(s.green(`\u2714 Graph explain: ${h.project}`)),h.centrality&&console.log(s.gray(` Centrality: fanIn ${h.centrality.fanIn}, fanOut ${h.centrality.fanOut}, reach ${h.centrality.reach}, betweenness ${h.centrality.betweenness}${h.centrality.isHotspot?" (hotspot)":""}`)),console.log(s.gray(` Direct dependents: ${h.directDependents.join(", ")||"none"}`)),console.log(s.gray(` Direct dependencies: ${h.directDependencies.join(", ")||"none"}`)),console.log(s.gray(` Blast radius (transitive dependents): ${h.transitiveDependents.length}`));for(let S of h.transitiveDependents.slice(0,10))console.log(s.gray(` \u2022 ${S.id} (d${S.distance}, via ${S.via??"\u2014"})`));return}let P=m(y);if(n.json){console.log(JSON.stringify(P,null,2));return}console.log(s.green("\u2714 Workspace dependency graph")),console.log(s.gray(` Nodes: ${P.graph.stats.nodeCount}`)),console.log(s.gray(` Edges: ${P.graph.stats.edgeCount} (inferred ${P.graph.stats.inferredEdges}, contract ${P.graph.stats.contractEdges}, manual ${P.graph.stats.manualEdges})`)),console.log(s.gray(` Integrity: ${P.integrity.ok?"ok":"issues"} (cycles ${P.integrity.stats.cycleCount}, dangling ${P.integrity.stats.danglingCount}, orphans ${P.integrity.stats.orphanCount})`)),console.log(s.gray(` Hotspots: ${P.hotspots.join(", ")||"none"}`)),console.log(s.gray(" Render: workspace graph dot | workspace graph mermaid"));}else if(t==="watch"){let c=i("watch"),{runWorkspaceWatch:u}=await import('./workspace-watch-PFJDHPXI.js'),m=n.once===true||a("--once"),d=n.json===true,p=new AbortController,f=()=>p.abort();process.once("SIGINT",f),process.once("SIGTERM",f),d||console.log(s.green("\u2714 Workspace watch (model + graph kept in memory)")),await u({workspacePath:c,once:m,signal:p.signal,buildOptions:{workspacePath:c,observableScanDepth:l()},onProgress:g=>{d||console.error(s.gray(` ${g}`));},emit:g=>{if(d){console.log(JSON.stringify(g));return}if(g.kind==="ready"){console.log(s.gray(` Ready: ${g.graph.nodeCount} nodes, ${g.graph.edgeCount} edges (hash ${g.modelHash.slice(0,12)})`));return}if(g.kind==="error"){console.error(s.red(` \u2717 Rebuild failed: ${g.error??"unknown error"}`));return}if(g.kind==="unchanged"){console.log(s.gray(` No structural change (${g.mode}, ${g.durationMs}ms)`));return}let y=[];g.changedProjects.length>0&&y.push(`changed: ${g.changedProjects.join(", ")}`),g.addedProjects.length>0&&y.push(`added: ${g.addedProjects.join(", ")}`),g.removedProjects.length>0&&y.push(`removed: ${g.removedProjects.join(", ")}`),g.graph.edgesAdded.length>0&&y.push(`+${g.graph.edgesAdded.length} edges`),g.graph.edgesRemoved.length>0&&y.push(`-${g.graph.edgesRemoved.length} edges`),console.log(s.cyan(` \u21BB Changed (${g.mode}, ${g.durationMs}ms): ${y.join("; ")||"structure updated"}`));}}),process.removeListener("SIGINT",f),process.removeListener("SIGTERM",f),!d&&!m&&console.log(s.gray(" Watch stopped."));return}else if(t==="sync"){let c=i("sync"),{syncWorkspaceProjects:u}=await import('./workspace-MPKEUHFP.js');n.json||console.log(s.cyan(`\u{1F4C2} Scanning workspace: ${v.basename(c)}`));let m=await u(c,n.json===true);await qe(c,{silent:n.json===true});let{readWorkspaceRegistrySummary:d}=await import('./workspace-registry-summary-X5WRUU3T.js'),p=await d(c);n.json&&console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-sync-v1",workspacePath:c,registry:m,contractSynced:true,registrySummary:p},null,2));}else if(t==="registry"){let c=i("registry"),u=e||"status";u!=="status"&&(console.log(s.red(`\u274C Unknown workspace registry action: ${u}`)),console.log(s.gray(" npx rapidkit workspace registry status [--refresh] [--json]")),process.exit(1));let{publishWorkspaceRegistrySummary:m,readWorkspaceRegistrySummary:d,resolveWorkspaceRegisteredProjects:p}=await import('./workspace-registry-summary-X5WRUU3T.js'),g=n.refresh===true||a("--refresh")||n.force===true||a("--force")?await m(c):await d(c)||await m(c);if(n.json){console.log(JSON.stringify(g,null,2));return}let y=await p(c);console.log(s.cyan("Workspace registry")),console.log(s.gray(` Authority: ${g.authority}`)),console.log(s.gray(` Projects: ${g.projectCount}`)),console.log(s.gray(` Summary: ${g.registrySummaryPath}`)),y.summary.projectCount===0&&console.log(s.yellow(" No registered projects \u2014 run workspace sync after adding projects."));}else if(t==="foundation"){let c=i("foundation"),u=e||"ensure";u!=="ensure"&&(console.log(s.red(`\u274C Unknown workspace foundation action: ${u}`)),console.log(s.gray(" npx rapidkit workspace foundation ensure [--force] [--json]")),process.exit(1));let{ensureWorkspaceFoundation:m}=await import('./workspace-foundation-2OVUZXPT.js'),d=await m(c,{force:n.force===true||a("--force")});if(n.json){console.log(JSON.stringify(d,null,2));return}d.created.length>0?console.log(s.green(`\u2714 Workspace foundation ensured: ${d.created.join(", ")}`)):console.log(s.gray("Workspace foundation files are already up to date."));}else if(t==="policy"){let c=i("policy"),u=await yd(c,e,o,r,n.json===true||a("--json"));u!==0&&process.exit(u);}else if(t==="contract"){let c=i("contract"),{buildWorkspaceContractGraph:u,readWorkspaceContract:m,verifyWorkspaceContract:d,writeWorkspaceContract:p,WORKSPACE_CONTRACT_PATH:f}=await import('./workspace-contract-OO4GMENV.js'),g=e||"inspect",y=n.output;try{if(g==="init"){let w=await p({workspacePath:c,outputPath:y,force:n.force===true||a("--force")});if(n.json){console.log(JSON.stringify(w,null,2));return}console.log(s.green(`\u2714 Workspace contract initialized: ${w.contractPath}`)),console.log(s.gray(` Projects: ${w.contract.projects.length}`));return}if(g==="inspect"){let w=await m({workspacePath:c,contractPath:y});if(n.json){console.log(JSON.stringify(w,null,2));return}console.log(s.green(`\u2714 Workspace contract: ${w.contractPath}`)),console.log(s.gray(` Workspace: ${w.contract.workspace.name}`)),console.log(s.gray(` Projects: ${w.contract.projects.length}`)),console.log(s.gray(` Schema: v${w.contract.schemaVersion}`));return}if(g==="verify"){let w=await d({workspacePath:c,contractPath:y,strict:n.strict===true||a("--strict")}),{writeWorkspaceContractVerifyEvidence:P}=await import('./workspace-contract-OO4GMENV.js'),k=await P({workspacePath:c,result:w});if(n.json)console.log(JSON.stringify({...w,evidencePath:k},null,2));else {let h=w.status==="passed"?s.green:s.red;console.log(h(`\u2714 Workspace contract verification ${w.status}: ${w.contractPath}`)),console.log(s.gray(` Projects: ${w.projectCount}`));for(let S of w.checks){let b=S.status==="passed"?"\u2714":"\u2718";console.log(s.gray(` ${b} ${S.id}: ${S.message}`));}for(let S of w.violations)console.log(s.gray(` Violation: ${S}`));}(w.status==="failed"||w.status!=="passed"&&n.strict)&&process.exit(1);return}if(g==="graph"){let w=await u({workspacePath:c,contractPath:y});if(n.json){console.log(JSON.stringify(w,null,2));return}console.log(s.green(`\u2714 Workspace contract graph: ${w.contractPath}`)),console.log(s.gray(` Workspace: ${w.graph.workspace.name}`)),console.log(s.gray(` Projects: ${w.graph.summary.projectCount}`)),console.log(s.gray(` Dependencies: ${w.graph.summary.dependencyEdges}`)),console.log(s.gray(` Event links: ${w.graph.summary.eventEdges}`)),console.log(s.gray(` Ports: ${w.graph.summary.portCount}`));for(let P of w.graph.nodes){let k=P.ports.map(h=>`${h.name}:${h.port}`).join(", ")||"none";console.log(s.gray(` \u2022 ${P.id} (${P.runtime||"unknown"}${P.framework?`/${P.framework}`:""}) ports=${k}`));}for(let P of w.graph.edges){let k=P.type==="event"?`event:${P.label}`:P.label;console.log(s.gray(` ${P.from} -> ${P.to} [${k}]`));}return}console.log(s.red(`\u274C Unknown workspace contract action: ${g}`)),console.log(s.white(` npx rapidkit workspace contract init|inspect|verify|graph [--output ${f}]`)),process.exit(1);}catch(w){n.json&&(console.log(JSON.stringify({command:`workspace contract ${g}`,result:"error",workspacePath:c,timestamp:new Date().toISOString(),error:{code:`workspace.contract.${g}.failed`,message:w.message}},null,2)),process.exit(1)),console.log(s.red(`\u274C Workspace contract ${g} failed: ${w.message}`)),process.exit(1);}}else if(t==="share"){let c=i("share"),u=n.output||e,{createWorkspaceShareBundle:m}=await import('./workspace-MPKEUHFP.js'),d=await m(c,{outputPath:u,includePaths:n.includePaths===true,includeDoctorEvidence:n.doctor!==false,includeBlueprint:n.blueprint!==false});if(n.json){console.log(JSON.stringify({command:"workspace share",result:"ok",timestamp:new Date().toISOString(),workspacePath:c,bundlePath:d,options:{includePaths:n.includePaths===true,includeDoctorEvidence:n.doctor!==false,includeBlueprint:n.blueprint!==false}},null,2));return}console.log(s.green(`\u2714 Workspace share bundle exported: ${d}`)),console.log(s.gray("Share this JSON with your team for reproducible workspace/project diagnostics."));}else if(t==="export"){let c=i("export"),{exportWorkspaceArchive:u}=await import('./workspace-archive-EJIGYKSR.js'),m=await u({workspacePath:c,outputPath:n.output||e,includeEnv:n.includeEnv===true||a("--include-env")});if(n.json){console.log(JSON.stringify(m,null,2));return}let d=(m.bytesWritten/(1024*1024)).toFixed(2);console.log(s.green(`\u2714 Workspace archive exported: ${m.archivePath}`)),console.log(s.gray(` Files: ${m.manifest.files.length}`)),console.log(s.gray(` Size: ${d} MB`)),m.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 c=o;c||(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:u,inspectWorkspaceArchive:m,verifyWorkspaceArchive:d}=await import('./workspace-archive-EJIGYKSR.js');try{if(e==="inspect"){let f=await m({archivePathOrUrl:c});if(n.json){console.log(JSON.stringify(f,null,2));return}let g=(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: ${g} MB`));return}if(e==="doctor"){let f=await u({archivePathOrUrl:c,strict:n.strict===true||a("--strict")});if(n.json)console.log(JSON.stringify(f,null,2));else {let g=f.status==="passed"?s.green:f.status==="warning"?s.yellow:s.red;console.log(g(`\u2714 Workspace archive doctor ${f.status}: ${f.archivePath}`)),console.log(s.gray(` Workspace: ${f.workspaceName}`)),console.log(s.gray(` Files: ${f.fileCount}`));for(let y of f.checks){let w=y.status==="passed"?"\u2714":y.status==="warning"?"\u26A0":"\u2718";console.log(s.gray(` ${w} ${y.id}: ${y.message}`));}for(let y of f.recommendedActions)console.log(s.gray(` Next: ${y}`));}(f.status==="failed"||f.status==="warning"&&n.strict)&&process.exit(1);return}let p=await d({archivePathOrUrl:c,requireChecksums:n.strict===true||a("--strict")});if(n.json)console.log(JSON.stringify(p,null,2));else if(p.status==="passed")console.log(s.green(`\u2714 Workspace archive verified: ${p.archivePath}`)),console.log(s.gray(` Files: ${p.verifiedFiles}/${p.fileCount}`));else {let f=p.status==="failed"?s.red:s.yellow;console.log(f(`\u274C Workspace archive verification ${p.status}: ${p.archivePath}`)),p.missingArchiveEntries.length&&console.log(s.gray(` Missing entries: ${p.missingArchiveEntries.join(", ")}`)),p.extraArchiveEntries.length&&console.log(s.gray(` Unexpected entries: ${p.extraArchiveEntries.join(", ")}`)),p.mismatches.length&&console.log(s.gray(` Mismatches: ${p.mismatches.map(g=>g.path).join(", ")}`)),p.missingChecksumFiles.length&&console.log(s.gray(` Missing checksums: ${p.missingChecksumFiles.join(", ")}`));}(p.status==="failed"||p.status==="warning"&&n.strict)&&process.exit(1);}catch(p){n.json&&(console.log(JSON.stringify({schemaVersion:"workspace-archive-error-v1",command:`workspace archive ${e}`,status:"error",timestamp:new Date().toISOString(),archivePathOrUrl:c,error:{code:`workspace.archive.${e}.failed`,message:p.message}},null,2)),process.exit(1)),console.log(s.red(`\u274C Workspace archive ${e} failed: ${p.message}`)),process.exit(1);}}else if(t==="hydrate"||t==="import"){let c=e;c||(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:u}=await import('./workspace-archive-EJIGYKSR.js');try{let m=await u({archivePathOrUrl:c,outputPath:n.output,force:n.force===true||a("--force"),dryRun:n.dryRun===true||a("--dry-run"),strict:n.strict===true||a("--strict")});if(n.json){console.log(JSON.stringify(m,null,2));return}console.log(s.green(m.dryRun?`\u2714 Workspace archive hydrate preview: ${m.outputPath}`:`\u2714 Workspace archive hydrated: ${m.outputPath}`)),console.log(s.gray(` Files: ${m.files.length}`)),m.manifest?.workspaceName&&console.log(s.gray(` Workspace: ${m.manifest.workspaceName}`));}catch(m){n.json&&(console.log(JSON.stringify({schemaVersion:"workspace-archive-error-v1",command:`workspace ${t}`,status:"error",timestamp:new Date().toISOString(),archivePathOrUrl:c,outputPath:n.output??null,dryRun:n.dryRun===true||a("--dry-run"),error:{code:`workspace.${t}.failed`,message:m.message}},null,2)),process.exit(1)),console.log(s.red(`\u274C Workspace ${t} failed: ${m.message}`)),process.exit(1);}}else if(t==="run"){let c=i(`run ${e||""}`.trim()),u=new Set(["init","test","build","start"]),m=e?.trim()??"";m||(console.log(s.red(`Unknown workspace run stage: ${e||"(none provided)"}`)),console.log(s.gray("Available stages: init | test | build | start | <custom-from-context>")),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(" \u2022 custom \u2014 any stage key declared in .rapidkit/context.json commands")),console.log(s.gray(" Note: dev is excluded \u2014 it is a local-only primitive, not a CI stage")),process.exit(2)),u.has(m)||(!/^[a-z][a-z0-9_-]*$/i.test(m)||m==="dev"||m==="stop")&&(console.log(s.red(`Unknown workspace run stage: ${m}`)),console.log(s.gray("Available stages: init | test | build | start | <custom-from-context>")),process.exit(2));let d=Number(n.maxWorkers??""),p=Number.isFinite(d)?Math.max(1,Math.trunc(d)):void 0;if(m==="init"&&n.json!==true){let y=await cn(c);y!==0&&process.exit(y);}let{runWorkspaceStage:f}=await import('./workspace-run-NULA72JV.js'),g=await f({workspacePath:c,stage:m,scope:n.scope,affected:n.affected===true,blastRadius:n.blastRadius===true,since:n.since,parallel:n.parallel===true,maxWorkers:p,continueOnError:n.continueOnError===true,strict:n.strict===true,json:n.json===true,enforceGates:n.gates,reusePassed:n.reusePassed===true});n.json&&console.log(JSON.stringify(g,null,2)),g.summary.exitCode!==0&&process.exit(g.summary.exitCode);}else if(t==="explain"||t==="why"){let c=i(t),{parseWorkspaceExplainTarget:u}=await import('./workspace-explain-contract-24RQ7KIW.js'),{buildWorkspaceExplain:m,writeWorkspaceExplainReport:d}=await import('./workspace-explain-Q7TJCHD5.js'),p=(e??o??"").trim();!p&&n.scope&&(p=n.scope.startsWith("project:")?n.scope:`project:${n.scope}`),p||(console.log(s.red(`\u274C workspace ${t} requires a target.`)),console.log(s.gray(" npx rapidkit workspace explain project:<name>|release-blocked [--json] [--write]")),console.log(s.gray(" npx rapidkit workspace why <project>|release-blocked [--json]")),process.exit(1));let f=u(p);f||(console.log(s.red(`\u274C Invalid explain target: ${p}`)),process.exit(1));let g=await m({workspacePath:c,target:f}),y=n.write===true||a("--write"),w;if(y&&(w=await d(g,c,t==="why"?"why":"explain")),n.json){console.log(JSON.stringify({...g,outputPath:w},null,2));return}console.log(s.green(`\u2714 Workspace ${t==="why"?"why":"explain"}: ${g.summary}`));for(let P of g.sections)console.log(s.bold(`
|
|
331
|
+
${P.title}`)),console.log(P.body);w&&console.log(s.gray(`
|
|
332
|
+
Written: ${w}`));}else if(t==="trace"){let c=i("trace"),u=n.from||e;u||(console.log(s.red("\u274C workspace trace requires --from <diff-ref>")),console.log(s.gray(" npx rapidkit workspace trace --from .rapidkit/reports/workspace-model-diff-last-run.json --json")),process.exit(1));let{resolveWorkspaceTraceTarget:m}=await import('./workspace-explain-contract-24RQ7KIW.js'),{buildWorkspaceExplain:d,writeWorkspaceExplainReport:p}=await import('./workspace-explain-Q7TJCHD5.js'),f=m(u);(!f||f.kind!=="trace")&&(console.log(s.red(`\u274C Invalid trace ref: ${u}`)),console.log(s.gray(" Use a diff artifact path or trace:<path>, e.g. trace:.rapidkit/reports/workspace-model-diff-last-run.json")),process.exit(1));let g=await d({workspacePath:c,target:f}),y=n.write===true||a("--write"),w;if(y&&(w=await p(g,c,"trace")),n.json){console.log(JSON.stringify({...g,outputPath:w},null,2));return}console.log(s.green(`\u2714 Workspace trace: ${g.summary}`));for(let P of g.sections)console.log(s.bold(`
|
|
333
|
+
${P.title}`)),console.log(P.body);w&&console.log(s.gray(`
|
|
334
|
+
Written: ${w}`));}else if(t==="feedback"){let c=i("feedback"),u=(e||"record").toLowerCase();u!=="record"&&(console.log(s.red(`Unknown feedback action: ${u}`)),console.log(s.gray("Available: record")),process.exit(1)),!n.json&&!a("--json")&&(console.log(s.red("\u274C workspace feedback record requires --json (stdin payload)")),console.log(s.gray(` echo '{"actionId":"fix","summary":"ok","outcome":"ok"}' | npx rapidkit workspace feedback record --json`)),process.exit(1)),process.stdin.isTTY&&(console.log(s.red("\u274C workspace feedback record requires piped JSON on stdin (not a TTY)")),console.log(s.gray(` echo '{"actionId":"fix","summary":"ok","outcome":"ok"}' | npx rapidkit workspace feedback record --json`)),process.exit(1));let{recordWorkspaceFeedback:m,parseFeedbackStdinPayload:d,readStdinAll:p}=await import('./workspace-feedback-KCDFF7YS.js'),f=await p(),g=d(f);g||(console.log(s.red("\u274C Invalid or empty feedback JSON on stdin")),process.exit(1));let y=await m({workspacePath:c,payload:g});n.json?console.log(JSON.stringify(y,null,2)):y.ok?(console.log(s.green("\u2714 Workspace feedback recorded")),console.log(s.gray(` History: ${y.historyPath}`))):console.log(s.red(`\u274C ${y.error??"Failed to record feedback"}`)),y.ok||process.exit(1);}else if(t==="mcp"){let c=i("mcp"),u=(e||"serve").toLowerCase();u!=="serve"&&(n.json&&(console.log(JSON.stringify({command:"workspace mcp",action:u,result:"error",workspacePath:c,timestamp:new Date().toISOString(),error:{code:"workspace.mcp.unknown_action",message:`Unknown mcp action: ${u}`},availableActions:["serve"]},null,2)),process.exit(1)),console.log(s.red(`Unknown mcp action: ${u}`)),console.log(s.gray("Available: serve")),process.exit(1));let{runWorkspaceMcpServe:m}=await import('./workspace-mcp-serve-DFJIUTL5.js');n.json||console.error(s.gray("\u2139 RapidKit MCP server (read-mostly) listening on stdio JSON-RPC\u2026")),await m({workspacePath:c});}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:
|
|
335
335
|
npx rapidkit init | npx rapidkit workspace init | npx rapidkit workspace run init
|
|
336
|
-
`));let c=i("init"),
|
|
336
|
+
`));let c=i("init"),u=Number(n.maxWorkers??""),m=Number.isFinite(u)?Math.max(1,Math.trunc(u)):void 0,d=await cn(c);d!==0&&process.exit(d);let{runWorkspaceStage:p}=await import('./workspace-run-NULA72JV.js'),f=await p({workspacePath:c,stage:"init",scope:n.scope,affected:n.affected===true,blastRadius:n.blastRadius===true,since:n.since,parallel:n.parallel===true,maxWorkers:m,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: ${Ko.join(", ")}`)),process.exit(1);});function Mt(t){let e="\u2500".repeat(46);console.log(""),console.log(s.gray(e)),console.log(s.bold(t)),console.log(s.gray(e));}function bd(){console.log(s.yellow("Migration notice: rapidkit is moving to Workspai.")),console.log(s.gray("The rapidkit npm package is in compatibility mode and is planned for deprecation in a future release.")),console.log(s.gray("New installs should use:")),console.log(s.cyan(" npm install -g workspai")),console.log(s.cyan(" npx workspai --help")),console.log(s.gray("Legacy compatibility package: npm install -g rapidkit")),console.log(s.gray("Package: https://www.npmjs.com/package/workspai")),console.log(s.gray(`Repo: https://github.com/rapidkitlabs/workspai
|
|
337
|
+
`));}function Ca(){let t=b$1()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";bd(),console.log(s.white(`Usage:
|
|
337
338
|
`)),console.log(s.cyan(` npx rapidkit <workspace-name> [options]
|
|
338
339
|
`)),console.log(s.bold(`Open-Source Workspace Intelligence for Software Systems
|
|
339
340
|
`)),console.log(s.white("Most AI tools understand files.")),console.log(s.white("RapidKit helps developers, CI pipelines, IDEs, and AI agents share the same understanding of a software system.")),console.log(s.dim(`One workspace. One truth. Humans and AI aligned.
|
|
340
|
-
`)),
|
|
341
|
+
`)),Mt("Workspace Lifecycle"),console.log(s.white(`
|
|
341
342
|
1. Create or adopt a workspace
|
|
342
343
|
`)),console.log(s.cyan(" npx rapidkit my-workspace")),console.log(s.cyan(" npx rapidkit adopt /path/to/project")),console.log(s.cyan(` npx rapidkit import <path|git-url>
|
|
343
344
|
`)),console.log(s.white(`2. Build a workspace model
|
|
@@ -350,7 +351,7 @@ Written: ${k}`));}else if(t==="feedback"){let c=i("feedback"),f=(e||"record").to
|
|
|
350
351
|
`)),console.log(s.cyan(" npx rapidkit workspace verify --strict")),console.log(s.cyan(` npx rapidkit pipeline --strict
|
|
351
352
|
`)),console.log(s.white(`6. Explain blockers and trace change impact
|
|
352
353
|
`)),console.log(s.cyan(" npx rapidkit workspace explain release-blocked --json --write")),console.log(s.cyan(` npx rapidkit workspace trace --from .rapidkit/reports/workspace-model-diff-last-run.json --json --write
|
|
353
|
-
`)),
|
|
354
|
+
`)),Mt("Workspace Intelligence"),console.log(s.white(`
|
|
354
355
|
What projects exist?
|
|
355
356
|
`)),console.log(s.cyan(` npx rapidkit workspace model --json
|
|
356
357
|
`)),console.log(s.white(`What should AI agents know?
|
|
@@ -367,7 +368,7 @@ What projects exist?
|
|
|
367
368
|
`)),console.log(s.cyan(` npx rapidkit workspace agent-sync --write
|
|
368
369
|
`)),console.log(s.white(`Expose evidence to MCP clients?
|
|
369
370
|
`)),console.log(s.cyan(` npx rapidkit workspace mcp serve
|
|
370
|
-
`)),
|
|
371
|
+
`)),Mt("Workspace Operations"),console.log(s.white(`
|
|
371
372
|
Create workspace
|
|
372
373
|
`)),console.log(s.cyan(` npx rapidkit my-workspace
|
|
373
374
|
`)),console.log(s.white(`Bootstrap toolchains
|
|
@@ -379,7 +380,7 @@ Create workspace
|
|
|
379
380
|
`)),console.log(s.cyan(` npx rapidkit adopt /path/to/project
|
|
380
381
|
`)),console.log(s.white(`Import repository
|
|
381
382
|
`)),console.log(s.cyan(` npx rapidkit import <path|git-url>
|
|
382
|
-
`)),
|
|
383
|
+
`)),Mt("Governance & Release"),console.log(s.white(`
|
|
383
384
|
Analyze workspace
|
|
384
385
|
`)),console.log(s.cyan(` npx rapidkit analyze
|
|
385
386
|
`)),console.log(s.white(`Check readiness
|
|
@@ -390,7 +391,7 @@ Analyze workspace
|
|
|
390
391
|
`)),console.log(s.cyan(` npx rapidkit snapshot create
|
|
391
392
|
`)),console.log(s.white(`Archive project
|
|
392
393
|
`)),console.log(s.cyan(` npx rapidkit project archive
|
|
393
|
-
`)),
|
|
394
|
+
`)),Mt("Agent Grounding"),console.log(s.white(`
|
|
394
395
|
Generate context pack
|
|
395
396
|
`)),console.log(s.cyan(` npx rapidkit workspace context --for-agent
|
|
396
397
|
`)),console.log(s.white(`Sync agent surfaces
|
|
@@ -399,24 +400,25 @@ Generate context pack
|
|
|
399
400
|
`)),console.log(s.cyan(` npx rapidkit workspace mcp serve
|
|
400
401
|
`)),console.log(s.white(`Supported ecosystems:
|
|
401
402
|
`)),console.log(s.gray(` Copilot \xB7 Cursor \xB7 Claude Code \xB7 Codex \xB7 MCP-ready tools
|
|
402
|
-
`)),
|
|
403
|
+
`)),Mt("Mental Model"),console.log(s.gray(`
|
|
403
404
|
Repository`)),console.log(s.gray(" \u2193")),console.log(s.gray(" Workspace")),console.log(s.gray(" \u2193")),console.log(s.gray(" Workspace Intelligence")),console.log(s.gray(" \u2193")),console.log(s.gray(` Developers \xB7 CI \xB7 IDEs \xB7 AI Agents
|
|
404
405
|
`)),console.log(s.dim(`RapidKit turns projects and repositories into a shared, evidence-backed understanding of a software system.
|
|
405
|
-
`)),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 ${
|
|
406
|
+
`)),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 ${v.join(g(),"my-workspace")}`)+s.gray(" # default managed location")),console.log(s.cyan(" npx rapidkit my-workspace --here ")+s.gray("# Create in current directory, then cd my-workspace")),console.log(s.cyan(" npx rapidkit bootstrap ")+s.gray("# Bootstrap all runtime toolchains")),console.log(s.cyan(" npx rapidkit create project nextjs web ")+s.gray("# Frontend (Next.js)")),console.log(s.cyan(" npx rapidkit create project fastapi.standard api ")+s.gray("# Backend (FastAPI)")),console.log(s.cyan(" cd my-api")),console.log(s.cyan(` ${t}
|
|
406
407
|
`)),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
|
|
408
|
+
`)),console.log(s.gray(` Tip: use --skip-python-engine for a Python-aware Workspace Intelligence shell first; after creating a RapidKit module-enabled project, run workspace run init to install the local Python engine.
|
|
407
409
|
`)),console.log(s.bold("Workspace commands (inside a workspace):")),console.log(s.gray(" npx rapidkit bootstrap [--profile <p>] Re-bootstrap toolchains")),console.log(s.gray(" npx rapidkit analyze [--json --strict] Analyze workspace health and gaps")),console.log(s.gray(" npx rapidkit pipeline [--json --strict] Governance loop: sync \u2192 doctor \u2192 analyze \u2192 readiness \u2192 autopilot")),console.log(s.gray(" npx rapidkit readiness [--json --strict] Release readiness gates (env/doctor/analyze/verify/deps)")),console.log(s.gray(" npx rapidkit doctor workspace [--ci] Workspace health with CI exit codes")),console.log(s.gray(" npx rapidkit workspace list List registered workspaces")),console.log(s.gray(" npx rapidkit workspace model --json Build workspace intelligence model")),console.log(s.gray(" npx rapidkit workspace context --for-agent --json --write Build agent context + sync grounding")),console.log(s.gray(" npx rapidkit workspace agent-sync --write --refresh-context Sync the Agent Customization Pack")),console.log(s.gray(" npx rapidkit workspace snapshot --json Persist workspace intelligence snapshot")),console.log(s.gray(" npx rapidkit workspace diff --from <file|git[:ref]> --json Diff current model against a snapshot")),console.log(s.gray(" npx rapidkit workspace impact --from <file> --json Build blast radius from model diff")),console.log(s.gray(" npx rapidkit workspace verify [--strict] --json Evaluate impact verification evidence")),console.log(s.gray(" npx rapidkit workspace explain <target> [--write] --json Narrative for blockers/projects (alias: why)")),console.log(s.gray(" npx rapidkit workspace trace --from <diff> [--write] --json Diff \u2192 blast radius \u2192 gates narrative")),console.log(s.gray(" npx rapidkit workspace feedback record --json Append agent action outcome to intelligence history")),console.log(s.gray(" npx rapidkit workspace mcp serve Read-mostly stdio MCP over workspace evidence")),console.log(s.gray(" npx rapidkit workspace graph [emit|explain|dot|mermaid] Inspect/visualize dependency graph")),console.log(s.gray(" npx rapidkit workspace watch [--once] [--json] Keep model+graph in memory; stream change events")),console.log(s.gray(" npx rapidkit workspace run <stage> [--scope project:<name>] [--reuse-passed] Fleet init/test/build/start or custom stage")),console.log(s.gray(" npx rapidkit workspace sync [--json] Sync registry + contract from projects")),console.log(s.gray(" npx rapidkit workspace registry status [--refresh] [--json] Canonical project registry summary")),console.log(s.gray(" npx rapidkit import <path|git-url> Copy or clone a backend project into this workspace")),console.log(s.gray(" npx rapidkit adopt [path] Link an existing local project to a workspace")),console.log(s.gray(" npx rapidkit snapshot create [name] Create a recoverable workspace snapshot")),console.log(s.gray(" npx rapidkit snapshot restore <name> Restore snapshot metadata with safety guard")),console.log(s.gray(" npx rapidkit snapshot inspect <name> Inspect snapshot manifest and size")),console.log(s.gray(" npx rapidkit project archive <name> Archive a project with a safety snapshot")),console.log(s.gray(" npx rapidkit project restore <archive> Restore an archived project safely")),console.log(s.gray(" npx rapidkit workspace share [--output <file>] Export collaboration bundle")),console.log(s.gray(" npx rapidkit workspace foundation ensure Ensure workspace.json/policies/toolchain files")),console.log(s.gray(" npx rapidkit workspace contract init Create workspace service contract")),console.log(s.gray(" npx rapidkit workspace contract verify Verify service ports/dependencies")),console.log(s.gray(" npx rapidkit workspace contract graph Show service dependency graph")),console.log(s.gray(" npx rapidkit workspace export --output <file> Export portable workspace archive")),console.log(s.gray(" npx rapidkit workspace archive verify <file> Verify archive integrity")),console.log(s.gray(" npx rapidkit workspace archive doctor <file> Diagnose archive readiness")),console.log(s.gray(" npx rapidkit workspace hydrate <archive> --output <dir> Hydrate workspace archive")),console.log(s.gray(" npx rapidkit workspace policy show Show effective workspace policies")),console.log(s.gray(" npx rapidkit workspace policy set <k> <v> Update workspace policy values")),console.log(s.gray(" npx rapidkit setup python|node|go|java|dotnet [--warm-deps] Set up runtime (+ optional deps warm-up)")),console.log(s.gray(" npx rapidkit mirror [status|sync|verify|rotate] Registry mirror management")),console.log(s.gray(" npx rapidkit cache [status|clear|prune|repair] Package cache management")),console.log(s.gray(" npx rapidkit infra plan Discover and generate infra compose")),console.log(s.gray(` npx rapidkit infra up|down|status Manage Docker sidecar infrastructure
|
|
408
410
|
`)),console.log(s.bold("Options (workspace creation):")),console.log(s.gray(" -y, --yes Skip prompts and use defaults")),console.log(s.gray(" --author <name> Author/team name for workspace metadata")),console.log(s.gray(" --skip-git Skip git initialization")),console.log(s.gray(" --debug Enable debug logging")),console.log(s.gray(" --dry-run Show what would be created")),console.log(s.gray(" --create-workspace When creating a project outside a workspace: create and register a workspace in the current directory")),console.log(s.gray(" --no-workspace When creating a project outside a workspace: do not create a workspace")),console.log(s.gray(` --no-update-check Skip checking for updates
|
|
409
411
|
`)),console.log(s.bold("Project commands (inside a project):")),console.log(s.gray(" npx rapidkit create project Scaffold a new project")),console.log(s.gray(" cd my-api Change directory to the new project")),console.log(s.gray(" npx rapidkit init Install project dependencies")),console.log(s.gray(" npx rapidkit dev Start dev server")),console.log(s.gray(" npx rapidkit build Build for production")),console.log(s.gray(` npx rapidkit test Run tests
|
|
410
412
|
`)),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
|
|
411
|
-
`)),
|
|
413
|
+
`)),wd?(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
|
|
412
414
|
`))):console.log(s.gray(`Tip: set RAPIDKIT_SHOW_LEGACY=1 to show legacy template flags in help.
|
|
413
|
-
`));}var
|
|
415
|
+
`));}var la="__rapidkit_signal_handlers_registered__",da=globalThis;da[la]||(da[la]=true,process.on("SIGINT",async()=>{if(!Yo){if(Yo=true,console.log(s.yellow(`
|
|
414
416
|
|
|
415
|
-
\u26A0\uFE0F Interrupted by user`)),
|
|
416
|
-
`):await
|
|
417
|
-
`)),
|
|
418
|
-
`),process.exit(1);}):a||l?
|
|
419
|
-
`),process.exit(1);}):c?
|
|
420
|
-
`),process.exit(1);}):
|
|
421
|
-
`),
|
|
422
|
-
`),
|
|
417
|
+
\u26A0\uFE0F Interrupted by user`)),st&&await E__default.pathExists(st)){console.log(s.gray("Cleaning up partial installation..."));try{await E__default.remove(st),console.log(s.green("\u2713 Cleanup complete"));}catch(t){f.debug("Cleanup failed:",t);}}b$6(130,"Interrupted by user"),process.exit(130);}}),process.on("SIGTERM",async()=>{if(!Yo){if(Yo=true,f.debug("Received SIGTERM"),st&&await E__default.pathExists(st))try{await E__default.remove(st);}catch(t){f.debug("Cleanup failed:",t);}b$6(143,"Terminated"),process.exit(143);}}));var jd=process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test",Sd=(()=>{let t=process.argv[1];if(!t)return false;let e=t.replace(/\\/g,"/"),o=e.endsWith("/dist/index.js")||e.endsWith("/src/index.ts");try{return j.realpathSync(t)===j.realpathSync(fileURLToPath(import.meta.url))||o}catch{return v.resolve(t)===v.resolve(fileURLToPath(import.meta.url))||o}})(),xd=!jd||Sd;function Cd(){for(let t of [process.stdout,process.stderr])t._handle?.setBlocking?.(true);}function Rd(){for(let t of [process.stdout,process.stderr]){if(t.isTTY)continue;let e=t;if(e.__rapidkitSyncWriteInstalled)continue;let o=t.fd;if(typeof o!="number")continue;let r=t.write.bind(t);e.write=((n,i,a)=>{let l=typeof i=="string"?i:"utf8",c=typeof i=="function"?i:typeof a=="function"?a:void 0;try{let u=typeof n=="string"?Buffer.from(n,l):n instanceof Uint8Array?Buffer.from(n):Buffer.from(String(n),l);return j.writeSync(o,u),c?.(),true}catch{return r(n,l,c)}}),e.__rapidkitSyncWriteInstalled=true;}}async function ne(t){b$6(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(o=>{e.write("",()=>o());}))),process.exit(t);}async function pa(t,e=0){return j.writeSync(process.stdout.fd??1,t),ne(e)}if(xd){Cd(),Rd(),d$3(),a$3({argv:process.argv,cwd:process.cwd(),rapidkitVersion:b()}),c$1(process.argv);let t=process.argv.slice(2),e$2=t[0],o=process.cwd(),r=We(o),n=j.existsSync(v.join(o,".rapidkit","project.json")),i$2=Ql(),a=Zi(t),l=i$2&&eo(t),c=e$2==="init"&&r&&!n;(t.length===0||t.length===1&&(e$2==="--help"||e$2==="-h"||e$2==="help"))&&(a$1("npm cli"),Ca(),await ne(0)),t.some(m=>m==="--version"||m==="-V"||m==="-v")&&!t.some(m=>m==="--help"||m==="-h"||m==="help")&&(t.includes("--json")?await pa(`${JSON.stringify(Zl(),null,2)}
|
|
418
|
+
`):await pa(`${b()}
|
|
419
|
+
`)),nn(t)&&await ne(0),l&&ea(e$2)?(async()=>{e$2==="bootstrap"&&await ne(await na(t)),e$2==="setup"&&await ne(await sa(t)),e$2==="cache"&&await ne(await ia(t)),await ne(await aa(t));})().catch(m=>{process.stderr.write(`RapidKit (npm) failed to run ${e$2}: ${m?.message??m}
|
|
420
|
+
`),process.exit(1);}):a||l?oe.parseAsync().then(()=>ne(0)).catch(m=>{process.stderr.write(`RapidKit (npm) failed: ${m?.message??m}
|
|
421
|
+
`),process.exit(1);}):c?ln(t).then(m=>ne(m)).catch(m=>{process.stderr.write(`RapidKit (npm) failed to run workspace init: ${m?.message??m}
|
|
422
|
+
`),process.exit(1);}):hd().then(async m=>{if(!m){let d=process.argv.slice(2);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] argv=${JSON.stringify(d)}
|
|
423
|
+
`),Zi(d)){await oe.parseAsync();return}if(nn(d)&&await ne(0),d[0]==="create"){let f=await ga(d);await ne(f);}if(d[0]==="init"){let f=await ln(d);await ne(f);}if(ea(d[0])){if(d[0]==="bootstrap"){let g=await na(d);await ne(g);}if(d[0]==="setup"){let g=await sa(d);await ne(g);}if(d[0]==="cache"){let g=await ia(d);await ne(g);}let f=await aa(d);await ne(f);}if(m$1(d[0])){if(sn(d))return;let f=d[0],g=d$4(process.cwd()),y=await yt(process.cwd()),w=Z(process.cwd()),P=false;if(w){let b=v.join(w,".rapidkit","policies.yml");if(await E__default.pathExists(b))try{let A=await j.promises.readFile(b,"utf-8");if(P=((A.match(/^\s*enforcement_mode:\s*(warn|strict)\s*(?:#.*)?$/m)??A.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m))?.[1]??"warn")==="strict",P){let Y=v.join(w,".rapidkit","toolchain.lock"),U=[];if(!await E__default.pathExists(Y))U.push("toolchain.lock is missing \u2014 run `rapidkit bootstrap` first (strict mode requires a reproducible toolchain).");else try{let K=JSON.parse(await j.promises.readFile(Y,"utf-8")).runtime??{};e$1(g,process.cwd())&&!K.go?.version&&U.push("Go runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."),f$2(g,process.cwd())&&!K.node?.version&&U.push("Node runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."),g$1(g,process.cwd())&&!K.java?.version&&U.push("Java runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup java` first."),h$2(g,process.cwd())&&!K.dotnet?.version&&U.push(".NET runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup dotnet` first."),i(g,process.cwd())&&!K.python?.version&&U.push("Python runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");}catch{U.push("toolchain.lock is invalid JSON \u2014 regenerate it with `rapidkit bootstrap` before running commands in strict mode.");}let J=v.join(w,".rapidkit","workspace.json");if(await E__default.pathExists(J))try{let K=JSON.parse(await j.promises.readFile(J,"utf-8")).profile??"",V=i$1(process.cwd(),g),R=nt({profile:K,runtime:V.runtime,subjectLabel:v.basename(process.cwd()),mode:"strict"});R.ok||U.push(`${R.message} Update the workspace profile or use a polyglot workspace.`);}catch{}if(U.length>0){console.log(s.red(`\u274C Strict policy violations block \`${f}\`:`));for(let Se of U)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 ne(1);}}}catch{}}let k=await a$4({startPath:process.cwd(),action:f,writeReport:true}),h=P||process.env.RAPIDKIT_LIFECYCLE_ENFORCE_READINESS==="1"||process.env.RAPIDKIT_ENFORCE_READINESS==="1";if(k.blocking&&h){console.log(s.red(`\u274C Release readiness blocks \`${f}\`:`));for(let b of k.blockingReasons)console.log(s.red(` \u2022 ${b}`));k.evidencePath&&console.log(s.gray(`\u2139\uFE0F Readiness evidence: ${k.evidencePath}`)),await ne(1);}k.overallStatus!=="pass"&&!h&&(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 S=await Sa(process.cwd(),async()=>{if(e$1(g,process.cwd())||y==="go"){let b=Ne("go",{runCommandInCwd:B,runCoreRapidkit:e});if(f==="lint")return X(await b.runLint?.(process.cwd())??{exitCode:1,message:"Lint is not supported."});if(f==="format")return X(await b.runFormat?.(process.cwd())??{exitCode:1,message:"Format is not supported."});let A=f==="dev"?await b.runDev(process.cwd()):f==="test"?await b.runTest(process.cwd()):f==="build"?await b.runBuild(process.cwd()):await b.runStart(process.cwd());return A.message&&console.log(s.red(`\u274C ${A.message}`)),A.exitCode}if(g$1(g,process.cwd())||y==="java")return f==="dev"?await He("dev",process.cwd()):f==="test"?await He("test",process.cwd()):f==="build"?await He("build",process.cwd()):f==="lint"?await He("lint",process.cwd()):f==="format"?await He("format",process.cwd()):await He("start",process.cwd());if(h$2(g,process.cwd())||y==="dotnet"){let b=Ne("dotnet",{runCommandInCwd:B,runCoreRapidkit:e});if(f==="lint")return X(await b.runLint?.(process.cwd())??{exitCode:1,message:"Lint is not supported."});if(f==="format")return X(await b.runFormat?.(process.cwd())??{exitCode:1,message:"Format is not supported."});let A=f==="dev"?await b.runDev(process.cwd()):f==="test"?await b.runTest(process.cwd()):f==="build"?await b.runBuild(process.cwd()):await b.runStart(process.cwd());return A.message&&console.log(s.red(`\u274C ${A.message}`)),A.exitCode}if(f$2(g,process.cwd())||y==="node")return f==="dev"?await gt("dev",process.cwd()):f==="test"?await gt("test",process.cwd()):f==="build"?await gt("build",process.cwd()):f==="lint"?await gt("lint",process.cwd()):f==="format"?await gt("format",process.cwd()):await gt("start",process.cwd());if(i(g,process.cwd())||y==="python"){if(f==="lint"||f==="format")return await e([f],{cwd:process.cwd()});let b=Ne("python",{runCommandInCwd:B,runCoreRapidkit:e});return X(f==="dev"?await b.runDev(process.cwd()):f==="test"?await b.runTest(process.cwd()):f==="build"?await b.runBuild(process.cwd()):await b.runStart(process.cwd()))}return -1});if(!S.ok){await ne(S.code);return}if(S.ok&&S.value>=0){await ne(S.value);return}if(S.ok&&S.value===-1){console.error(s.red(`\u274C RapidKit cannot run \`${f}\` for this project runtime.`)),console.error(s.gray("Run `rapidkit project commands` to inspect supported commands.")),await ne(1);return}}if(sn(d))return;let p=await kd(d);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] shouldForwardToCore=${p}
|
|
424
|
+
`),p){let f=await e(d,{cwd:process.cwd()});await ne(f);}await oe.parseAsync();}});}export{ka as COMMAND_CAPABILITIES_SCHEMA_VERSION,Bl as NPM_ONLY_SCOPED_COMMANDS,ya as NPM_ONLY_TOP_LEVEL_COMMANDS,Xl as VERSION_CONTRACT_SCHEMA_VERSION,Hl as WRAPPER_ORCHESTRATED_PROJECT_COMMANDS,od as detectWindowsDoctorWorkspaceShadow,ed as getGlobalCommandCapabilities,Uo as getPublishedContractVersions,Zl as getVersionContract,ud as handleAdoptCommand,na as handleBootstrapCommand,ia as handleCacheCommand,ga as handleCreateOrFallback,pd as handleImportCommand,ln as handleInitCommand,aa as handleMirrorCommand,sa as handleSetupCommand,cn as installWorkspaceDependencies,Ql as isNpmExecInvocation,kd as shouldForwardToCore};
|