rapidkit 0.35.0 → 0.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analyze-HXO6R656.js +1 -0
- package/dist/autopilot-release-FMQ5KND5.js +1 -0
- package/dist/chunk-45KNNNAB.js +2 -0
- package/dist/chunk-7ZSURMR2.js +4 -0
- package/dist/{chunk-FNL34DKD.js → chunk-DC44JPI3.js} +1 -1
- package/dist/{chunk-752X3YI3.js → chunk-HUQ5WRUF.js} +48 -48
- package/dist/{chunk-KDUAZXEQ.js → chunk-KIB4KHBF.js} +3 -3
- package/dist/chunk-UY4LZEXK.js +7 -0
- package/dist/chunk-Y2ZPG7KN.js +9 -0
- package/dist/create-7R4CGABE.js +1 -0
- package/dist/index.js +63 -63
- package/dist/pipeline-23AEXNF2.js +5 -0
- package/dist/{workspace-ZXWYIZOR.js → workspace-ZDL5IQU4.js} +1 -1
- package/dist/workspace-foundation-QVWALXMP.js +1 -0
- package/dist/{workspace-intelligence-NXIO55GJ.js → workspace-intelligence-VLA2RILM.js} +1 -1
- package/dist/workspace-run-NIKH2IKF.js +1 -0
- package/dist/{workspace-verify-K56NI3AI.js → workspace-verify-XEXRCET7.js} +1 -1
- package/package.json +1 -1
- package/dist/analyze-IIPDLLM2.js +0 -1
- package/dist/autopilot-release-EO7GQS4P.js +0 -1
- package/dist/chunk-5LLGW5TP.js +0 -9
- package/dist/chunk-B7NCBH5B.js +0 -2
- package/dist/chunk-DKVWFHZO.js +0 -4
- package/dist/chunk-R4RPUW7I.js +0 -7
- package/dist/create-LUXJGSNL.js +0 -1
- package/dist/pipeline-7OTUIB6D.js +0 -5
- package/dist/workspace-foundation-TYLH5SAU.js +0 -1
- package/dist/workspace-run-AZ63D75J.js +0 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {b as b$2,a as a$5}from'./chunk-
|
|
2
|
+
import {b as b$2,a as a$5}from'./chunk-7ZSURMR2.js';import {a as a$9}from'./chunk-YJ24EV3P.js';import {j as j$1,a as a$4,b as b$3,c as c$1,d,e as e$2,f as f$1,q,s,h as h$2,m,i as i$2,r,t,g,p,k,o}from'./chunk-YBS2HGO3.js';export{i as PROJECT_COMMANDS_CORE_FALLBACK}from'./chunk-YBS2HGO3.js';import {a as a$6}from'./chunk-KMUWWZRT.js';import {i as i$3}from'./chunk-UZW5QFRW.js';import {f,e as e$1,d as d$1,i as i$4,a as a$7,g as g$1}from'./chunk-GX7UU7LL.js';import {a as a$2,b as b$1,c,e,j as j$2}from'./chunk-IATULVMR.js';import {b as b$4,d as d$2}from'./chunk-RV6HBTFC.js';import {a as a$8}from'./chunk-A5FBGRJA.js';import {a as a$a}from'./chunk-VKLL63TL.js';import {b,a as a$3}from'./chunk-AC6KIKII.js';import {a as a$1}from'./chunk-VM2TOHNX.js';import {a,h as h$1,i as i$1,f as f$2,b as b$6,d as d$3,c as c$3,j as j$3}from'./chunk-Z5LKRG57.js';import {c as c$5}from'./chunk-2FIX2MDC.js';import {c as c$4}from'./chunk-MCLLP6MW.js';import {c as c$2,b as b$5}from'./chunk-HHJAANUC.js';import {Command,Option}from'commander';import i from'chalk';import He from'inquirer';import h from'path';import {fileURLToPath}from'url';import {spawn,spawnSync}from'child_process';import Mi from'validate-npm-package-name';import*as R from'fs-extra';import R__default from'fs-extra';import j,{promises,createWriteStream}from'fs';import jn,{homedir,tmpdir}from'os';import {execa}from'execa';import oa from'ora';import ro,{createVerify,createHash,createHmac}from'crypto';import Bs from'http';import Vs from'https';function Pt(t){let e=Mi(t);if(!e.validForNewPackages){let o=e.errors||[],n=e.warnings||[],s=[...o,...n];throw new j$2(t,`NPM validation failed: ${s.join(", ")}`)}if(!/^[a-z][a-z0-9_-]*$/.test(t))throw new j$2(t,"Must start with a lowercase letter and contain only lowercase letters, numbers, hyphens, and underscores");if(["test","tests","src","dist","build","lib","python","pip","poetry","node","npm","rapidkit","rapidkit"].includes(t.toLowerCase()))throw new j$2(t,`"${t}" is a reserved name. Please choose a different name.`);if(t.length<2)throw new j$2(t,"Name must be at least 2 characters long");if(t.length>214)throw new j$2(t,"Name must be less than 214 characters");return true}function Ti(){return d$3()}function Wi(t,e){return t==="py"?["-3",...e]:e}function Fi(t){return typeof t=="object"&&t!==null}async function Ji(t,e,r,o=c$5()){try{let n=await execa(t,e,{cwd:r,timeout:o,reject:false,stdio:"pipe"});return {ok:n.exitCode===0,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr}}catch(n){return {ok:false,exitCode:void 0,stdout:"",stderr:n instanceof Error?n.message:String(n)}}}async function Ki(t,e){let r=["-m","rapidkit",...t],o=Ti();for(let n of o){let s=await Ji(n,Wi(n,r),e?.cwd,e?.timeoutMs);if(!s.ok)continue;let a=(s.stdout??"").trim();try{let c=JSON.parse(a);return Fi(c)?{ok:true,command:n,exitCode:s.exitCode,stdout:s.stdout,stderr:s.stderr,data:c}:{ok:false,command:n,exitCode:s.exitCode,stdout:s.stdout,stderr:s.stderr}}catch{return {ok:false,command:n,exitCode:s.exitCode,stdout:s.stdout,stderr:s.stderr}}}return {ok:false}}async function yn(t,e){let r=await Ki(["project","detect","--path",t,"--json"],e);return !r.ok||!r.data||r.data.schema_version!==1?{ok:false,command:r.command,exitCode:r.exitCode,stdout:r.stdout,stderr:r.stderr}:r}var wn=new Set(["create"]),Br=new Set(["--yes","-y","--skip-git","--skip-install","--debug","--dry-run","--no-update-check","--create-workspace","--no-workspace"]),Li=new Set(["pip","poetry","venv","pipx","python"]);function kn(t){return typeof t=="string"&&Li.has(t)}function Vr(t,e){return !t||wn.has(t)?false:a$7.has(t)?true:e?.has(t)??false}function qr(t,e=null){let r=t[0];return !r||r.startsWith("-")||wn.has(r)||r==="init"?false:Vr(r,e)?true:t.filter(n=>!n.startsWith("-")&&!Br.has(n)).length<=1?false:t.length>1}var jt=h.join(jn.homedir(),".rapidkitrc.json"),Gi=h.join(jn.homedir(),".rapidkit","config.json");function vn(t){try{if(!j.existsSync(t))return {};let e=j.readFileSync(t,"utf-8"),r=JSON.parse(e);return !r||typeof r!="object"||Array.isArray(r)?{}:r}catch{return {}}}function bn(t){if(process.platform!=="win32")try{j.chmodSync(t,384);}catch{}}function bt(){let t=vn(jt),e=vn(Gi);return j.existsSync(jt)&&bn(jt),{...t,openaiApiKey:t.openaiApiKey??e.openaiApiKey,aiEnabled:t.aiEnabled??e.aiEnabled,telemetry:t.telemetry??e.telemetry}}function ar(t){let r={...bt(),...t};j.writeFileSync(jt,JSON.stringify(r,null,2),{encoding:"utf-8",mode:384}),bn(jt);}function Tt(){return process.env.OPENAI_API_KEY||bt().openaiApiKey||null}function Ur(){return bt().aiEnabled!==false}function Hr(){return jt}async function xn(){return (await import('inquirer')).default}function Sn(t){let e=t.command("config").description("Configure RapidKit settings");e.command("set-api-key").description("Set OpenAI API key for AI features").option("--key <key>","API key (or enter interactively)").action(async r=>{let o=r.key;o?o.startsWith("sk-")||(console.log(i.red(`
|
|
3
3
|
\u274C Invalid API key format (should start with sk-)
|
|
4
4
|
`)),process.exit(1)):o=(await(await xn()).prompt([{type:"password",name:"apiKey",message:"Enter your OpenAI API key:",validate:a=>a?a.startsWith("sk-")?a.length<20?"API key seems too short":true:"Invalid API key format (should start with sk-)":"API key is required"}])).apiKey,ar({openaiApiKey:o}),console.log(i.green(`
|
|
5
5
|
\u2705 OpenAI API key saved successfully!
|
|
@@ -28,7 +28,7 @@ Cancelled
|
|
|
28
28
|
`));let o=r.length*50/1e6*.02;if(console.log(i.cyan(`\u{1F4B0} Estimated cost: ~$${o.toFixed(3)}`)),console.log(i.gray(` (Based on ${r.length} modules at $0.02/1M tokens)
|
|
29
29
|
`)),t){let a=await Fn(),{confirm:c}=await a.prompt([{type:"confirm",name:"confirm",message:"Generate embeddings now?",default:true}]);if(!c)return console.log(i.yellow(`
|
|
30
30
|
\u26A0\uFE0F Embeddings generation cancelled
|
|
31
|
-
`)),false}let n=r.map(a=>`${a.name}. ${a.description}. ${a.longDescription}. Keywords: ${a.keywords.join(", ")}. Use cases: ${a.useCases.join(", ")}.`),s=oa(`Generating embeddings for ${r.length} modules...`).start();try{let a=await _n(n);s.succeed(`Generated embeddings for ${r.length} modules`);let c={model:"text-embedding-3-small",dimension:a[0].length,generated_at:new Date().toISOString(),modules:r.map((p
|
|
31
|
+
`)),false}let n=r.map(a=>`${a.name}. ${a.description}. ${a.longDescription}. Keywords: ${a.keywords.join(", ")}. Use cases: ${a.useCases.join(", ")}.`),s=oa(`Generating embeddings for ${r.length} modules...`).start();try{let a=await _n(n);s.succeed(`Generated embeddings for ${r.length} modules`);let c={model:"text-embedding-3-small",dimension:a[0].length,generated_at:new Date().toISOString(),modules:r.map((u,p)=>({id:u.id,name:u.name,embedding:a[p]}))},l=e||h.join(process.cwd(),"data","modules-embeddings.json"),f=h.dirname(l);return j.existsSync(f)||j.mkdirSync(f,{recursive:true}),j.writeFileSync(l,JSON.stringify(c,null,2)),console.log(i.green(`
|
|
32
32
|
\u2705 Embeddings generated successfully!`)),console.log(i.gray(`\u{1F4C1} Saved to: ${l}`)),console.log(i.gray(`\u{1F4CA} Size: ${r.length} modules, ${a[0].length} dimensions
|
|
33
33
|
`)),true}catch(a){s.fail("Failed to generate embeddings");let c=Wn(a);return c.includes("429")?(console.log(i.red(`
|
|
34
34
|
\u274C OpenAI API quota exceeded`)),console.log(i.yellow(`Please check your billing: https://platform.openai.com/account/billing
|
|
@@ -69,7 +69,7 @@ Cancelled
|
|
|
69
69
|
`)),l.length>0)console.log(i.yellow(`\u26A0\uFE0F Low confidence matches found:
|
|
70
70
|
`));else return;if(o.json){console.log(JSON.stringify({query:s,recommendations:l},null,2));return}console.log(i.green.bold(`\u{1F4E6} Recommended Modules:
|
|
71
71
|
`)),l.forEach((d,m)=>{let g=(d.score*100).toFixed(1),w=d.score>.8?" \u2B50":"";console.log(i.bold(`${m+1}. ${d.module.name}${w}`)),console.log(i.gray(` ${d.module.description}`)),console.log(i.cyan(` Match: ${g}%`)+i.gray(` - ${d.reason}`)),console.log(i.yellow(` Category: ${d.module.category}`)),d.module.dependencies.length>0&&console.log(i.magenta(` Requires: ${d.module.dependencies.join(", ")}`)),console.log();});let f$1=l.slice(0,3).map(d=>d.module.id);console.log(i.cyan("\u{1F4A1} Quick install (top 3):")),console.log(i.white(` rapidkit add module ${f$1.join(" ")}
|
|
72
|
-
`));let
|
|
72
|
+
`));let u=await Gn(),{shouldInstall:p}=await u.prompt([{type:"confirm",name:"shouldInstall",message:"Would you like to install these modules now?",default:false}]);if(p){let{selectedModules:d}=await u.prompt([{type:"checkbox",name:"selectedModules",message:"Select modules to install:",choices:l.map(m=>({name:`${m.module.name} - ${m.module.description}`,value:m.module.id,checked:m.score>.7}))}]);if(d.length>0){console.log(i.blue(`
|
|
73
73
|
\u{1F4E6} Installing ${d.length} modules...
|
|
74
74
|
`)),console.log(i.gray(`Command: rapidkit add module ${d.join(" ")}`));let m=a$4(process.cwd());if(m?.module_support===false){let w=m?.runtime==="java"?"Spring Boot":"Go";console.log(i.red(`
|
|
75
75
|
\u274C RapidKit modules are not available for ${w} npm-level kits.`)),console.log(i.gray(` The module system requires Python and is currently only supported for FastAPI and NestJS projects.
|
|
@@ -101,7 +101,7 @@ No modules selected
|
|
|
101
101
|
`))),process.exit(o?0:1);}catch(r){let o=eo(r);a$1.error("Failed to generate embeddings:",o.message),process.exit(1);}}),e.command("update-embeddings").description("Update existing embeddings with latest modules").action(async()=>{try{let r=Tt();r||(console.log(i.red(`
|
|
102
102
|
\u274C OpenAI API key not configured
|
|
103
103
|
`)),console.log(i.white(`Set your API key: rapidkit config set-api-key
|
|
104
|
-
`)),process.exit(1)),dr(r);let o=await Ln();process.exit(o?0:1);}catch(r){let o=eo(r);a$1.error("Failed to update embeddings:",o.message),process.exit(1);}});}var aa="rapidkit.product-factory-plan.v1",ca="rapidkit.private-product-manifest.v1";function Ft(t,e=""){return typeof t=="string"&&t.trim()?t.trim():e}function to(t){return typeof t=="string"&&t.trim()?t.trim():null}function la(t,e){return typeof t=="number"&&Number.isFinite(t)?t:e}function qn(t){return Array.isArray(t)?[...new Set(t.filter(e=>typeof e=="string").map(e=>e.trim()).filter(Boolean))]:[]}function Hn(t){if(!/^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/.test(t))throw new Error(`Invalid product slug "${t}". Use lowercase letters, numbers, and hyphens.`)}function da(t,e,r){let o=Ft(t.slug);if(!o)throw new Error(`Backlog product at index ${e} is missing slug.`);Hn(o);let n=qn(t.modules),s=qn(t.moduleGaps);return {rank:la(t.rank,e+1),slug:o,title:Ft(t.title,o),category:Ft(t.category,"Uncategorized"),tier:Ft(t.tier,"pro"),summary:Ft(t.summary),modules:n,moduleGaps:s,recommendedKit:r,workspaceProfile:"enterprise",readiness:{status:s.length>0?"blocked-by-module-gaps":"ready-for-private-manifest",blockingGaps:s}}}function pa(t){if(!t||typeof t!="object"||Array.isArray(t))throw new Error("Backlog must be a JSON object.");return t}async function ua(t){let e=h.resolve(process.cwd(),t),r=pa(await
|
|
104
|
+
`)),process.exit(1)),dr(r);let o=await Ln();process.exit(o?0:1);}catch(r){let o=eo(r);a$1.error("Failed to update embeddings:",o.message),process.exit(1);}});}var aa="rapidkit.product-factory-plan.v1",ca="rapidkit.private-product-manifest.v1";function Ft(t,e=""){return typeof t=="string"&&t.trim()?t.trim():e}function to(t){return typeof t=="string"&&t.trim()?t.trim():null}function la(t,e){return typeof t=="number"&&Number.isFinite(t)?t:e}function qn(t){return Array.isArray(t)?[...new Set(t.filter(e=>typeof e=="string").map(e=>e.trim()).filter(Boolean))]:[]}function Hn(t){if(!/^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/.test(t))throw new Error(`Invalid product slug "${t}". Use lowercase letters, numbers, and hyphens.`)}function da(t,e,r){let o=Ft(t.slug);if(!o)throw new Error(`Backlog product at index ${e} is missing slug.`);Hn(o);let n=qn(t.modules),s=qn(t.moduleGaps);return {rank:la(t.rank,e+1),slug:o,title:Ft(t.title,o),category:Ft(t.category,"Uncategorized"),tier:Ft(t.tier,"pro"),summary:Ft(t.summary),modules:n,moduleGaps:s,recommendedKit:r,workspaceProfile:"enterprise",readiness:{status:s.length>0?"blocked-by-module-gaps":"ready-for-private-manifest",blockingGaps:s}}}function pa(t){if(!t||typeof t!="object"||Array.isArray(t))throw new Error("Backlog must be a JSON object.");return t}async function ua(t){let e=h.resolve(process.cwd(),t),r=pa(await R__default.readJson(e));if(!Array.isArray(r.products))throw new Error("Backlog must contain a products array.");return {absolutePath:e,payload:r}}function ma(t,e){let r=[...t];if(e.tier){let o=e.tier.toLowerCase();r=r.filter(n=>n.tier.toLowerCase()===o);}if(e.category){let o=e.category.toLowerCase();r=r.filter(n=>n.category.toLowerCase()===o);}if(e.limit){let o=Number.parseInt(e.limit,10);if(!Number.isInteger(o)||o<1)throw new Error("--limit must be a positive integer.");r=r.slice(0,o);}return r}async function zn(t){let e=t.kit?.trim()||"fastapi.standard",{absolutePath:r,payload:o}=await ua(t.backlogPath),n=o.products,s=n.map((u,p)=>da(u,p,e)),a=ma(s,t),c=new Set(a.flatMap(u=>u.modules)),l=a.flatMap(u=>u.moduleGaps),f=a.filter(u=>u.readiness.status==="ready-for-private-manifest").length;return {schemaVersion:aa,generatedAt:(t.now??new Date).toISOString(),source:{backlogPath:r,backlogSchemaVersion:to(o.schemaVersion),purpose:to(o.purpose),publicationRule:to(o.publicationRule)},defaults:{kit:e,workspaceProfile:"enterprise",projectSlug:"api"},stats:{totalProducts:n.length,plannedProducts:a.length,readyProducts:f,blockedProducts:a.length-f,uniqueModules:c.size,knownModuleGaps:l.length},products:a}}function Rt(t){return JSON.stringify(t,null,2)}function fa(t){return `sha256:${ro.createHash("sha256").update(Rt(t)).digest("hex")}`}async function ga(t){let e=await zn({backlogPath:t.backlogPath,kit:t.kit,now:t.now}),r=e.products.find(s=>s.slug===t.slug);if(!r)throw new Error(`Product "${t.slug}" was not found in backlog.`);let o=t.outputRoot||"../rapidkit-examples-pro",n={schemaVersion:ca,generatedAt:e.generatedAt,product:{rank:r.rank,slug:r.slug,title:r.title,category:r.category,tier:r.tier,summary:r.summary},workspace:{name:r.slug,profile:"enterprise",outputHint:h.join(o,r.slug)},projects:[{slug:"api",kit:r.recommendedKit,runtime:"python",framework:"fastapi",modules:r.modules,moduleGaps:r.moduleGaps}],factory:{sourceBacklogPath:e.source.backlogPath,manifestChecksum:"",requiredCommands:[`npx rapidkit create workspace ${r.slug} --yes --profile enterprise`,`npx rapidkit create project ${r.recommendedKit} api --yes --skip-install`,"npx rapidkit init","npx rapidkit workspace run test --strict --json","npx rapidkit readiness --strict --json"],releaseEvidencePath:`.rapidkit/product-factory/${r.slug}/release-evidence.json`}};return {...n,factory:{...n.factory,manifestChecksum:fa({...n,factory:{...n.factory,manifestChecksum:""}})}}}async function Un(t,e,r=false){let o=h.resolve(process.cwd(),t);if(!r&&await R__default.pathExists(o))throw new Error(`Refusing to overwrite existing file: ${o}. Use --force.`);await R__default.ensureDir(h.dirname(o)),await R__default.writeFile(o,`${Rt(e)}
|
|
105
105
|
`,"utf-8");}function ha(t,e){let r=h.join(".rapidkit","product-factory","manifests",`${e}.manifest.json`);return t?t.endsWith(".json")?t:h.join(t,`${e}.manifest.json`):r}function ya(t,e){console.log(i.bold(`
|
|
106
106
|
RapidKit Product Factory Plan
|
|
107
107
|
`)),console.log(i.cyan("Products:"),i.white(String(t.stats.plannedProducts))),console.log(i.cyan("Ready:"),i.green(String(t.stats.readyProducts))),console.log(i.cyan("Blocked:"),i.yellow(String(t.stats.blockedProducts))),console.log(i.cyan("Unique modules:"),i.white(String(t.stats.uniqueModules))),console.log(i.cyan("Known gaps:"),i.yellow(String(t.stats.knownModuleGaps))),e&&console.log(i.gray(`
|
|
@@ -111,17 +111,17 @@ Next: npx rapidkit product manifest create <slug> --from-backlog <file>
|
|
|
111
111
|
RapidKit Private Product Manifest
|
|
112
112
|
`)),console.log(i.cyan("Product:"),i.white(t.product.slug)),console.log(i.cyan("Kit:"),i.white(t.projects[0].kit)),console.log(i.cyan("Modules:"),i.white(String(t.projects[0].modules.length))),console.log(i.cyan("Module gaps:"),i.yellow(String(t.projects[0].moduleGaps.length))),console.log(i.cyan("Checksum:"),i.white(t.factory.manifestChecksum)),console.log(i.gray(`
|
|
113
113
|
Wrote manifest: ${h.resolve(process.cwd(),e)}
|
|
114
|
-
`));}function Yn(t){let e=t.command("product",{hidden:true}).description("Product Factory commands for private workspace product manifests");e.command("plan <backlog>").description("Build a deterministic Product Factory plan from a workspace backlog JSON").option("--output <file>","Write plan JSON to file").option("--kit <kit>","Default API kit for generated product manifests","fastapi.standard").option("--tier <tier>","Filter products by tier").option("--category <category>","Filter products by category").option("--limit <count>","Limit planned products").option("--json","Print JSON to stdout").action(async(r,o)=>{try{let n=await zn({backlogPath:r,kit:o.kit,tier:o.tier,category:o.category,limit:o.limit});o.output&&await Un(o.output,n,true),o.json?console.log(Rt(n)):ya(n,o.output);}catch(n){let s=n instanceof Error?n.message:String(n);o.json?console.log(Rt({ok:false,error:{message:s}})):console.error(i.red(`Product plan failed: ${s}`)),process.exit(1);}}),e.command("manifest").description("Create or inspect private product manifests").command("create <slug>").description("Create a private product manifest from a backlog product slug").requiredOption("--from-backlog <file>","Source workspace backlog JSON").option("--output <fileOrDir>","Manifest output file or directory").option("--kit <kit>","API kit for the generated workspace product","fastapi.standard").option("--workspace-output <dir>","Suggested root for generated product workspaces").option("--json","Print JSON to stdout").option("--force","Overwrite existing manifest file").action(async(r,o)=>{try{Hn(r);let n=await ga({backlogPath:o.fromBacklog,slug:r,kit:o.kit,outputRoot:o.workspaceOutput}),s=ha(o.output,r);await Un(s,n,o.force===true),o.json?console.log(Rt(n)):wa(n,s);}catch(n){let s=n instanceof Error?n.message:String(n);o.json?console.log(Rt({ok:false,error:{message:s}})):console.error(i.red(`Product manifest create failed: ${s}`)),process.exit(1);}});}var Zn="rapidkit-workspace-snapshot-v1",Xn="rapidkit-project-archive-v1",ka=[".rapidkit/workspace.json",".rapidkit-workspace","rapidkit.config.json","rapidkit.config.js","rapidkit.config.cjs","rapidkit.config.mjs","package.json"],va=new Set([".git","node_modules",".venv","dist","build","target","coverage","htmlcov",".next"]),Jt={requireReasonForDestructiveOps:false,requireSafetySnapshotForDestructiveOps:true,allowPermanentDelete:true};function Et(t=new Date){return t.toISOString().replace(/[:.]/g,"-")}function oo(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 Pa(t){try{let e=await
|
|
115
|
-
`,"utf-8"),r}async function gr(t,e,r){let o=await ba(t);if(o.requireReasonForDestructiveOps&&!r.reason?.trim())throw new Error(`${e} requires --reason by workspace policy.`);if(o.requireSafetySnapshotForDestructiveOps&&r.safetySnapshot===false)throw new Error(`${e} requires a safety snapshot by workspace policy.`);if(r.permanent&&!o.allowPermanentDelete)throw new Error("Permanent project delete is disabled by workspace policy.");return o}function no(t=process.cwd()){let e=h.resolve(t),r=h.resolve(jn.tmpdir());for(;;){if(e!==r&&(E__default.existsSync(h.join(e,".rapidkit-workspace"))||E__default.existsSync(h.join(e,".rapidkit","workspace.json"))))return e;let o=h.dirname(e);if(o===e)return null;e=o;}}function rt(t){let e=t?h.resolve(t):no(process.cwd());if(!e)throw new Error("Not inside a RapidKit workspace. Run from workspace root or pass --workspace.");if(!E__default.existsSync(h.join(e,".rapidkit-workspace"))&&!E__default.existsSync(h.join(e,".rapidkit","workspace.json")))throw new Error(`Workspace path is not a RapidKit workspace: ${e}`);return e}async function Sa(t){let e=await Pa(h.join(t,".rapidkit","workspace.json")),r=e?.workspace_name??e?.name;return typeof r=="string"&&r.trim()?r.trim():h.basename(t)}function hr(t){return h.join(t,".rapidkit","snapshots")}function Kt(t){return h.join(t,".rapidkit","archive","projects")}function so(t){return h.join(t,"files")}function Ca(t){return h.join(jn.tmpdir(),`rapidkit-workspace-snapshot-${process.pid}-${t}-${ro.randomBytes(4).toString("hex")}`)}function io(t,e){let r=h.relative(t,e);if(!r)return true;let o=r.split(h.sep);return o[0]===".rapidkit"&&["snapshots","archive","audit"].includes(o[1]||"")?false:!o.some(n=>va.has(n))}async function Ra(t){return (await a$a(t,{descendIntoMatchedProjects:false})).map(r=>({name:h.basename(r),relativePath:h.relative(t,r)}))}async function Ea(t,e){let r=[];for(let o of ka){let n=h.join(t,o);if(!await E__default.pathExists(n))continue;let s=h.join(e,o);await E__default.copy(n,s,{filter:a=>io(t,a)}),r.push(o);}return r}async function _a(t,e){await E__default.writeJson(h.join(t,"snapshot.json"),e,{spaces:2});}async function ao(t){let e=h.join(t,"snapshot.json"),r=await E__default.readJson(e);if(!r||typeof r!="object"||r.schema!==Zn)throw new Error(`Invalid RapidKit workspace snapshot manifest: ${e}`);return r}async function Aa(t){let e=0,r=0,o=[t];for(;o.length>0;){let n=o.shift();if(!n)continue;let s=[];try{s=await E__default.readdir(n,{withFileTypes:true});}catch{continue}for(let a of s){let c=h.join(n,a.name);if(a.isDirectory()){o.push(c);continue}if(a.isFile())try{let l=await E__default.stat(c);e+=1,r+=l.size;}catch{}}}return {files:e,bytes:r}}async function _t(t={}){let e=rt(t.workspacePath),r=t.name?t.name:`snapshot-${Et()}`,o=oo(r),n=h.join(hr(e),o),s=Ca(o);if(await E__default.pathExists(n))throw new Error(`Snapshot already exists: ${o}`);let a=so(s);try{await E__default.ensureDir(a);let c=t.includeProjects?"full":"metadata",l=c==="full"?["."]:await Ea(e,a);c==="full"&&await E__default.copy(e,a,{filter:p=>io(e,p)});let f={schema:Zn,name:o,mode:c,reason:t.reason,createdAt:new Date().toISOString(),workspaceName:await Sa(e),workspacePath:e,copiedPaths:l,projects:await Ra(e)};return await _a(s,f),await E__default.ensureDir(h.dirname(n)),await E__default.move(s,n,{overwrite:false}),await Le(e,{action:"snapshot.create",target:o,status:"succeeded",reason:t.reason,details:{mode:c,copiedPaths:l,snapshotPath:n,projectCount:f.projects.length}}),{manifest:f,snapshotPath:n}}catch(c){throw await E__default.remove(s),await Le(e,{action:"snapshot.create",target:o,status:"failed",reason:t.reason,details:{error:c instanceof Error?c.message:String(c)}}),c}}async function es(t){let e=rt(t.workspacePath),r=h.join(hr(e),oo(t.name));if(!await E__default.pathExists(r))throw new Error(`Snapshot not found: ${t.name}`);let o=await ao(r),n=so(r),s=await Aa(n);return {manifest:o,snapshotPath:r,filesRoot:n,estimatedFileCount:s.files,estimatedBytes:s.bytes}}async function ts(t={}){let e=rt(t.workspacePath),r=hr(e);if(!await E__default.pathExists(r))return [];let o=await E__default.readdir(r,{withFileTypes:true}),n=[];for(let s of o){if(!s.isDirectory())continue;let a=h.join(r,s.name);try{n.push({...await ao(a),snapshotPath:a});}catch{}}return n.sort((s,a)=>a.createdAt.localeCompare(s.createdAt))}async function rs(t){let e=rt(t.workspacePath),r=h.join(hr(e),oo(t.name));if(!await E__default.pathExists(r))throw new Error(`Snapshot not found: ${t.name}`);let o=await ao(r),n=so(r),s=o.mode==="full"?["."]:Array.from(new Set(o.copiedPaths.map(l=>l.startsWith(".rapidkit/")?".rapidkit":l)));if(t.dryRun)return await Le(e,{action:"snapshot.restore",target:o.name,status:"planned",reason:t.reason,details:{restoredPaths:s}}),{workspacePath:e,snapshotPath:r,restoredPaths:s,dryRun:true};if(!t.force)throw new Error("Restore is destructive. Re-run with --force after reviewing --dry-run output.");await gr(e,"snapshot.restore",{reason:t.reason,safetySnapshot:t.safetySnapshot});let a;if(t.safetySnapshot!==false&&(a=(await _t({workspacePath:e,name:`pre-restore-${o.name}-${Et()}`,reason:`Automatic safety snapshot before restoring ${o.name}`,includeProjects:false})).snapshotPath),o.mode==="full")await E__default.copy(n,e,{overwrite:true,errorOnExist:false,filter:l=>io(n,l)});else for(let l of o.copiedPaths)await E__default.copy(h.join(n,l),h.join(e,l),{overwrite:true,errorOnExist:false});let c={workspacePath:e,snapshotPath:r,restoredPaths:s,dryRun:false,safetySnapshotPath:a};return await Le(e,{action:"snapshot.restore",target:o.name,status:"succeeded",reason:t.reason,details:{restoredPaths:s,safetySnapshotPath:a}}),c}function os(t){let e=t.trim();if(!e)throw new Error("Project name/path is required.");return e}async function ns(t,e){let r=os(e),o=h.isAbsolute(r)?h.resolve(r):h.resolve(t,r);if(o.startsWith(`${h.resolve(t)}${h.sep}`)&&await E__default.pathExists(o))return o;let s=(await a$a(t,{descendIntoMatchedProjects:false})).filter(a=>{let c=h.relative(t,a);return h.basename(a)===r||c===r});if(s.length===0)throw new Error(`Project not found in workspace: ${e}`);if(s.length>1)throw new Error(`Project reference is ambiguous: ${e}`);return s[0]}async function co(t){try{let{syncWorkspaceProjects:e}=await import('./workspace-ZXWYIZOR.js');await e(t,true);}catch{}}function Ia(t,e){let r=ro.randomBytes(4).toString("hex");return h.join(Kt(t),`${e}-${Et()}-${r}`)}async function ss(t){let e=h.join(t,"rapidkit-archive.json"),r=await E__default.readJson(e);if(!r||typeof r!="object"||r.schema!==Xn)throw new Error(`Invalid RapidKit archive manifest: ${e}`);return r}async function lo(t={}){let e=rt(t.workspacePath),r=Kt(e);if(!await E__default.pathExists(r))return [];let o=await E__default.readdir(r,{withFileTypes:true}),n=[];for(let s of o){if(!s.isDirectory())continue;let a=h.join(r,s.name),c=h.join(a,"rapidkit-archive.json");try{n.push({...await ss(a),archivePath:a,manifestPath:c});}catch{}}return n.sort((s,a)=>a.archivedAt.localeCompare(s.archivedAt))}async function $a(t,e){let r=os(e),o=h.isAbsolute(r)?h.resolve(r):h.resolve(Kt(t),r);if(o.startsWith(`${h.resolve(Kt(t))}${h.sep}`)&&await E__default.pathExists(h.join(o,"rapidkit-archive.json")))return o;let s=(await lo({workspacePath:t})).filter(a=>h.basename(a.archivePath)===r||a.projectName===r||h.relative(Kt(t),a.archivePath)===r);if(s.length===0)throw new Error(`Archived project not found: ${e}`);if(s.length>1)throw new Error(`Archive reference is ambiguous: ${e}`);return s[0].archivePath}async function po(t){let e=rt(t.workspacePath),r=await ns(e,t.project),o=h.basename(r),n=Ia(e,o),s=h.join(n,"rapidkit-archive.json");if(t.dryRun)return await Le(e,{action:"project.archive",target:o,status:"planned",reason:t.reason,details:{projectPath:r,archivePath:n}}),{workspacePath:e,projectName:o,projectPath:r,action:"archive",archivePath:n,manifestPath:s,dryRun:true};await gr(e,"project.archive",{reason:t.reason,safetySnapshot:true});let a=await _t({workspacePath:e,name:`pre-archive-${o}-${Et()}`,reason:t.reason||`Automatic safety snapshot before archiving ${o}`,includeProjects:false});await E__default.ensureDir(h.dirname(n)),await E__default.move(r,n,{overwrite:false});let c={schema:Xn,projectName:o,originalPath:r,archivedPath:n,reason:t.reason,archivedAt:new Date().toISOString(),safetySnapshotPath:a.snapshotPath};return await E__default.writeJson(s,c,{spaces:2}),await c$2(e,[r]),await co(e),await Le(e,{action:"project.archive",target:o,status:"succeeded",reason:t.reason,details:{projectPath:r,archivePath:n,manifestPath:s,safetySnapshotPath:a.snapshotPath}}),{workspacePath:e,projectName:o,projectPath:r,action:"archive",archivePath:n,manifestPath:s,safetySnapshotPath:a.snapshotPath,dryRun:false}}async function is(t){if(!t.permanent)return po(t);let e=rt(t.workspacePath),r=await ns(e,t.project),o=h.basename(r);if(t.confirm!==o)throw new Error(`Permanent delete requires --confirm ${o}`);if(t.dryRun)return await Le(e,{action:"project.delete",target:o,status:"planned",reason:t.reason,details:{projectPath:r,permanent:true}}),{workspacePath:e,projectName:o,projectPath:r,action:"delete",dryRun:true};await gr(e,"project.delete",{reason:t.reason,permanent:true,safetySnapshot:true});let n=await _t({workspacePath:e,name:`pre-delete-${o}-${Et()}`,reason:t.reason||`Automatic safety snapshot before deleting ${o}`,includeProjects:false});return await E__default.remove(r),await c$2(e,[r]),await co(e),await Le(e,{action:"project.delete",target:o,status:"succeeded",reason:t.reason,details:{projectPath:r,permanent:true,safetySnapshotPath:n.snapshotPath}}),{workspacePath:e,projectName:o,projectPath:r,action:"delete",safetySnapshotPath:n.snapshotPath,dryRun:false}}async function as(t){let e=rt(t.workspacePath),r=await $a(e,t.archive),o=await ss(r),n=t.targetName?.trim()||o.projectName,s=h.join(e,n);if(!s.startsWith(`${h.resolve(e)}${h.sep}`))throw new Error(`Archive restore target escapes workspace: ${n}`);if(await E__default.pathExists(s)&&!t.force)throw new Error(`Project path already exists. Re-run with --force to overwrite: ${s}`);if(t.dryRun)return await Le(e,{action:"project.restore",target:n,status:"planned",reason:t.reason,details:{archivePath:r,projectPath:s}}),{workspacePath:e,projectName:n,projectPath:s,action:"restore",archivePath:r,manifestPath:h.join(r,"rapidkit-archive.json"),dryRun:true};await gr(e,"project.restore",{reason:t.reason,safetySnapshot:true});let a=await _t({workspacePath:e,name:`pre-restore-project-${n}-${Et()}`,reason:t.reason||`Automatic safety snapshot before restoring ${n}`,includeProjects:false});return await E__default.move(r,s,{overwrite:t.force===true}),await co(e),await Le(e,{action:"project.restore",target:n,status:"succeeded",reason:t.reason,details:{archivePath:r,projectPath:s,safetySnapshotPath:a.snapshotPath}}),{workspacePath:e,projectName:n,projectPath:s,action:"restore",archivePath:r,manifestPath:h.join(s,"rapidkit-archive.json"),safetySnapshotPath:a.snapshotPath,dryRun:false}}var Da="rapidkit.infra-stack.v1",ls="rapidkit.infra-plan.v1",At=".rapidkit/infra/docker-compose.yml",It=".rapidkit/reports/infra-plan.json",fo=".rapidkit/infra/.env.example";function Ma(){let t=h.dirname(fileURLToPath(import.meta.url)),e=[h.join(t,"../../contracts/infra-stack.v1.json"),h.join(t,"../contracts/infra-stack.v1.json")];for(let r of e)if(j.existsSync(r))return r;throw new Error(`Infra stack contract not found. Expected contracts/infra-stack.v1.json beside the rapidkit package root. Checked: ${e.join(", ")}`)}var mo=null;function mt(t){if(mo)return mo;let e=Ma(),r=j.readFileSync(e,"utf-8"),o=JSON.parse(r);if(o.schemaVersion!==Da)throw new Error(`Unsupported infra stack schema: ${o.schemaVersion}`);return Oa(o),(mo=o),o}function Oa(t){let e=new Set(Object.keys(t.services));for(let[r,o]of Object.entries(t.moduleMappings)){if(!Array.isArray(o))throw new Error(`Invalid moduleMappings entry for ${r}`);for(let n of o)if(!e.has(n))throw new Error(`moduleMappings/${r} references unknown service '${n}'`)}for(let[r,o]of Object.entries(t.envVarMappings)){if(!Array.isArray(o))throw new Error(`Invalid envVarMappings entry for ${r}`);for(let n of o)if(!e.has(n))throw new Error(`envVarMappings/${r} references unknown service '${n}'`)}}function ds(t,e){let r=e.startsWith("free/")?e:`free/${e}`;return t.moduleMappings[r]||[]}function $t(t,e){return t.envVarMappings[e.toUpperCase()]||[]}function ps(t,e){let r={};for(let o of e){let n=t.services[o];n&&Object.assign(r,n.connectionEnv);}return r}async function Ta(t){let e=h.join(t,"registry.json");if(!await E__default.pathExists(e))return [];try{let o=(await E__default.readJson(e)).installed_modules||[];return [...new Set(o.map(n=>typeof n.slug=="string"?n.slug.trim():"").filter(Boolean))]}catch{return []}}async function Wa(t){let e=h.join(t,".env.example");if(!await E__default.pathExists(e))return [];try{let r=await E__default.readFile(e,"utf-8"),o=[];for(let n of r.split(`
|
|
116
|
-
`)){let s=n.trim();if(!s||s.startsWith("#"))continue;let a=s.match(/^([A-Z0-9_]+)=/);a?.[1]&&o.push(a[1]);}return o}catch{return []}}async function Fa(t){let e=h.join(t,".rapidkit","infra","overrides.json");if(!await
|
|
114
|
+
`));}function Yn(t){let e=t.command("product",{hidden:true}).description("Product Factory commands for private workspace product manifests");e.command("plan <backlog>").description("Build a deterministic Product Factory plan from a workspace backlog JSON").option("--output <file>","Write plan JSON to file").option("--kit <kit>","Default API kit for generated product manifests","fastapi.standard").option("--tier <tier>","Filter products by tier").option("--category <category>","Filter products by category").option("--limit <count>","Limit planned products").option("--json","Print JSON to stdout").action(async(r,o)=>{try{let n=await zn({backlogPath:r,kit:o.kit,tier:o.tier,category:o.category,limit:o.limit});o.output&&await Un(o.output,n,true),o.json?console.log(Rt(n)):ya(n,o.output);}catch(n){let s=n instanceof Error?n.message:String(n);o.json?console.log(Rt({ok:false,error:{message:s}})):console.error(i.red(`Product plan failed: ${s}`)),process.exit(1);}}),e.command("manifest").description("Create or inspect private product manifests").command("create <slug>").description("Create a private product manifest from a backlog product slug").requiredOption("--from-backlog <file>","Source workspace backlog JSON").option("--output <fileOrDir>","Manifest output file or directory").option("--kit <kit>","API kit for the generated workspace product","fastapi.standard").option("--workspace-output <dir>","Suggested root for generated product workspaces").option("--json","Print JSON to stdout").option("--force","Overwrite existing manifest file").action(async(r,o)=>{try{Hn(r);let n=await ga({backlogPath:o.fromBacklog,slug:r,kit:o.kit,outputRoot:o.workspaceOutput}),s=ha(o.output,r);await Un(s,n,o.force===true),o.json?console.log(Rt(n)):wa(n,s);}catch(n){let s=n instanceof Error?n.message:String(n);o.json?console.log(Rt({ok:false,error:{message:s}})):console.error(i.red(`Product manifest create failed: ${s}`)),process.exit(1);}});}var Zn="rapidkit-workspace-snapshot-v1",Xn="rapidkit-project-archive-v1",ka=[".rapidkit/workspace.json",".rapidkit-workspace","rapidkit.config.json","rapidkit.config.js","rapidkit.config.cjs","rapidkit.config.mjs","package.json"],va=new Set([".git","node_modules",".venv","dist","build","target","coverage","htmlcov",".next"]),Jt={requireReasonForDestructiveOps:false,requireSafetySnapshotForDestructiveOps:true,allowPermanentDelete:true};function Et(t=new Date){return t.toISOString().replace(/[:.]/g,"-")}function oo(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 Pa(t){try{let e=await R__default.readJson(t);return e&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}function ja(t,e){if(!t)return e;let r=t.trim().toLowerCase();return ["true","yes","1","on"].includes(r)?true:["false","no","0","off"].includes(r)?false:e}async function ba(t){let e=h.join(t,".rapidkit","policies.yml");if(!await R__default.pathExists(e))return {...Jt};try{let r=await R__default.readFile(e,"utf-8"),o=(n,s)=>{let a=r.match(new RegExp(`^\\s*${n}:\\s*([^#\\n]+)`,"m"));return ja(a?.[1],s)};return {requireReasonForDestructiveOps:o("require_reason_for_destructive_ops",Jt.requireReasonForDestructiveOps),requireSafetySnapshotForDestructiveOps:o("require_safety_snapshot_for_destructive_ops",Jt.requireSafetySnapshotForDestructiveOps),allowPermanentDelete:o("allow_permanent_delete",Jt.allowPermanentDelete)}}catch{return {...Jt}}}function xa(t){return h.join(t,".rapidkit","audit","events.jsonl")}async function Le(t,e){let r={schema:"rapidkit-workspace-audit-event-v1",id:ro.randomUUID(),timestamp:new Date().toISOString(),workspacePath:t,...e},o=xa(t);return await R__default.ensureDir(h.dirname(o)),await R__default.appendFile(o,`${JSON.stringify(r)}
|
|
115
|
+
`,"utf-8"),r}async function gr(t,e,r){let o=await ba(t);if(o.requireReasonForDestructiveOps&&!r.reason?.trim())throw new Error(`${e} requires --reason by workspace policy.`);if(o.requireSafetySnapshotForDestructiveOps&&r.safetySnapshot===false)throw new Error(`${e} requires a safety snapshot by workspace policy.`);if(r.permanent&&!o.allowPermanentDelete)throw new Error("Permanent project delete is disabled by workspace policy.");return o}function no(t=process.cwd()){let e=h.resolve(t),r=h.resolve(jn.tmpdir());for(;;){if(e!==r&&(R__default.existsSync(h.join(e,".rapidkit-workspace"))||R__default.existsSync(h.join(e,".rapidkit","workspace.json"))))return e;let o=h.dirname(e);if(o===e)return null;e=o;}}function rt(t){let e=t?h.resolve(t):no(process.cwd());if(!e)throw new Error("Not inside a RapidKit workspace. Run from workspace root or pass --workspace.");if(!R__default.existsSync(h.join(e,".rapidkit-workspace"))&&!R__default.existsSync(h.join(e,".rapidkit","workspace.json")))throw new Error(`Workspace path is not a RapidKit workspace: ${e}`);return e}async function Sa(t){let e=await Pa(h.join(t,".rapidkit","workspace.json")),r=e?.workspace_name??e?.name;return typeof r=="string"&&r.trim()?r.trim():h.basename(t)}function hr(t){return h.join(t,".rapidkit","snapshots")}function Kt(t){return h.join(t,".rapidkit","archive","projects")}function so(t){return h.join(t,"files")}function Ca(t){return h.join(jn.tmpdir(),`rapidkit-workspace-snapshot-${process.pid}-${t}-${ro.randomBytes(4).toString("hex")}`)}function io(t,e){let r=h.relative(t,e);if(!r)return true;let o=r.split(h.sep);return o[0]===".rapidkit"&&["snapshots","archive","audit"].includes(o[1]||"")?false:!o.some(n=>va.has(n))}async function Ra(t){return (await a$a(t,{descendIntoMatchedProjects:false})).map(r=>({name:h.basename(r),relativePath:h.relative(t,r)}))}async function Ea(t,e){let r=[];for(let o of ka){let n=h.join(t,o);if(!await R__default.pathExists(n))continue;let s=h.join(e,o);await R__default.copy(n,s,{filter:a=>io(t,a)}),r.push(o);}return r}async function _a(t,e){await R__default.writeJson(h.join(t,"snapshot.json"),e,{spaces:2});}async function ao(t){let e=h.join(t,"snapshot.json"),r=await R__default.readJson(e);if(!r||typeof r!="object"||r.schema!==Zn)throw new Error(`Invalid RapidKit workspace snapshot manifest: ${e}`);return r}async function Aa(t){let e=0,r=0,o=[t];for(;o.length>0;){let n=o.shift();if(!n)continue;let s=[];try{s=await R__default.readdir(n,{withFileTypes:true});}catch{continue}for(let a of s){let c=h.join(n,a.name);if(a.isDirectory()){o.push(c);continue}if(a.isFile())try{let l=await R__default.stat(c);e+=1,r+=l.size;}catch{}}}return {files:e,bytes:r}}async function _t(t={}){let e=rt(t.workspacePath),r=t.name?t.name:`snapshot-${Et()}`,o=oo(r),n=h.join(hr(e),o),s=Ca(o);if(await R__default.pathExists(n))throw new Error(`Snapshot already exists: ${o}`);let a=so(s);try{await R__default.ensureDir(a);let c=t.includeProjects?"full":"metadata",l=c==="full"?["."]:await Ea(e,a);c==="full"&&await R__default.copy(e,a,{filter:u=>io(e,u)});let f={schema:Zn,name:o,mode:c,reason:t.reason,createdAt:new Date().toISOString(),workspaceName:await Sa(e),workspacePath:e,copiedPaths:l,projects:await Ra(e)};return await _a(s,f),await R__default.ensureDir(h.dirname(n)),await R__default.move(s,n,{overwrite:false}),await Le(e,{action:"snapshot.create",target:o,status:"succeeded",reason:t.reason,details:{mode:c,copiedPaths:l,snapshotPath:n,projectCount:f.projects.length}}),{manifest:f,snapshotPath:n}}catch(c){throw await R__default.remove(s),await Le(e,{action:"snapshot.create",target:o,status:"failed",reason:t.reason,details:{error:c instanceof Error?c.message:String(c)}}),c}}async function es(t){let e=rt(t.workspacePath),r=h.join(hr(e),oo(t.name));if(!await R__default.pathExists(r))throw new Error(`Snapshot not found: ${t.name}`);let o=await ao(r),n=so(r),s=await Aa(n);return {manifest:o,snapshotPath:r,filesRoot:n,estimatedFileCount:s.files,estimatedBytes:s.bytes}}async function ts(t={}){let e=rt(t.workspacePath),r=hr(e);if(!await R__default.pathExists(r))return [];let o=await R__default.readdir(r,{withFileTypes:true}),n=[];for(let s of o){if(!s.isDirectory())continue;let a=h.join(r,s.name);try{n.push({...await ao(a),snapshotPath:a});}catch{}}return n.sort((s,a)=>a.createdAt.localeCompare(s.createdAt))}async function rs(t){let e=rt(t.workspacePath),r=h.join(hr(e),oo(t.name));if(!await R__default.pathExists(r))throw new Error(`Snapshot not found: ${t.name}`);let o=await ao(r),n=so(r),s=o.mode==="full"?["."]:Array.from(new Set(o.copiedPaths.map(l=>l.startsWith(".rapidkit/")?".rapidkit":l)));if(t.dryRun)return await Le(e,{action:"snapshot.restore",target:o.name,status:"planned",reason:t.reason,details:{restoredPaths:s}}),{workspacePath:e,snapshotPath:r,restoredPaths:s,dryRun:true};if(!t.force)throw new Error("Restore is destructive. Re-run with --force after reviewing --dry-run output.");await gr(e,"snapshot.restore",{reason:t.reason,safetySnapshot:t.safetySnapshot});let a;if(t.safetySnapshot!==false&&(a=(await _t({workspacePath:e,name:`pre-restore-${o.name}-${Et()}`,reason:`Automatic safety snapshot before restoring ${o.name}`,includeProjects:false})).snapshotPath),o.mode==="full")await R__default.copy(n,e,{overwrite:true,errorOnExist:false,filter:l=>io(n,l)});else for(let l of o.copiedPaths)await R__default.copy(h.join(n,l),h.join(e,l),{overwrite:true,errorOnExist:false});let c={workspacePath:e,snapshotPath:r,restoredPaths:s,dryRun:false,safetySnapshotPath:a};return await Le(e,{action:"snapshot.restore",target:o.name,status:"succeeded",reason:t.reason,details:{restoredPaths:s,safetySnapshotPath:a}}),c}function os(t){let e=t.trim();if(!e)throw new Error("Project name/path is required.");return e}async function ns(t,e){let r=os(e),o=h.isAbsolute(r)?h.resolve(r):h.resolve(t,r);if(o.startsWith(`${h.resolve(t)}${h.sep}`)&&await R__default.pathExists(o))return o;let s=(await a$a(t,{descendIntoMatchedProjects:false})).filter(a=>{let c=h.relative(t,a);return h.basename(a)===r||c===r});if(s.length===0)throw new Error(`Project not found in workspace: ${e}`);if(s.length>1)throw new Error(`Project reference is ambiguous: ${e}`);return s[0]}async function co(t){try{let{syncWorkspaceProjects:e}=await import('./workspace-ZDL5IQU4.js');await e(t,true);}catch{}}function Ia(t,e){let r=ro.randomBytes(4).toString("hex");return h.join(Kt(t),`${e}-${Et()}-${r}`)}async function ss(t){let e=h.join(t,"rapidkit-archive.json"),r=await R__default.readJson(e);if(!r||typeof r!="object"||r.schema!==Xn)throw new Error(`Invalid RapidKit archive manifest: ${e}`);return r}async function lo(t={}){let e=rt(t.workspacePath),r=Kt(e);if(!await R__default.pathExists(r))return [];let o=await R__default.readdir(r,{withFileTypes:true}),n=[];for(let s of o){if(!s.isDirectory())continue;let a=h.join(r,s.name),c=h.join(a,"rapidkit-archive.json");try{n.push({...await ss(a),archivePath:a,manifestPath:c});}catch{}}return n.sort((s,a)=>a.archivedAt.localeCompare(s.archivedAt))}async function $a(t,e){let r=os(e),o=h.isAbsolute(r)?h.resolve(r):h.resolve(Kt(t),r);if(o.startsWith(`${h.resolve(Kt(t))}${h.sep}`)&&await R__default.pathExists(h.join(o,"rapidkit-archive.json")))return o;let s=(await lo({workspacePath:t})).filter(a=>h.basename(a.archivePath)===r||a.projectName===r||h.relative(Kt(t),a.archivePath)===r);if(s.length===0)throw new Error(`Archived project not found: ${e}`);if(s.length>1)throw new Error(`Archive reference is ambiguous: ${e}`);return s[0].archivePath}async function po(t){let e=rt(t.workspacePath),r=await ns(e,t.project),o=h.basename(r),n=Ia(e,o),s=h.join(n,"rapidkit-archive.json");if(t.dryRun)return await Le(e,{action:"project.archive",target:o,status:"planned",reason:t.reason,details:{projectPath:r,archivePath:n}}),{workspacePath:e,projectName:o,projectPath:r,action:"archive",archivePath:n,manifestPath:s,dryRun:true};await gr(e,"project.archive",{reason:t.reason,safetySnapshot:true});let a=await _t({workspacePath:e,name:`pre-archive-${o}-${Et()}`,reason:t.reason||`Automatic safety snapshot before archiving ${o}`,includeProjects:false});await R__default.ensureDir(h.dirname(n)),await R__default.move(r,n,{overwrite:false});let c={schema:Xn,projectName:o,originalPath:r,archivedPath:n,reason:t.reason,archivedAt:new Date().toISOString(),safetySnapshotPath:a.snapshotPath};return await R__default.writeJson(s,c,{spaces:2}),await c$2(e,[r]),await co(e),await Le(e,{action:"project.archive",target:o,status:"succeeded",reason:t.reason,details:{projectPath:r,archivePath:n,manifestPath:s,safetySnapshotPath:a.snapshotPath}}),{workspacePath:e,projectName:o,projectPath:r,action:"archive",archivePath:n,manifestPath:s,safetySnapshotPath:a.snapshotPath,dryRun:false}}async function is(t){if(!t.permanent)return po(t);let e=rt(t.workspacePath),r=await ns(e,t.project),o=h.basename(r);if(t.confirm!==o)throw new Error(`Permanent delete requires --confirm ${o}`);if(t.dryRun)return await Le(e,{action:"project.delete",target:o,status:"planned",reason:t.reason,details:{projectPath:r,permanent:true}}),{workspacePath:e,projectName:o,projectPath:r,action:"delete",dryRun:true};await gr(e,"project.delete",{reason:t.reason,permanent:true,safetySnapshot:true});let n=await _t({workspacePath:e,name:`pre-delete-${o}-${Et()}`,reason:t.reason||`Automatic safety snapshot before deleting ${o}`,includeProjects:false});return await R__default.remove(r),await c$2(e,[r]),await co(e),await Le(e,{action:"project.delete",target:o,status:"succeeded",reason:t.reason,details:{projectPath:r,permanent:true,safetySnapshotPath:n.snapshotPath}}),{workspacePath:e,projectName:o,projectPath:r,action:"delete",safetySnapshotPath:n.snapshotPath,dryRun:false}}async function as(t){let e=rt(t.workspacePath),r=await $a(e,t.archive),o=await ss(r),n=t.targetName?.trim()||o.projectName,s=h.join(e,n);if(!s.startsWith(`${h.resolve(e)}${h.sep}`))throw new Error(`Archive restore target escapes workspace: ${n}`);if(await R__default.pathExists(s)&&!t.force)throw new Error(`Project path already exists. Re-run with --force to overwrite: ${s}`);if(t.dryRun)return await Le(e,{action:"project.restore",target:n,status:"planned",reason:t.reason,details:{archivePath:r,projectPath:s}}),{workspacePath:e,projectName:n,projectPath:s,action:"restore",archivePath:r,manifestPath:h.join(r,"rapidkit-archive.json"),dryRun:true};await gr(e,"project.restore",{reason:t.reason,safetySnapshot:true});let a=await _t({workspacePath:e,name:`pre-restore-project-${n}-${Et()}`,reason:t.reason||`Automatic safety snapshot before restoring ${n}`,includeProjects:false});return await R__default.move(r,s,{overwrite:t.force===true}),await co(e),await Le(e,{action:"project.restore",target:n,status:"succeeded",reason:t.reason,details:{archivePath:r,projectPath:s,safetySnapshotPath:a.snapshotPath}}),{workspacePath:e,projectName:n,projectPath:s,action:"restore",archivePath:r,manifestPath:h.join(s,"rapidkit-archive.json"),safetySnapshotPath:a.snapshotPath,dryRun:false}}var Da="rapidkit.infra-stack.v1",ls="rapidkit.infra-plan.v1",At=".rapidkit/infra/docker-compose.yml",It=".rapidkit/reports/infra-plan.json",fo=".rapidkit/infra/.env.example";function Ma(){let t=h.dirname(fileURLToPath(import.meta.url)),e=[h.join(t,"../../contracts/infra-stack.v1.json"),h.join(t,"../contracts/infra-stack.v1.json")];for(let r of e)if(j.existsSync(r))return r;throw new Error(`Infra stack contract not found. Expected contracts/infra-stack.v1.json beside the rapidkit package root. Checked: ${e.join(", ")}`)}var mo=null;function mt(t){if(mo)return mo;let e=Ma(),r=j.readFileSync(e,"utf-8"),o=JSON.parse(r);if(o.schemaVersion!==Da)throw new Error(`Unsupported infra stack schema: ${o.schemaVersion}`);return Oa(o),(mo=o),o}function Oa(t){let e=new Set(Object.keys(t.services));for(let[r,o]of Object.entries(t.moduleMappings)){if(!Array.isArray(o))throw new Error(`Invalid moduleMappings entry for ${r}`);for(let n of o)if(!e.has(n))throw new Error(`moduleMappings/${r} references unknown service '${n}'`)}for(let[r,o]of Object.entries(t.envVarMappings)){if(!Array.isArray(o))throw new Error(`Invalid envVarMappings entry for ${r}`);for(let n of o)if(!e.has(n))throw new Error(`envVarMappings/${r} references unknown service '${n}'`)}}function ds(t,e){let r=e.startsWith("free/")?e:`free/${e}`;return t.moduleMappings[r]||[]}function $t(t,e){return t.envVarMappings[e.toUpperCase()]||[]}function ps(t,e){let r={};for(let o of e){let n=t.services[o];n&&Object.assign(r,n.connectionEnv);}return r}async function Ta(t){let e=h.join(t,"registry.json");if(!await R__default.pathExists(e))return [];try{let o=(await R__default.readJson(e)).installed_modules||[];return [...new Set(o.map(n=>typeof n.slug=="string"?n.slug.trim():"").filter(Boolean))]}catch{return []}}async function Wa(t){let e=h.join(t,".env.example");if(!await R__default.pathExists(e))return [];try{let r=await R__default.readFile(e,"utf-8"),o=[];for(let n of r.split(`
|
|
116
|
+
`)){let s=n.trim();if(!s||s.startsWith("#"))continue;let a=s.match(/^([A-Z0-9_]+)=/);a?.[1]&&o.push(a[1]);}return o}catch{return []}}async function Fa(t){let e=h.join(t,".rapidkit","infra","overrides.json");if(!await R__default.pathExists(e))return [];try{let r=await R__default.readJson(e);return Array.isArray(r.services)?[...new Set(r.services.filter(o=>typeof o=="string"&&o.trim().length>0))]:[]}catch{return []}}async function Ja(t){let e=h.join(t,".rapidkit","workspace.contract.json");if(!await R__default.pathExists(e))return [];try{let r=await R__default.readJson(e),o=[];for(let n of r.projects||[]){let s=typeof n.slug=="string"?n.slug:"unknown";for(let a of n.contracts?.env||[])typeof a=="string"&&a.trim()&&o.push({project:s,env:a.trim().toUpperCase()});}return o}catch{return []}}function yr(t,e,r,o){t.add(r),e.push(o);}async function us(t){let e=h.resolve(t.workspacePath),r=t.contract||mt(),o=new Set,n=[],s=new Set,a=new Set,c=new Set,l=await c$4(e);for(let f of l){let u=h.dirname(h.dirname(f)),p=h.basename(u);for(let d of await Ta(u)){s.add(d);for(let m of ds(r,d))yr(o,n,m,{kind:"module",value:d,project:p});}for(let d of await Wa(u)){a.add(d);for(let m of $t(r,d))yr(o,n,m,{kind:"env-var",value:d,project:p});}}for(let f of await Ja(e)){a.add(f.env);for(let u of $t(r,f.env))yr(o,n,u,{kind:"contract-env",value:f.env,project:f.project});}for(let f of await Fa(e))c.add(f),yr(o,n,f,{kind:"override",value:f});return {modules:[...s].sort(),envVars:[...a].sort(),overrides:[...c].sort(),sources:n,serviceIds:[...o].sort()}}function Ka(t){let e=t.trim();if(!e||e.startsWith("#"))return null;let r=e.indexOf("=");if(r<=0)return null;let o=e.slice(0,r).trim();if(!/^[A-Z0-9_]+$/.test(o))return null;let n=e.slice(r+1).trim();(n.startsWith('"')&&n.endsWith('"')||n.startsWith("'")&&n.endsWith("'"))&&(n=n.slice(1,-1));let s=n.match(/^\$\{[A-Z0-9_]+:-([^}]+)\}$/),a=(s?s[1]:n).trim();return a?{key:o,value:a}:null}async function La(t){if(!await R__default.pathExists(t))return {};try{let e=await R__default.readFile(t,"utf-8"),r={};for(let o of e.split(`
|
|
117
117
|
`)){let n=Ka(o);n&&(r[n.key]=n.value);}return r}catch{return {}}}async function fs(t){let e={},r=await c$4(t.workspacePath);for(let o of r){let n=h.dirname(h.dirname(o)),s=await La(h.join(n,".env.example"));for(let[a,c]of Object.entries(s))$t(t.contract,a).length>0&&(e[a]=c);}return e}function gs(t,e){return t.filter(r=>$t(e,r).length>0).sort()}function hs(t){let e=t.RAPIDKIT_DB_POSTGRES_URL||t.DATABASE_URL;if(e?.startsWith("postgresql://"))try{let r=new URL(e),o=r.pathname.replace(/^\//,"");return {POSTGRES_USER:decodeURIComponent(r.username||"postgres"),POSTGRES_PASSWORD:decodeURIComponent(r.password||"postgres"),POSTGRES_DB:o||"postgres"}}catch{return}}function ys(t){let e=t.POSTGRES_USER||"postgres",r=t.POSTGRES_DB||"postgres";return ["CMD-SHELL",`pg_isready -U ${e} -d ${r}`]}function Ga(t){return /[:#{}[\],&*!|>'"%@`]/.test(t)||t.includes(`
|
|
118
118
|
`)?JSON.stringify(t):t}function ws(t,e){return Object.entries(t).map(([r,o])=>`${e}${r}: ${Ga(o)}`).join(`
|
|
119
119
|
`)}function Ba(t,e){let r=t.test.map(o=>JSON.stringify(o)).join(", ");return [`${e}healthcheck:`,`${e} test: [${r}]`,`${e} interval: ${t.interval}`,`${e} timeout: ${t.timeout}`,`${e} retries: ${t.retries}`].join(`
|
|
120
120
|
`)}function ks(t){let e=["# Generated by RapidKit infra plan \u2014 do not edit manually.",`# Workspace: ${t.workspaceName}`,`# Generated at: ${t.plan.generatedAt}`,"name: rapidkit-infra"],r=new Set;if(t.plan.services.length===0)return e.push("services: {}"),e.push(""),e.join(`
|
|
121
121
|
`);e.push("services:");for(let o of t.plan.services){let n=t.contract.services[o.id];if(n){if(e.push(` ${o.id}:`),e.push(` image: ${n.image}`),e.push(` container_name: rapidkit-${o.id}`),n.command?.length){let s=n.command.map(a=>JSON.stringify(a)).join(", ");e.push(` command: [${s}]`);}if(n.env&&Object.keys(n.env).length>0){e.push(" environment:");let s={...n.env,...t.plan.serviceEnvOverrides?.[o.id]||{}};e.push(ws(s," "));}else t.plan.serviceEnvOverrides?.[o.id]&&(e.push(" environment:"),e.push(ws(t.plan.serviceEnvOverrides[o.id]," ")));if(n.ports.length>0){e.push(" ports:");for(let s of n.ports)e.push(` - "${s.host}:${s.container}"`);}if(n.volumes?.length){e.push(" volumes:");for(let s of n.volumes){e.push(` - ${s}`);let a=s.split(":")[0];a&&!a.startsWith("/")&&r.add(a);}}if(n.healthcheck){let s=t.plan.serviceEnvOverrides?.[o.id];if(o.id==="postgres"&&s){let a=ys(s).map(c=>JSON.stringify(c)).join(", ");e.push(" healthcheck:"),e.push(` test: [${a}]`),e.push(` interval: ${n.healthcheck.interval}`),e.push(` timeout: ${n.healthcheck.timeout}`),e.push(` retries: ${n.healthcheck.retries}`);}else e.push(Ba(n.healthcheck," "));}e.push(" restart: unless-stopped");}}if(r.size>0){e.push("volumes:");for(let o of [...r].sort())e.push(` ${o}:`),e.push(" driver: local");}return e.push(""),e.join(`
|
|
122
|
-
`)}function Va(t,e,r){return t.kind==="override"?t.value===e:t.kind==="module"?r.moduleMappings[t.value]?.includes(e)??false:r.envVarMappings[t.value.toUpperCase()]?.includes(e)??false}function qa(t){let e=new Map,r=[];for(let o of t)for(let n of o.ports){let s=e.get(n.host);s&&s!==o.id?r.push(`Port collision on host ${n.host} between services '${s}' and '${o.id}'`):e.set(n.host,o.id);}return r}async function Ua(t){let e=h.join(t,".rapidkit","workspace.json");if(await
|
|
123
|
-
`);return t.dryRun?{composePath:r,planPath:o,envExamplePath:n}:(await
|
|
124
|
-
`,"utf-8"),await
|
|
122
|
+
`)}function Va(t,e,r){return t.kind==="override"?t.value===e:t.kind==="module"?r.moduleMappings[t.value]?.includes(e)??false:r.envVarMappings[t.value.toUpperCase()]?.includes(e)??false}function qa(t){let e=new Map,r=[];for(let o of t)for(let n of o.ports){let s=e.get(n.host);s&&s!==o.id?r.push(`Port collision on host ${n.host} between services '${s}' and '${o.id}'`):e.set(n.host,o.id);}return r}async function Ua(t){let e=h.join(t,".rapidkit","workspace.json");if(await R__default.pathExists(e))try{let r=await R__default.readJson(e);return r.workspace_name||r.name}catch{return}}async function ho(t){let e=h.resolve(t.workspacePath),r=mt(),o=await us({workspacePath:e,contract:r}),n=o.serviceIds.map(d=>{let m=r.services[d];return m?{id:d,displayName:m.displayName,category:m.category,image:m.image,ports:m.ports,sources:o.sources.filter(g=>Va(g,d,r))}:null}).filter(d=>d!==null),s=qa(n);n.length===0&&s.push("No infrastructure services detected. Install modules with infra dependencies or add .rapidkit/infra/overrides.json");for(let d of o.overrides)r.services[d]||s.push(`Override references unknown service '${d}'`);let a=await R__default.pathExists(h.join(e,".rapidkit","workspace.contract.json"))?".rapidkit/workspace.contract.json":void 0,c=ps(r,o.serviceIds),l=await fs({workspacePath:e,contract:r}),f={...c,...l};l.RAPIDKIT_DB_POSTGRES_URL&&(f.DATABASE_URL=l.RAPIDKIT_DB_POSTGRES_URL);let u={},p=hs(f);return p&&o.serviceIds.includes("postgres")&&(u.postgres=p),{schemaVersion:ls,generatedAt:(t.now||(()=>new Date))().toISOString(),workspacePath:e,workspaceName:await Ua(e),contractPath:a,strategy:"sidecar",composePath:At,envExamplePath:fo,services:n,connectionEnv:f,serviceEnvOverrides:Object.keys(u).length>0?u:void 0,sources:{modules:o.modules,envVars:o.envVars,overrides:o.overrides},warnings:s}}async function yo(t){let e=h.resolve(t.workspacePath),r=h.join(e,At),o=h.join(e,It),n=h.join(e,fo),s=mt(),a=ks({plan:t.plan,contract:s,workspaceName:t.plan.workspaceName||h.basename(e)}),c=["# Generated by: npx rapidkit infra plan","# Copy values into project .env files as needed.",...Object.entries(t.plan.connectionEnv).map(([l,f])=>`${l}=${f}`),""].join(`
|
|
123
|
+
`);return t.dryRun?{composePath:r,planPath:o,envExamplePath:n}:(await R__default.ensureDir(h.dirname(r)),await R__default.ensureDir(h.dirname(o)),await R__default.writeFile(r,a,"utf-8"),await R__default.writeFile(o,`${JSON.stringify(t.plan,null,2)}
|
|
124
|
+
`,"utf-8"),await R__default.writeFile(n,c,"utf-8"),{composePath:r,planPath:o,envExamplePath:n})}function Ha(t){return h.resolve(t).split(h.sep).join("/")}async function Ps(){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 za(){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 Ps();}function js(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 bs(t){await za();let e=await Ps(),r=Ha(t.composePath),o=await execa(e.command,[...e.prefixArgs,"-f",r,...t.args],{cwd:t.workspacePath,reject:false});return {exitCode:o.exitCode??1,stdout:o.stdout,stderr:o.stderr}}function kr(t){let e=t?h.resolve(t):no(process.cwd());if(!e)throw new Error("Not inside a RapidKit workspace. Run from workspace root or pass --workspace.");return a$8(e)}function Ya(t){return h.join(t,At)}async function wo(t){let e=h.join(t,It);if(!await R__default.pathExists(e))throw new Error(`Infra plan not found at ${It}. Run: npx rapidkit infra plan`);return await R__default.readJson(e)}async function ko(t){let e=Ya(t.workspacePath);if(!await R__default.pathExists(e))throw new Error(`Compose file not found at ${At}. Run: npx rapidkit infra plan`);return bs({composePath:e,workspacePath:t.workspacePath,args:t.args})}function Qa(t,e={}){if(console.log(i.bold(`
|
|
125
125
|
RapidKit infra plan
|
|
126
126
|
`)),console.log(i.gray(`Workspace: ${t.workspacePath}`)),t.workspaceName&&console.log(i.gray(`Name: ${t.workspaceName}`)),console.log(i.gray(`Strategy: ${t.strategy} (sidecar compose)`)),console.log(i.gray(`Compose: ${t.composePath}`)),console.log(i.gray(`Plan report: ${It}`)),console.log(i.gray(`Env example: ${t.envExamplePath}`)),console.log(""),t.services.length===0)console.log(i.yellow("No infrastructure services detected."));else {console.log(i.bold("Services:"));for(let r of t.services){let o=r.ports.map(n=>`${n.host}:${n.container}`).join(", ");console.log(i.cyan(` ${r.id}`),i.gray(`(${r.displayName})`),o?i.white(`ports ${o}`):"");}}if(t.sources.modules.length>0&&(console.log(""),console.log(i.bold("Detected from modules:")),console.log(i.gray(` ${t.sources.modules.join(", ")}`))),t.sources.envVars.length>0){let r=mt(),o=gs(t.sources.envVars,r);console.log(i.bold("Detected from env vars (infra-mapped):")),o.length>0?console.log(i.gray(` ${o.join(", ")}`)):console.log(i.gray(" none"));let n=t.sources.envVars.length-o.length;if(n>0&&!e.verbose)console.log(i.gray(` (${n} other project env vars scanned \u2014 use --verbose to list all)`));else if(e.verbose){let s=t.sources.envVars.filter(a=>!o.includes(a));s.length>0&&console.log(i.gray(` Other scanned env vars: ${s.join(", ")}`));}}if(t.sources.overrides.length>0&&(console.log(i.bold("Overrides:")),console.log(i.gray(` ${t.sources.overrides.join(", ")}`))),Object.keys(t.connectionEnv).length>0){console.log(""),console.log(i.bold("Connection env (preview):"));for(let[r,o]of Object.entries(t.connectionEnv))console.log(i.gray(` ${r}=${o}`));}if(t.warnings.length>0){console.log(""),console.log(i.yellow("Warnings:"));for(let r of t.warnings)console.log(i.yellow(` - ${r}`));}console.log("");}function xs(t){let e=t.command("infra").description("Plan and manage workspace infrastructure (Docker sidecar stack)");e.command("plan").description("Discover infra needs and generate compose plan artifacts").option("--workspace <path>","Workspace root path").option("--json","Print plan as JSON").option("--dry-run","Compute plan without writing artifacts").option("--verbose","Show all scanned project env vars").action(async r=>{try{let o=kr(r.workspace),n=await ho({workspacePath:o}),s=await yo({workspacePath:o,plan:n,dryRun:r.dryRun});if(r.json){console.log(JSON.stringify({...n,artifacts:r.dryRun?{composePath:s.composePath,planPath:s.planPath,envExamplePath:s.envExamplePath,dryRun:true}:{composePath:s.composePath,planPath:s.planPath,envExamplePath:s.envExamplePath}},null,2));return}Qa(n,{verbose:r.verbose}),r.dryRun?console.log(i.yellow(`Dry run \u2014 no files written.
|
|
127
127
|
`)):(console.log(i.green("Artifacts written:")),console.log(i.gray(` ${s.composePath}`)),console.log(i.gray(` ${s.planPath}`)),console.log(i.gray(` ${s.envExamplePath}
|
|
@@ -144,19 +144,19 @@ RapidKit infra status
|
|
|
144
144
|
`))),a.exitCode!==0&&(a.stderr&&process.stderr.write(a.stderr),process.exit(a.exitCode)),r.strict&&/Restarting|Exit|unhealthy/i.test(a.stdout)&&(console.log(""),console.log(i.red("One or more infra containers are not healthy.")),console.log(i.gray(`Inspect logs with: docker logs rapidkit-postgres (or redis/mailpit)
|
|
145
145
|
`)),process.exit(1));}catch(o){console.error(i.red(`
|
|
146
146
|
\u274C ${o instanceof Error?o.message:String(o)}
|
|
147
|
-
`)),process.exit(1);}});}function Xa(t){try{let e=h.join(t,"Makefile");return j.existsSync(e)?j.readFileSync(e,"utf8"):""}catch{return ""}}function Be(t,e){let r=Xa(t);return r?new RegExp(`^${e}\\s*:`,"m").test(r):false}var Pr=class{constructor(e){this.runCommand=e;}runCommand;runtime="dotnet";async run(e,r,o){return {exitCode:await this.runCommand(e,r,o)}}async ensureDotnetInstalled(e){return (await this.run("dotnet",["--version"],e)).exitCode===0?null:{exitCode:1,message:".NET SDK is not installed or not available on PATH. Install .NET 8+ from https://dotnet.microsoft.com/download and retry."}}findFilesBySuffix(e,r,o=3){let n=[],s=[{dir:e,depth:0}],a=new Set(["bin","obj",".git","node_modules",".rapidkit"]);for(;s.length>0;){let c=s.shift();if(!c||c.depth>o)continue;let l=[];try{l=j.readdirSync(c.dir,{withFileTypes:true});}catch{continue}for(let f of l){let
|
|
147
|
+
`)),process.exit(1);}});}function Xa(t){try{let e=h.join(t,"Makefile");return j.existsSync(e)?j.readFileSync(e,"utf8"):""}catch{return ""}}function Be(t,e){let r=Xa(t);return r?new RegExp(`^${e}\\s*:`,"m").test(r):false}var Pr=class{constructor(e){this.runCommand=e;}runCommand;runtime="dotnet";async run(e,r,o){return {exitCode:await this.runCommand(e,r,o)}}async ensureDotnetInstalled(e){return (await this.run("dotnet",["--version"],e)).exitCode===0?null:{exitCode:1,message:".NET SDK is not installed or not available on PATH. Install .NET 8+ from https://dotnet.microsoft.com/download and retry."}}findFilesBySuffix(e,r,o=3){let n=[],s=[{dir:e,depth:0}],a=new Set(["bin","obj",".git","node_modules",".rapidkit"]);for(;s.length>0;){let c=s.shift();if(!c||c.depth>o)continue;let l=[];try{l=j.readdirSync(c.dir,{withFileTypes:true});}catch{continue}for(let f of l){let u=h.join(c.dir,f.name);if(f.isDirectory()){a.has(f.name)||s.push({dir:u,depth:c.depth+1});continue}f.name.toLowerCase().endsWith(r.toLowerCase())&&n.push(u);}}return n.sort()}findProjectFile(e){let r=this.findFilesBySuffix(e,".csproj");return r.find(o=>!o.toLowerCase().includes(".tests.csproj"))||r[0]||null}findTestProjectFile(e){return this.findFilesBySuffix(e,".csproj").find(o=>o.toLowerCase().includes(".tests.csproj"))||null}async checkPrereqs(){return this.run("dotnet",["--version"],process.cwd())}async warmSetupCache(e){let r=await this.ensureDotnetInstalled(e);return r||this.run("dotnet",["nuget","locals","all","--list"],e)}async initProject(e){let r=await this.ensureDotnetInstalled(e);if(r)return r;let o=this.findProjectFile(e),n=await this.run("dotnet",o?["restore",o]:["restore"],e);return n.exitCode===0?n:{exitCode:n.exitCode,message:"dotnet restore failed. Check NuGet connectivity, package references, and .NET SDK workload availability, then retry."}}async runDev(e){let r=await this.ensureDotnetInstalled(e);if(r)return r;let o=this.findProjectFile(e),n=o?["watch","--project",o,"run"]:["watch","run"];return this.run("dotnet",n,e)}async runTest(e){let r=await this.ensureDotnetInstalled(e);if(r)return r;let o=this.findTestProjectFile(e)||this.findProjectFile(e);return this.run("dotnet",o?["test",o]:["test"],e)}async runBuild(e){let r=await this.ensureDotnetInstalled(e);if(r)return r;let o=this.findProjectFile(e);return this.run("dotnet",o?["build",o,"-c","Release"]:["build","-c","Release"],e)}async runStart(e){let r=await this.ensureDotnetInstalled(e);if(r)return r;let o=this.findProjectFile(e);return this.run("dotnet",o?["run","--project",o]:["run"],e)}async runLint(e){if(Be(e,"lint"))return this.run("make",["lint"],e);let r=h.join(e,"Directory.Build.props");if(j.existsSync(r)&&j.readFileSync(r,"utf-8").includes("EnforceCodeStyleInBuild")){let o=await this.ensureDotnetInstalled(e);if(o)return o;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(Be(e,"format"))return this.run("make",["format"],e);let r=await this.ensureDotnetInstalled(e);return r||(j.existsSync(h.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 jr=class{constructor(e){this.runCommand=e;}runCommand;runtime="go";async run(e,r,o){return {exitCode:await this.runCommand(e,r,o)}}async ensureGoInstalled(e){return (await this.run("go",["version"],e)).exitCode===0?null:{exitCode:1,message:"Go toolchain is not installed or not available on PATH. Install Go from https://go.dev/dl/ and retry."}}findGoRunTarget(e){let r=h.join(e,"main.go");if(j.existsSync(r))return "./main.go";let o=h.join(e,"cmd");try{let n=j.readdirSync(o,{withFileTypes:true}).filter(s=>s.isDirectory()).map(s=>s.name).sort();for(let s of n)if(j.existsSync(h.join(o,s,"main.go")))return `./cmd/${s}`}catch{}return "./."}findWorkspaceRoot(e){let r=e;for(;;){if(j.existsSync(h.join(r,".rapidkit-workspace")))return r;let o=h.dirname(r);if(o===r)break;r=o;}return null}resolveDependencyMode(e){let r=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(r==="shared-runtime-caches"||r==="shared-node-deps"||r==="isolated")return r;let o=this.findWorkspaceRoot(e);if(!o)return "isolated";let n=h.join(o,".rapidkit","policies.yml");if(!j.existsSync(n))return "isolated";try{let c=j.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(c==="shared-runtime-caches"||c==="shared-node-deps"||c==="isolated")return c}catch{}return "isolated"}withGoCacheEnv(e,r){let o=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),s=o==="shared-runtime-caches"?h.join(n||e,".rapidkit","cache","go"):h.join(e,".rapidkit","cache","go"),a=process.env.GOMODCACHE,c=process.env.GOCACHE;return process.env.GOMODCACHE=h.join(s,"mod"),process.env.GOCACHE=h.join(s,"build"),r().finally(()=>{typeof a>"u"?delete process.env.GOMODCACHE:process.env.GOMODCACHE=a,typeof c>"u"?delete process.env.GOCACHE:process.env.GOCACHE=c;})}async checkPrereqs(){return this.run("go",["version"],process.cwd())}async warmSetupCache(e){return this.withGoCacheEnv(e,async()=>{try{return process.env.GOMODCACHE&&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 r=await this.ensureGoInstalled(e);return r||this.run("go",["mod","tidy"],e)})}async runDev(e){return this.withGoCacheEnv(e,()=>(async()=>{let r=await this.ensureGoInstalled(e);if(r)return r;let o=h.join(e,"Makefile");return j.existsSync(o)?this.run("make",["run"],e):this.run("go",["run",this.findGoRunTarget(e)],e)})())}async runTest(e){return this.withGoCacheEnv(e,async()=>{let r=await this.ensureGoInstalled(e);return r||this.run("go",["test","./..."],e)})}async runBuild(e){return this.withGoCacheEnv(e,async()=>{let r=await this.ensureGoInstalled(e);return r||this.run("go",["build","-buildvcs=false","./..."],e)})}async runStart(e){return this.withGoCacheEnv(e,async()=>{let o=(a()?[h.join(e,"server.exe"),h.join(e,"server")]:[h.join(e,"server")]).find(s=>j.existsSync(s));if(o)return this.run(o,[],e);let n=await this.ensureGoInstalled(e);return n||this.run("go",["run",this.findGoRunTarget(e)],e)})}async runLint(e){return this.withGoCacheEnv(e,async()=>{let r=await this.ensureGoInstalled(e);return r||(Be(e,"lint")?this.run("make",["lint"],e):j.existsSync(h.join(e,".golangci.yml"))||j.existsSync(h.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 r=await this.ensureGoInstalled(e);return r||(Be(e,"fmt")?this.run("make",["fmt"],e):Be(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 br=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 r=process.env.JAVA_HOME?.trim();if(!r)return "java";let o=h.join(r,"bin",process.platform==="win32"?"java.exe":"java");return j.existsSync(o)?o:"java"}parseMajorJavaVersion(e){if(!e)return null;let o=e.trim().replace(/\"/g,"").split(".")[0],n=Number.parseInt(o,10);return Number.isFinite(n)?n:null}readRequiredJavaMajor(e){let r=h.join(e,"pom.xml");if(!j.existsSync(r))return 21;try{let n=j.readFileSync(r,"utf-8").match(/<java\.version>\s*([^<\s]+)\s*<\/java\.version>/i);return this.parseMajorJavaVersion(n?.[1])??21}catch{return 21}}async detectInstalledJavaMajor(e,r){try{let o=await execa(e,["-version"],{cwd:r,timeout:5e3,reject:false});if(o.exitCode!==0)return null;let n=`${o.stdout||""}
|
|
148
148
|
${o.stderr||""}`,s=n.match(/version\s+"([^"]+)"/i);if(s?.[1])return this.parseMajorJavaVersion(s[1]);let a=n.match(/(?:openjdk|java)\s+(\d+(?:[._]\d+)?)/i);return a?.[1]?this.parseMajorJavaVersion(a[1]):null}catch{return null}}parseMavenVersion(e){if(!e)return null;let r=e.match(/Apache Maven\s+(\d+)\.(\d+)\.(\d+)/i);return r?[Number.parseInt(r[1],10),Number.parseInt(r[2],10),Number.parseInt(r[3],10)]:null}isMavenVersionAtLeast(e,r){for(let o=0;o<3;o+=1){if(e[o]>r[o])return true;if(e[o]<r[o])return false}return true}async checkSystemMavenVersion(e){try{let r=await execa("mvn",["-version"],{cwd:e,timeout:5e3,reject:false});if(r.exitCode!==0)return {exitCode:r.exitCode||1,message:"Maven is required and must be available on PATH (3.9+)."};let o=this.parseMavenVersion(`${r.stdout||""}
|
|
149
|
-
${r.stderr||""}`);return o?this.isMavenVersionAtLeast(o,[3,9,0])?{exitCode:0}:{exitCode:1,message:`Maven ${o.join(".")} detected; Maven 3.9+ is required.`}:{exitCode:1,message:"Unable to parse Maven version. Ensure Maven 3.9+ is installed and retry."}}catch{return {exitCode:1,message:"Maven version check failed. Install Maven 3.9+ and ensure mvn is on PATH."}}}shouldUseGradleNoDaemon(){return process.env.CI==="true"||process.env.RAPIDKIT_GRADLE_NO_DAEMON==="1"}inspectJavaProject(e){let r=j.existsSync(h.join(e,"pom.xml")),o=j.existsSync(h.join(e,"mvnw"))||j.existsSync(h.join(e,"mvnw.cmd")),n=j.existsSync(h.join(e,"build.gradle"))||j.existsSync(h.join(e,"build.gradle.kts"))||j.existsSync(h.join(e,"settings.gradle"))||j.existsSync(h.join(e,"settings.gradle.kts")),s=j.existsSync(h.join(e,"gradlew"))||j.existsSync(h.join(e,"gradlew.bat"));return {hasMavenProject:r||o,hasMavenWrapper:o,hasGradleProject:n||s,hasGradleWrapper:s}}findWorkspaceRoot(e){let r=e;for(;;){if(j.existsSync(h.join(r,".rapidkit-workspace")))return r;let o=h.dirname(r);if(o===r)break;r=o;}return null}resolveDependencyMode(e){let r=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(r==="shared-runtime-caches"||r==="shared-node-deps"||r==="isolated")return r;let o=this.findWorkspaceRoot(e);if(!o)return "isolated";let n=h.join(o,".rapidkit","policies.yml");if(!j.existsSync(n))return "isolated";try{let c=j.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(c==="shared-runtime-caches"||c==="shared-node-deps"||c==="isolated")return c}catch{}return "isolated"}buildToolCommand(e){return this.isGradleProject(e)?this.gradleCommand(e):this.mavenCommand(e)}mavenCommand(e){let r=h.join(e,"mvnw.cmd");if(process.platform==="win32"&&j.existsSync(r))return {command:r,baseArgs:[]};let o=h.join(e,"mvnw");return j.existsSync(o)?this.ensureWrapperExecutable(o)?{command:o,baseArgs:[]}:{command:"sh",baseArgs:[o]}:{command:"mvn",baseArgs:[]}}gradleCommand(e){let r=h.join(e,"gradlew.bat");if(process.platform==="win32"&&j.existsSync(r))return {command:r,baseArgs:[]};let o=h.join(e,"gradlew");return j.existsSync(o)?this.ensureWrapperExecutable(o)?{command:o,baseArgs:[]}:{command:"sh",baseArgs:[o]}:{command:"gradle",baseArgs:[]}}isGradleProject(e){return this.inspectJavaProject(e).hasGradleProject}isMavenProject(e){return this.inspectJavaProject(e).hasMavenProject}discoverWorkspaceJavaProjects(e){let r=[],o=new Set,n=[e];for(;n.length>0;){let s=n.shift();if(!s||o.has(s))continue;o.add(s);let a=[];try{a=j.readdirSync(s,{withFileTypes:true});}catch{continue}for(let c of a){if(!c.isDirectory()||c.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(c.name))continue;let l=h.join(s,c.name),f=this.inspectJavaProject(l);(f.hasMavenProject||f.hasGradleProject)&&r.push(l),n.push(l);}}return r}withJavaCacheEnv(e,r){let o=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),s=o==="shared-runtime-caches"?h.join(n||e,".rapidkit","cache","java","m2"):h.join(e,".rapidkit","cache","java","m2"),a=o==="shared-runtime-caches"?h.join(n||e,".rapidkit","cache","java","gradle"):h.join(e,".rapidkit","cache","java","gradle"),c=process.env.MAVEN_OPTS,l=process.env.GRADLE_USER_HOME,f=`-Dmaven.repo.local=${s}`;return process.env.MAVEN_OPTS=c?`${c} ${f}`:f,process.env.GRADLE_USER_HOME=a,r().finally(()=>{typeof c>"u"?delete process.env.MAVEN_OPTS:process.env.MAVEN_OPTS=c,typeof l>"u"?delete process.env.GRADLE_USER_HOME:process.env.GRADLE_USER_HOME=l;})}async runBuildTool(e,r,o=true){return this.withJavaCacheEnv(e,async()=>{try{let{command:n,baseArgs:s}=this.buildToolCommand(e),a=await this.runCommand(n,[...s,...r],e);if(a===0||!o)return {exitCode:a};let c=j.existsSync(h.join(e,"pom.xml")),l=j.existsSync(h.join(e,"build.gradle"))||j.existsSync(h.join(e,"build.gradle.kts"));return {exitCode:a,message:c||l?"Java build failed. Verify pom.xml/build.gradle syntax and dependencies, then retry.":"Java build tool is not installed or not available on PATH. Install Maven/Gradle and JDK 21+, or commit mvnw/gradlew wrapper scripts."}}catch(n){return {exitCode:1,message:`Java command execution failed: ${n instanceof Error?n.message:String(n)}. Verify pom.xml/build.gradle integrity and wrapper permissions.`}}})}resolveJarPath(e){let r=[h.join(e,"target"),h.join(e,"build","libs")];for(let o of r){if(!j.existsSync(o))continue;let s=j.readdirSync(o).filter(a=>a.toLowerCase().endsWith(".jar")).find(a=>!a.toLowerCase().endsWith("-sources.jar")&&!a.toLowerCase().endsWith("-javadoc.jar")&&!a.toLowerCase().endsWith("-plain.jar"));if(s)return h.join(o,s)}return null}commandArgsFor(e,r){if(e==="gradle"){let o=this.shouldUseGradleNoDaemon()?["--no-daemon"]:[];return r==="init"?[...o,"dependencies"]:r==="dev"?[...o,"bootRun"]:r==="test"?[...o,"test"]:[...o,"bootJar"]}return r==="init"?["-B","-q","-DskipTests","dependency:go-offline"]:r==="dev"?["spring-boot:run"]:r==="test"?["test"]:["-DskipTests","package"]}detectBuildTool(e){return this.isGradleProject(e)?"gradle":"maven"}async checkPrereqs(){let e=process.cwd(),r=this.resolveJavaCommand(e),o=await this.runCommand(r,["-version"],e);if(o!==0)return {exitCode:o,message:"JDK 21+ is required. Ensure java is on PATH or JAVA_HOME/bin/java is available."};if(this.isMavenProject(e)){let c=this.readRequiredJavaMajor(e),l=await this.detectInstalledJavaMajor(r,e);if(l!==null&&l<c)return {exitCode:1,message:`Detected Java ${l}, but project requires Java ${c}+.`};let f=h.join(process.env.JAVA_HOME||"","release");if(process.env.JAVA_HOME&&j.existsSync(f))try{let u=j.readFileSync(f,"utf-8").match(/^JAVA_VERSION="([^"]+)"/m),d=this.parseMajorJavaVersion(u?.[1]);if(d!==null&&d<c)return {exitCode:1,message:`Detected JAVA_HOME version ${d}, but project requires Java ${c}+.`}}catch{}}if(this.isMavenProject(e)||this.isGradleProject(e)){let c=this.detectBuildTool(e),l=c==="gradle"?["--version"]:["-version"],f=await this.runBuildTool(e,l);return f.exitCode!==0?f:c==="maven"&&!this.inspectJavaProject(e).hasMavenWrapper?this.checkSystemMavenVersion(e):f}let n=this.findWorkspaceRoot(e);if(n&&n===e){let c=this.discoverWorkspaceJavaProjects(n);if(c.length>0){let l=c.reduce((u,d)=>Math.max(u,this.readRequiredJavaMajor(d)),0);if(l>0){let u=await this.detectInstalledJavaMajor(r,e);if(u!==null&&u<l){let d=c.filter(m=>this.readRequiredJavaMajor(m)>u).map(m=>h.relative(e,m)).join(", ");return {exitCode:1,message:`Detected Java ${u}, but workspace project(s) [${d}] require Java ${l}+.`}}}let f=false,p=false;for(let u of c){let d=this.inspectJavaProject(u);d.hasMavenProject&&!d.hasMavenWrapper&&(f=true),d.hasGradleProject&&!d.hasGradleWrapper&&(p=true);}if(f){let u=await this.withJavaCacheEnv(e,async()=>this.runCommand("mvn",["-version"],e));if(u!==0)return {exitCode:u,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(p){let u=await this.withJavaCacheEnv(e,async()=>this.runCommand("gradle",["--version"],e));if(u!==0)return {exitCode:u,message:"Gradle is required for one or more workspace Java projects without Gradle Wrapper. Install Gradle 8+, or add gradlew/gradlew.bat to those projects."}}return {exitCode:0}}}let s=await this.withJavaCacheEnv(e,async()=>this.runCommand("mvn",["-version"],e));if(s===0){let c=await this.checkSystemMavenVersion(e);return c.exitCode!==0?c:{exitCode:0}}let a=await this.withJavaCacheEnv(e,async()=>this.runCommand("gradle",["--version"],e));return a===0?{exitCode:0}:{exitCode:s||a||1,message:"Neither Maven nor Gradle is available on PATH. Install one of them, or use mvnw/gradlew wrappers in project roots."}}async warmSetupCache(e){return this.withJavaCacheEnv(e,async()=>{try{let r=process.env.MAVEN_OPTS?.match(/-Dmaven\.repo\.local=([^\s]+)/)?.[1];return r&&j.mkdirSync(r,{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 r=this.resolveJarPath(e);if(r)return {exitCode:await this.runCommand(this.resolveJavaCommand(e),["-jar",r],e)};let o=await this.runBuild(e);if(o.exitCode!==0)return o;let n=this.resolveJarPath(e);return n?{exitCode:await this.runCommand(this.resolveJavaCommand(e),["-jar",n],e)}:{exitCode:1,message:"Spring Boot build completed, but no runnable JAR was found under target/ or build/libs/. Verify build output naming and packaging plugins."}}async runLint(e){if(Be(e,"lint"))return {exitCode:await this.runCommand("make",["lint"],e)};let r=h.join(e,"pom.xml");return j.existsSync(r)&&j.readFileSync(r,"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(o=>h.join(e,o)).filter(o=>j.existsSync(o)).some(o=>j.readFileSync(o,"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 xr=class{constructor(e){this.runCommand=e;}runCommand;runtime="node";async run(e,r,o){return {exitCode:await this.runCommand(e,r,o)}}findWorkspaceRoot(e){let r=e;for(;;){if(j.existsSync(h.join(r,".rapidkit-workspace")))return r;let o=h.dirname(r);if(o===r)break;r=o;}return null}resolveDependencyMode(e){let r=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(r==="shared-runtime-caches"||r==="shared-node-deps"||r==="isolated")return r;let o=this.findWorkspaceRoot(e);if(!o)return "isolated";let n=h.join(o,".rapidkit","policies.yml");if(!j.existsSync(n))return "isolated";try{let c=j.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(c==="shared-runtime-caches"||c==="shared-node-deps"||c==="isolated")return c}catch{}return "isolated"}withDependencyEnv(e,r,o){let n=this.resolveDependencyMode(e),s=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),a=n==="isolated"?h.join(e,".rapidkit","cache","node"):h.join(s||e,".rapidkit","cache","node"),c=process.env.npm_config_cache,l=process.env.npm_config_store_dir,f=process.env.RAPIDKIT_DEP_SHARING_MODE,p=process.env.RAPIDKIT_WORKSPACE_PATH;return process.env.RAPIDKIT_DEP_SHARING_MODE=n,s&&(process.env.RAPIDKIT_WORKSPACE_PATH=s),r==="pnpm"?(process.env.npm_config_store_dir=h.join(a,"pnpm-store"),process.env.npm_config_cache=h.join(a,"pnpm-cache")):r==="yarn"?process.env.npm_config_cache=h.join(a,"yarn-cache"):process.env.npm_config_cache=h.join(a,"npm-cache"),o().finally(()=>{typeof c>"u"?delete process.env.npm_config_cache:process.env.npm_config_cache=c,typeof l>"u"?delete process.env.npm_config_store_dir:process.env.npm_config_store_dir=l,typeof f>"u"?delete process.env.RAPIDKIT_DEP_SHARING_MODE:process.env.RAPIDKIT_DEP_SHARING_MODE=f,typeof p>"u"?delete process.env.RAPIDKIT_WORKSPACE_PATH:process.env.RAPIDKIT_WORKSPACE_PATH=p;})}detectPackageManager(e){if(j.existsSync(h.join(e,"package-lock.json")))return "npm";if(j.existsSync(h.join(e,"pnpm-lock.yaml")))return "pnpm";if(j.existsSync(h.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(h.join(e,"package-lock.json"))||j.existsSync(h.join(e,"pnpm-lock.yaml"))||j.existsSync(h.join(e,"yarn.lock"))}availablePackageManagers(e){let r=this.detectPackageManager(e);return this.hasPinnedPackageManager(e)?[r]:[r,...["npm","pnpm","yarn"].filter(n=>n!==r&&this.commandAvailable(n))]}commandAvailable(e){return spawnSync(e,["--version"],{stdio:"ignore",shell:process.platform==="win32"}).status===0}scriptArgs(e,r){return e==="npm"?["run",r]:["run",r]}async runScriptWithFallback(e,r){let o={exitCode:1};for(let n of this.availablePackageManagers(e))if(o=await this.withDependencyEnv(e,n,()=>this.run(n,this.scriptArgs(n,r),e)),o.exitCode===0)return o;return o}async runLifecycle(e,r){let o=a$4(e),n=i$3(e,o),s=g(e,r,{framework:n.key});return s?this.runScriptWithFallback(e,s.scriptName):{exitCode:1,message:`No npm script available for \`${r}\`. Add a "${r}" script to package.json.`}}async checkPrereqs(){return this.run("node",["--version"],process.cwd())}async warmSetupCache(e){let r=this.detectPackageManager(e);return this.withDependencyEnv(e,r,async()=>{try{return process.env.npm_config_cache&&j.mkdirSync(process.env.npm_config_cache,{recursive:true}),r==="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 r=this.detectPackageManager(e),o=this.resolveDependencyMode(e),n=o==="shared-runtime-caches"||o==="shared-node-deps"?["install","--prefer-offline"]:["install"];return this.withDependencyEnv(e,r,()=>this.run(r,n,e))}async runDev(e){return this.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 Sr=class{constructor(e){this.runCore=e;}runCore;runtime="python";async run(e,r){return {exitCode:await this.withPythonCacheEnv(r,()=>this.runCore(e,r))}}findWorkspaceRoot(e){let r=e;for(;;){if(j.existsSync(h.join(r,".rapidkit-workspace")))return r;let o=h.dirname(r);if(o===r)break;r=o;}return null}resolveDependencyMode(e){let r=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(r==="shared-runtime-caches"||r==="shared-node-deps"||r==="isolated")return r;let o=this.findWorkspaceRoot(e);if(!o)return "isolated";let n=h.join(o,".rapidkit","policies.yml");if(!j.existsSync(n))return "isolated";try{let c=j.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(c==="shared-runtime-caches"||c==="shared-node-deps"||c==="isolated")return c}catch{}return "isolated"}withPythonCacheEnv(e,r){let o=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),s=o==="shared-runtime-caches"?h.join(n||e,".rapidkit","cache","python"):h.join(e,".rapidkit","cache","python"),a=process.env.PIP_CACHE_DIR,c=process.env.POETRY_CACHE_DIR;return process.env.PIP_CACHE_DIR=h.join(s,"pip"),process.env.POETRY_CACHE_DIR=h.join(s,"poetry"),r().finally(()=>{typeof a>"u"?delete process.env.PIP_CACHE_DIR:process.env.PIP_CACHE_DIR=a,typeof c>"u"?delete process.env.POETRY_CACHE_DIR:process.env.POETRY_CACHE_DIR=c;})}async checkPrereqs(){let e=process.cwd(),r=await this.run(["doctor","check"],e);return r.exitCode===0?r:this.run(["doctor"],e)}async initProject(e){return this.run(["init"],e)}async runDev(e){return this.run(["dev"],e)}async runTest(e){return this.run(["test"],e)}async runBuild(e){return this.run(["build"],e)}async runStart(e){return this.run(["start"],e)}async doctorHints(e){return ['Run "npx rapidkit doctor workspace" for a full workspace scan.','Use "npx rapidkit init" after adding or changing modules.','Use workspace launcher "./rapidkit" to avoid environment drift.']}};function tc(){let t={...process.env},e=t.PATH||"";if(e){let r=e.split(h.delimiter).filter(o=>!o.replace(/\\/g,"/").includes("/.pyenv/shims")).join(h.delimiter);t.PATH=r;}return t.PYENV_VERSION="system",t.POETRY_PYTHON=t.POETRY_PYTHON||c$3(),typeof t.RAPIDKIT_SKIP_LOCK_SYNC>"u"&&(t.RAPIDKIT_SKIP_LOCK_SYNC="1"),t}function Ve(t,e){return t==="go"?new jr((r,o,n)=>e.runCommandInCwd(r,o,n)):t==="node"?new xr((r,o,n)=>e.runCommandInCwd(r,o,n)):t==="java"?new br((r,o,n)=>e.runCommandInCwd(r,o,n)):t==="dotnet"?new Pr((r,o,n)=>e.runCommandInCwd(r,o,n)):new Sr((r,o)=>e.runCoreRapidkit(r,{cwd:o,env:tc()}))}var Es=h.join(jn.homedir(),".rapidkit","cache"),_s=1440*60*1e3;function xo(){let t=process.env.RAPIDKIT_CACHE_DIR?.trim();if(t)return t;let e=process.env.VITEST_WORKER_ID?.trim();return e?h.join(Es,`vitest-${e}`):Es}var Rr=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 h.join(xo(),`${this.getCacheKey(e)}.json`)}getTempCachePath(e){let r=`${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`;return `${e}.${r}.tmp`}async get(e,r="1.0"){let o=this.memoryCache.get(e);if(o&&o.version===r&&Date.now()-o.timestamp<_s)return a$1.debug(`Cache hit (memory): ${e}`),o.data;try{let n=this.getCachePath(e),s=await promises.readFile(n,"utf-8"),a=JSON.parse(s);if(a.version===r&&Date.now()-a.timestamp<_s)return a$1.debug(`Cache hit (disk): ${e}`),this.memoryCache.set(e,a),a.data;await promises.unlink(n).catch(()=>{});}catch{a$1.debug(`Cache miss: ${e}`);}return null}async set(e,r,o="1.0"){let n={data:r,timestamp:Date.now(),version:o};this.memoryCache.set(e,n);try{await promises.mkdir(xo(),{recursive:true});let s=this.getCachePath(e),a=this.getTempCachePath(s);await promises.writeFile(a,JSON.stringify(n),"utf-8"),await promises.rename(a,s),a$1.debug(`Cache set: ${e}`);}catch(s){a$1.debug(`Cache write failed: ${e}`,s);}}async invalidate(e){this.memoryCache.delete(e);try{let r=this.getCachePath(e);await promises.unlink(r),a$1.debug(`Cache invalidated: ${e}`);}catch{}}async clear(){this.memoryCache.clear();try{let e=xo(),r=await promises.readdir(e);await Promise.all(r.map(o=>promises.unlink(h.join(e,o)))),a$1.debug("Cache cleared");}catch{}}};var As=[{id:"fastapi.standard",aliases:["fastapi","fastapi.standard"],label:"fastapi \u2014 FastAPI Standard Kit",description:"Core-backed FastAPI service scaffold.",owner:"core",runtime:"python",framework:"fastapi",moduleSupport:true,stability:"stable"},{id:"fastapi.ddd",aliases:["fastapi.ddd","fastapi-ddd"],label:"fastapi \u2014 FastAPI DDD Kit",description:"Core-backed FastAPI DDD service scaffold.",owner:"core",runtime:"python",framework:"fastapi",moduleSupport:true,stability:"stable"},{id:"nestjs.standard",aliases:["nestjs","nest","nestjs.standard"],label:"nestjs \u2014 NestJS Standard Kit",description:"Core-backed NestJS service scaffold.",owner:"core",runtime:"node",framework:"nestjs",moduleSupport:true,stability:"stable"},{id:"springboot.standard",aliases:["spring","springboot","springboot.standard","java"],label:"spring \u2014 Spring Boot Standard Kit",description:"npm-backed Spring Boot service scaffold.",owner:"npm",runtime:"java",framework:"springboot",moduleSupport:false,stability:"stable",generator:"springboot",createUsage:"rapidkit create project springboot.standard <name> [--java-version <major>] [--spring-boot-version <semver>] [--group-id <com.example>] [--package-name <com.example.app>] [--port <number>]"},{id:"gofiber.standard",aliases:["go","go.standard","fiber","gofiber","gofiber.standard","go/fiber"],label:"go/fiber \u2014 Go Fiber Standard Kit",description:"npm-backed Go Fiber service scaffold.",owner:"npm",runtime:"go",framework:"gofiber",moduleSupport:false,stability:"stable",generator:"gofiber",createUsage:"rapidkit create project gofiber.standard <name> [--output <dir>]"},{id:"gogin.standard",aliases:["gin","gogin","gogin.standard","go/gin"],label:"go/gin \u2014 Go Gin Standard Kit",description:"npm-backed Go Gin service scaffold.",owner:"npm",runtime:"go",framework:"gogin",moduleSupport:false,stability:"stable",generator:"gogin",createUsage:"rapidkit create project gogin.standard <name> [--output <dir>]"},{id:"dotnet.webapi.clean",aliases:["dotnet","dotnet.webapi","dotnet.webapi.clean","aspnet","aspnetcore","asp.net","asp.net-core","csharp","c#"],label:"dotnet \u2014 ASP.NET Core Clean Web API",description:"npm-backed ASP.NET Core Web API with clean architecture boundaries.",owner:"npm",runtime:"dotnet",framework:"dotnet",moduleSupport:false,stability:"preview",generator:"dotnet-webapi-clean",createUsage:"rapidkit create project dotnet.webapi.clean <name> [--target-framework net8.0] [--root-namespace <Company.Product>] [--port <number>]"}],So=new Map;for(let t of As){So.set(t.id.toLowerCase(),t);for(let e of t.aliases)So.set(e.toLowerCase(),t);}function gt(t){return t?So.get(t.trim().toLowerCase())??null:null}function Is(t){return gt(t)?.id??t}function $s(){return As.filter(t=>t.owner==="core"||t.generator)}function Er(t){return gt(t)?.owner==="npm"}async function Ns(t,e){if(!t.generator)throw new Error(`Kit is not backed by an npm generator: ${t.id}`);if(t.generator==="gofiber"){let{generateGoFiberKit:r}=await import('./gofiber-standard-NDCBY6OM.js');await r(e.projectPath,{project_name:e.projectName,module_path:e.projectName,skipGit:e.skipGit,skipInstall:e.skipInstall});return}if(t.generator==="gogin"){let{generateGoGinKit:r}=await import('./gogin-standard-WUOMIHDR.js');await r(e.projectPath,{project_name:e.projectName,module_path:e.projectName,skipGit:e.skipGit,skipInstall:e.skipInstall});return}if(t.generator==="springboot"){let{generateSpringBootKit:r}=await import('./springboot-standard-WQWB5E24.js');await r(e.projectPath,{project_name:e.projectName,artifact_id:e.projectName,java_version:Te(e.args,"--java-version")?.trim(),spring_boot_version:Te(e.args,"--spring-boot-version")?.trim(),springdoc_version:Te(e.args,"--springdoc-version")?.trim(),group_id:Te(e.args,"--group-id")?.trim(),package_name:Te(e.args,"--package-name")?.trim(),description:Te(e.args,"--description")?.trim(),port:Te(e.args,"--port")?.trim(),skipGit:e.skipGit,skipInstall:e.skipInstall});return}if(t.generator==="dotnet-webapi-clean"){let{generateDotnetWebApiCleanKit:r}=await import('./dotnet-webapi-clean-TPQMNFSD.js');await r(e.projectPath,{project_name:e.projectName,target_framework:Te(e.args,"--target-framework")?.trim(),root_namespace:Te(e.args,"--root-namespace")?.trim(),description:Te(e.args,"--description")?.trim(),port:Te(e.args,"--port")?.trim(),skipGit:e.skipGit,skipInstall:e.skipInstall});return}throw new Error(`Unhandled npm kit generator: ${t.generator}`)}function Te(t,e){let r=t.indexOf(e);if(r>=0&&r+1<t.length)return t[r+1];let o=t.find(n=>n.startsWith(`${e}=`));return o?o.slice(e.length+1):void 0}function Ds(t){let e=sc(t.workspacePath,t.result.projectPath)?"imported":"adopted";return {name:t.result.projectName,path:t.result.projectPath,relativePath:ic(t.workspacePath,t.result.projectPath),relationship:e,stack:t.result.definition.framework,runtime:"node",framework:t.result.definition.framework,frameworkDisplayName:t.result.definition.displayName,supportTier:"extended",moduleSupport:false,confidence:"high",source:e==="adopted"?"adopted-local":"local-folder",importedAt:t.importedAt??new Date().toISOString()}}function sc(t,e){let r=h.relative(h.resolve(t),h.resolve(e));return r===""||r.length>0&&!r.startsWith("..")&&!h.isAbsolute(r)}function ic(t,e){return (h.relative(t,e)||".").split(h.sep).join("/")}var Ms=[{id:"nextjs",kitId:"frontend.nextjs",aliases:["frontend.nextjs","next","nextjs","next.js"],displayName:"Next.js",framework:"nextjs",defaultPort:3e3,commandDisplay:t=>`npx create-next-app@latest ${t}`,commandExec:(t,e)=>({command:"npx",args:["--yes","create-next-app@latest",t,"--yes",...e.skipGit?["--disable-git"]:[],...e.skipInstall?["--skip-install"]:[]]})},{id:"remix",kitId:"frontend.remix",aliases:["frontend.remix","remix","remix-run","react-router"],displayName:"React Router",framework:"remix",defaultPort:5173,commandDisplay:t=>`npx create-react-router@latest ${t}`,commandExec:(t,e)=>({command:"npx",args:["--yes","create-react-router@latest",t,"--yes",...e.skipInstall?["--no-install"]:["--install"],"--no-git-init"]})},{id:"vite-react",kitId:"frontend.vite-react",aliases:["frontend.vite-react","vite-react","react","vite.react"],displayName:"React + Vite",framework:"react",defaultPort:5173,commandDisplay:t=>`npm create vite@latest ${t} -- --template react-ts`,commandExec:t=>({command:"npm",args:["create","vite@latest",t,"--","--template","react-ts","--no-interactive"]})},{id:"vite-vue",kitId:"frontend.vite-vue",aliases:["frontend.vite-vue","vite-vue","vue","vite.vue"],displayName:"Vue + Vite",framework:"vue",defaultPort:5173,commandDisplay:t=>`npm create vite@latest ${t} -- --template vue-ts`,commandExec:t=>({command:"npm",args:["create","vite@latest",t,"--","--template","vue-ts","--no-interactive"]})},{id:"vite-svelte",kitId:"frontend.vite-svelte",aliases:["frontend.vite-svelte","vite-svelte","svelte","vite.svelte"],displayName:"Svelte + Vite",framework:"svelte",defaultPort:5173,commandDisplay:t=>`npm create vite@latest ${t} -- --template svelte-ts`,commandExec:t=>({command:"npm",args:["create","vite@latest",t,"--","--template","svelte-ts","--no-interactive"]})},{id:"vite-solid",kitId:"frontend.vite-solid",aliases:["frontend.vite-solid","vite-solid","solid","solidjs","vite.solid"],displayName:"Solid + Vite",framework:"solid",defaultPort:5173,commandDisplay:t=>`npm create vite@latest ${t} -- --template solid-ts`,commandExec:t=>({command:"npm",args:["create","vite@latest",t,"--","--template","solid-ts","--no-interactive"]})},{id:"vite-vanilla",kitId:"frontend.vite-vanilla",aliases:["frontend.vite-vanilla","vite","vanilla","vite-vanilla"],displayName:"Vite",framework:"vite",defaultPort:5173,commandDisplay:t=>`npm create vite@latest ${t} -- --template vanilla-ts`,commandExec:t=>({command:"npm",args:["create","vite@latest",t,"--","--template","vanilla-ts","--no-interactive"]})},{id:"nuxt",kitId:"frontend.nuxt",aliases:["frontend.nuxt","nuxt","nuxtjs","nuxt.js"],displayName:"Nuxt",framework:"nuxt",defaultPort:3e3,commandDisplay:t=>`npx nuxi@latest init ${t}`,commandExec:(t,e)=>({command:"npx",args:["--yes","nuxi@latest","init",t,...e.skipInstall?["--no-install"]:[]]})},{id:"angular",kitId:"frontend.angular",aliases:["frontend.angular","angular","ng"],displayName:"Angular",framework:"angular",defaultPort:4200,minNodeMajor:18,minNodeMessage:"Angular scaffolding requires Node.js 18.19+ or 20.11+. Upgrade Node, or choose another frontend kit.",commandDisplay:t=>`npx @angular/cli@19 new ${t}`,commandExec:(t,e)=>({command:"npx",args:["--yes","@angular/cli@19","new",t,"--defaults","--skip-git",...e.skipInstall?["--skip-install"]:[]]})},{id:"astro",kitId:"frontend.astro",aliases:["frontend.astro","astro"],displayName:"Astro",framework:"astro",defaultPort:4321,commandDisplay:t=>`npm create astro@4 ${t}`,commandExec:(t,e)=>({command:"npm",args:["create","astro@4",t,"--","--yes",...e.skipInstall?["--no-install"]:[],...e.skipGit?["--no-git"]:[]]})},{id:"sveltekit",kitId:"frontend.sveltekit",aliases:["frontend.sveltekit","sveltekit","svelte-kit"],displayName:"SvelteKit",framework:"sveltekit",defaultPort:5173,commandDisplay:t=>`npx sv@latest create ${t}`,commandExec:(t,e)=>({command:"npx",args:["--yes","sv@latest","create",t,"--template","minimal","--types","ts","--no-add-ons",...e.skipInstall?["--no-install"]:["--install","npm"]]})}],_r=new Map;for(let t of Ms){_r.set(t.id,t),_r.set(t.kitId,t);for(let e of t.aliases)_r.set(e.toLowerCase(),t);}function Os(){return [...Ms]}function Ye(t){return t?_r.get(t.trim().toLowerCase())??null:null}function Lt(t){return !!Ye(t)}function Ts(t){if(t[0]!=="create"||t[1]!=="frontend")return null;let e=t[2],r=t[3],o=t.slice(4),n=Ye(e);return n?["create","project",n.kitId,r??"",...o].filter(Boolean):["create","project",`frontend.${e??""}`,r??"",...o].filter(Boolean)}function Ar(t){let e=Ye(t);return e?`rapidkit create frontend ${e.id} <name> [--output <dir>] [--skip-install] [--dry-run]`:"rapidkit create frontend <nextjs|remix|vite-react|vite-vue|vite-svelte|vite-solid|vite-vanilla|nuxt|angular|astro|sveltekit> <name> [--output <dir>] [--skip-install] [--dry-run]"}async function Ws(t){let e=t.args;if(e[0]!=="create"||e[1]!=="project")throw new Error("Frontend create expects normalized args: create project <frontend.kit> <name>");let r=Ye(e[2]);if(!r)throw new Error(`Unknown frontend generator: ${e[2]??"(missing)"}`);let o=e[3];if(!o)throw new Error(`Usage: ${Ar(r.id)}`);Pt(o),dc(r);let n=mc(e,"--output")||process.cwd(),s=h.resolve(n,o),a=t.dryRun===true||e.includes("--dry-run"),c=e.includes("--skip-install"),l=e.includes("--skip-git")||e.includes("--no-git"),f=r.commandExec(o,{skipGit:l,skipInstall:c}),p=r.commandDisplay(o);if(await E__default.pathExists(s))throw new Error(`Directory "${s}" already exists`);if(a)return cc({definition:r,projectName:o,projectPath:s,commandPlan:f}),{definition:r,projectName:o,projectPath:s,dryRun:a,commandDisplay:p,commandExec:[f.command,...f.args]};await E__default.ensureDir(h.dirname(s));let u=await Fs(f.command,f.args,h.dirname(s)),d=await pc(s);if(u!==0&&!d)throw new Error(`Official ${r.displayName} generator failed with exit code ${u}`);return u!==0&&d&&console.log(i.yellow(`\u26A0\uFE0F Official ${r.displayName} generator exited with code ${u}, but the scaffold looks complete. Continuing RapidKit project setup...`)),l||await uc(s),await ac({definition:r,projectName:o,projectPath:s,commandDisplay:p,commandExec:[f.command,...f.args],skipGit:l,skipInstall:c}),console.log(i.green(`\u2705 ${r.displayName} project created at ${s}`)),console.log(i.gray(` Display command: npx rapidkit create frontend ${r.id} ${o}`)),console.log(i.gray(" Next: cd "+o+" && npx rapidkit dev")),{definition:r,projectName:o,projectPath:s,dryRun:a,commandDisplay:p,commandExec:[f.command,...f.args]}}async function ac(t){let e=new Date().toISOString(),r=await b(),o={schema_version:"1.0",name:t.projectName,slug:t.projectName,kind:"frontend",project_type:"frontend",runtime:"node",framework:t.definition.framework,framework_display_name:t.definition.displayName,kit_name:t.definition.kitId,kit:t.definition.kitId,engine:"npm",support_tier:"extended",module_support:false,modules:[],rapidkit_version:r,generated_by:"rapidkit-npm",generated_at:e,frontend:{generator:t.definition.id,official_generator:true,default_port:t.definition.defaultPort,command_display:t.commandDisplay,command_exec:t.commandExec,skip_install:t.skipInstall,skip_git:t.skipGit},contracts:{owns:[],apis:[],publishes:[],consumes:[],dependsOn:[],env:[]}},n={project:t.projectName,runtime:"node",framework:t.definition.framework,kind:"frontend",source:"official-generator"},s={kind:"rapidkit.frontend_create",schema_version:"1.0",generated_at:e,project:{name:t.projectName,path:t.projectPath,kind:"frontend",runtime:"node",framework:t.definition.framework,framework_display_name:t.definition.displayName,kit_name:t.definition.kitId},generator:{id:t.definition.id,command_display:t.commandDisplay,command_exec:t.commandExec}};await E__default.ensureDir(h.join(t.projectPath,".rapidkit")),await E__default.writeJson(h.join(t.projectPath,".rapidkit","project.json"),o,{spaces:2}),await E__default.writeJson(h.join(t.projectPath,".rapidkit","context.json"),n,{spaces:2}),await E__default.writeJson(h.join(t.projectPath,".rapidkit","frontend-create.json"),s,{spaces:2});}function cc(t){console.log(i.bold(`
|
|
150
|
-
RapidKit frontend create plan: ${t.definition.displayName}`)),console.log(i.gray(`Project: ${t.projectName}`)),console.log(i.gray(`Target: ${t.projectPath}`)),console.log(i.gray(`Show: npx rapidkit create frontend ${t.definition.id} ${t.projectName}`)),console.log(i.gray(`Run: ${[t.commandPlan.command,...t.commandPlan.args].join(" ")}`)),console.log(i.gray(`Default: http://localhost:${t.definition.defaultPort}`));}function lc(){let t=Number.parseInt(process.versions.node.split(".")[0]??"",10);return Number.isFinite(t)?t:0}function dc(t){if(!(!t.minNodeMajor||lc()>=t.minNodeMajor))throw new Error(t.minNodeMessage??`${t.displayName} requires Node.js ${t.minNodeMajor}+ (current: ${process.versions.node}).`)}async function pc(t){if(!await
|
|
151
|
-
`,"utf-8");}function We(t,e){return h.isAbsolute(e)?e:h.join(t,e)}function jc(t,e){if(t.target)return t.target;if(t.source)return h.basename(t.source);if(t.url)try{let r=new URL(t.url).pathname,o=h.basename(r);if(o&&o!=="/")return o}catch{}return `${e}.artifact`}async function bc(t){let e=h.join(t,".rapidkit","trusted-sources.lock"),r=new Set(["localhost","127.0.0.1"]);if(!await
|
|
152
|
-
`,"utf-8"),n}function Rc(t,e){if(!e?.enabled)return {headers:{}};let r=process.env[e.hmacKeyEnv];if(!r)return {headers:{},error:`Evidence signing key env is missing: ${e.hmacKeyEnv}`};let o=(e.algorithm||"sha256").toLowerCase(),n=e.headerName||"x-rapidkit-evidence-signature",s=createHmac(o,r).update(JSON.stringify(t)).digest("hex");return {headers:{[n]:s,"x-rapidkit-evidence-signature-alg":o}}}async function Ec(t,e,r){let o=(r.algorithm||"sha256").toLowerCase(),n=We(t,r.publicKeyPath);if(!await E.pathExists(n))return {verified:false,algorithm:o,publicKeyPath:n,publicKeyFingerprint:"",signature:r.signature,message:`Public key not found: ${n}`};try{let s=await promises.readFile(n,"utf-8"),a=await promises.readFile(e),c=createVerify(o);c.update(a),c.end();let l=Buffer.from(r.signature,"base64"),f=c.verify(s,l),p=createHash("sha256").update(s).digest("hex");return {verified:f,algorithm:o,publicKeyPath:n,publicKeyFingerprint:p,signature:r.signature,message:f?"Attestation verified.":"Attestation signature verification failed."}}catch(s){return {verified:false,algorithm:o,publicKeyPath:n,publicKeyFingerprint:"",signature:r.signature,message:`Attestation verification error: ${s.message}`}}}async function _c(t,e,r,o){let n=process.env.RAPIDKIT_SIGSTORE_MOCK;if(n==="success")return {verified:true,tlogVerified:o.requireTransparencyLog,message:"Sigstore verification passed (mock).",identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:r.bundlePath||null,certificatePath:r.certificatePath||null,signaturePath:r.signaturePath||null};if(n==="fail")return {verified:false,tlogVerified:false,message:"Sigstore verification failed (mock).",identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:r.bundlePath||null,certificatePath:r.certificatePath||null,signaturePath:r.signaturePath||null};let s=r.signaturePath?We(t,r.signaturePath):null;if(!s||!await E.pathExists(s))return {verified:false,tlogVerified:false,message:"Sigstore signaturePath is missing or not found.",identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:r.bundlePath||null,certificatePath:r.certificatePath||null,signaturePath:s};let a=["verify-blob",e,"--signature",s],c=r.certificatePath?We(t,r.certificatePath):null;c&&a.push("--certificate",c);let l=r.bundlePath?We(t,r.bundlePath):null;l&&a.push("--bundle",l);let f=r.keyPath?We(t,r.keyPath):null;f&&a.push("--key",f),r.identity&&a.push("--certificate-identity",r.identity),r.issuer&&a.push("--certificate-oidc-issuer",r.issuer),r.rekorUrl&&a.push("--rekor-url",r.rekorUrl),o.requireTransparencyLog||a.push("--insecure-ignore-tlog");try{let p=await execa("cosign",a,{reject:false});return p.exitCode===0?{verified:true,tlogVerified:o.requireTransparencyLog,message:"Sigstore verification passed.",identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:l,certificatePath:c,signaturePath:s}:{verified:false,tlogVerified:false,message:`Sigstore verification failed: ${p.stderr||p.stdout||"unknown error"}`,identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:l,certificatePath:c,signaturePath:s}}catch(p){return {verified:false,tlogVerified:false,message:`Sigstore verification error: ${p.message}`,identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:l,certificatePath:c,signaturePath:s}}}async function Ac(t,e){let r=e.algorithm||"sha256",o=We(t,e.policyPath),n=We(t,e.signaturePath),s=We(t,e.publicKeyPath);if(!await E.pathExists(o))return {verified:false,message:`Governance policy bundle not found: ${o}`,policies:null};if(!await E.pathExists(n))return {verified:false,message:`Governance policy signature not found: ${n}`,policies:null};if(!await E.pathExists(s))return {verified:false,message:`Governance policy public key not found: ${s}`,policies:null};try{let a=await promises.readFile(o,"utf-8"),c=(await promises.readFile(n,"utf-8")).trim(),l=await promises.readFile(s,"utf-8"),f=createVerify(r);return f.update(a),f.end(),f.verify(l,Buffer.from(c,"base64"))?{verified:true,message:"Governance policy bundle verified.",policies:JSON.parse(a).policies||{}}:{verified:false,message:"Governance policy bundle signature verification failed.",policies:null}}catch(a){return {verified:false,message:`Governance policy bundle verification error: ${a.message}`,policies:null}}}async function Ro(t,e){let r=[],o={syncedArtifacts:0,verifiedArtifacts:0,rotatedFiles:0,lockWritten:false,governanceBundleVerified:false,transparencyEvidenceWritten:false,transparencyEvidenceRecords:0,evidenceExported:false,evidenceExportTarget:null},n=h.join(t,".rapidkit"),s=h.join(n,"mirror-config.json"),a=h.join(n,"mirror.lock"),c=h.join(n,"mirror","artifacts"),l=h.join(n,"reports"),f=await bc(t);if(!await E.pathExists(s))return r.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: .rapidkit/mirror-config.json not found."}),{checks:r,details:o};let p={};try{p=JSON.parse(await promises.readFile(s,"utf-8"));}catch{return r.push({id:"mirror.lifecycle.config",status:"failed",message:"Mirror lifecycle failed: invalid JSON in mirror-config.json."}),{checks:r,details:o}}if(!(e.forceRun===true||e.ciMode||e.offlineMode||p.mode==="offline-only"))return r.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: not in ci/offline mode."}),{checks:r,details:o};await E.ensureDir(c);let d=Math.max(0,p.prefetch?.retries??2),m=Math.max(0,p.prefetch?.backoffMs??250),g=Math.max(1e3,p.prefetch?.timeoutMs??15e3),w=p.security?.requireAttestation===true,y=p.security?.requireSigstore===true,v=p.security?.requireTransparencyLog===true,P=p.security?.requireSignedGovernance===true,k=p.security?.evidenceExport,R=(process.env.RAPIDKIT_ENV||p.security?.governance?.environment||"dev").toLowerCase(),C=p.security?.governance?.policies||{};if(p.security?.governanceBundle){let T=await Ac(t,p.security.governanceBundle);if(r.push({id:"governance.bundle.verify",status:T.verified?"passed":"failed",message:T.message}),T.verified&&T.policies)C=T.policies,o.governanceBundleVerified=true;else if(P)return {checks:r,details:o}}let I=C[R],H=v||I?.requireTransparencyLog===true,z=[],oe=Array.isArray(p.artifacts)?p.artifacts:[],L=[];for(let T=0;T<oe.length;T+=1){let K=oe[T],S=K.id||`artifact-${T+1}`,X=K.source?We(t,K.source):null,ce=jc(K,S),q=h.join(c,ce),we=false,Ae={sourceType:"path",source:X||K.url||"unknown",host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true};if(X&&await E.pathExists(X))await E.ensureDir(h.dirname(q)),await E.copyFile(X,q),o.syncedArtifacts+=1,we=true,Ae={sourceType:"path",source:X,host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true},r.push({id:`mirror.sync.${S}`,status:"passed",message:`Mirrored artifact ${S} from source path.`});else if(K.url){let x="";try{x=new URL(K.url).hostname.toLowerCase();}catch{r.push({id:`mirror.prefetch.${S}`,status:"failed",message:`Invalid URL for ${S}: ${K.url}`});continue}if(!(process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||f.has(x))){r.push({id:`mirror.prefetch.trust.${S}`,status:"failed",message:`Untrusted mirror host for ${S}: ${x}. Add host to .rapidkit/trusted-sources.lock or set RAPIDKIT_TRUSTED_SOURCES=1.`});continue}if(e.offlineMode&&(await E.pathExists(q)?(we=true,Ae={sourceType:"url",source:K.url,host:x,fetchedAt:new Date().toISOString(),attempts:0,trusted:true},r.push({id:`mirror.prefetch.${S}`,status:"passed",message:`Offline mode reused existing mirrored artifact ${S}.`})):r.push({id:`mirror.prefetch.${S}`,status:"failed",message:`Offline mode cannot prefetch remote artifact ${S} without an existing mirrored copy.`}),!we))continue;if(!we){let se=null,ke=0;for(let Ee=1;Ee<=d+1;Ee+=1){ke=Ee;try{await xc(K.url,q,g),o.syncedArtifacts+=1,we=true,Ae={sourceType:"url",source:K.url,host:x,fetchedAt:new Date().toISOString(),attempts:ke,trusted:true},r.push({id:`mirror.prefetch.${S}`,status:"passed",message:ke>1?`Prefetched artifact ${S} from ${x} after ${ke} attempts.`:`Prefetched artifact ${S} from ${x}.`});break}catch(ze){if(se=ze,Ee<=d){await Ks(m*Ee);continue}}}if(!we){r.push({id:`mirror.prefetch.${S}`,status:"failed",message:`Failed to prefetch ${S} after ${d+1} attempt(s): ${se?.message||"unknown error"}`});continue}}if(!we){r.push({id:`mirror.prefetch.${S}`,status:"failed",message:`Failed to prefetch ${S}.`});continue}}if(!we){K.required||e.offlineMode?r.push({id:`mirror.sync.${S}`,status:"failed",message:`Mirror source missing for ${S}${X?`: ${X}`:""}`}):r.push({id:`mirror.sync.${S}`,status:"skipped",message:`Mirror source not found for optional artifact ${S}.`});continue}let Ne=await Pc(q);if(K.sha256&&K.sha256.toLowerCase()!==Ne.toLowerCase()){r.push({id:`mirror.verify.${S}`,status:"failed",message:`Checksum mismatch for ${S}.`});continue}o.verifiedArtifacts+=1,r.push({id:`mirror.verify.${S}`,status:"passed",message:`Checksum verified for ${S}.`});let je=K.attestation?await Ec(t,q,K.attestation):null;if(K.attestation){if(r.push({id:`mirror.attest.${S}`,status:je?.verified?"passed":"failed",message:je?.message||"Attestation verification failed."}),!je?.verified)continue}else if(w){r.push({id:`mirror.attest.${S}`,status:"failed",message:`Attestation is required but missing for ${S}.`});continue}else r.push({id:`mirror.attest.${S}`,status:"skipped",message:`No attestation provided for ${S}.`});let Re=K.attestation?.sigstore,G=Re?await _c(t,q,Re,{requireTransparencyLog:H}):null;if(Re){if(r.push({id:`mirror.sigstore.${S}`,status:G?.verified?"passed":"failed",message:G?.message||"Sigstore verification failed."}),z.push({artifactId:S,verified:!!G?.verified,tlogVerified:!!G?.tlogVerified,identity:G?.identity||null,issuer:G?.issuer||null,rekorUrl:G?.rekorUrl||null,timestamp:new Date().toISOString(),environment:R}),!G?.verified)continue}else if(y){r.push({id:`mirror.sigstore.${S}`,status:"failed",message:`Sigstore attestation is required but missing for ${S}.`});continue}else r.push({id:`mirror.sigstore.${S}`,status:"skipped",message:`No Sigstore attestation provided for ${S}.`});if(Re&&G?.verified&&I){let x=I.allowedIdentities||[];if(x.length>0){let se=!!G.identity&&x.includes(G.identity);if(r.push({id:`mirror.sigstore.policy.identity.${S}`,status:se?"passed":"failed",message:se?`Sigstore identity policy passed for ${S} in ${R}.`:`Sigstore identity policy failed for ${S} in ${R}.`}),!se)continue}let N=I.allowedIssuers||[];if(N.length>0){let se=!!G.issuer&&N.includes(G.issuer);if(r.push({id:`mirror.sigstore.policy.issuer.${S}`,status:se?"passed":"failed",message:se?`Sigstore issuer policy passed for ${S} in ${R}.`:`Sigstore issuer policy failed for ${S} in ${R}.`}),!se)continue}let Q=I.allowedRekorUrls||[];if(Q.length>0){let se=!!G.rekorUrl&&Q.includes(G.rekorUrl);if(r.push({id:`mirror.sigstore.policy.rekor.${S}`,status:se?"passed":"failed",message:se?`Sigstore Rekor policy passed for ${S} in ${R}.`:`Sigstore Rekor policy failed for ${S} in ${R}.`}),!se)continue}}else I&&r.push({id:`mirror.sigstore.policy.${S}`,status:"skipped",message:`Sigstore governance policy configured for ${R} but no verified Sigstore attestation for ${S}.`});let dt=await promises.stat(q);L.push({id:S,path:h.relative(t,q),sha256:Ne,size:dt.size,provenance:Ae,attestation:{detached:{provided:!!K.attestation,verified:je?.verified||false,algorithm:je?.algorithm||null,publicKeyPath:je?.publicKeyPath||null,publicKeyFingerprint:je?.publicKeyFingerprint||null,signature:je?.signature||null,verifiedAt:je?.verified?new Date().toISOString():null},sigstore:{provided:!!Re,verified:G?.verified||false,tlogVerified:G?.tlogVerified||false,identity:G?.identity||null,issuer:G?.issuer||null,rekorUrl:G?.rekorUrl||null,bundlePath:G?.bundlePath||null,certificatePath:G?.certificatePath||null,signaturePath:G?.signaturePath||null,verifiedAt:G?.verified?new Date().toISOString():null}}});}let O=p.retention?.keepLast;if(typeof O=="number"&&O>0){let K=(await promises.readdir(c,{withFileTypes:true})).filter(S=>S.isFile()).map(S=>h.join(c,S.name));if(K.length>O){let S=await Promise.all(K.map(async ce=>({filePath:ce,stat:await promises.stat(ce)})));S.sort((ce,q)=>q.stat.mtimeMs-ce.stat.mtimeMs);let X=S.slice(O);for(let ce of X)await promises.unlink(ce.filePath),o.rotatedFiles+=1;}}r.push({id:"mirror.rotate",status:"passed",message:o.rotatedFiles>0?`Mirror retention rotation removed ${o.rotatedFiles} file(s).`:"Mirror retention rotation completed with no removals."});let Pe={schemaVersion:"1.0",generatedAt:new Date().toISOString(),mode:p.mode||null,environment:R,artifacts:L};if(await promises.writeFile(a,`${JSON.stringify(Pe,null,2)}
|
|
153
|
-
`,"utf-8"),o.lockWritten=true,r.push({id:"mirror.lock.write",status:"passed",message:`Mirror lock updated at ${h.relative(t,a)}.`}),o.transparencyEvidenceRecords=z.length,z.length>0){let T={schemaVersion:"1.0",generatedAt:new Date().toISOString(),environment:
|
|
154
|
-
`,"utf-8"),o.evidenceExported=true,o.evidenceExportTarget=q,r.push({id:"sigstore.evidence.export.file",status:"passed",message:`Transparency evidence exported to file sink ${q}.`});}catch(q){r.push({id:"sigstore.evidence.export.file",status:"failed",message:`Evidence file export failed: ${q.message}`});}else if(k.target==="http")if(!k.endpoint)r.push({id:"sigstore.evidence.export.http",status:"failed",message:"Evidence export target=http requires security.evidenceExport.endpoint."});else {let q=Math.max(0,k.retries??0),we=Math.max(0,k.backoffMs??500),Ae=Rc(T,k.signing);Ae.error&&r.push({id:"sigstore.evidence.export.http",status:"failed",message:Ae.error});try{let Ne=k.authTokenEnv?process.env[k.authTokenEnv]:void 0,je=false,Re=null;for(let G=1;G<=q+1;G+=1)try{if(Ae.error)throw new Error(Ae.error);await Sc(k.endpoint,T,ce,Ne,Ae.headers),o.evidenceExported=true,o.evidenceExportTarget=k.endpoint,r.push({id:"sigstore.evidence.export.http",status:"passed",message:G>1?`Transparency evidence exported to HTTP endpoint ${k.endpoint} after ${G} attempts.`:`Transparency evidence exported to HTTP endpoint ${k.endpoint}.`}),je=true;break}catch(dt){Re=dt,G<=q&&await Ks(we*G);}if(!je)throw Re||new Error("unknown evidence export error")}catch(Ne){let je=`Evidence HTTP export failed: ${Ne.message}`;r.push({id:"sigstore.evidence.export.http",status:"failed",message:je});try{let Re=await Cc(t,k.deadLetterPath,T,je);r.push({id:"sigstore.evidence.export.deadletter",status:"passed",message:`Evidence export failure persisted to dead-letter sink ${Re}.`});}catch(Re){r.push({id:"sigstore.evidence.export.deadletter",status:"failed",message:`Evidence dead-letter write failed: ${Re.message}`});}}}if(k.failOnError&&r.some(we=>we.status==="failed"&&(we.id==="sigstore.evidence.export.file"||we.id==="sigstore.evidence.export.http")))return {checks:r,details:o}}else r.push({id:"sigstore.evidence.export",status:"skipped",message:"Central evidence export not configured (security.evidenceExport.enabled=false)."});}else r.push({id:"sigstore.evidence.write",status:"skipped",message:"No Sigstore records available for transparency evidence output."}),r.push({id:"sigstore.evidence.export",status:"skipped",message:"Central evidence export skipped because no transparency evidence records exist."});return {checks:r,details:o}}function Ir(t){let e=k(t.detection.runtime),r=o({runtime:t.detection.runtime,moduleSupport:t.moduleSupport,projectPath:t.projectPath,framework:t.detection.key}),o$1=[];o$1.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}),o$1.push({id:"runtime-support",status:e.tier==="observed"?"warn":"pass",message:`${e.displayName} is supported at ${e.tier} tier.`,recommendation:e.tier==="observed"?"Observed runtimes are contract-aware but may need manual commands until a first-class kit exists.":void 0}),o$1.push({id:"module-mutation-policy",status:t.moduleSupport?"pass":"warn",message:t.moduleSupport?"RapidKit module mutation is enabled for this project.":"RapidKit module mutation is disabled for this imported project.",recommendation:t.moduleSupport?void 0:"Use project lifecycle and workspace governance commands; enable module_support only after validating a compatible module generator."}),o$1.push({id:"lifecycle-commands",status:r.lifecycleCommands.length>1?"pass":"warn",message:r.lifecycleCommands.length>1?`Lifecycle commands available: ${r.lifecycleCommands.join(", ")}.`:"Only help-level lifecycle support is available for this runtime today.",recommendation:r.lifecycleCommands.length>1?void 0:"Add runtime scripts or a RapidKit runtime adapter before relying on dev/test/build/start."});let n=o$1.some(a=>a.status==="fail"),s=o$1.some(a=>a.status==="warn");return {schemaVersion:1,kind:"rapidkit.import_readiness",generatedAt:(t.generatedAt??new Date).toISOString(),status:n?"blocked":s?"review":"ready",project:{name:t.projectName,relativePath:t.relativePath,...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:r.lifecycleCommands,unsupportedLifecycleCommands:r.unsupportedLifecycleCommands,moduleCommands:r.moduleCommands},checks:o$1}}function $r(t){return t.existingProjectJson?.module_support===true?true:t.enableModules!==true?false:k(t.detection.runtime).moduleCommands}function qs(t){return t.replace(/\\/g,"/")}function Ic(t,e){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,80)||e}function $c(t,e){let r=qs(h.relative(t,e));return !r||r.startsWith("..")?true:r.split("/").filter(Boolean).some(o=>o==="..")}function Gt(t){let e=qs(h.relative(t.workspacePath,t.projectPath)),r=$c(t.workspacePath,t.projectPath),o=Ic(t.projectName,h.basename(t.projectPath)),n=r?`external/${o}`:e||o;return {relativePath:e||n,contractRelativePath:n,isExternal:r}}function Us(t){return t.trim().toLowerCase().replace(/\.git$/i,"").replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,64)}function Dc(t){let e=t.trim();if(!e)return "imported-project";let r=e.replace(/\\/g,"/").replace(/\/+$/,"").split("/"),o=r[r.length-1]||e,n=o.split(":"),s=(n[n.length-1]||o).replace(/\.git$/i,"");return Us(s)||"imported-project"}function _o(t){let e=t.trim();return e.includes("://")||e.startsWith("git@")}function Mc(t){return _o(t)?"git-url":"local-folder"}async function Oc(t,e){let r=Us(e)||"imported-project",o=0;for(;;){let n=o===0?r:o===1?`${r}-imported`:`${r}-imported-${o}`,s=h.join(t,n);if(!await E__default.pathExists(s))return s;o+=1;}}function Tc(t,e){let r=h.resolve(t),o=h.resolve(e),n=h.relative(r,o);return n===""||n.length>0&&!n.startsWith("..")&&!h.isAbsolute(n)}function Wc(t,e){if(Tc(t,e))throw new Error("Import source must be outside the current workspace root.")}function Fc(t){return t.startsWith(".env")?![".env.example",".env.sample",".env.template",".env.defaults",".env.dist"].includes(t):false}function Jc(t){let e=h.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)||Fc(e)||e.endsWith(".pem")||e.endsWith(".key"))}async function Kc(t){let e=h.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 Lc(t){let e=new Date().toISOString(),r=typeof t.existingProjectJson?.name=="string"?t.existingProjectJson.name:h.basename(t.projectPath),o=Gt({workspacePath:t.workspacePath,projectPath:t.projectPath,projectName:r}),n=o.contractRelativePath,s=h.join(t.projectPath,".rapidkit","project.json"),a=h.join(t.projectPath,".rapidkit","import.json"),c=h.join(t.projectPath,".rapidkit","import-readiness.json"),l=$r({existingProjectJson:t.existingProjectJson,detection:t.detection,enableModules:t.enableModules}),f=Array.isArray(t.existingProjectJson?.modules)?t.existingProjectJson.modules:[],p=t.existingProjectJson?.contracts&&typeof t.existingProjectJson.contracts=="object"&&!Array.isArray(t.existingProjectJson.contracts)?t.existingProjectJson.contracts:{owns:[],apis:[],publishes:[],consumes:[],dependsOn:[],env:[]},u={...t.existingProjectJson||{},schema_version:typeof t.existingProjectJson?.schema_version=="string"?t.existingProjectJson.schema_version:"1.0",name:typeof t.existingProjectJson?.name=="string"?t.existingProjectJson.name:h.basename(t.projectPath),slug:typeof t.existingProjectJson?.slug=="string"?t.existingProjectJson.slug:h.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:l,modules:f,contracts:p,import:{managed_by:"rapidkit-npm",source_type:t.sourceType,imported_at:e,relative_path:n,discovered_relative_path:o.relativePath,is_external:o.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:h.basename(t.projectPath)},project:{name:u.name,slug:u.slug,relative_path:n,kind:t.projectKind,module_support:l},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:l}},m=Ir({projectName:String(u.name),relativePath:n,projectKind:t.projectKind,source:t.sourceType,detection:t.detection,moduleSupport:l,projectPath:t.projectPath,generatedAt:new Date(e)});return await E__default.ensureDir(h.dirname(s)),await E__default.writeJson(s,u,{spaces:2}),await E__default.writeJson(a,d,{spaces:2}),await E__default.writeJson(c,m,{spaces:2}),{projectJsonPath:s,importJsonPath:a,importReadinessPath:c,moduleSupport:l}}async function Gc(t,e){let r={name:e.name,path:e.path,relativePath:e.relativePath,stack:e.stack,runtime:e.runtime,framework:e.framework,frameworkDisplayName:e.frameworkDisplayName,supportTier:e.supportTier,moduleSupport:e.moduleSupport,confidence:e.confidence,source:e.source,importedAt:new Date().toISOString()};await b$5(t,[r]);}async function Hs(t){await E__default.pathExists(t)&&await E__default.remove(t);}async function zs(t,e){await Hs(e),await c$2(t,[e]);}async function Ys(t){let e=h.resolve(t.workspacePath),r=t.source.trim(),o=t.sourceType??Mc(r),n=t.name??(o==="git-url"?Dc(r):h.basename(r)),s=await Oc(e,n),a=false;try{if(o==="local-folder"){let m=h.resolve(r),g=await E__default.stat(m).catch(()=>null);if(!g||!g.isDirectory())throw new Error("Import source is not a directory.");Wc(e,m),a=true,await E__default.copy(m,s,{overwrite:false,errorOnExist:true,filter:Jc});}else a=true,await execa("git",["clone","--depth","1",r,s],{timeout:12e4});let c=await Kc(s),l=i$3(s,c),f=await a$9(s,c),p=await Lc({workspacePath:e,projectPath:s,sourceType:o,detection:l,existingProjectJson:c,projectKind:f,enableModules:t.enableModules}),u=Gt({workspacePath:e,projectPath:s,projectName:h.basename(s)}),d={name:h.basename(s),path:s,relativePath:u.contractRelativePath,stack:l.importStack,runtime:l.runtime,framework:l.key,frameworkDisplayName:l.displayName,supportTier:l.supportTier,moduleSupport:p.moduleSupport,confidence:l.confidence,source:o,projectJsonPath:p.projectJsonPath,importJsonPath:p.importJsonPath,importReadinessPath:p.importReadinessPath};return await Gc(e,d),d}catch(c){if(a)try{await Hs(s);}catch(l){let f=c instanceof Error?c.message:String(c),p=l instanceof Error?l.message:String(l);throw new Error(`Import failed: ${f}. Rollback also failed: ${p}`)}throw c}}function Bc(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,64)}function Vc(t,e){return h.resolve(t)===h.resolve(e)}async function qc(t){let e=h.join(t,".rapidkit","project.json");if(!await E__default.pathExists(e))return null;try{return await E__default.readJson(e)}catch{return null}}function Uc(t){let e=Array.isArray(t.existingProjectJson?.modules)?t.existingProjectJson.modules:[],r=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:r,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 Qs(t,e,r){let o=h.join(e,".rapidkit","project.json"),n=h.join(e,".rapidkit","adopt.json"),s=h.join(e,".rapidkit","adopt-readiness.json");r?await E__default.writeJson(o,r,{spaces:2}):await E__default.pathExists(o)&&await E__default.remove(o),await E__default.pathExists(n)&&await E__default.remove(n),await E__default.pathExists(s)&&await E__default.remove(s);let{removeImportedProjectsRegistryEntries:a}=await import('./imported-projects-registry-ZOCHFWMK.js');await a(t,[e]);}async function Zs(t){let e=h.resolve(t.workspacePath),r=h.resolve(t.source),o=await E__default.stat(r).catch(()=>null);if(!o||!o.isDirectory())throw new Error("Adopt source is not a directory.");if(Vc(e,r))throw new Error("Adopt source cannot be the workspace root itself.");let n=await qc(r),s=i$3(r,n),a=await a$9(r,n),c=Bc(t.name||(typeof n?.name=="string"?n.name:"")||h.basename(r))||"adopted-project",l=Gt({workspacePath:e,projectPath:r,projectName:c}),f=(t.now??new Date).toISOString(),p=h.join(r,".rapidkit","project.json"),u=h.join(r,".rapidkit","adopt.json"),d=h.join(r,".rapidkit","adopt-readiness.json"),m=$r({existingProjectJson:n,detection:s,enableModules:t.enableModules}),g=Uc({projectName:c,contractRelativePath:l.contractRelativePath,isExternal:l.isExternal,discoveredRelativePath:l.relativePath,detection:s,existingProjectJson:n,projectKind:a,moduleSupport:m,adoptedAt:f}),w={schema_version:"1.0",kind:"rapidkit.adopted_project",adopted_at:f,managed_by:"rapidkit-npm",mode:"linked",workspace:{path:e},project:{name:c,path:r,relative_path:l.contractRelativePath,discovered_relative_path:l.relativePath,is_external:l.isExternal,kind:a,module_support:m},detection:{framework:s.key,framework_display_name:s.displayName,runtime:s.runtime,kind:a,confidence:s.confidence,support_tier:s.supportTier,import_stack:s.importStack,source:s.source},policy:{moved_source:false,copied_source:false,module_mutation_enabled:m,workspace_contract:"linked-project"}},y=Ir({projectName:c,relativePath:l.contractRelativePath,projectKind:a,source:"adopted-local",detection:s,moduleSupport:m,projectPath:r,generatedAt:new Date(f)});if(t.dryRun!==true){await E__default.ensureDir(h.dirname(p)),await E__default.writeJson(p,g,{spaces:2}),await E__default.writeJson(u,w,{spaces:2}),await E__default.writeJson(d,y,{spaces:2});let v={name:c,path:r,relativePath:l.contractRelativePath,relationship:"adopted",stack:s.importStack,runtime:s.runtime,framework:s.key,frameworkDisplayName:s.displayName,supportTier:s.supportTier,moduleSupport:m,confidence:s.confidence,source:"adopted-local",importedAt:f};await b$5(e,[v]);}return {name:c,path:r,relativePath:l.relativePath,contractRelativePath:l.contractRelativePath,isExternal:l.isExternal,relationship:"adopted",stack:s.importStack,runtime:s.runtime,framework:s.key,frameworkDisplayName:s.displayName,supportTier:s.supportTier,moduleSupport:m,confidence:s.confidence,projectJsonPath:p,adoptJsonPath:u,adoptReadinessPath:d,wroteFiles:t.dryRun!==true}}var Ao="workspai",Xs="Workspai";function Hc(t){return j.existsSync(h.join(t,".rapidkit-workspace"))||j.existsSync(h.join(t,".rapidkit","workspace.json"))}function Dr(t=homedir()){return h.join(t,"rapidkit","workspaces")}function ei(t=homedir()){return h.join(t,"Workspai","rapidkits")}function Io(t,e=homedir()){return h.join(Dr(e),t)}function zc(t,e=homedir()){return [Io(t,e),h.join(ei(e),t)]}function $o(t,e={}){let r=e.homeDir??homedir();return e.outputDir?h.resolve(e.outputDir,t):Io(t,r)}function No(t,e=homedir()){for(let r of zc(t,e))if(j.existsSync(r))return r}function ti(t,e="my-workspace"){let r=1;for(;;){let o=r===1?e:`${e}-${r}`,n=h.join(t,o);if(!j.existsSync(n))return {name:o,targetPath:n};r+=1;}}function Yc(t=homedir()){return [h.join(Dr(t),Ao),h.join(ei(t),Ao)]}function ri(t=homedir()){for(let e of Yc(t))if(Hc(e))return e;return Io(Ao,t)}function Do(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 Zc(t){let e=t.trim().toLowerCase();return e?e.startsWith("fastapi")?"fastapi":e.startsWith("nestjs")?"nestjs":null:null}function $e(t,e){let r=t.indexOf(e);if(r>=0&&r+1<t.length)return t[r+1];let o=t.find(n=>n.startsWith(`${e}=`));if(o)return o.slice(e.length+1)}function qo(){return d$3()}function ni(){let t={...process.env},e=t.PATH||"";return e&&(t.PATH=e.split(h.delimiter).filter(r=>!r.replace(/\\/g,"/").includes("/.pyenv/shims")).join(h.delimiter)),t.PYENV_VERSION="system",t.POETRY_PYTHON||(t.POETRY_PYTHON=c$3()),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 Xc(t){return f$2(h.join(t,".venv"))}async function Pi(t,e){return await U(t,["--version"],e)===0}async function wt(t){let e=h.join(t,"go.mod");if(await E__default.pathExists(e))return "go";let r=h.join(t,"pom.xml"),o=h.join(t,"build.gradle"),n=h.join(t,"build.gradle.kts");if(await E__default.pathExists(r)||await E__default.pathExists(o)||await E__default.pathExists(n))return "java";if((await E__default.pathExists(t)?await j.promises.readdir(t,{withFileTypes:true}):[]).some(u=>u.isFile()&&u.name.toLowerCase().endsWith(".sln")))return "dotnet";let a=h.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 c=h.join(t,"package.json");if(await E__default.pathExists(c))return "node";let l=h.join(t,"pyproject.toml"),f=h.join(t,"requirements.txt"),p=h.join(t,"poetry.lock");return await E__default.pathExists(l)||await E__default.pathExists(f)||await E__default.pathExists(p)?"python":null}async function el(t){for(let e of qo())if(await U(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function ji(t){for(let e of qo())if(await U(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function tl(t){let e=f$2(h.join(t,".venv"));if(!await E__default.pathExists(e)){let s=await ji(t);if(s!==0)return s}if(!await Pi("poetry",t))return 0;let o=await U("poetry",["config","virtualenvs.in-project","true","--local"],t);if(o!==0)return o;let n=await U("poetry",["env","use",e],t);return n!==0?n:0}async function rl(t){let e=f$2(h.join(t,".venv"));if(!await E__default.pathExists(e)){let n=await ji(t);if(n!==0)return n}await U(e,["-m","pip","install","--upgrade","pip","setuptools","wheel"],t);let r=h.join(t,"requirements.txt");if(await E__default.pathExists(r)&&await U(e,["-m","pip","install","-r","requirements.txt"],t)===0)return 0;let o=h.join(t,"pyproject.toml");return await E__default.pathExists(o)&&(await U(e,["-m","pip","install","-e","."],t)===0||await U(e,["-m","pip","install","."],t)===0)?0:1}async function Mo(t,e){return await tl(t)!==0&&console.log(i.yellow("\u26A0\uFE0F Could not fully configure Poetry local venv. Trying fallback installer...")),(await e.initProject(t)).exitCode===0&&await E__default.pathExists(h.join(t,".venv"))?0:(console.log(i.yellow("\u26A0\uFE0F Python init fallback: installing dependencies directly into project .venv")),await rl(t))}async function Oo(t){let e=await ht("init",t);if(e===0)return 0;let r=["npm","pnpm","yarn"];for(let o of r){if(!await Pi(o,t))continue;if(await U(o,["install"],t)===0)return console.log(i.green(`\u2705 Node init fallback succeeded with ${o} install`)),0}return e}function ol(t,e){let r=n=>/^\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?$/.test(n),o=$e([...e],"--port");if(o&&!/^\d+$/.test(o.trim()))return "Invalid --port. Expected numeric TCP port, e.g. 8080";if(t==="springboot.standard"){let n=$e([...e],"--java-version"),s=$e([...e],"--spring-boot-version"),a=$e([...e],"--springdoc-version"),c=$e([...e],"--group-id"),l=$e([...e],"--package-name");if(n&&!/^\d+$/.test(n.trim()))return "Invalid --java-version. Expected major version number, e.g. 21";if(s&&!r(s.trim()))return "Invalid --spring-boot-version. Expected semantic version, e.g. 3.5.0";if(a&&!r(a.trim()))return "Invalid --springdoc-version. Expected semantic version, e.g. 2.8.9";if(c&&!/^[A-Za-z0-9_.-]+$/.test(c.trim()))return "Invalid --group-id. Use dot-separated Java package identifiers only.";if(l&&!/^[A-Za-z0-9_.-]+$/.test(l.trim()))return "Invalid --package-name. Use dot-separated Java package identifiers only."}if(t==="dotnet.webapi.clean"){let n=$e([...e],"--target-framework"),s=$e([...e],"--root-namespace");if(n&&!/^net\d+\.\d+$/.test(n.trim()))return "Invalid --target-framework. Expected .NET target framework, e.g. net8.0";if(s&&!/^[A-Za-z0-9_.]+$/.test(s.trim()))return "Invalid --root-namespace. Use dot-separated .NET namespace identifiers only."}return null}async function Jo(t){if(t[0]!=="create"||t[1]!=="project")return 1;let e=t[2],r=gt(e),o=t[3];if(!r||r.owner!=="npm")return 1;if(!o)return process.stderr.write(`Usage: ${r.createUsage??"rapidkit create project <kit> <name> [--output <dir>]"}
|
|
155
|
-
`),1;try{Pt(o);}catch(f){let
|
|
149
|
+
${r.stderr||""}`);return o?this.isMavenVersionAtLeast(o,[3,9,0])?{exitCode:0}:{exitCode:1,message:`Maven ${o.join(".")} detected; Maven 3.9+ is required.`}:{exitCode:1,message:"Unable to parse Maven version. Ensure Maven 3.9+ is installed and retry."}}catch{return {exitCode:1,message:"Maven version check failed. Install Maven 3.9+ and ensure mvn is on PATH."}}}shouldUseGradleNoDaemon(){return process.env.CI==="true"||process.env.RAPIDKIT_GRADLE_NO_DAEMON==="1"}inspectJavaProject(e){let r=j.existsSync(h.join(e,"pom.xml")),o=j.existsSync(h.join(e,"mvnw"))||j.existsSync(h.join(e,"mvnw.cmd")),n=j.existsSync(h.join(e,"build.gradle"))||j.existsSync(h.join(e,"build.gradle.kts"))||j.existsSync(h.join(e,"settings.gradle"))||j.existsSync(h.join(e,"settings.gradle.kts")),s=j.existsSync(h.join(e,"gradlew"))||j.existsSync(h.join(e,"gradlew.bat"));return {hasMavenProject:r||o,hasMavenWrapper:o,hasGradleProject:n||s,hasGradleWrapper:s}}findWorkspaceRoot(e){let r=e;for(;;){if(j.existsSync(h.join(r,".rapidkit-workspace")))return r;let o=h.dirname(r);if(o===r)break;r=o;}return null}resolveDependencyMode(e){let r=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(r==="shared-runtime-caches"||r==="shared-node-deps"||r==="isolated")return r;let o=this.findWorkspaceRoot(e);if(!o)return "isolated";let n=h.join(o,".rapidkit","policies.yml");if(!j.existsSync(n))return "isolated";try{let c=j.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(c==="shared-runtime-caches"||c==="shared-node-deps"||c==="isolated")return c}catch{}return "isolated"}buildToolCommand(e){return this.isGradleProject(e)?this.gradleCommand(e):this.mavenCommand(e)}mavenCommand(e){let r=h.join(e,"mvnw.cmd");if(process.platform==="win32"&&j.existsSync(r))return {command:r,baseArgs:[]};let o=h.join(e,"mvnw");return j.existsSync(o)?this.ensureWrapperExecutable(o)?{command:o,baseArgs:[]}:{command:"sh",baseArgs:[o]}:{command:"mvn",baseArgs:[]}}gradleCommand(e){let r=h.join(e,"gradlew.bat");if(process.platform==="win32"&&j.existsSync(r))return {command:r,baseArgs:[]};let o=h.join(e,"gradlew");return j.existsSync(o)?this.ensureWrapperExecutable(o)?{command:o,baseArgs:[]}:{command:"sh",baseArgs:[o]}:{command:"gradle",baseArgs:[]}}isGradleProject(e){return this.inspectJavaProject(e).hasGradleProject}isMavenProject(e){return this.inspectJavaProject(e).hasMavenProject}discoverWorkspaceJavaProjects(e){let r=[],o=new Set,n=[e];for(;n.length>0;){let s=n.shift();if(!s||o.has(s))continue;o.add(s);let a=[];try{a=j.readdirSync(s,{withFileTypes:true});}catch{continue}for(let c of a){if(!c.isDirectory()||c.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(c.name))continue;let l=h.join(s,c.name),f=this.inspectJavaProject(l);(f.hasMavenProject||f.hasGradleProject)&&r.push(l),n.push(l);}}return r}withJavaCacheEnv(e,r){let o=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),s=o==="shared-runtime-caches"?h.join(n||e,".rapidkit","cache","java","m2"):h.join(e,".rapidkit","cache","java","m2"),a=o==="shared-runtime-caches"?h.join(n||e,".rapidkit","cache","java","gradle"):h.join(e,".rapidkit","cache","java","gradle"),c=process.env.MAVEN_OPTS,l=process.env.GRADLE_USER_HOME,f=`-Dmaven.repo.local=${s}`;return process.env.MAVEN_OPTS=c?`${c} ${f}`:f,process.env.GRADLE_USER_HOME=a,r().finally(()=>{typeof c>"u"?delete process.env.MAVEN_OPTS:process.env.MAVEN_OPTS=c,typeof l>"u"?delete process.env.GRADLE_USER_HOME:process.env.GRADLE_USER_HOME=l;})}async runBuildTool(e,r,o=true){return this.withJavaCacheEnv(e,async()=>{try{let{command:n,baseArgs:s}=this.buildToolCommand(e),a=await this.runCommand(n,[...s,...r],e);if(a===0||!o)return {exitCode:a};let c=j.existsSync(h.join(e,"pom.xml")),l=j.existsSync(h.join(e,"build.gradle"))||j.existsSync(h.join(e,"build.gradle.kts"));return {exitCode:a,message:c||l?"Java build failed. Verify pom.xml/build.gradle syntax and dependencies, then retry.":"Java build tool is not installed or not available on PATH. Install Maven/Gradle and JDK 21+, or commit mvnw/gradlew wrapper scripts."}}catch(n){return {exitCode:1,message:`Java command execution failed: ${n instanceof Error?n.message:String(n)}. Verify pom.xml/build.gradle integrity and wrapper permissions.`}}})}resolveJarPath(e){let r=[h.join(e,"target"),h.join(e,"build","libs")];for(let o of r){if(!j.existsSync(o))continue;let s=j.readdirSync(o).filter(a=>a.toLowerCase().endsWith(".jar")).find(a=>!a.toLowerCase().endsWith("-sources.jar")&&!a.toLowerCase().endsWith("-javadoc.jar")&&!a.toLowerCase().endsWith("-plain.jar"));if(s)return h.join(o,s)}return null}commandArgsFor(e,r){if(e==="gradle"){let o=this.shouldUseGradleNoDaemon()?["--no-daemon"]:[];return r==="init"?[...o,"dependencies"]:r==="dev"?[...o,"bootRun"]:r==="test"?[...o,"test"]:[...o,"bootJar"]}return r==="init"?["-B","-q","-DskipTests","dependency:go-offline"]:r==="dev"?["spring-boot:run"]:r==="test"?["test"]:["-DskipTests","package"]}detectBuildTool(e){return this.isGradleProject(e)?"gradle":"maven"}async checkPrereqs(){let e=process.cwd(),r=this.resolveJavaCommand(e),o=await this.runCommand(r,["-version"],e);if(o!==0)return {exitCode:o,message:"JDK 21+ is required. Ensure java is on PATH or JAVA_HOME/bin/java is available."};if(this.isMavenProject(e)){let c=this.readRequiredJavaMajor(e),l=await this.detectInstalledJavaMajor(r,e);if(l!==null&&l<c)return {exitCode:1,message:`Detected Java ${l}, but project requires Java ${c}+.`};let f=h.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<c)return {exitCode:1,message:`Detected JAVA_HOME version ${d}, but project requires Java ${c}+.`}}catch{}}if(this.isMavenProject(e)||this.isGradleProject(e)){let c=this.detectBuildTool(e),l=c==="gradle"?["--version"]:["-version"],f=await this.runBuildTool(e,l);return f.exitCode!==0?f:c==="maven"&&!this.inspectJavaProject(e).hasMavenWrapper?this.checkSystemMavenVersion(e):f}let n=this.findWorkspaceRoot(e);if(n&&n===e){let c=this.discoverWorkspaceJavaProjects(n);if(c.length>0){let l=c.reduce((p,d)=>Math.max(p,this.readRequiredJavaMajor(d)),0);if(l>0){let p=await this.detectInstalledJavaMajor(r,e);if(p!==null&&p<l){let d=c.filter(m=>this.readRequiredJavaMajor(m)>p).map(m=>h.relative(e,m)).join(", ");return {exitCode:1,message:`Detected Java ${p}, but workspace project(s) [${d}] require Java ${l}+.`}}}let f=false,u=false;for(let p of c){let d=this.inspectJavaProject(p);d.hasMavenProject&&!d.hasMavenWrapper&&(f=true),d.hasGradleProject&&!d.hasGradleWrapper&&(u=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(u){let p=await this.withJavaCacheEnv(e,async()=>this.runCommand("gradle",["--version"],e));if(p!==0)return {exitCode:p,message:"Gradle is required for one or more workspace Java projects without Gradle Wrapper. Install Gradle 8+, or add gradlew/gradlew.bat to those projects."}}return {exitCode:0}}}let s=await this.withJavaCacheEnv(e,async()=>this.runCommand("mvn",["-version"],e));if(s===0){let c=await this.checkSystemMavenVersion(e);return c.exitCode!==0?c:{exitCode:0}}let a=await this.withJavaCacheEnv(e,async()=>this.runCommand("gradle",["--version"],e));return a===0?{exitCode:0}:{exitCode:s||a||1,message:"Neither Maven nor Gradle is available on PATH. Install one of them, or use mvnw/gradlew wrappers in project roots."}}async warmSetupCache(e){return this.withJavaCacheEnv(e,async()=>{try{let r=process.env.MAVEN_OPTS?.match(/-Dmaven\.repo\.local=([^\s]+)/)?.[1];return r&&j.mkdirSync(r,{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 r=this.resolveJarPath(e);if(r)return {exitCode:await this.runCommand(this.resolveJavaCommand(e),["-jar",r],e)};let o=await this.runBuild(e);if(o.exitCode!==0)return o;let n=this.resolveJarPath(e);return n?{exitCode:await this.runCommand(this.resolveJavaCommand(e),["-jar",n],e)}:{exitCode:1,message:"Spring Boot build completed, but no runnable JAR was found under target/ or build/libs/. Verify build output naming and packaging plugins."}}async runLint(e){if(Be(e,"lint"))return {exitCode:await this.runCommand("make",["lint"],e)};let r=h.join(e,"pom.xml");return j.existsSync(r)&&j.readFileSync(r,"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(o=>h.join(e,o)).filter(o=>j.existsSync(o)).some(o=>j.readFileSync(o,"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 xr=class{constructor(e){this.runCommand=e;}runCommand;runtime="node";async run(e,r,o){return {exitCode:await this.runCommand(e,r,o)}}findWorkspaceRoot(e){let r=e;for(;;){if(j.existsSync(h.join(r,".rapidkit-workspace")))return r;let o=h.dirname(r);if(o===r)break;r=o;}return null}resolveDependencyMode(e){let r=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(r==="shared-runtime-caches"||r==="shared-node-deps"||r==="isolated")return r;let o=this.findWorkspaceRoot(e);if(!o)return "isolated";let n=h.join(o,".rapidkit","policies.yml");if(!j.existsSync(n))return "isolated";try{let c=j.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(c==="shared-runtime-caches"||c==="shared-node-deps"||c==="isolated")return c}catch{}return "isolated"}withDependencyEnv(e,r,o){let n=this.resolveDependencyMode(e),s=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),a=n==="isolated"?h.join(e,".rapidkit","cache","node"):h.join(s||e,".rapidkit","cache","node"),c=process.env.npm_config_cache,l=process.env.npm_config_store_dir,f=process.env.RAPIDKIT_DEP_SHARING_MODE,u=process.env.RAPIDKIT_WORKSPACE_PATH;return process.env.RAPIDKIT_DEP_SHARING_MODE=n,s&&(process.env.RAPIDKIT_WORKSPACE_PATH=s),r==="pnpm"?(process.env.npm_config_store_dir=h.join(a,"pnpm-store"),process.env.npm_config_cache=h.join(a,"pnpm-cache")):r==="yarn"?process.env.npm_config_cache=h.join(a,"yarn-cache"):process.env.npm_config_cache=h.join(a,"npm-cache"),o().finally(()=>{typeof c>"u"?delete process.env.npm_config_cache:process.env.npm_config_cache=c,typeof l>"u"?delete process.env.npm_config_store_dir:process.env.npm_config_store_dir=l,typeof f>"u"?delete process.env.RAPIDKIT_DEP_SHARING_MODE:process.env.RAPIDKIT_DEP_SHARING_MODE=f,typeof u>"u"?delete process.env.RAPIDKIT_WORKSPACE_PATH:process.env.RAPIDKIT_WORKSPACE_PATH=u;})}detectPackageManager(e){if(j.existsSync(h.join(e,"package-lock.json")))return "npm";if(j.existsSync(h.join(e,"pnpm-lock.yaml")))return "pnpm";if(j.existsSync(h.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(h.join(e,"package-lock.json"))||j.existsSync(h.join(e,"pnpm-lock.yaml"))||j.existsSync(h.join(e,"yarn.lock"))}availablePackageManagers(e){let r=this.detectPackageManager(e);return this.hasPinnedPackageManager(e)?[r]:[r,...["npm","pnpm","yarn"].filter(n=>n!==r&&this.commandAvailable(n))]}commandAvailable(e){return spawnSync(e,["--version"],{stdio:"ignore",shell:process.platform==="win32"}).status===0}scriptArgs(e,r){return e==="npm"?["run",r]:["run",r]}async runScriptWithFallback(e,r){let o={exitCode:1};for(let n of this.availablePackageManagers(e))if(o=await this.withDependencyEnv(e,n,()=>this.run(n,this.scriptArgs(n,r),e)),o.exitCode===0)return o;return o}async runLifecycle(e,r){let o=a$4(e),n=i$3(e,o),s=g(e,r,{framework:n.key});return s?this.runScriptWithFallback(e,s.scriptName):{exitCode:1,message:`No npm script available for \`${r}\`. Add a "${r}" script to package.json.`}}async checkPrereqs(){return this.run("node",["--version"],process.cwd())}async warmSetupCache(e){let r=this.detectPackageManager(e);return this.withDependencyEnv(e,r,async()=>{try{return process.env.npm_config_cache&&j.mkdirSync(process.env.npm_config_cache,{recursive:true}),r==="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 r=this.detectPackageManager(e),o=this.resolveDependencyMode(e),n=o==="shared-runtime-caches"||o==="shared-node-deps"?["install","--prefer-offline"]:["install"];return this.withDependencyEnv(e,r,()=>this.run(r,n,e))}async runDev(e){return this.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 Sr=class{constructor(e){this.runCore=e;}runCore;runtime="python";async run(e,r){return {exitCode:await this.withPythonCacheEnv(r,()=>this.runCore(e,r))}}findWorkspaceRoot(e){let r=e;for(;;){if(j.existsSync(h.join(r,".rapidkit-workspace")))return r;let o=h.dirname(r);if(o===r)break;r=o;}return null}resolveDependencyMode(e){let r=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(r==="shared-runtime-caches"||r==="shared-node-deps"||r==="isolated")return r;let o=this.findWorkspaceRoot(e);if(!o)return "isolated";let n=h.join(o,".rapidkit","policies.yml");if(!j.existsSync(n))return "isolated";try{let c=j.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(c==="shared-runtime-caches"||c==="shared-node-deps"||c==="isolated")return c}catch{}return "isolated"}withPythonCacheEnv(e,r){let o=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),s=o==="shared-runtime-caches"?h.join(n||e,".rapidkit","cache","python"):h.join(e,".rapidkit","cache","python"),a=process.env.PIP_CACHE_DIR,c=process.env.POETRY_CACHE_DIR;return process.env.PIP_CACHE_DIR=h.join(s,"pip"),process.env.POETRY_CACHE_DIR=h.join(s,"poetry"),r().finally(()=>{typeof a>"u"?delete process.env.PIP_CACHE_DIR:process.env.PIP_CACHE_DIR=a,typeof c>"u"?delete process.env.POETRY_CACHE_DIR:process.env.POETRY_CACHE_DIR=c;})}async checkPrereqs(){let e=process.cwd(),r=await this.run(["doctor","check"],e);return r.exitCode===0?r:this.run(["doctor"],e)}async initProject(e){return this.run(["init"],e)}async runDev(e){return this.run(["dev"],e)}async runTest(e){return this.run(["test"],e)}async runBuild(e){return this.run(["build"],e)}async runStart(e){return this.run(["start"],e)}async doctorHints(e){return ['Run "npx rapidkit doctor workspace" for a full workspace scan.','Use "npx rapidkit init" after adding or changing modules.','Use workspace launcher "./rapidkit" to avoid environment drift.']}};function tc(){let t={...process.env},e=t.PATH||"";if(e){let r=e.split(h.delimiter).filter(o=>!o.replace(/\\/g,"/").includes("/.pyenv/shims")).join(h.delimiter);t.PATH=r;}return t.PYENV_VERSION="system",t.POETRY_PYTHON=t.POETRY_PYTHON||c$3(),typeof t.RAPIDKIT_SKIP_LOCK_SYNC>"u"&&(t.RAPIDKIT_SKIP_LOCK_SYNC="1"),t}function Ve(t,e){return t==="go"?new jr((r,o,n)=>e.runCommandInCwd(r,o,n)):t==="node"?new xr((r,o,n)=>e.runCommandInCwd(r,o,n)):t==="java"?new br((r,o,n)=>e.runCommandInCwd(r,o,n)):t==="dotnet"?new Pr((r,o,n)=>e.runCommandInCwd(r,o,n)):new Sr((r,o)=>e.runCoreRapidkit(r,{cwd:o,env:tc()}))}var Es=h.join(jn.homedir(),".rapidkit","cache"),_s=1440*60*1e3;function xo(){let t=process.env.RAPIDKIT_CACHE_DIR?.trim();if(t)return t;let e=process.env.VITEST_WORKER_ID?.trim();return e?h.join(Es,`vitest-${e}`):Es}var Rr=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 h.join(xo(),`${this.getCacheKey(e)}.json`)}getTempCachePath(e){let r=`${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`;return `${e}.${r}.tmp`}async get(e,r="1.0"){let o=this.memoryCache.get(e);if(o&&o.version===r&&Date.now()-o.timestamp<_s)return a$1.debug(`Cache hit (memory): ${e}`),o.data;try{let n=this.getCachePath(e),s=await promises.readFile(n,"utf-8"),a=JSON.parse(s);if(a.version===r&&Date.now()-a.timestamp<_s)return a$1.debug(`Cache hit (disk): ${e}`),this.memoryCache.set(e,a),a.data;await promises.unlink(n).catch(()=>{});}catch{a$1.debug(`Cache miss: ${e}`);}return null}async set(e,r,o="1.0"){let n={data:r,timestamp:Date.now(),version:o};this.memoryCache.set(e,n);try{await promises.mkdir(xo(),{recursive:true});let s=this.getCachePath(e),a=this.getTempCachePath(s);await promises.writeFile(a,JSON.stringify(n),"utf-8"),await promises.rename(a,s),a$1.debug(`Cache set: ${e}`);}catch(s){a$1.debug(`Cache write failed: ${e}`,s);}}async invalidate(e){this.memoryCache.delete(e);try{let r=this.getCachePath(e);await promises.unlink(r),a$1.debug(`Cache invalidated: ${e}`);}catch{}}async clear(){this.memoryCache.clear();try{let e=xo(),r=await promises.readdir(e);await Promise.all(r.map(o=>promises.unlink(h.join(e,o)))),a$1.debug("Cache cleared");}catch{}}};var As=[{id:"fastapi.standard",aliases:["fastapi","fastapi.standard"],label:"fastapi \u2014 FastAPI Standard Kit",description:"Core-backed FastAPI service scaffold.",owner:"core",runtime:"python",framework:"fastapi",moduleSupport:true,stability:"stable"},{id:"fastapi.ddd",aliases:["fastapi.ddd","fastapi-ddd"],label:"fastapi \u2014 FastAPI DDD Kit",description:"Core-backed FastAPI DDD service scaffold.",owner:"core",runtime:"python",framework:"fastapi",moduleSupport:true,stability:"stable"},{id:"nestjs.standard",aliases:["nestjs","nest","nestjs.standard"],label:"nestjs \u2014 NestJS Standard Kit",description:"Core-backed NestJS service scaffold.",owner:"core",runtime:"node",framework:"nestjs",moduleSupport:true,stability:"stable"},{id:"springboot.standard",aliases:["spring","springboot","springboot.standard","java"],label:"spring \u2014 Spring Boot Standard Kit",description:"npm-backed Spring Boot service scaffold.",owner:"npm",runtime:"java",framework:"springboot",moduleSupport:false,stability:"stable",generator:"springboot",createUsage:"rapidkit create project springboot.standard <name> [--java-version <major>] [--spring-boot-version <semver>] [--group-id <com.example>] [--package-name <com.example.app>] [--port <number>]"},{id:"gofiber.standard",aliases:["go","go.standard","fiber","gofiber","gofiber.standard","go/fiber"],label:"go/fiber \u2014 Go Fiber Standard Kit",description:"npm-backed Go Fiber service scaffold.",owner:"npm",runtime:"go",framework:"gofiber",moduleSupport:false,stability:"stable",generator:"gofiber",createUsage:"rapidkit create project gofiber.standard <name> [--output <dir>]"},{id:"gogin.standard",aliases:["gin","gogin","gogin.standard","go/gin"],label:"go/gin \u2014 Go Gin Standard Kit",description:"npm-backed Go Gin service scaffold.",owner:"npm",runtime:"go",framework:"gogin",moduleSupport:false,stability:"stable",generator:"gogin",createUsage:"rapidkit create project gogin.standard <name> [--output <dir>]"},{id:"dotnet.webapi.clean",aliases:["dotnet","dotnet.webapi","dotnet.webapi.clean","aspnet","aspnetcore","asp.net","asp.net-core","csharp","c#"],label:"dotnet \u2014 ASP.NET Core Clean Web API",description:"npm-backed ASP.NET Core Web API with clean architecture boundaries.",owner:"npm",runtime:"dotnet",framework:"dotnet",moduleSupport:false,stability:"preview",generator:"dotnet-webapi-clean",createUsage:"rapidkit create project dotnet.webapi.clean <name> [--target-framework net8.0] [--root-namespace <Company.Product>] [--port <number>]"}],So=new Map;for(let t of As){So.set(t.id.toLowerCase(),t);for(let e of t.aliases)So.set(e.toLowerCase(),t);}function gt(t){return t?So.get(t.trim().toLowerCase())??null:null}function Is(t){return gt(t)?.id??t}function $s(){return As.filter(t=>t.owner==="core"||t.generator)}function Er(t){return gt(t)?.owner==="npm"}async function Ns(t,e){if(!t.generator)throw new Error(`Kit is not backed by an npm generator: ${t.id}`);if(t.generator==="gofiber"){let{generateGoFiberKit:r}=await import('./gofiber-standard-NDCBY6OM.js');await r(e.projectPath,{project_name:e.projectName,module_path:e.projectName,skipGit:e.skipGit,skipInstall:e.skipInstall});return}if(t.generator==="gogin"){let{generateGoGinKit:r}=await import('./gogin-standard-WUOMIHDR.js');await r(e.projectPath,{project_name:e.projectName,module_path:e.projectName,skipGit:e.skipGit,skipInstall:e.skipInstall});return}if(t.generator==="springboot"){let{generateSpringBootKit:r}=await import('./springboot-standard-WQWB5E24.js');await r(e.projectPath,{project_name:e.projectName,artifact_id:e.projectName,java_version:Te(e.args,"--java-version")?.trim(),spring_boot_version:Te(e.args,"--spring-boot-version")?.trim(),springdoc_version:Te(e.args,"--springdoc-version")?.trim(),group_id:Te(e.args,"--group-id")?.trim(),package_name:Te(e.args,"--package-name")?.trim(),description:Te(e.args,"--description")?.trim(),port:Te(e.args,"--port")?.trim(),skipGit:e.skipGit,skipInstall:e.skipInstall});return}if(t.generator==="dotnet-webapi-clean"){let{generateDotnetWebApiCleanKit:r}=await import('./dotnet-webapi-clean-TPQMNFSD.js');await r(e.projectPath,{project_name:e.projectName,target_framework:Te(e.args,"--target-framework")?.trim(),root_namespace:Te(e.args,"--root-namespace")?.trim(),description:Te(e.args,"--description")?.trim(),port:Te(e.args,"--port")?.trim(),skipGit:e.skipGit,skipInstall:e.skipInstall});return}throw new Error(`Unhandled npm kit generator: ${t.generator}`)}function Te(t,e){let r=t.indexOf(e);if(r>=0&&r+1<t.length)return t[r+1];let o=t.find(n=>n.startsWith(`${e}=`));return o?o.slice(e.length+1):void 0}function Ds(t){let e=sc(t.workspacePath,t.result.projectPath)?"imported":"adopted";return {name:t.result.projectName,path:t.result.projectPath,relativePath:ic(t.workspacePath,t.result.projectPath),relationship:e,stack:t.result.definition.framework,runtime:"node",framework:t.result.definition.framework,frameworkDisplayName:t.result.definition.displayName,supportTier:"extended",moduleSupport:false,confidence:"high",source:e==="adopted"?"adopted-local":"local-folder",importedAt:t.importedAt??new Date().toISOString()}}function sc(t,e){let r=h.relative(h.resolve(t),h.resolve(e));return r===""||r.length>0&&!r.startsWith("..")&&!h.isAbsolute(r)}function ic(t,e){return (h.relative(t,e)||".").split(h.sep).join("/")}var Ms=[{id:"nextjs",kitId:"frontend.nextjs",aliases:["frontend.nextjs","next","nextjs","next.js"],displayName:"Next.js",framework:"nextjs",defaultPort:3e3,commandDisplay:t=>`npx create-next-app@latest ${t}`,commandExec:(t,e)=>({command:"npx",args:["--yes","create-next-app@latest",t,"--yes",...e.skipGit?["--disable-git"]:[],...e.skipInstall?["--skip-install"]:[]]})},{id:"remix",kitId:"frontend.remix",aliases:["frontend.remix","remix","remix-run","react-router"],displayName:"React Router",framework:"remix",defaultPort:5173,commandDisplay:t=>`npx create-react-router@latest ${t}`,commandExec:(t,e)=>({command:"npx",args:["--yes","create-react-router@latest",t,"--yes",...e.skipInstall?["--no-install"]:["--install"],"--no-git-init"]})},{id:"vite-react",kitId:"frontend.vite-react",aliases:["frontend.vite-react","vite-react","react","vite.react"],displayName:"React + Vite",framework:"react",defaultPort:5173,commandDisplay:t=>`npm create vite@latest ${t} -- --template react-ts`,commandExec:t=>({command:"npm",args:["create","vite@latest",t,"--","--template","react-ts","--no-interactive"]})},{id:"vite-vue",kitId:"frontend.vite-vue",aliases:["frontend.vite-vue","vite-vue","vue","vite.vue"],displayName:"Vue + Vite",framework:"vue",defaultPort:5173,commandDisplay:t=>`npm create vite@latest ${t} -- --template vue-ts`,commandExec:t=>({command:"npm",args:["create","vite@latest",t,"--","--template","vue-ts","--no-interactive"]})},{id:"vite-svelte",kitId:"frontend.vite-svelte",aliases:["frontend.vite-svelte","vite-svelte","svelte","vite.svelte"],displayName:"Svelte + Vite",framework:"svelte",defaultPort:5173,commandDisplay:t=>`npm create vite@latest ${t} -- --template svelte-ts`,commandExec:t=>({command:"npm",args:["create","vite@latest",t,"--","--template","svelte-ts","--no-interactive"]})},{id:"vite-solid",kitId:"frontend.vite-solid",aliases:["frontend.vite-solid","vite-solid","solid","solidjs","vite.solid"],displayName:"Solid + Vite",framework:"solid",defaultPort:5173,commandDisplay:t=>`npm create vite@latest ${t} -- --template solid-ts`,commandExec:t=>({command:"npm",args:["create","vite@latest",t,"--","--template","solid-ts","--no-interactive"]})},{id:"vite-vanilla",kitId:"frontend.vite-vanilla",aliases:["frontend.vite-vanilla","vite","vanilla","vite-vanilla"],displayName:"Vite",framework:"vite",defaultPort:5173,commandDisplay:t=>`npm create vite@latest ${t} -- --template vanilla-ts`,commandExec:t=>({command:"npm",args:["create","vite@latest",t,"--","--template","vanilla-ts","--no-interactive"]})},{id:"nuxt",kitId:"frontend.nuxt",aliases:["frontend.nuxt","nuxt","nuxtjs","nuxt.js"],displayName:"Nuxt",framework:"nuxt",defaultPort:3e3,commandDisplay:t=>`npx nuxi@latest init ${t}`,commandExec:(t,e)=>({command:"npx",args:["--yes","nuxi@latest","init",t,...e.skipInstall?["--no-install"]:[]]})},{id:"angular",kitId:"frontend.angular",aliases:["frontend.angular","angular","ng"],displayName:"Angular",framework:"angular",defaultPort:4200,minNodeMajor:18,minNodeMessage:"Angular scaffolding requires Node.js 18.19+ or 20.11+. Upgrade Node, or choose another frontend kit.",commandDisplay:t=>`npx @angular/cli@19 new ${t}`,commandExec:(t,e)=>({command:"npx",args:["--yes","@angular/cli@19","new",t,"--defaults","--skip-git",...e.skipInstall?["--skip-install"]:[]]})},{id:"astro",kitId:"frontend.astro",aliases:["frontend.astro","astro"],displayName:"Astro",framework:"astro",defaultPort:4321,commandDisplay:t=>`npm create astro@4 ${t}`,commandExec:(t,e)=>({command:"npm",args:["create","astro@4",t,"--","--yes",...e.skipInstall?["--no-install"]:[],...e.skipGit?["--no-git"]:[]]})},{id:"sveltekit",kitId:"frontend.sveltekit",aliases:["frontend.sveltekit","sveltekit","svelte-kit"],displayName:"SvelteKit",framework:"sveltekit",defaultPort:5173,commandDisplay:t=>`npx sv@latest create ${t}`,commandExec:(t,e)=>({command:"npx",args:["--yes","sv@latest","create",t,"--template","minimal","--types","ts","--no-add-ons",...e.skipInstall?["--no-install"]:["--install","npm"]]})}],_r=new Map;for(let t of Ms){_r.set(t.id,t),_r.set(t.kitId,t);for(let e of t.aliases)_r.set(e.toLowerCase(),t);}function Os(){return [...Ms]}function Ye(t){return t?_r.get(t.trim().toLowerCase())??null:null}function Lt(t){return !!Ye(t)}function Ts(t){if(t[0]!=="create"||t[1]!=="frontend")return null;let e=t[2],r=t[3],o=t.slice(4),n=Ye(e);return n?["create","project",n.kitId,r??"",...o].filter(Boolean):["create","project",`frontend.${e??""}`,r??"",...o].filter(Boolean)}function Ar(t){let e=Ye(t);return e?`rapidkit create frontend ${e.id} <name> [--output <dir>] [--skip-install] [--dry-run]`:"rapidkit create frontend <nextjs|remix|vite-react|vite-vue|vite-svelte|vite-solid|vite-vanilla|nuxt|angular|astro|sveltekit> <name> [--output <dir>] [--skip-install] [--dry-run]"}async function Ws(t){let e=t.args;if(e[0]!=="create"||e[1]!=="project")throw new Error("Frontend create expects normalized args: create project <frontend.kit> <name>");let r=Ye(e[2]);if(!r)throw new Error(`Unknown frontend generator: ${e[2]??"(missing)"}`);let o=e[3];if(!o)throw new Error(`Usage: ${Ar(r.id)}`);Pt(o),dc(r);let n=mc(e,"--output")||process.cwd(),s=h.resolve(n,o),a=t.dryRun===true||e.includes("--dry-run"),c=e.includes("--skip-install"),l=e.includes("--skip-git")||e.includes("--no-git"),f=r.commandExec(o,{skipGit:l,skipInstall:c}),u=r.commandDisplay(o);if(await R__default.pathExists(s))throw new Error(`Directory "${s}" already exists`);if(a)return cc({definition:r,projectName:o,projectPath:s,commandPlan:f}),{definition:r,projectName:o,projectPath:s,dryRun:a,commandDisplay:u,commandExec:[f.command,...f.args]};await R__default.ensureDir(h.dirname(s));let p=await Fs(f.command,f.args,h.dirname(s)),d=await pc(s);if(p!==0&&!d)throw new Error(`Official ${r.displayName} generator failed with exit code ${p}`);return p!==0&&d&&console.log(i.yellow(`\u26A0\uFE0F Official ${r.displayName} generator exited with code ${p}, but the scaffold looks complete. Continuing RapidKit project setup...`)),l||await uc(s),await ac({definition:r,projectName:o,projectPath:s,commandDisplay:u,commandExec:[f.command,...f.args],skipGit:l,skipInstall:c}),console.log(i.green(`\u2705 ${r.displayName} project created at ${s}`)),console.log(i.gray(` Display command: npx rapidkit create frontend ${r.id} ${o}`)),console.log(i.gray(" Next: cd "+o+" && npx rapidkit dev")),{definition:r,projectName:o,projectPath:s,dryRun:a,commandDisplay:u,commandExec:[f.command,...f.args]}}async function ac(t){let e=new Date().toISOString(),r=await b(),o={schema_version:"1.0",name:t.projectName,slug:t.projectName,kind:"frontend",project_type:"frontend",runtime:"node",framework:t.definition.framework,framework_display_name:t.definition.displayName,kit_name:t.definition.kitId,kit:t.definition.kitId,engine:"npm",support_tier:"extended",module_support:false,modules:[],rapidkit_version:r,generated_by:"rapidkit-npm",generated_at:e,frontend:{generator:t.definition.id,official_generator:true,default_port:t.definition.defaultPort,command_display:t.commandDisplay,command_exec:t.commandExec,skip_install:t.skipInstall,skip_git:t.skipGit},contracts:{owns:[],apis:[],publishes:[],consumes:[],dependsOn:[],env:[]}},n={project:t.projectName,runtime:"node",framework:t.definition.framework,kind:"frontend",source:"official-generator"},s={kind:"rapidkit.frontend_create",schema_version:"1.0",generated_at:e,project:{name:t.projectName,path:t.projectPath,kind:"frontend",runtime:"node",framework:t.definition.framework,framework_display_name:t.definition.displayName,kit_name:t.definition.kitId},generator:{id:t.definition.id,command_display:t.commandDisplay,command_exec:t.commandExec}};await R__default.ensureDir(h.join(t.projectPath,".rapidkit")),await R__default.writeJson(h.join(t.projectPath,".rapidkit","project.json"),o,{spaces:2}),await R__default.writeJson(h.join(t.projectPath,".rapidkit","context.json"),n,{spaces:2}),await R__default.writeJson(h.join(t.projectPath,".rapidkit","frontend-create.json"),s,{spaces:2});}function cc(t){console.log(i.bold(`
|
|
150
|
+
RapidKit frontend create plan: ${t.definition.displayName}`)),console.log(i.gray(`Project: ${t.projectName}`)),console.log(i.gray(`Target: ${t.projectPath}`)),console.log(i.gray(`Show: npx rapidkit create frontend ${t.definition.id} ${t.projectName}`)),console.log(i.gray(`Run: ${[t.commandPlan.command,...t.commandPlan.args].join(" ")}`)),console.log(i.gray(`Default: http://localhost:${t.definition.defaultPort}`));}function lc(){let t=Number.parseInt(process.versions.node.split(".")[0]??"",10);return Number.isFinite(t)?t:0}function dc(t){if(!(!t.minNodeMajor||lc()>=t.minNodeMajor))throw new Error(t.minNodeMessage??`${t.displayName} requires Node.js ${t.minNodeMajor}+ (current: ${process.versions.node}).`)}async function pc(t){if(!await R__default.pathExists(t))return false;let e=h.join(t,"package.json");return await R__default.pathExists(e)?true:(await R__default.readdir(t)).length>0}async function uc(t){let e=h.join(t,".git");if(await R__default.pathExists(e))return;if(await Fs("git",["init"],t)===0){console.log(i.gray(" Git repository initialized."));return}console.log(i.yellow("\u26A0\uFE0F Git initialization was skipped or failed. You can run `git init` manually inside the project."));}async function Fs(t,e,r){return await new Promise(o=>{let n=spawn(t,e,{cwd:r,stdio:"inherit",shell:b$6()});n.on("close",s=>o(s??1)),n.on("error",()=>o(1));})}function mc(t,e){let r=t.indexOf(e);if(r>=0&&r+1<t.length)return t[r+1];let o=t.find(n=>n.startsWith(`${e}=`));return o?o.slice(e.length+1):void 0}var fc=["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"],gc={"fastapi.standard":"api","fastapi.ddd":"api","nestjs.standard":"api","springboot.standard":"service","gofiber.standard":"api","gogin.standard":"api","dotnet.webapi.clean":"api"},hc={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 yc(t){return t[Math.floor(Math.random()*t.length)]}function Co(t){let e=yc(fc),r=Ye(t);if(r){let s=hc[r.id]??"app";return `${e}-${s}`}let o=gt(t),n=o?gc[o.id]??"service":"app";return `${e}-${n}`}async function Pc(t){let e=await promises.readFile(t);return createHash("sha256").update(e).digest("hex")}async function Js(t,e){await R.outputFile(t,`${JSON.stringify(e,null,2)}
|
|
151
|
+
`,"utf-8");}function We(t,e){return h.isAbsolute(e)?e:h.join(t,e)}function jc(t,e){if(t.target)return t.target;if(t.source)return h.basename(t.source);if(t.url)try{let r=new URL(t.url).pathname,o=h.basename(r);if(o&&o!=="/")return o}catch{}return `${e}.artifact`}async function bc(t){let e=h.join(t,".rapidkit","trusted-sources.lock"),r=new Set(["localhost","127.0.0.1"]);if(!await R.pathExists(e))return r;try{let n=(await promises.readFile(e,"utf-8")).split(/\r?\n/).map(s=>s.trim()).filter(s=>s.length>0&&!s.startsWith("#"));for(let s of n)r.add(s.toLowerCase());}catch{}return r}async function xc(t,e,r){await R.ensureDir(h.dirname(e)),await new Promise((o,n)=>{let a=(t.startsWith("https://")?Vs:Bs).get(t,c=>{if(!c.statusCode||c.statusCode<200||c.statusCode>=300){n(new Error(`HTTP ${c.statusCode||"unknown"}`)),c.resume();return}let l=createWriteStream(e);c.pipe(l),l.on("finish",()=>{l.close(),o();}),l.on("error",f=>{n(f);});});a.setTimeout(r,()=>{a.destroy(new Error(`Request timeout after ${r}ms`));}),a.on("error",c=>{n(c);});});}async function Sc(t,e,r,o,n){let s=new URL(t),a=JSON.stringify(e),c=s.protocol==="https:"?Vs:Bs;await new Promise((l,f)=>{let u=c.request({method:"POST",hostname:s.hostname,port:s.port||(s.protocol==="https:"?443:80),path:`${s.pathname}${s.search}`,headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(a),...o?{Authorization:`Bearer ${o}`}:{},...n||{}}},p=>{if(!p.statusCode||p.statusCode<200||p.statusCode>=300){f(new Error(`HTTP ${p.statusCode||"unknown"}`)),p.resume();return}p.resume(),l();});u.setTimeout(r,()=>{u.destroy(new Error(`Request timeout after ${r}ms`));}),u.on("error",p=>{f(p);}),u.write(a),u.end();});}function Ks(t){return new Promise(e=>setTimeout(e,t))}async function Cc(t,e,r,o){let n=We(t,e||".rapidkit/reports/evidence-export-dead-letter.ndjson");return await R.ensureDir(h.dirname(n)),await promises.appendFile(n,`${JSON.stringify({timestamp:new Date().toISOString(),reason:o,payload:r})}
|
|
152
|
+
`,"utf-8"),n}function Rc(t,e){if(!e?.enabled)return {headers:{}};let r=process.env[e.hmacKeyEnv];if(!r)return {headers:{},error:`Evidence signing key env is missing: ${e.hmacKeyEnv}`};let o=(e.algorithm||"sha256").toLowerCase(),n=e.headerName||"x-rapidkit-evidence-signature",s=createHmac(o,r).update(JSON.stringify(t)).digest("hex");return {headers:{[n]:s,"x-rapidkit-evidence-signature-alg":o}}}async function Ec(t,e,r){let o=(r.algorithm||"sha256").toLowerCase(),n=We(t,r.publicKeyPath);if(!await R.pathExists(n))return {verified:false,algorithm:o,publicKeyPath:n,publicKeyFingerprint:"",signature:r.signature,message:`Public key not found: ${n}`};try{let s=await promises.readFile(n,"utf-8"),a=await promises.readFile(e),c=createVerify(o);c.update(a),c.end();let l=Buffer.from(r.signature,"base64"),f=c.verify(s,l),u=createHash("sha256").update(s).digest("hex");return {verified:f,algorithm:o,publicKeyPath:n,publicKeyFingerprint:u,signature:r.signature,message:f?"Attestation verified.":"Attestation signature verification failed."}}catch(s){return {verified:false,algorithm:o,publicKeyPath:n,publicKeyFingerprint:"",signature:r.signature,message:`Attestation verification error: ${s.message}`}}}async function _c(t,e,r,o){let n=process.env.RAPIDKIT_SIGSTORE_MOCK;if(n==="success")return {verified:true,tlogVerified:o.requireTransparencyLog,message:"Sigstore verification passed (mock).",identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:r.bundlePath||null,certificatePath:r.certificatePath||null,signaturePath:r.signaturePath||null};if(n==="fail")return {verified:false,tlogVerified:false,message:"Sigstore verification failed (mock).",identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:r.bundlePath||null,certificatePath:r.certificatePath||null,signaturePath:r.signaturePath||null};let s=r.signaturePath?We(t,r.signaturePath):null;if(!s||!await R.pathExists(s))return {verified:false,tlogVerified:false,message:"Sigstore signaturePath is missing or not found.",identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:r.bundlePath||null,certificatePath:r.certificatePath||null,signaturePath:s};let a=["verify-blob",e,"--signature",s],c=r.certificatePath?We(t,r.certificatePath):null;c&&a.push("--certificate",c);let l=r.bundlePath?We(t,r.bundlePath):null;l&&a.push("--bundle",l);let f=r.keyPath?We(t,r.keyPath):null;f&&a.push("--key",f),r.identity&&a.push("--certificate-identity",r.identity),r.issuer&&a.push("--certificate-oidc-issuer",r.issuer),r.rekorUrl&&a.push("--rekor-url",r.rekorUrl),o.requireTransparencyLog||a.push("--insecure-ignore-tlog");try{let u=await execa("cosign",a,{reject:false});return u.exitCode===0?{verified:true,tlogVerified:o.requireTransparencyLog,message:"Sigstore verification passed.",identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:l,certificatePath:c,signaturePath:s}:{verified:false,tlogVerified:false,message:`Sigstore verification failed: ${u.stderr||u.stdout||"unknown error"}`,identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:l,certificatePath:c,signaturePath:s}}catch(u){return {verified:false,tlogVerified:false,message:`Sigstore verification error: ${u.message}`,identity:r.identity||null,issuer:r.issuer||null,rekorUrl:r.rekorUrl||null,bundlePath:l,certificatePath:c,signaturePath:s}}}async function Ac(t,e){let r=e.algorithm||"sha256",o=We(t,e.policyPath),n=We(t,e.signaturePath),s=We(t,e.publicKeyPath);if(!await R.pathExists(o))return {verified:false,message:`Governance policy bundle not found: ${o}`,policies:null};if(!await R.pathExists(n))return {verified:false,message:`Governance policy signature not found: ${n}`,policies:null};if(!await R.pathExists(s))return {verified:false,message:`Governance policy public key not found: ${s}`,policies:null};try{let a=await promises.readFile(o,"utf-8"),c=(await promises.readFile(n,"utf-8")).trim(),l=await promises.readFile(s,"utf-8"),f=createVerify(r);return f.update(a),f.end(),f.verify(l,Buffer.from(c,"base64"))?{verified:true,message:"Governance policy bundle verified.",policies:JSON.parse(a).policies||{}}:{verified:false,message:"Governance policy bundle signature verification failed.",policies:null}}catch(a){return {verified:false,message:`Governance policy bundle verification error: ${a.message}`,policies:null}}}async function Ro(t,e){let r=[],o={syncedArtifacts:0,verifiedArtifacts:0,rotatedFiles:0,lockWritten:false,governanceBundleVerified:false,transparencyEvidenceWritten:false,transparencyEvidenceRecords:0,evidenceExported:false,evidenceExportTarget:null},n=h.join(t,".rapidkit"),s=h.join(n,"mirror-config.json"),a=h.join(n,"mirror.lock"),c=h.join(n,"mirror","artifacts"),l=h.join(n,"reports"),f=await bc(t);if(!await R.pathExists(s))return r.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: .rapidkit/mirror-config.json not found."}),{checks:r,details:o};let u={};try{u=JSON.parse(await promises.readFile(s,"utf-8"));}catch{return r.push({id:"mirror.lifecycle.config",status:"failed",message:"Mirror lifecycle failed: invalid JSON in mirror-config.json."}),{checks:r,details:o}}if(!(e.forceRun===true||e.ciMode||e.offlineMode||u.mode==="offline-only"))return r.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: not in ci/offline mode."}),{checks:r,details:o};await R.ensureDir(c);let d=Math.max(0,u.prefetch?.retries??2),m=Math.max(0,u.prefetch?.backoffMs??250),g=Math.max(1e3,u.prefetch?.timeoutMs??15e3),w=u.security?.requireAttestation===true,y=u.security?.requireSigstore===true,v=u.security?.requireTransparencyLog===true,P=u.security?.requireSignedGovernance===true,k=u.security?.evidenceExport,E=(process.env.RAPIDKIT_ENV||u.security?.governance?.environment||"dev").toLowerCase(),C=u.security?.governance?.policies||{};if(u.security?.governanceBundle){let T=await Ac(t,u.security.governanceBundle);if(r.push({id:"governance.bundle.verify",status:T.verified?"passed":"failed",message:T.message}),T.verified&&T.policies)C=T.policies,o.governanceBundleVerified=true;else if(P)return {checks:r,details:o}}let I=C[E],H=v||I?.requireTransparencyLog===true,z=[],oe=Array.isArray(u.artifacts)?u.artifacts:[],L=[];for(let T=0;T<oe.length;T+=1){let K=oe[T],S=K.id||`artifact-${T+1}`,X=K.source?We(t,K.source):null,ce=jc(K,S),q=h.join(c,ce),we=false,Ae={sourceType:"path",source:X||K.url||"unknown",host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true};if(X&&await R.pathExists(X))await R.ensureDir(h.dirname(q)),await R.copyFile(X,q),o.syncedArtifacts+=1,we=true,Ae={sourceType:"path",source:X,host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true},r.push({id:`mirror.sync.${S}`,status:"passed",message:`Mirrored artifact ${S} from source path.`});else if(K.url){let x="";try{x=new URL(K.url).hostname.toLowerCase();}catch{r.push({id:`mirror.prefetch.${S}`,status:"failed",message:`Invalid URL for ${S}: ${K.url}`});continue}if(!(process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||f.has(x))){r.push({id:`mirror.prefetch.trust.${S}`,status:"failed",message:`Untrusted mirror host for ${S}: ${x}. Add host to .rapidkit/trusted-sources.lock or set RAPIDKIT_TRUSTED_SOURCES=1.`});continue}if(e.offlineMode&&(await R.pathExists(q)?(we=true,Ae={sourceType:"url",source:K.url,host:x,fetchedAt:new Date().toISOString(),attempts:0,trusted:true},r.push({id:`mirror.prefetch.${S}`,status:"passed",message:`Offline mode reused existing mirrored artifact ${S}.`})):r.push({id:`mirror.prefetch.${S}`,status:"failed",message:`Offline mode cannot prefetch remote artifact ${S} without an existing mirrored copy.`}),!we))continue;if(!we){let se=null,ke=0;for(let Ee=1;Ee<=d+1;Ee+=1){ke=Ee;try{await xc(K.url,q,g),o.syncedArtifacts+=1,we=true,Ae={sourceType:"url",source:K.url,host:x,fetchedAt:new Date().toISOString(),attempts:ke,trusted:true},r.push({id:`mirror.prefetch.${S}`,status:"passed",message:ke>1?`Prefetched artifact ${S} from ${x} after ${ke} attempts.`:`Prefetched artifact ${S} from ${x}.`});break}catch(ze){if(se=ze,Ee<=d){await Ks(m*Ee);continue}}}if(!we){r.push({id:`mirror.prefetch.${S}`,status:"failed",message:`Failed to prefetch ${S} after ${d+1} attempt(s): ${se?.message||"unknown error"}`});continue}}if(!we){r.push({id:`mirror.prefetch.${S}`,status:"failed",message:`Failed to prefetch ${S}.`});continue}}if(!we){K.required||e.offlineMode?r.push({id:`mirror.sync.${S}`,status:"failed",message:`Mirror source missing for ${S}${X?`: ${X}`:""}`}):r.push({id:`mirror.sync.${S}`,status:"skipped",message:`Mirror source not found for optional artifact ${S}.`});continue}let Ne=await Pc(q);if(K.sha256&&K.sha256.toLowerCase()!==Ne.toLowerCase()){r.push({id:`mirror.verify.${S}`,status:"failed",message:`Checksum mismatch for ${S}.`});continue}o.verifiedArtifacts+=1,r.push({id:`mirror.verify.${S}`,status:"passed",message:`Checksum verified for ${S}.`});let je=K.attestation?await Ec(t,q,K.attestation):null;if(K.attestation){if(r.push({id:`mirror.attest.${S}`,status:je?.verified?"passed":"failed",message:je?.message||"Attestation verification failed."}),!je?.verified)continue}else if(w){r.push({id:`mirror.attest.${S}`,status:"failed",message:`Attestation is required but missing for ${S}.`});continue}else r.push({id:`mirror.attest.${S}`,status:"skipped",message:`No attestation provided for ${S}.`});let Re=K.attestation?.sigstore,G=Re?await _c(t,q,Re,{requireTransparencyLog:H}):null;if(Re){if(r.push({id:`mirror.sigstore.${S}`,status:G?.verified?"passed":"failed",message:G?.message||"Sigstore verification failed."}),z.push({artifactId:S,verified:!!G?.verified,tlogVerified:!!G?.tlogVerified,identity:G?.identity||null,issuer:G?.issuer||null,rekorUrl:G?.rekorUrl||null,timestamp:new Date().toISOString(),environment:E}),!G?.verified)continue}else if(y){r.push({id:`mirror.sigstore.${S}`,status:"failed",message:`Sigstore attestation is required but missing for ${S}.`});continue}else r.push({id:`mirror.sigstore.${S}`,status:"skipped",message:`No Sigstore attestation provided for ${S}.`});if(Re&&G?.verified&&I){let x=I.allowedIdentities||[];if(x.length>0){let se=!!G.identity&&x.includes(G.identity);if(r.push({id:`mirror.sigstore.policy.identity.${S}`,status:se?"passed":"failed",message:se?`Sigstore identity policy passed for ${S} in ${E}.`:`Sigstore identity policy failed for ${S} in ${E}.`}),!se)continue}let N=I.allowedIssuers||[];if(N.length>0){let se=!!G.issuer&&N.includes(G.issuer);if(r.push({id:`mirror.sigstore.policy.issuer.${S}`,status:se?"passed":"failed",message:se?`Sigstore issuer policy passed for ${S} in ${E}.`:`Sigstore issuer policy failed for ${S} in ${E}.`}),!se)continue}let Q=I.allowedRekorUrls||[];if(Q.length>0){let se=!!G.rekorUrl&&Q.includes(G.rekorUrl);if(r.push({id:`mirror.sigstore.policy.rekor.${S}`,status:se?"passed":"failed",message:se?`Sigstore Rekor policy passed for ${S} in ${E}.`:`Sigstore Rekor policy failed for ${S} in ${E}.`}),!se)continue}}else I&&r.push({id:`mirror.sigstore.policy.${S}`,status:"skipped",message:`Sigstore governance policy configured for ${E} but no verified Sigstore attestation for ${S}.`});let dt=await promises.stat(q);L.push({id:S,path:h.relative(t,q),sha256:Ne,size:dt.size,provenance:Ae,attestation:{detached:{provided:!!K.attestation,verified:je?.verified||false,algorithm:je?.algorithm||null,publicKeyPath:je?.publicKeyPath||null,publicKeyFingerprint:je?.publicKeyFingerprint||null,signature:je?.signature||null,verifiedAt:je?.verified?new Date().toISOString():null},sigstore:{provided:!!Re,verified:G?.verified||false,tlogVerified:G?.tlogVerified||false,identity:G?.identity||null,issuer:G?.issuer||null,rekorUrl:G?.rekorUrl||null,bundlePath:G?.bundlePath||null,certificatePath:G?.certificatePath||null,signaturePath:G?.signaturePath||null,verifiedAt:G?.verified?new Date().toISOString():null}}});}let O=u.retention?.keepLast;if(typeof O=="number"&&O>0){let K=(await promises.readdir(c,{withFileTypes:true})).filter(S=>S.isFile()).map(S=>h.join(c,S.name));if(K.length>O){let S=await Promise.all(K.map(async ce=>({filePath:ce,stat:await promises.stat(ce)})));S.sort((ce,q)=>q.stat.mtimeMs-ce.stat.mtimeMs);let X=S.slice(O);for(let ce of X)await promises.unlink(ce.filePath),o.rotatedFiles+=1;}}r.push({id:"mirror.rotate",status:"passed",message:o.rotatedFiles>0?`Mirror retention rotation removed ${o.rotatedFiles} file(s).`:"Mirror retention rotation completed with no removals."});let Pe={schemaVersion:"1.0",generatedAt:new Date().toISOString(),mode:u.mode||null,environment:E,artifacts:L};if(await promises.writeFile(a,`${JSON.stringify(Pe,null,2)}
|
|
153
|
+
`,"utf-8"),o.lockWritten=true,r.push({id:"mirror.lock.write",status:"passed",message:`Mirror lock updated at ${h.relative(t,a)}.`}),o.transparencyEvidenceRecords=z.length,z.length>0){let T={schemaVersion:"1.0",generatedAt:new Date().toISOString(),environment:E,records:z},K=new Date().toISOString().replace(/[:.]/g,"-"),S=h.join(l,`transparency-evidence-${K}.json`),X=h.join(l,"transparency-evidence.latest.json");if(await R.ensureDir(l),await Js(S,T),await Js(X,T),o.transparencyEvidenceWritten=true,r.push({id:"sigstore.evidence.write",status:"passed",message:`Transparency evidence written to ${h.relative(t,X)}.`}),k?.enabled){let ce=Math.max(1e3,k.timeoutMs??1e4);if(k.target==="file")if(!k.filePath)r.push({id:"sigstore.evidence.export.file",status:"failed",message:"Evidence export target=file requires security.evidenceExport.filePath."});else try{let q=We(t,k.filePath);await R.ensureDir(h.dirname(q)),await promises.appendFile(q,`${JSON.stringify(T)}
|
|
154
|
+
`,"utf-8"),o.evidenceExported=true,o.evidenceExportTarget=q,r.push({id:"sigstore.evidence.export.file",status:"passed",message:`Transparency evidence exported to file sink ${q}.`});}catch(q){r.push({id:"sigstore.evidence.export.file",status:"failed",message:`Evidence file export failed: ${q.message}`});}else if(k.target==="http")if(!k.endpoint)r.push({id:"sigstore.evidence.export.http",status:"failed",message:"Evidence export target=http requires security.evidenceExport.endpoint."});else {let q=Math.max(0,k.retries??0),we=Math.max(0,k.backoffMs??500),Ae=Rc(T,k.signing);Ae.error&&r.push({id:"sigstore.evidence.export.http",status:"failed",message:Ae.error});try{let Ne=k.authTokenEnv?process.env[k.authTokenEnv]:void 0,je=false,Re=null;for(let G=1;G<=q+1;G+=1)try{if(Ae.error)throw new Error(Ae.error);await Sc(k.endpoint,T,ce,Ne,Ae.headers),o.evidenceExported=true,o.evidenceExportTarget=k.endpoint,r.push({id:"sigstore.evidence.export.http",status:"passed",message:G>1?`Transparency evidence exported to HTTP endpoint ${k.endpoint} after ${G} attempts.`:`Transparency evidence exported to HTTP endpoint ${k.endpoint}.`}),je=true;break}catch(dt){Re=dt,G<=q&&await Ks(we*G);}if(!je)throw Re||new Error("unknown evidence export error")}catch(Ne){let je=`Evidence HTTP export failed: ${Ne.message}`;r.push({id:"sigstore.evidence.export.http",status:"failed",message:je});try{let Re=await Cc(t,k.deadLetterPath,T,je);r.push({id:"sigstore.evidence.export.deadletter",status:"passed",message:`Evidence export failure persisted to dead-letter sink ${Re}.`});}catch(Re){r.push({id:"sigstore.evidence.export.deadletter",status:"failed",message:`Evidence dead-letter write failed: ${Re.message}`});}}}if(k.failOnError&&r.some(we=>we.status==="failed"&&(we.id==="sigstore.evidence.export.file"||we.id==="sigstore.evidence.export.http")))return {checks:r,details:o}}else r.push({id:"sigstore.evidence.export",status:"skipped",message:"Central evidence export not configured (security.evidenceExport.enabled=false)."});}else r.push({id:"sigstore.evidence.write",status:"skipped",message:"No Sigstore records available for transparency evidence output."}),r.push({id:"sigstore.evidence.export",status:"skipped",message:"Central evidence export skipped because no transparency evidence records exist."});return {checks:r,details:o}}function Ir(t){let e=k(t.detection.runtime),r=o({runtime:t.detection.runtime,moduleSupport:t.moduleSupport,projectPath:t.projectPath,framework:t.detection.key}),o$1=[];o$1.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}),o$1.push({id:"runtime-support",status:e.tier==="observed"?"warn":"pass",message:`${e.displayName} is supported at ${e.tier} tier.`,recommendation:e.tier==="observed"?"Observed runtimes are contract-aware but may need manual commands until a first-class kit exists.":void 0}),o$1.push({id:"module-mutation-policy",status:t.moduleSupport?"pass":"warn",message:t.moduleSupport?"RapidKit module mutation is enabled for this project.":"RapidKit module mutation is disabled for this imported project.",recommendation:t.moduleSupport?void 0:"Use project lifecycle and workspace governance commands; enable module_support only after validating a compatible module generator."}),o$1.push({id:"lifecycle-commands",status:r.lifecycleCommands.length>1?"pass":"warn",message:r.lifecycleCommands.length>1?`Lifecycle commands available: ${r.lifecycleCommands.join(", ")}.`:"Only help-level lifecycle support is available for this runtime today.",recommendation:r.lifecycleCommands.length>1?void 0:"Add runtime scripts or a RapidKit runtime adapter before relying on dev/test/build/start."});let n=o$1.some(a=>a.status==="fail"),s=o$1.some(a=>a.status==="warn");return {schemaVersion:1,kind:"rapidkit.import_readiness",generatedAt:(t.generatedAt??new Date).toISOString(),status:n?"blocked":s?"review":"ready",project:{name:t.projectName,relativePath:t.relativePath,...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:r.lifecycleCommands,unsupportedLifecycleCommands:r.unsupportedLifecycleCommands,moduleCommands:r.moduleCommands},checks:o$1}}function $r(t){return t.existingProjectJson?.module_support===true?true:t.enableModules!==true?false:k(t.detection.runtime).moduleCommands}function qs(t){return t.replace(/\\/g,"/")}function Ic(t,e){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,80)||e}function $c(t,e){let r=qs(h.relative(t,e));return !r||r.startsWith("..")?true:r.split("/").filter(Boolean).some(o=>o==="..")}function Gt(t){let e=qs(h.relative(t.workspacePath,t.projectPath)),r=$c(t.workspacePath,t.projectPath),o=Ic(t.projectName,h.basename(t.projectPath)),n=r?`external/${o}`:e||o;return {relativePath:e||n,contractRelativePath:n,isExternal:r}}function Us(t){return t.trim().toLowerCase().replace(/\.git$/i,"").replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,64)}function Dc(t){let e=t.trim();if(!e)return "imported-project";let r=e.replace(/\\/g,"/").replace(/\/+$/,"").split("/"),o=r[r.length-1]||e,n=o.split(":"),s=(n[n.length-1]||o).replace(/\.git$/i,"");return Us(s)||"imported-project"}function _o(t){let e=t.trim();return e.includes("://")||e.startsWith("git@")}function Mc(t){return _o(t)?"git-url":"local-folder"}async function Oc(t,e){let r=Us(e)||"imported-project",o=0;for(;;){let n=o===0?r:o===1?`${r}-imported`:`${r}-imported-${o}`,s=h.join(t,n);if(!await R__default.pathExists(s))return s;o+=1;}}function Tc(t,e){let r=h.resolve(t),o=h.resolve(e),n=h.relative(r,o);return n===""||n.length>0&&!n.startsWith("..")&&!h.isAbsolute(n)}function Wc(t,e){if(Tc(t,e))throw new Error("Import source must be outside the current workspace root.")}function Fc(t){return t.startsWith(".env")?![".env.example",".env.sample",".env.template",".env.defaults",".env.dist"].includes(t):false}function Jc(t){let e=h.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)||Fc(e)||e.endsWith(".pem")||e.endsWith(".key"))}async function Kc(t){let e=h.join(t,".rapidkit","project.json");if(!await R__default.pathExists(e))return null;try{return await R__default.readJson(e)}catch{return null}}async function Lc(t){let e=new Date().toISOString(),r=typeof t.existingProjectJson?.name=="string"?t.existingProjectJson.name:h.basename(t.projectPath),o=Gt({workspacePath:t.workspacePath,projectPath:t.projectPath,projectName:r}),n=o.contractRelativePath,s=h.join(t.projectPath,".rapidkit","project.json"),a=h.join(t.projectPath,".rapidkit","import.json"),c=h.join(t.projectPath,".rapidkit","import-readiness.json"),l=$r({existingProjectJson:t.existingProjectJson,detection:t.detection,enableModules:t.enableModules}),f=Array.isArray(t.existingProjectJson?.modules)?t.existingProjectJson.modules:[],u=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:h.basename(t.projectPath),slug:typeof t.existingProjectJson?.slug=="string"?t.existingProjectJson.slug:h.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:l,modules:f,contracts:u,import:{managed_by:"rapidkit-npm",source_type:t.sourceType,imported_at:e,relative_path:n,discovered_relative_path:o.relativePath,is_external:o.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:h.basename(t.projectPath)},project:{name:p.name,slug:p.slug,relative_path:n,kind:t.projectKind,module_support:l},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:l}},m=Ir({projectName:String(p.name),relativePath:n,projectKind:t.projectKind,source:t.sourceType,detection:t.detection,moduleSupport:l,projectPath:t.projectPath,generatedAt:new Date(e)});return await R__default.ensureDir(h.dirname(s)),await R__default.writeJson(s,p,{spaces:2}),await R__default.writeJson(a,d,{spaces:2}),await R__default.writeJson(c,m,{spaces:2}),{projectJsonPath:s,importJsonPath:a,importReadinessPath:c,moduleSupport:l}}async function Gc(t,e){let r={name:e.name,path:e.path,relativePath:e.relativePath,stack:e.stack,runtime:e.runtime,framework:e.framework,frameworkDisplayName:e.frameworkDisplayName,supportTier:e.supportTier,moduleSupport:e.moduleSupport,confidence:e.confidence,source:e.source,importedAt:new Date().toISOString()};await b$5(t,[r]);}async function Hs(t){await R__default.pathExists(t)&&await R__default.remove(t);}async function zs(t,e){await Hs(e),await c$2(t,[e]);}async function Ys(t){let e=h.resolve(t.workspacePath),r=t.source.trim(),o=t.sourceType??Mc(r),n=t.name??(o==="git-url"?Dc(r):h.basename(r)),s=await Oc(e,n),a=false;try{if(o==="local-folder"){let m=h.resolve(r),g=await R__default.stat(m).catch(()=>null);if(!g||!g.isDirectory())throw new Error("Import source is not a directory.");Wc(e,m),a=true,await R__default.copy(m,s,{overwrite:false,errorOnExist:true,filter:Jc});}else a=true,await execa("git",["clone","--depth","1",r,s],{timeout:12e4});let c=await Kc(s),l=i$3(s,c),f=await a$9(s,c),u=await Lc({workspacePath:e,projectPath:s,sourceType:o,detection:l,existingProjectJson:c,projectKind:f,enableModules:t.enableModules}),p=Gt({workspacePath:e,projectPath:s,projectName:h.basename(s)}),d={name:h.basename(s),path:s,relativePath:p.contractRelativePath,stack:l.importStack,runtime:l.runtime,framework:l.key,frameworkDisplayName:l.displayName,supportTier:l.supportTier,moduleSupport:u.moduleSupport,confidence:l.confidence,source:o,projectJsonPath:u.projectJsonPath,importJsonPath:u.importJsonPath,importReadinessPath:u.importReadinessPath};return await Gc(e,d),d}catch(c){if(a)try{await Hs(s);}catch(l){let f=c instanceof Error?c.message:String(c),u=l instanceof Error?l.message:String(l);throw new Error(`Import failed: ${f}. Rollback also failed: ${u}`)}throw c}}function Bc(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,64)}function Vc(t,e){return h.resolve(t)===h.resolve(e)}async function qc(t){let e=h.join(t,".rapidkit","project.json");if(!await R__default.pathExists(e))return null;try{return await R__default.readJson(e)}catch{return null}}function Uc(t){let e=Array.isArray(t.existingProjectJson?.modules)?t.existingProjectJson.modules:[],r=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:r,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 Qs(t,e,r){let o=h.join(e,".rapidkit","project.json"),n=h.join(e,".rapidkit","adopt.json"),s=h.join(e,".rapidkit","adopt-readiness.json");r?await R__default.writeJson(o,r,{spaces:2}):await R__default.pathExists(o)&&await R__default.remove(o),await R__default.pathExists(n)&&await R__default.remove(n),await R__default.pathExists(s)&&await R__default.remove(s);let{removeImportedProjectsRegistryEntries:a}=await import('./imported-projects-registry-ZOCHFWMK.js');await a(t,[e]);}async function Zs(t){let e=h.resolve(t.workspacePath),r=h.resolve(t.source),o=await R__default.stat(r).catch(()=>null);if(!o||!o.isDirectory())throw new Error("Adopt source is not a directory.");if(Vc(e,r))throw new Error("Adopt source cannot be the workspace root itself.");let n=await qc(r),s=i$3(r,n),a=await a$9(r,n),c=Bc(t.name||(typeof n?.name=="string"?n.name:"")||h.basename(r))||"adopted-project",l=Gt({workspacePath:e,projectPath:r,projectName:c}),f=(t.now??new Date).toISOString(),u=h.join(r,".rapidkit","project.json"),p=h.join(r,".rapidkit","adopt.json"),d=h.join(r,".rapidkit","adopt-readiness.json"),m=$r({existingProjectJson:n,detection:s,enableModules:t.enableModules}),g=Uc({projectName:c,contractRelativePath:l.contractRelativePath,isExternal:l.isExternal,discoveredRelativePath:l.relativePath,detection:s,existingProjectJson:n,projectKind:a,moduleSupport:m,adoptedAt:f}),w={schema_version:"1.0",kind:"rapidkit.adopted_project",adopted_at:f,managed_by:"rapidkit-npm",mode:"linked",workspace:{path:e},project:{name:c,path:r,relative_path:l.contractRelativePath,discovered_relative_path:l.relativePath,is_external:l.isExternal,kind:a,module_support:m},detection:{framework:s.key,framework_display_name:s.displayName,runtime:s.runtime,kind:a,confidence:s.confidence,support_tier:s.supportTier,import_stack:s.importStack,source:s.source},policy:{moved_source:false,copied_source:false,module_mutation_enabled:m,workspace_contract:"linked-project"}},y=Ir({projectName:c,relativePath:l.contractRelativePath,projectKind:a,source:"adopted-local",detection:s,moduleSupport:m,projectPath:r,generatedAt:new Date(f)});if(t.dryRun!==true){await R__default.ensureDir(h.dirname(u)),await R__default.writeJson(u,g,{spaces:2}),await R__default.writeJson(p,w,{spaces:2}),await R__default.writeJson(d,y,{spaces:2});let v={name:c,path:r,relativePath:l.contractRelativePath,relationship:"adopted",stack:s.importStack,runtime:s.runtime,framework:s.key,frameworkDisplayName:s.displayName,supportTier:s.supportTier,moduleSupport:m,confidence:s.confidence,source:"adopted-local",importedAt:f};await b$5(e,[v]);}return {name:c,path:r,relativePath:l.relativePath,contractRelativePath:l.contractRelativePath,isExternal:l.isExternal,relationship:"adopted",stack:s.importStack,runtime:s.runtime,framework:s.key,frameworkDisplayName:s.displayName,supportTier:s.supportTier,moduleSupport:m,confidence:s.confidence,projectJsonPath:u,adoptJsonPath:p,adoptReadinessPath:d,wroteFiles:t.dryRun!==true}}var Ao="workspai",Xs="Workspai";function Hc(t){return j.existsSync(h.join(t,".rapidkit-workspace"))||j.existsSync(h.join(t,".rapidkit","workspace.json"))}function Dr(t=homedir()){return h.join(t,"rapidkit","workspaces")}function ei(t=homedir()){return h.join(t,"Workspai","rapidkits")}function Io(t,e=homedir()){return h.join(Dr(e),t)}function zc(t,e=homedir()){return [Io(t,e),h.join(ei(e),t)]}function $o(t,e={}){let r=e.homeDir??homedir();return e.outputDir?h.resolve(e.outputDir,t):Io(t,r)}function No(t,e=homedir()){for(let r of zc(t,e))if(j.existsSync(r))return r}function ti(t,e="my-workspace"){let r=1;for(;;){let o=r===1?e:`${e}-${r}`,n=h.join(t,o);if(!j.existsSync(n))return {name:o,targetPath:n};r+=1;}}function Yc(t=homedir()){return [h.join(Dr(t),Ao),h.join(ei(t),Ao)]}function ri(t=homedir()){for(let e of Yc(t))if(Hc(e))return e;return Io(Ao,t)}function Do(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 Zc(t){let e=t.trim().toLowerCase();return e?e.startsWith("fastapi")?"fastapi":e.startsWith("nestjs")?"nestjs":null:null}function $e(t,e){let r=t.indexOf(e);if(r>=0&&r+1<t.length)return t[r+1];let o=t.find(n=>n.startsWith(`${e}=`));if(o)return o.slice(e.length+1)}function qo(){return d$3()}function ni(){let t={...process.env},e=t.PATH||"";return e&&(t.PATH=e.split(h.delimiter).filter(r=>!r.replace(/\\/g,"/").includes("/.pyenv/shims")).join(h.delimiter)),t.PYENV_VERSION="system",t.POETRY_PYTHON||(t.POETRY_PYTHON=c$3()),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 Xc(t){return f$2(h.join(t,".venv"))}async function Pi(t,e){return await U(t,["--version"],e)===0}async function wt(t){let e=h.join(t,"go.mod");if(await R__default.pathExists(e))return "go";let r=h.join(t,"pom.xml"),o=h.join(t,"build.gradle"),n=h.join(t,"build.gradle.kts");if(await R__default.pathExists(r)||await R__default.pathExists(o)||await R__default.pathExists(n))return "java";if((await R__default.pathExists(t)?await j.promises.readdir(t,{withFileTypes:true}):[]).some(p=>p.isFile()&&p.name.toLowerCase().endsWith(".sln")))return "dotnet";let a=h.join(t,"src");if(await R__default.pathExists(a)&&(await j.promises.readdir(a,{withFileTypes:true})).some(d=>d.isFile()&&d.name.toLowerCase().endsWith(".csproj")))return "dotnet";let c=h.join(t,"package.json");if(await R__default.pathExists(c))return "node";let l=h.join(t,"pyproject.toml"),f=h.join(t,"requirements.txt"),u=h.join(t,"poetry.lock");return await R__default.pathExists(l)||await R__default.pathExists(f)||await R__default.pathExists(u)?"python":null}async function el(t){for(let e of qo())if(await U(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function ji(t){for(let e of qo())if(await U(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function tl(t){let e=f$2(h.join(t,".venv"));if(!await R__default.pathExists(e)){let s=await ji(t);if(s!==0)return s}if(!await Pi("poetry",t))return 0;let o=await U("poetry",["config","virtualenvs.in-project","true","--local"],t);if(o!==0)return o;let n=await U("poetry",["env","use",e],t);return n!==0?n:0}async function rl(t){let e=f$2(h.join(t,".venv"));if(!await R__default.pathExists(e)){let n=await ji(t);if(n!==0)return n}await U(e,["-m","pip","install","--upgrade","pip","setuptools","wheel"],t);let r=h.join(t,"requirements.txt");if(await R__default.pathExists(r)&&await U(e,["-m","pip","install","-r","requirements.txt"],t)===0)return 0;let o=h.join(t,"pyproject.toml");return await R__default.pathExists(o)&&(await U(e,["-m","pip","install","-e","."],t)===0||await U(e,["-m","pip","install","."],t)===0)?0:1}async function Mo(t,e){return await tl(t)!==0&&console.log(i.yellow("\u26A0\uFE0F Could not fully configure Poetry local venv. Trying fallback installer...")),(await e.initProject(t)).exitCode===0&&await R__default.pathExists(h.join(t,".venv"))?0:(console.log(i.yellow("\u26A0\uFE0F Python init fallback: installing dependencies directly into project .venv")),await rl(t))}async function Oo(t){let e=await ht("init",t);if(e===0)return 0;let r=["npm","pnpm","yarn"];for(let o of r){if(!await Pi(o,t))continue;if(await U(o,["install"],t)===0)return console.log(i.green(`\u2705 Node init fallback succeeded with ${o} install`)),0}return e}function ol(t,e){let r=n=>/^\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?$/.test(n),o=$e([...e],"--port");if(o&&!/^\d+$/.test(o.trim()))return "Invalid --port. Expected numeric TCP port, e.g. 8080";if(t==="springboot.standard"){let n=$e([...e],"--java-version"),s=$e([...e],"--spring-boot-version"),a=$e([...e],"--springdoc-version"),c=$e([...e],"--group-id"),l=$e([...e],"--package-name");if(n&&!/^\d+$/.test(n.trim()))return "Invalid --java-version. Expected major version number, e.g. 21";if(s&&!r(s.trim()))return "Invalid --spring-boot-version. Expected semantic version, e.g. 3.5.0";if(a&&!r(a.trim()))return "Invalid --springdoc-version. Expected semantic version, e.g. 2.8.9";if(c&&!/^[A-Za-z0-9_.-]+$/.test(c.trim()))return "Invalid --group-id. Use dot-separated Java package identifiers only.";if(l&&!/^[A-Za-z0-9_.-]+$/.test(l.trim()))return "Invalid --package-name. Use dot-separated Java package identifiers only."}if(t==="dotnet.webapi.clean"){let n=$e([...e],"--target-framework"),s=$e([...e],"--root-namespace");if(n&&!/^net\d+\.\d+$/.test(n.trim()))return "Invalid --target-framework. Expected .NET target framework, e.g. net8.0";if(s&&!/^[A-Za-z0-9_.]+$/.test(s.trim()))return "Invalid --root-namespace. Use dot-separated .NET namespace identifiers only."}return null}async function Jo(t){if(t[0]!=="create"||t[1]!=="project")return 1;let e=t[2],r=gt(e),o=t[3];if(!r||r.owner!=="npm")return 1;if(!o)return process.stderr.write(`Usage: ${r.createUsage??"rapidkit create project <kit> <name> [--output <dir>]"}
|
|
155
|
+
`),1;try{Pt(o);}catch(f){let u=f instanceof Error?f.message:String(f);return process.stderr.write(`${u}
|
|
156
156
|
`),1}let n=ol(r.id,t);if(n)return process.stderr.write(`${n}
|
|
157
157
|
`),1;let s=$e(t,"--output")||process.cwd(),a=h.resolve(s,o),c=t.includes("--skip-git")||t.includes("--no-git"),l=t.includes("--skip-install");try{let{default:f}=await import('fs-extra');if(await f.ensureDir(h.dirname(a)),await f.pathExists(a))return process.stderr.write(`\u274C Directory "${a}" already exists
|
|
158
|
-
`),1;await f.ensureDir(a),await Ns(r,{projectName:o,projectPath:a,args:t,skipGit:c,skipInstall:l});let
|
|
159
|
-
`),1}}async function si(t){let e=Ye(t[2]);if(!e)return 1;try{let r=await Ws({args:t});if(!r.dryRun){let o=re(process.cwd()),n=false;o||(o=(await Ho()).workspacePath,n=true);let{registerProjectInWorkspace:s,registerWorkspace:a,syncWorkspaceProjects:c}=await import('./workspace-
|
|
158
|
+
`),1;await f.ensureDir(a),await Ns(r,{projectName:o,projectPath:a,args:t,skipGit:c,skipInstall:l});let u=re(process.cwd());if(u){let{syncWorkspaceProjects:p}=await import('./workspace-ZDL5IQU4.js');await p(u,true);}return 0}catch(f){return process.stderr.write(`RapidKit ${r.id} generator failed: ${f?.message??f}
|
|
159
|
+
`),1}}async function si(t){let e=Ye(t[2]);if(!e)return 1;try{let r=await Ws({args:t});if(!r.dryRun){let o=re(process.cwd()),n=false;o||(o=(await Ho()).workspacePath,n=true);let{registerProjectInWorkspace:s,registerWorkspace:a,syncWorkspaceProjects:c}=await import('./workspace-ZDL5IQU4.js'),l=Ds({workspacePath:o,result:r});await a(o,h.basename(o)),await b$5(o,[l]),await s(o,r.projectName,r.projectPath),await c(o,true),await Ze(o,{silent:true}),n&&(console.log(i.gray(`\u2139\uFE0F Project created outside a RapidKit workspace \u2014 linked to managed workspace "${Xs}" (${l.relationship}).`)),console.log(i.gray(` Registry: ${h.join(j$3(),"workspaces.json")}`)),console.log(i.gray(" Tip: run from inside a workspace next time, or create one with `rapidkit create workspace`.")));}return 0}catch(r){return process.stderr.write(`RapidKit ${e.kitId} generator failed: ${r?.message??r}
|
|
160
160
|
`),t[3]||process.stderr.write(`Usage: ${Ar(e.id)}
|
|
161
161
|
`),1}}async function To(t,e){if(t.includes("--json"))return process.stderr.write("RapidKit (npm) offline fallback does not support --json for `create` commands.\nInstall Python 3.10+ and retry the same command.\n"),1;if(t[0]!=="create")return 1;if(t[1]!=="project")return process.stderr.write(`RapidKit (npm) could not run the Python core engine for \`create\`.
|
|
162
162
|
Reason: ${e}.
|
|
@@ -168,23 +168,23 @@ Reason: ${e}.
|
|
|
168
168
|
Requested kit: ${n}
|
|
169
169
|
Offline fallback only supports: fastapi.standard, nestjs.standard (and their shorthands).
|
|
170
170
|
Install Python 3.10+ to access all kits.
|
|
171
|
-
`),1;let c=$e(t,"--output")||process.cwd(),l=h.resolve(c,s),f=t.includes("--skip-git")||t.includes("--no-git"),
|
|
172
|
-
`),1;let
|
|
171
|
+
`),1;let c=$e(t,"--output")||process.cwd(),l=h.resolve(c,s),f=t.includes("--skip-git")||t.includes("--no-git"),u=t.includes("--skip-install");try{if(await R__default.ensureDir(h.dirname(l)),await R__default.pathExists(l))return process.stderr.write(`\u274C Directory "${l}" already exists
|
|
172
|
+
`),1;let p="pip",d=re(process.cwd());if(d)try{let{readWorkspaceMarker:g}=await import('./workspace-marker-IOPQ42A7.js'),w=await g(d);w?.metadata?.npm?.installMethod&&(p=w.metadata.npm.installMethod,a$1.debug(`Detected workspace engine: ${p}`));}catch(g){a$1.debug("Failed to read workspace marker",g);}else a$1.debug("No workspace found, using default engine: pip");await R__default.ensureDir(l);let{generateDemoKit:m}=await import('./demo-kit-KTRITRWH.js');if(await m(l,{project_name:s,template:a,kit_name:n,skipGit:f,skipInstall:u,engine:p}),d){let{syncWorkspaceProjects:g}=await import('./workspace-ZDL5IQU4.js');await g(d,true),await Ze(d,{silent:true});}return 0}catch(p){return process.stderr.write(`RapidKit (npm) offline fallback failed: ${p?.message??p}
|
|
173
173
|
`),1}}async function bi(t){let e$2=t[0]==="create"&&t[1]==="frontend",r=Ts(t);if(r&&(t=r),e$2&&!Lt(t[2]))return process.stderr.write(`Unknown frontend generator: ${t[2]?.replace(/^frontend\./,"")}
|
|
174
174
|
`),process.stderr.write(`Usage: ${Ar()}
|
|
175
|
-
`),1;let o=new Set(["--yes","-y","--skip-git","--skip-install","--debug","--dry-run","--no-update-check","--create-workspace","--no-workspace"]);if(t[0]==="create"&&(!t[1]||t[1].startsWith("-"))){let n=t.includes("--yes")||t.includes("-y"),s=t.slice(1),a;!process.stdin.isTTY||n?(a="workspace",process.stdin.isTTY&&console.log(i.gray("\u2139\uFE0F No subcommand provided for `create`; defaulting to `create workspace`."))):a=(await He.prompt([{type:"rawlist",name:"createTarget",message:"What do you want to create?",choices:[{name:"workspace",value:"workspace"},{name:"project",value:"project"}]}])).createTarget;let c=["create",a,...s];return await bi(c)}if(t[0]==="create"&&t[1]==="workspace")try{let n=t.includes("--yes")||t.includes("-y"),s=t.includes("--skip-git")||t.includes("--no-git"),a=t.includes("--dry-run"),c=t[2]&&!t[2].startsWith("-")?t[2]:void 0,l=$e(t,"--install-method"),f=l==="poetry"||l==="venv"||l==="pipx"?l:void 0,
|
|
175
|
+
`),1;let o=new Set(["--yes","-y","--skip-git","--skip-install","--debug","--dry-run","--no-update-check","--create-workspace","--no-workspace"]);if(t[0]==="create"&&(!t[1]||t[1].startsWith("-"))){let n=t.includes("--yes")||t.includes("-y"),s=t.slice(1),a;!process.stdin.isTTY||n?(a="workspace",process.stdin.isTTY&&console.log(i.gray("\u2139\uFE0F No subcommand provided for `create`; defaulting to `create workspace`."))):a=(await He.prompt([{type:"rawlist",name:"createTarget",message:"What do you want to create?",choices:[{name:"workspace",value:"workspace"},{name:"project",value:"project"}]}])).createTarget;let c=["create",a,...s];return await bi(c)}if(t[0]==="create"&&t[1]==="workspace")try{let n=t.includes("--yes")||t.includes("-y"),s=t.includes("--skip-git")||t.includes("--no-git"),a=t.includes("--dry-run"),c=t[2]&&!t[2].startsWith("-")?t[2]:void 0,l=$e(t,"--install-method"),f=l==="poetry"||l==="venv"||l==="pipx"?l:void 0,u=$e(t,"--profile"),p=u==="minimal"||u==="java-only"||u==="go-only"||u==="dotnet-only"||u==="python-only"||u==="node-only"||u==="polyglot"||u==="enterprise"?u:void 0,d=c||(n?"my-workspace":(await He.prompt([{type:"input",name:"workspaceName",message:"Workspace name:",default:"my-workspace"}])).workspaceName);if(!d||!d.trim())return process.stderr.write(`Workspace name is required.
|
|
176
176
|
`),1;try{Pt(d);}catch(k){if(k instanceof e)return process.stderr.write(`${k.message}
|
|
177
|
-
`),1;throw k}let m=$e(t,"--output"),g=$o(d.trim(),{outputDir:m||void 0});a||await
|
|
177
|
+
`),1;throw k}let m=$e(t,"--output"),g=$o(d.trim(),{outputDir:m||void 0});a||await R__default.ensureDir(h.dirname(g));let w=No(d.trim());if(!a&&(w&&await R__default.pathExists(w)||await R__default.pathExists(g)))return process.stderr.write(`\u274C Workspace "${d}" already exists
|
|
178
178
|
`),w&&w!==g&&process.stderr.write(` Found at: ${w}
|
|
179
|
-
`),1;let y=await a$2(),v=y.author||process.env.USER||"RapidKit User";if(!n){let k=await He.prompt([{type:"input",name:"author",message:"Author name:",default:v}]);k.author?.trim()&&(v=k.author.trim());}let{createProject:P}=await import('./create-
|
|
179
|
+
`),1;let y=await a$2(),v=y.author||process.env.USER||"RapidKit User";if(!n){let k=await He.prompt([{type:"input",name:"author",message:"Author name:",default:v}]);k.author?.trim()&&(v=k.author.trim());}let{createProject:P}=await import('./create-7R4CGABE.js');return await P(d,{skipGit:s,yes:n,dryRun:a,userConfig:{...y,author:v},installMethod:f,profile:p,parentDirectory:h.dirname(g)}),a||console.log(i.gray(`\u2139\uFE0F Workspace root: ${g}`)),0}catch(n){return process.stderr.write(`RapidKit (npm) failed to create workspace: ${n?.message??n}
|
|
180
180
|
`),1}try{if(t[0]==="create"&&t[1]==="project"){if(t.includes("--help")||t.includes("-h"))try{return await d$1(),await e$1(["create","project","--help"],{cwd:process.cwd()})}catch(y){return process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${y?.message??y}
|
|
181
181
|
`),1}if(!t[2]||t[2].startsWith("-")){console.log(i.bold(`
|
|
182
182
|
\u{1F680} RapidKit
|
|
183
|
-
`));let{kitChoice:y}=await He.prompt([{type:"rawlist",name:"kitChoice",message:"Select a kit to scaffold:",choices:[...$s().map(k=>({name:k.label,value:k.id})),...Os().map(k=>({name:`frontend \u2014 ${k.displayName} (official generator)`,value:k.kitId}))]}]);if(Er(y)||Lt(y)){let k=Co(y),{projectName:
|
|
184
|
-
`),a$1.debug(`Synced Python version ${oe.trim()} from workspace to ${k}`);}}}catch(k){a$1.debug("Could not sync Python version from workspace:",k);}let{syncWorkspaceProjects:P}=await import('./workspace-
|
|
185
|
-
`),1)}}if(t[0]==="create"&&t[1]!=="project")try{await d$1();let n=await e$1(t,{cwd:process.cwd()});if(n===0){let s=re(process.cwd());if(s){let{syncWorkspaceProjects:a}=await import('./workspace-
|
|
183
|
+
`));let{kitChoice:y}=await He.prompt([{type:"rawlist",name:"kitChoice",message:"Select a kit to scaffold:",choices:[...$s().map(k=>({name:k.label,value:k.id})),...Os().map(k=>({name:`frontend \u2014 ${k.displayName} (official generator)`,value:k.kitId}))]}]);if(Er(y)||Lt(y)){let k=Co(y),{projectName:E}=await He.prompt([{type:"input",name:"projectName",message:"Project name:",default:k,validate:oe=>oe.trim().length>0||"Project name is required"}]),C=t.slice(2).filter(oe=>oe.startsWith("-")),I=["create","project",y,E.trim(),...C],H=Lt(y)?await si(I):await Jo(I),z=re(process.cwd());return H===0&&z&&await Ze(z),H}let v=Co(y),{projectName:P}=await He.prompt([{type:"input",name:"projectName",message:"Project name:",default:v,validate:k=>k.trim().length>0||"Project name is required"}]);t.splice(2,0,y,P.trim());}{let y=re(process.cwd()),v=(t[2]||"").toLowerCase();if(y&&v){let P=h.join(y,".rapidkit","workspace.json"),k=h.join(y,".rapidkit","policies.yml");try{let[E,C]=await Promise.all([R__default.pathExists(P).then(q=>q?j.promises.readFile(P,"utf-8"):"{}"),R__default.pathExists(k).then(q=>q?j.promises.readFile(k,"utf-8"):"")]),I=JSON.parse(E).profile,z=C.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]??"warn",oe=gt(v),O=Ye(v)?"node":oe?.runtime,Pe=O==="go",T=O==="java",K=O==="dotnet",S=O==="node",X=O==="python"||!O,ce=null;if(I==="python-only"&&!X?ce=`Kit "${v}" is not a Python kit, but workspace profile is "python-only".`:I==="node-only"&&!S?ce=`Kit "${v}" is not a Node kit, but workspace profile is "node-only".`:I==="go-only"&&!Pe?ce=`Kit "${v}" is not a Go kit, but workspace profile is "go-only".`:I==="java-only"&&!T?ce=`Kit "${v}" is not a Java kit, but workspace profile is "java-only".`:I==="dotnet-only"&&!K&&(ce=`Kit "${v}" is not a .NET kit, but workspace profile is "dotnet-only".`),ce){if(z==="strict")return console.log(i.red(`\u274C Profile violation (strict mode): ${ce}`)),console.log(i.gray("\u{1F4A1} Change workspace profile or use --no-workspace to skip enforcement.")),1;console.log(i.yellow(`\u26A0\uFE0F Profile warning: ${ce}`)),console.log(i.gray('\u{1F4A1} Consider using a "polyglot" workspace profile for multi-language projects.'));}}catch{}}}if(Er(t[2])){let y=await Jo(t),v=re(process.cwd());return y===0&&v&&await Ze(v),y}if(Lt(t[2]))return await si(t);let s=t.includes("--create-workspace"),a=t.includes("--no-workspace"),c=t.includes("--yes")||t.includes("-y"),l=t.includes("--skip-git")||t.includes("--no-git");if(!!!Go(process.cwd())){let{registerWorkspaceAtPath:y}=await import('./create-7R4CGABE.js');if(s)await y(process.cwd(),{skipGit:l,yes:c,userConfig:await a$2()});else if(!a)if(c)await y(process.cwd(),{skipGit:l,yes:true,userConfig:await a$2()});else {let{createWs:v}=await He.prompt([{type:"confirm",name:"createWs",message:"This project will be created outside a RapidKit workspace. Create and register a workspace here?",default:true}]);v&&await y(process.cwd(),{skipGit:l,yes:false,userConfig:await a$2()});}}let p=[...t.filter(y=>{let v=y.split("=")[0];return !o.has(y)&&!o.has(v)})],d=re(process.cwd()),w=t.includes("--skip-install")||!!d?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0;try{await d$1();let y=await e$1(p,{cwd:process.cwd(),env:w});if(y===0&&d&&!t.includes("--skip-install")&&(console.log(i.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(i.white(" Next: cd <project-name> && npx rapidkit init"))),y===0){let v=d||re(process.cwd());if(v){try{let k=t[3];if(k){let E=t.indexOf("--output"),C=E>=0?t[E+1]:".",I=h.resolve(process.cwd(),C,k),H=h.join(v,".python-version"),z=h.join(I,".python-version");if(j.existsSync(H)&&j.existsSync(I)){let oe=j.readFileSync(H,"utf-8");j.writeFileSync(z,oe.trim()+`
|
|
184
|
+
`),a$1.debug(`Synced Python version ${oe.trim()} from workspace to ${k}`);}}}catch(k){a$1.debug("Could not sync Python version from workspace:",k);}let{syncWorkspaceProjects:P}=await import('./workspace-ZDL5IQU4.js');await P(v,true),await Ze(v);}}return y}catch(y){let v=Do(y);return v?await To(p,v):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${y?.message??y}
|
|
185
|
+
`),1)}}if(t[0]==="create"&&t[1]!=="project")try{await d$1();let n=await e$1(t,{cwd:process.cwd()});if(n===0){let s=re(process.cwd());if(s){let{syncWorkspaceProjects:a}=await import('./workspace-ZDL5IQU4.js');await a(s,true);}}return n}catch(n){let s=Do(n);return s?await To(t,s):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${n?.message??n}
|
|
186
186
|
`),1)}return await d$1(),await e$1(t,{cwd:process.cwd()})}catch(n){let s=Do(n);return s?await To(t,s):(process.stderr.write(`RapidKit (npm) failed to run the Python core engine: ${n?.message??n}
|
|
187
|
-
`),1)}}var ii=["init","dev","start","build","test","docs","lint","format","create","help","--help","-h"],xi=["analyze","readiness","doctor","autopilot","pipeline","import","adopt","snapshot","workspace","bootstrap","setup","cache","mirror","ai","config","product","infra","shell","commands"],nl=["analyze","readiness","doctor","autopilot","pipeline","import","adopt","snapshot","workspace","ai","config","product","infra","shell","commands"],sl=["bootstrap","setup","cache","mirror"],il=[["project","commands"],["project","archives"],["project","archive"],["project","restore"],["project","delete"]],al=["init"],cl=h$2,ai=[...cl,...i$2];function ll(t){return !!t&&xi.includes(t)}function Si(t){let e=t[0],r=t[1];return il.some(([o,n])=>e!==o?false:r?r===n:true)}function Vt(t){return ll(t[0])||Si(t)}function dl(t){return !!t&&nl.includes(t)}function ci(t){return dl(t[0])||Si(t)}function li(t){return !!t&&sl.includes(t)}function pl(t=process.env){let e=t.npm_config_user_agent||"",r=t.npm_execpath||"",o=t.npm_command||"";return e.startsWith("npm/")||e.includes(" npx/")||/(?:^|[/\\])npx(?:\.cmd)?$/i.test(r)||/(?:^|[/\\])npm(?:\.cmd)?$/i.test(r)||o==="exec"||o==="x"||o==="run-script"}function Ci(t={}){let e=q(process.cwd());if(t.json){console.log(JSON.stringify(e,null,2));return}console.log(i.bold("RapidKit project command capabilities")),console.log(i.gray(`Project: ${e.projectRoot??"not detected"}`)),console.log(i.gray(`Runtime: ${e.runtime} (${e.runtimeSupportTier}) | Framework: ${e.frameworkDisplayName} (${e.frameworkSupportTier}) | Module support: ${e.moduleSupport?"yes":"no"}`)),console.log(i.gray(`Doctor support: ${e.runtimeDoctorSupport}`)),console.log(""),console.log(i.green(`Supported: ${e.supportedCommands.join(", ")||"none"}`)),console.log(i.yellow(`Global: ${e.globalCommands.join(", ")||"none"}`)),console.log(i.red(`Unsupported: ${e.unsupportedCommands.join(", ")||"none"}`));}function ul(){let t=[...xi,"project"],e=["version","create","add","list","info","upgrade","diff","merge","optimize","license","checkpoint","reconcile","rollback","uninstall","frameworks","modules"],r=["init","dev","start","build","test","lint","format","help"];return {scope:"global",cli:"rapidkit-npm",version:b(),cwd:process.cwd(),commands:{npmOwned:t,coreBacked:e,projectScoped:r},commandMap:Object.fromEntries([...t.map(o=>[o,{command:o,owner:"npm-wrapper",status:"supported",scope:o==="project"?"project-introspection":"workspace"}]),...e.map(o=>[o,{command:o,owner:"python-core",status:"delegated",scope:"core"}]),...r.map(o=>[o,{command:o,owner:"runtime-adapter",status:o==="help"?"supported":"runtime-dependent",scope:"project"}])])}}function ml(t={}){let e=ul();if(t.json){console.log(JSON.stringify(e,null,2));return}console.log(i.bold("RapidKit command capabilities")),console.log(i.gray(`CLI: ${e.cli} v${e.version}`)),console.log(""),console.log(i.green(`npm wrapper: ${e.commands.npmOwned.join(", ")}`)),console.log(i.cyan(`Python core: ${e.commands.coreBacked.join(", ")}`)),console.log(i.yellow(`Project runtime: ${e.commands.projectScoped.join(", ")}`)),console.log(""),console.log(i.gray("Tip: run `rapidkit project commands --json` inside a project."));}function Ko(t){return s(t)?(Ci({json:t.includes("--json")||t.includes("--ci")}),true):false}function Lo(t$1){let e=q(process.cwd());if(!e.projectRoot)return false;let r$1=r(t$1,process.cwd());if(!r$1||r$1.status!=="unsupported")return false;console.error(i.red(t(r$1,e))),process.exit(1);}function Je(t){return j.existsSync(h.join(t,".rapidkit-workspace"))||j.existsSync(h.join(t,".rapidkit","workspace.json"))}function Ri(t){let e=t;for(;;){let r=h.join(e,".rapidkit","context.json");if(j.existsSync(r))return r;let o=h.dirname(e);if(o===e)break;e=o;}return null}function Go(t){let e=t,r=h.resolve(tmpdir());for(;;){let o=h.join(e,".rapidkit-workspace");if(j.existsSync(o)&&h.resolve(e)!==r)return o;let n=h.dirname(e);if(n===e)break;e=n;}return null}function re(t){let e=t,r=h.resolve(tmpdir());for(;;){let o=h.join(e,".rapidkit-workspace");if(j.existsSync(o)&&h.resolve(e)!==r)return e;let n=h.dirname(e);if(n===e)break;e=n;}return null}async function Ze(t,e){try{let{syncWorkspaceContract:r}=await import('./workspace-contract-A6QP7FPA.js'),o=await r({workspacePath:t});if(!e?.silent&&(o.addedProjects.length>0||o.updatedProjects.length>0)&&console.log(i.gray(`\u2139\uFE0F Workspace contract synced (${o.contract.projects.length} project(s)).`)),o.verification.status!=="passed"){console.log(i.yellow("\u26A0\uFE0F Workspace contract verification failed after project sync."));for(let n of o.verification.violations)console.log(i.gray(` Violation: ${n}`));console.log(i.white(" Next: npx rapidkit workspace contract inspect"));}}catch(r){e?.silent||console.log(i.yellow(`\u26A0\uFE0F Workspace contract sync skipped: ${r.message}`));}}async function fl(t,e=process.cwd(),r=process.platform){if(!(t.workspaceFlag||t.scope==="workspace")||!a(r))return {detected:false};let n=i$1(e,r);for(let s of n){if(!await
|
|
187
|
+
`),1)}}var ii=["init","dev","start","build","test","docs","lint","format","create","help","--help","-h"],xi=["analyze","readiness","doctor","autopilot","pipeline","import","adopt","snapshot","workspace","bootstrap","setup","cache","mirror","ai","config","product","infra","shell","commands"],nl=["analyze","readiness","doctor","autopilot","pipeline","import","adopt","snapshot","workspace","ai","config","product","infra","shell","commands"],sl=["bootstrap","setup","cache","mirror"],il=[["project","commands"],["project","archives"],["project","archive"],["project","restore"],["project","delete"]],al=["init"],cl=h$2,ai=[...cl,...i$2];function ll(t){return !!t&&xi.includes(t)}function Si(t){let e=t[0],r=t[1];return il.some(([o,n])=>e!==o?false:r?r===n:true)}function Vt(t){return ll(t[0])||Si(t)}function dl(t){return !!t&&nl.includes(t)}function ci(t){return dl(t[0])||Si(t)}function li(t){return !!t&&sl.includes(t)}function pl(t=process.env){let e=t.npm_config_user_agent||"",r=t.npm_execpath||"",o=t.npm_command||"";return e.startsWith("npm/")||e.includes(" npx/")||/(?:^|[/\\])npx(?:\.cmd)?$/i.test(r)||/(?:^|[/\\])npm(?:\.cmd)?$/i.test(r)||o==="exec"||o==="x"||o==="run-script"}function Ci(t={}){let e=q(process.cwd());if(t.json){console.log(JSON.stringify(e,null,2));return}console.log(i.bold("RapidKit project command capabilities")),console.log(i.gray(`Project: ${e.projectRoot??"not detected"}`)),console.log(i.gray(`Runtime: ${e.runtime} (${e.runtimeSupportTier}) | Framework: ${e.frameworkDisplayName} (${e.frameworkSupportTier}) | Module support: ${e.moduleSupport?"yes":"no"}`)),console.log(i.gray(`Doctor support: ${e.runtimeDoctorSupport}`)),console.log(""),console.log(i.green(`Supported: ${e.supportedCommands.join(", ")||"none"}`)),console.log(i.yellow(`Global: ${e.globalCommands.join(", ")||"none"}`)),console.log(i.red(`Unsupported: ${e.unsupportedCommands.join(", ")||"none"}`));}function ul(){let t=[...xi,"project"],e=["version","create","add","list","info","upgrade","diff","merge","optimize","license","checkpoint","reconcile","rollback","uninstall","frameworks","modules"],r=["init","dev","start","build","test","lint","format","help"];return {scope:"global",cli:"rapidkit-npm",version:b(),cwd:process.cwd(),commands:{npmOwned:t,coreBacked:e,projectScoped:r},commandMap:Object.fromEntries([...t.map(o=>[o,{command:o,owner:"npm-wrapper",status:"supported",scope:o==="project"?"project-introspection":"workspace"}]),...e.map(o=>[o,{command:o,owner:"python-core",status:"delegated",scope:"core"}]),...r.map(o=>[o,{command:o,owner:"runtime-adapter",status:o==="help"?"supported":"runtime-dependent",scope:"project"}])])}}function ml(t={}){let e=ul();if(t.json){console.log(JSON.stringify(e,null,2));return}console.log(i.bold("RapidKit command capabilities")),console.log(i.gray(`CLI: ${e.cli} v${e.version}`)),console.log(""),console.log(i.green(`npm wrapper: ${e.commands.npmOwned.join(", ")}`)),console.log(i.cyan(`Python core: ${e.commands.coreBacked.join(", ")}`)),console.log(i.yellow(`Project runtime: ${e.commands.projectScoped.join(", ")}`)),console.log(""),console.log(i.gray("Tip: run `rapidkit project commands --json` inside a project."));}function Ko(t){return s(t)?(Ci({json:t.includes("--json")||t.includes("--ci")}),true):false}function Lo(t$1){let e=q(process.cwd());if(!e.projectRoot)return false;let r$1=r(t$1,process.cwd());if(!r$1||r$1.status!=="unsupported")return false;console.error(i.red(t(r$1,e))),process.exit(1);}function Je(t){return j.existsSync(h.join(t,".rapidkit-workspace"))||j.existsSync(h.join(t,".rapidkit","workspace.json"))}function Ri(t){let e=t;for(;;){let r=h.join(e,".rapidkit","context.json");if(j.existsSync(r))return r;let o=h.dirname(e);if(o===e)break;e=o;}return null}function Go(t){let e=t,r=h.resolve(tmpdir());for(;;){let o=h.join(e,".rapidkit-workspace");if(j.existsSync(o)&&h.resolve(e)!==r)return o;let n=h.dirname(e);if(n===e)break;e=n;}return null}function re(t){let e=t,r=h.resolve(tmpdir());for(;;){let o=h.join(e,".rapidkit-workspace");if(j.existsSync(o)&&h.resolve(e)!==r)return e;let n=h.dirname(e);if(n===e)break;e=n;}return null}async function Ze(t,e){try{let{syncWorkspaceContract:r}=await import('./workspace-contract-A6QP7FPA.js'),o=await r({workspacePath:t});if(!e?.silent&&(o.addedProjects.length>0||o.updatedProjects.length>0)&&console.log(i.gray(`\u2139\uFE0F Workspace contract synced (${o.contract.projects.length} project(s)).`)),o.verification.status!=="passed"){console.log(i.yellow("\u26A0\uFE0F Workspace contract verification failed after project sync."));for(let n of o.verification.violations)console.log(i.gray(` Violation: ${n}`));console.log(i.white(" Next: npx rapidkit workspace contract inspect"));}}catch(r){e?.silent||console.log(i.yellow(`\u26A0\uFE0F Workspace contract sync skipped: ${r.message}`));}}async function fl(t,e=process.cwd(),r=process.platform){if(!(t.workspaceFlag||t.scope==="workspace")||!a(r))return {detected:false};let n=i$1(e,r);for(let s of n){if(!await R__default.pathExists(s))continue;let a=s.toLowerCase();if(a.endsWith("rapidkit.cmd")||a.endsWith("rapidkit.exe"))return {detected:true,candidatePath:s,reason:"Found workspace-local rapidkit launcher on Windows."}}return {detected:false}}function gl(t){let e=t;for(;;){let r=h.join(e,".rapidkit-workspace"),o=h.join(e,".rapidkit","workspace.json");if(!j.existsSync(r)&&j.existsSync(o))return e;let n=h.dirname(e);if(n===e)break;e=n;}return null}var Ei={enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true};function hl(t){return t&&t.match(/^[\t ]*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]==="strict"?"strict":"warn"}function Bt(t,e){let r=t.match(new RegExp(`^[\\t ]*${e}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return r?r[1]==="true":Ei[e]}function di(t){let e=t??"";return {mode:hl(e),dependency_sharing_mode:_i(e),rules:{enforce_workspace_marker:Bt(e,"enforce_workspace_marker"),enforce_toolchain_lock:Bt(e,"enforce_toolchain_lock"),disallow_untrusted_tool_sources:Bt(e,"disallow_untrusted_tool_sources"),enforce_compatibility_matrix:Bt(e,"enforce_compatibility_matrix"),require_mirror_lock_for_offline:Bt(e,"require_mirror_lock_for_offline")}}}function pi(t,e,r){let o=`${e}: ${r}`,n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),s=new RegExp(`^[\\t ]*${n}:\\s*.*$`,"m");if(s.test(t))return t.replace(s,o);let a=/^[\t ]*rules:\s*(?:#.*)?$/m;return a.test(t)?t.replace(a,`${o}
|
|
188
188
|
rules:`):`${t.endsWith(`
|
|
189
189
|
`)?t:`${t}
|
|
190
190
|
`}${o}
|
|
@@ -194,29 +194,29 @@ ${o}`):`${t.endsWith(`
|
|
|
194
194
|
`}rules:
|
|
195
195
|
${o}
|
|
196
196
|
`}function wl(){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(`
|
|
197
|
-
`)}async function ui(t){let e=h.join(t,".rapidkit","policies.yml");return await
|
|
197
|
+
`)}async function ui(t){let e=h.join(t,".rapidkit","policies.yml");return await R__default.pathExists(e)?j.promises.readFile(e,"utf-8"):wl()}async function kl(t,e){let r=h.join(t,".rapidkit"),o=h.join(r,"policies.yml");await R__default.ensureDir(r);let n=e.endsWith(`
|
|
198
198
|
`)?e:`${e}
|
|
199
|
-
`;await j.promises.writeFile(o,n,"utf-8");}function vl(t){let e=t.trim().toLowerCase();return e==="true"||e==="1"||e==="on"?true:e==="false"||e==="0"||e==="off"?false:null}function _i(t){if(!t)return "isolated";let r=t.match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();return r==="shared-runtime-caches"||r==="shared-node-deps"||r==="isolated"?r:"isolated"}function Ai(t){if(!t)return {mode:"isolated",status:"skipped",message:"No policies.yml found; dependency_sharing_mode defaults to isolated."};let e=t.match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m);if(!e)return {mode:"isolated",status:"skipped",message:"dependency_sharing_mode is not set; defaulting to isolated."};let r=e[1].toLowerCase();return r==="isolated"||r==="shared-runtime-caches"||r==="shared-node-deps"?{mode:r,status:"passed",message:`dependency_sharing_mode is valid: ${r}.`}:{mode:"isolated",status:"failed",message:`Invalid dependency_sharing_mode: ${r}. Use one of: isolated, shared-runtime-caches, shared-node-deps.`}}async function Ii(t,e){let r=re(t),o=r?h.join(r,".rapidkit","policies.yml"):null,n="isolated";if(o&&await
|
|
200
|
-
`,"utf-8");}async function Pl(t,e,r){let o=process.env.RAPIDKIT_TEST_IMPORT_SYNC_FAIL==="1"&&(process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"),n=e.workspace?h.resolve(e.workspace):null,s=n??re(process.cwd()),a=false,c=false;if(n){if(!Je(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(i.red(`\u274C ${u}`)),1}}else if(!s||!Je(s)){let u=await Ho();s=u.workspacePath,a=true,c=u.created;}if(!s||!Je(s)){let u="Not inside a RapidKit workspace";return e.json?console.log(JSON.stringify({error:u},null,2)):(console.log(i.red(`\u274C ${u}`)),console.log(i.gray("\u{1F4A1} Run this command from a workspace root or pass --workspace <path>."))),1}let l=`cd ${s}`,f=r?.syncWorkspaceProjects??(async u=>{if(o)throw new Error("forced sync failure for command-level import rollback test");let{syncWorkspaceProjects:d}=await import('./workspace-ZXWYIZOR.js');await d(u,true),await Ze(u,{silent:true});}),p=r?.rollbackImportedProjectImport??zs;try{let u=await Ys({workspacePath:s,source:t,name:e.name,sourceType:e.git===true?"git-url":void 0,enableModules:e.enableModules});try{await f(s);}catch(d){await p(s,u.path);try{await f(s);}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:s,workspaceResolution:a?"default-auto":n?"explicit":"nearest",defaultWorkspaceCreated:a?c:false,suggestedCdCommand:l,importedProject:u},null,2)),0):(a&&console.log(i.yellow(`\u2139 Imported outside a workspace, so RapidKit used the default workspace: ${s}`)),console.log(i.green(`\u2714 Imported project: ${u.name}`)),console.log(i.gray(` Workspace: ${s}`)),console.log(i.gray(` Destination: ${u.path}`)),console.log(i.gray(` Stack: ${u.stack} (${u.confidence})`)),console.log(i.gray(` Source: ${e.git===true||_o(t)?"git-url":"local-folder"}`)),console.log(i.gray(` Next shell step: ${l}`)),0)}catch(u){let d=u instanceof Error?u.message:String(u);return e.json?console.log(JSON.stringify({error:d},null,2)):console.log(i.red(`\u274C Import failed: ${d}`)),1}}async function jl(t,e,r){let o=h.resolve(t||process.cwd()),n=e.workspace?h.resolve(e.workspace):null,s=n??re(process.cwd()),a=false,c=false;if(n){if(!Je(n)){let m=`Workspace path is not a valid RapidKit workspace: ${n}`;return e.json?console.log(JSON.stringify({error:m},null,2)):console.log(i.red(`\u274C ${m}`)),1}}else if(!s||!Je(s)){let m=await Ho();s=m.workspacePath,a=true,c=m.created;}if(!s||!Je(s)){let m="Not inside a RapidKit workspace";return e.json?console.log(JSON.stringify({error:m},null,2)):(console.log(i.red(`\u274C ${m}`)),console.log(i.gray("\u{1F4A1} Run this command from a workspace root or pass --workspace <path>."))),1}let l=process.env.RAPIDKIT_TEST_ADOPT_SYNC_FAIL==="1"&&(process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"),f=r?.syncWorkspaceProjects??(async m=>{if(l)throw new Error("forced sync failure for command-level adopt rollback test");let{syncWorkspaceProjects:g}=await import('./workspace-ZXWYIZOR.js');await g(m,true),await Ze(m,{silent:true});}),p=r?.registerProjectInWorkspace??(async(m,g,w)=>{let{registerProjectInWorkspace:y}=await import('./workspace-ZXWYIZOR.js');await y(m,g,w);}),u=r?.registerWorkspace??(async(m,g)=>{let{registerWorkspace:w}=await import('./workspace-ZXWYIZOR.js');await w(m,g);}),d=r?.rollbackAdoptedProjectImport??Qs;try{let m=h.join(o,".rapidkit","project.json"),g=await E__default.pathExists(m)?await E__default.readJson(m):null,w=await Zs({workspacePath:s,source:o,name:e.name,dryRun:e.dryRun===true,enableModules:e.enableModules});if(e.dryRun!==true)try{await u(s,h.basename(s)),await p(s,w.name,w.path),await f(s);}catch(y){throw await d(s,w.path,g),new Error(`Workspace sync failed after adopt and adoption metadata was rolled back: ${y instanceof Error?y.message:String(y)}`)}return e.json?(console.log(JSON.stringify({workspacePath:s,workspaceResolution:a?"default-auto":n?"explicit":"nearest",defaultWorkspaceCreated:a?c:false,dryRun:e.dryRun===true,adoptedProject:w},null,2)),0):(a&&console.log(i.yellow(`\u2139 Adopted outside a workspace, so RapidKit used the default workspace: ${s}`)),e.dryRun===true&&console.log(i.yellow("\u2139 Dry run: no adoption files were written.")),console.log(i.green(`\u2714 Adopted project: ${w.name}`)),console.log(i.gray(` Workspace: ${s}`)),console.log(i.gray(` Project: ${w.path}`)),console.log(i.gray(" Mode: linked (source was not moved or copied)")),console.log(i.gray(` Stack: ${w.stack} (${w.confidence})`)),console.log(i.gray(` Report: ${w.adoptReadinessPath}`)),console.log(i.gray(" Next: npx rapidkit workspace model --json")),0)}catch(m){let g=m instanceof Error?m.message:String(m);return e.json?console.log(JSON.stringify({error:g},null,2)):console.log(i.red(`\u274C Adopt failed: ${g}`)),1}}async function Bo(t){let e=new Set(["python-only","polyglot","enterprise"]),r="minimal";try{let s=h.join(t,".rapidkit","workspace.json");r=JSON.parse(await j.promises.readFile(s,"utf-8")).profile??"minimal";}catch{r="minimal";}if(!await(async()=>{if(e.has(r))return true;let s=await Uo(t);if(s.length===0)return false;for(let a of s){let c=a$4(a),l=c?.module_support;if(!(b$3(c,a)||d(c,a)||e$2(c,a))&&l!==false)return f$1(c,a)||c$1(c,a),true}return false})())return 0;let n="poetry";try{let{readWorkspaceMarker:s}=await import('./workspace-marker-IOPQ42A7.js'),c=(await s(t))?.metadata?.npm?.installMethod;(c==="poetry"||c==="venv"||c==="pipx"||c==="pip")&&(n=c);}catch{}if(n==="poetry"||n==="venv"){let s=h.join(t,"pyproject.toml"),a=false;try{a=(await j.promises.readFile(s,"utf-8")).includes("rapidkit-core");}catch{a=false;}let c=process.env.RAPIDKIT_DEV_PATH,l=c?await E__default.pathExists(c):false;if(a){let f=Xc(t);if(!await E__default.pathExists(f)){let d=await el(t);if(d!==0)return d}let u=await U(f,l&&c?["-m","pip","install",c,"--quiet","--disable-pip-version-check"]:["-m","pip","install","rapidkit-core","--quiet","--disable-pip-version-check"],t);if(u!==0)return u}else {let f=await U("poetry",["install","--no-root"],t);if(f!==0)return f;let p=await U("poetry",["add","rapidkit-core"],t);if(p!==0)return p}try{let{writeWorkspaceLauncher:f}=await import('./create-LUXJGSNL.js');await f(t,n==="venv"?"venv":"poetry");}catch{}return 0}return 0}async function Uo(t){let e=[],r=new Set,o=[t];for(;o.length>0;){let n=o.pop();if(!n||r.has(n))continue;r.add(n);let s=[];try{s=await j.promises.readdir(n,{withFileTypes:true});}catch{continue}for(let a of s){if(!a.isDirectory()||a.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(a.name))continue;let c=h.join(n,a.name),l=h.join(c,".rapidkit","context.json"),f=h.join(c,".rapidkit","project.json");if(await E__default.pathExists(l)||await E__default.pathExists(f)){e.push(c);continue}o.push(c);}}return e}function bl(t){return ti(t)}async function Ho(){let t=ri(),e=h.basename(t),r=Je(t);await E__default.ensureDir(h.join(t,".rapidkit")),await b$4(t,d$2(e,b()));let o=h.join(t,".rapidkit","workspace.json");return await E__default.pathExists(o)||await yt(o,{name:e,workspace_name:e,profile:"minimal",createdAt:new Date().toISOString(),createdBy:"rapidkit-npm-import-fallback"}),{workspacePath:t,created:!r}}async function Wo(t){let r=await Ve("go",{runCommandInCwd:U,runCoreRapidkit:e$1}).initProject(t);return Z(r)}function Z(t){return t.message&&console.log(i.red(`\u274C ${t.message}`)),t.exitCode}async function ht(t,e){let r=Ve("node",{runCommandInCwd:U,runCoreRapidkit:e$1});if(t==="init"){let n=await r.initProject(e);return Z(n)}if(t==="dev"){let n=await r.runDev(e);return Z(n)}if(t==="test"){let n=await r.runTest(e);return Z(n)}if(t==="build"){let n=await r.runBuild(e);return Z(n)}if(t==="lint"){let n=await r.runLint?.(e);return Z(n??{exitCode:1,message:"Lint is not supported."})}if(t==="format"){let n=await r.runFormat?.(e);return Z(n??{exitCode:1,message:"Format is not supported."})}let o=await r.runStart(e);return Z(o)}async function Qe(t,e){let r=Ve("java",{runCommandInCwd:U,runCoreRapidkit:e$1});if(t==="init"){let n=await r.initProject(e);return Z(n)}if(t==="dev"){let n=await r.runDev(e);return Z(n)}if(t==="test"){let n=await r.runTest(e);return Z(n)}if(t==="build"){let n=await r.runBuild(e);return Z(n)}if(t==="lint"){let n=await r.runLint?.(e);return Z(n??{exitCode:1,message:"Lint is not supported."})}if(t==="format"){let n=await r.runFormat?.(e);return Z(n??{exitCode:1,message:"Format is not supported."})}let o=await r.runStart(e);return Z(o)}async function mi(t,e=Vo){let r=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof r>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let s=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 se=x.match(/^\s*mode:\s*([a-zA-Z]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase()==="strict"?"strict":"warn",ke=(Ee,ze)=>{let Nt=x.match(new RegExp(`^\\s*${Ee}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return Nt?Nt[1].toLowerCase()==="true":ze};return {mode:se,dependency_sharing_mode:_i(x),rules:{enforce_workspace_marker:ke("enforce_workspace_marker",true),enforce_toolchain_lock:ke("enforce_toolchain_lock",false),disallow_untrusted_tool_sources:ke("disallow_untrusted_tool_sources",false),enforce_compatibility_matrix:ke("enforce_compatibility_matrix",false),require_mirror_lock_for_offline:ke("require_mirror_lock_for_offline",true)}}};let c=["init"],l,f=false,p=false,u=false,d$1=false;for(let x=1;x<t.length;x+=1){let N=t[x];if(N==="--ci"){f=true;continue}if(N==="--offline"){p=true;continue}if(N==="--json"){u=true;continue}if(N==="--compliance-only"){d$1=true;continue}if(N==="--profile"){let Q=t[x+1];if(!Q||Q.startsWith("-"))return console.log(i.yellow("Usage: rapidkit bootstrap [path] [--profile <minimal|java-only|go-only|dotnet-only|python-only|node-only|polyglot|enterprise>] [--ci] [--offline] [--json] [--compliance-only]")),1;l=Q,x+=1;continue}if(N.startsWith("--profile=")){l=N.slice(10);continue}c.push(N);}let m=s(l);if(l&&!m)return console.log(i.red(`Invalid profile: ${l}. Use one of: minimal, java-only, go-only, dotnet-only, python-only, node-only, polyglot, enterprise.`)),1;let g=process.cwd(),w=c.slice(1).filter(x=>!x.startsWith("-"));if(w.length>0){let x=h.resolve(g,w[0]),N=a$4(x),Q=j.existsSync(x)?await wt(x):"unknown";if(!Je(x)&&(b$3(N,x)||d(N,x)||e$2(N,x)||c$1(N,x)||f$1(N,x)||Q!=="unknown"))return await e(c)}let y=h.join(g,".rapidkit-workspace"),v=h.join(g,".rapidkit","workspace.json"),P;!j.existsSync(y)&&j.existsSync(v)?P=g:(P=re(g),P||(P=gl(g)));let k=[],R=null,C=null;if(P)try{let x=h.join(P,".rapidkit","workspace.json"),N=await j.promises.readFile(x,"utf-8"),Q=JSON.parse(N);C=s(Q.profile);}catch{C=null;}let I=["minimal","java-only","python-only","node-only","go-only","dotnet-only","polyglot","enterprise"],H={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"},z=m;if(!!P&&!m&&!f&&!u&&!!process.stdin.isTTY&&!!process.stdout.isTTY){let x=C||"minimal",{chosenProfile:N}=await He.prompt([{type:"rawlist",name:"chosenProfile",message:`Select workspace profile for bootstrap (current: ${x})`,choices:I.map(Q=>({name:Q===x?`${H[Q]} \u2190 current`:H[Q],value:Q})),default:I.indexOf(x)}]);z=N;}let L=z||C||"minimal";if(P)try{let N=L==="python-only"||L==="polyglot"||L==="enterprise"?"poetry":"venv",Q;try{let ze=(await j.promises.readFile(h.join(P,".python-version"),"utf-8")).trim();ze&&(Q=ze);}catch{}let{syncWorkspaceFoundationFiles:se}=await import('./create-LUXJGSNL.js'),ke=await se(P,{workspaceName:h.basename(P),installMethod:N,pythonVersion:Q,profile:L,writeMarker:true,writeGitignore:true,onlyIfMissing:true});k.push({id:"workspace.legacy.sync",status:ke.length>0?"passed":"skipped",message:ke.length>0?`Legacy workspace foundation synchronized: ${ke.join(", ")}`:"Workspace foundation files are already up to date."});}catch(x){k.push({id:"workspace.legacy.sync",status:"failed",message:`Failed to synchronize legacy workspace foundation files: ${x.message}`});}if(P&&z&&z!==C)try{let x=h.join(P,".rapidkit","workspace.json"),N=await j.promises.readFile(x,"utf-8"),Q=JSON.parse(N);Q.profile=z,await j.promises.writeFile(x,JSON.stringify(Q,null,2)+`
|
|
201
|
-
`,"utf-8");}catch{}let O={mode:"warn",dependency_sharing_mode:"isolated",rules:{enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true}},Pe=null;if(P)try{let x=await j.promises.readFile(h.join(P,".rapidkit","policies.yml"),"utf-8");Pe=x,O=a(x);}catch{k.push({id:"policy.file",status:"skipped",message:"No workspace policy file found; using default bootstrap policy."});}else k.push({id:"workspace.detect",status:"skipped",message:"No workspace marker found; bootstrap runs in project/single-path mode."});if(P){let x=Ai(Pe);O.dependency_sharing_mode=x.mode,k.push({id:"policy.schema.dependency_sharing_mode",status:x.status,message:x.message}),k.push({id:"policy.dependency_sharing_mode.effective",status:"passed",message:O.dependency_sharing_mode==="isolated"?"Effective dependency mode: isolated (default secure mode).":O.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 N=j.existsSync(h.join(P,".rapidkit-workspace"));k.push({id:"policy.enforce_workspace_marker",status:!O.rules.enforce_workspace_marker||N?"passed":"failed",message:!O.rules.enforce_workspace_marker||N?"Workspace marker policy satisfied.":"Workspace marker policy failed: .rapidkit-workspace is missing."});let Q=j.existsSync(h.join(P,".rapidkit","toolchain.lock"));k.push({id:"policy.enforce_toolchain_lock",status:!O.rules.enforce_toolchain_lock||Q?"passed":"failed",message:!O.rules.enforce_toolchain_lock||Q?"Toolchain lock policy satisfied.":"Toolchain lock policy failed: .rapidkit/toolchain.lock is missing."});let se=process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||j.existsSync(h.join(P,".rapidkit","trusted-sources.lock"));k.push({id:"policy.disallow_untrusted_tool_sources",status:!O.rules.disallow_untrusted_tool_sources||se?"passed":"failed",message:!O.rules.disallow_untrusted_tool_sources||se?"Trusted tool sources policy satisfied.":"Trusted tool sources policy failed: set RAPIDKIT_TRUSTED_SOURCES=1 or provide .rapidkit/trusted-sources.lock."});let ke=h.join(P,".rapidkit","compatibility-matrix.json"),Ee=j.existsSync(ke),ze=O.rules.enforce_compatibility_matrix;if(k.push({id:"policy.enforce_compatibility_matrix",status:!ze||Ee?"passed":"failed",message:!ze||Ee?"Compatibility matrix policy satisfied.":"Compatibility matrix policy failed: .rapidkit/compatibility-matrix.json is missing."}),Ee)try{let B=await j.promises.readFile(ke,"utf-8"),ee=JSON.parse(B),Ut=!!ee&&typeof ee=="object";k.push({id:"compatibility.matrix.parse",status:Ut?"passed":"failed",message:Ut?"Compatibility matrix parsed successfully.":"Compatibility matrix parse failed: invalid JSON object."});}catch{k.push({id:"compatibility.matrix.parse",status:"failed",message:"Compatibility matrix parse failed: invalid JSON."});}let Nt=h.join(P,".rapidkit","mirror-config.json"),Ni=h.join(P,".rapidkit","mirror.lock"),Tr=j.existsSync(Nt),Wr=j.existsSync(Ni),zo={};if(Tr)try{zo=JSON.parse(await j.promises.readFile(Nt,"utf-8")),k.push({id:"mirror.config.parse",status:"passed",message:"Mirror configuration parsed successfully."});}catch{k.push({id:"mirror.config.parse",status:"failed",message:"Mirror configuration parse failed: invalid JSON in .rapidkit/mirror-config.json."});}let Fr=await Ro(P,{ciMode:f,offlineMode:
|
|
202
|
-
`):(console.log(i.red("\u274C Bootstrap blocked by strict policy checks.")),console.log(i.gray(`Compliance report: ${q}`))),1}let Ne=0;
|
|
203
|
-
`);else {let x=k.filter(N=>N.status==="failed").length;x>0&&console.log(i.yellow(`\u26A0\uFE0F Bootstrap completed with ${x} policy/profile warnings.`)),console.log(i.gray(`Compliance report: ${q}`));}return Ne}finally{typeof r>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=r;}}async function fi(t){if(t.includes("--help")||t.includes("-h"))return console.log(i.yellow("Usage: rapidkit setup <python|node|go|java|dotnet> [--warm-deps]")),0;let e=(t[1]||"").toLowerCase(),r=t.includes("--warm-deps")||t.includes("--warm-dependencies");if(!e||!["python","node","go","java","dotnet"].includes(e))return console.log(i.yellow("Usage: rapidkit setup <python|node|go|java|dotnet> [--warm-deps]")),1;let o=async(
|
|
204
|
-
${I.stderr||""}`.match(/version\s+"([^"]+)"/i);w=z?z[1]:null;let oe=j.existsSync(h.join(
|
|
205
|
-
${Pe.stderr||""}`.match(/Apache Maven\s+(\S+)/i);v=K?K[1]:null;}else if(L){y="gradle";let O=(()=>{let S=h.join(
|
|
199
|
+
`;await j.promises.writeFile(o,n,"utf-8");}function vl(t){let e=t.trim().toLowerCase();return e==="true"||e==="1"||e==="on"?true:e==="false"||e==="0"||e==="off"?false:null}function _i(t){if(!t)return "isolated";let r=t.match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();return r==="shared-runtime-caches"||r==="shared-node-deps"||r==="isolated"?r:"isolated"}function Ai(t){if(!t)return {mode:"isolated",status:"skipped",message:"No policies.yml found; dependency_sharing_mode defaults to isolated."};let e=t.match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m);if(!e)return {mode:"isolated",status:"skipped",message:"dependency_sharing_mode is not set; defaulting to isolated."};let r=e[1].toLowerCase();return r==="isolated"||r==="shared-runtime-caches"||r==="shared-node-deps"?{mode:r,status:"passed",message:`dependency_sharing_mode is valid: ${r}.`}:{mode:"isolated",status:"failed",message:`Invalid dependency_sharing_mode: ${r}. Use one of: isolated, shared-runtime-caches, shared-node-deps.`}}async function Ii(t,e){let r=re(t),o=r?h.join(r,".rapidkit","policies.yml"):null,n="isolated";if(o&&await R__default.pathExists(o))try{let c=await j.promises.readFile(o,"utf-8"),l=Ai(c);if(l.status==="failed")return console.log(i.red(`\u274C ${l.message}`)),{ok:false,code:1};n=l.mode;}catch{return console.log(i.red("\u274C Failed to read workspace policy file (.rapidkit/policies.yml).")),{ok:false,code:1}}let s=process.env.RAPIDKIT_DEP_SHARING_MODE,a=process.env.RAPIDKIT_WORKSPACE_PATH;process.env.RAPIDKIT_DEP_SHARING_MODE=n,r&&(process.env.RAPIDKIT_WORKSPACE_PATH=r);try{return {ok:true,value:await e()}}finally{typeof s>"u"?delete process.env.RAPIDKIT_DEP_SHARING_MODE:process.env.RAPIDKIT_DEP_SHARING_MODE=s,typeof a>"u"?delete process.env.RAPIDKIT_WORKSPACE_PATH:process.env.RAPIDKIT_WORKSPACE_PATH=a;}}async function U(t,e,r){return await new Promise(o=>{let n=spawn(t,e,{stdio:["ignore","pipe","pipe"],cwd:r,shell:b$6()});n.stdout?.on("data",s=>{process.stdout.write(s);}),n.stderr?.on("data",s=>{process.stderr.write(s);}),n.on("close",s=>o(s??1)),n.on("error",()=>o(1));})}async function yt(t,e){await R__default.outputFile(t,`${JSON.stringify(e,null,2)}
|
|
200
|
+
`,"utf-8");}async function Pl(t,e,r){let o=process.env.RAPIDKIT_TEST_IMPORT_SYNC_FAIL==="1"&&(process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"),n=e.workspace?h.resolve(e.workspace):null,s=n??re(process.cwd()),a=false,c=false;if(n){if(!Je(n)){let p=`Workspace path is not a valid RapidKit workspace: ${n}`;return e.json?console.log(JSON.stringify({error:p},null,2)):console.log(i.red(`\u274C ${p}`)),1}}else if(!s||!Je(s)){let p=await Ho();s=p.workspacePath,a=true,c=p.created;}if(!s||!Je(s)){let p="Not inside a RapidKit workspace";return e.json?console.log(JSON.stringify({error:p},null,2)):(console.log(i.red(`\u274C ${p}`)),console.log(i.gray("\u{1F4A1} Run this command from a workspace root or pass --workspace <path>."))),1}let l=`cd ${s}`,f=r?.syncWorkspaceProjects??(async p=>{if(o)throw new Error("forced sync failure for command-level import rollback test");let{syncWorkspaceProjects:d}=await import('./workspace-ZDL5IQU4.js');await d(p,true),await Ze(p,{silent:true});}),u=r?.rollbackImportedProjectImport??zs;try{let p=await Ys({workspacePath:s,source:t,name:e.name,sourceType:e.git===true?"git-url":void 0,enableModules:e.enableModules});try{await f(s);}catch(d){await u(s,p.path);try{await f(s);}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:s,workspaceResolution:a?"default-auto":n?"explicit":"nearest",defaultWorkspaceCreated:a?c:false,suggestedCdCommand:l,importedProject:p},null,2)),0):(a&&console.log(i.yellow(`\u2139 Imported outside a workspace, so RapidKit used the default workspace: ${s}`)),console.log(i.green(`\u2714 Imported project: ${p.name}`)),console.log(i.gray(` Workspace: ${s}`)),console.log(i.gray(` Destination: ${p.path}`)),console.log(i.gray(` Stack: ${p.stack} (${p.confidence})`)),console.log(i.gray(` Source: ${e.git===true||_o(t)?"git-url":"local-folder"}`)),console.log(i.gray(` Next shell step: ${l}`)),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(i.red(`\u274C Import failed: ${d}`)),1}}async function jl(t,e,r){let o=h.resolve(t||process.cwd()),n=e.workspace?h.resolve(e.workspace):null,s=n??re(process.cwd()),a=false,c=false;if(n){if(!Je(n)){let m=`Workspace path is not a valid RapidKit workspace: ${n}`;return e.json?console.log(JSON.stringify({error:m},null,2)):console.log(i.red(`\u274C ${m}`)),1}}else if(!s||!Je(s)){let m=await Ho();s=m.workspacePath,a=true,c=m.created;}if(!s||!Je(s)){let m="Not inside a RapidKit workspace";return e.json?console.log(JSON.stringify({error:m},null,2)):(console.log(i.red(`\u274C ${m}`)),console.log(i.gray("\u{1F4A1} Run this command from a workspace root or pass --workspace <path>."))),1}let l=process.env.RAPIDKIT_TEST_ADOPT_SYNC_FAIL==="1"&&(process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"),f=r?.syncWorkspaceProjects??(async m=>{if(l)throw new Error("forced sync failure for command-level adopt rollback test");let{syncWorkspaceProjects:g}=await import('./workspace-ZDL5IQU4.js');await g(m,true),await Ze(m,{silent:true});}),u=r?.registerProjectInWorkspace??(async(m,g,w)=>{let{registerProjectInWorkspace:y}=await import('./workspace-ZDL5IQU4.js');await y(m,g,w);}),p=r?.registerWorkspace??(async(m,g)=>{let{registerWorkspace:w}=await import('./workspace-ZDL5IQU4.js');await w(m,g);}),d=r?.rollbackAdoptedProjectImport??Qs;try{let m=h.join(o,".rapidkit","project.json"),g=await R__default.pathExists(m)?await R__default.readJson(m):null,w=await Zs({workspacePath:s,source:o,name:e.name,dryRun:e.dryRun===true,enableModules:e.enableModules});if(e.dryRun!==true)try{await p(s,h.basename(s)),await u(s,w.name,w.path),await f(s);}catch(y){throw await d(s,w.path,g),new Error(`Workspace sync failed after adopt and adoption metadata was rolled back: ${y instanceof Error?y.message:String(y)}`)}return e.json?(console.log(JSON.stringify({workspacePath:s,workspaceResolution:a?"default-auto":n?"explicit":"nearest",defaultWorkspaceCreated:a?c:false,dryRun:e.dryRun===true,adoptedProject:w},null,2)),0):(a&&console.log(i.yellow(`\u2139 Adopted outside a workspace, so RapidKit used the default workspace: ${s}`)),e.dryRun===true&&console.log(i.yellow("\u2139 Dry run: no adoption files were written.")),console.log(i.green(`\u2714 Adopted project: ${w.name}`)),console.log(i.gray(` Workspace: ${s}`)),console.log(i.gray(` Project: ${w.path}`)),console.log(i.gray(" Mode: linked (source was not moved or copied)")),console.log(i.gray(` Stack: ${w.stack} (${w.confidence})`)),console.log(i.gray(` Report: ${w.adoptReadinessPath}`)),console.log(i.gray(" Next: npx rapidkit workspace model --json")),0)}catch(m){let g=m instanceof Error?m.message:String(m);return e.json?console.log(JSON.stringify({error:g},null,2)):console.log(i.red(`\u274C Adopt failed: ${g}`)),1}}async function Bo(t){let e=new Set(["python-only","polyglot","enterprise"]),r="minimal";try{let s=h.join(t,".rapidkit","workspace.json");r=JSON.parse(await j.promises.readFile(s,"utf-8")).profile??"minimal";}catch{r="minimal";}if(!await(async()=>{if(e.has(r))return true;let s=await Uo(t);if(s.length===0)return false;for(let a of s){let c=a$4(a),l=c?.module_support;if(!(b$3(c,a)||d(c,a)||e$2(c,a))&&l!==false)return f$1(c,a)||c$1(c,a),true}return false})())return 0;let n="poetry";try{let{readWorkspaceMarker:s}=await import('./workspace-marker-IOPQ42A7.js'),c=(await s(t))?.metadata?.npm?.installMethod;(c==="poetry"||c==="venv"||c==="pipx"||c==="pip")&&(n=c);}catch{}if(n==="poetry"||n==="venv"){let s=h.join(t,"pyproject.toml"),a=false;try{a=(await j.promises.readFile(s,"utf-8")).includes("rapidkit-core");}catch{a=false;}let c=process.env.RAPIDKIT_DEV_PATH,l=c?await R__default.pathExists(c):false;if(a){let f=Xc(t);if(!await R__default.pathExists(f)){let d=await el(t);if(d!==0)return d}let p=await U(f,l&&c?["-m","pip","install",c,"--quiet","--disable-pip-version-check"]:["-m","pip","install","rapidkit-core","--quiet","--disable-pip-version-check"],t);if(p!==0)return p}else {let f=await U("poetry",["install","--no-root"],t);if(f!==0)return f;let u=await U("poetry",["add","rapidkit-core"],t);if(u!==0)return u}try{let{writeWorkspaceLauncher:f}=await import('./create-7R4CGABE.js');await f(t,n==="venv"?"venv":"poetry");}catch{}return 0}return 0}async function Uo(t){let e=[],r=new Set,o=[t];for(;o.length>0;){let n=o.pop();if(!n||r.has(n))continue;r.add(n);let s=[];try{s=await j.promises.readdir(n,{withFileTypes:true});}catch{continue}for(let a of s){if(!a.isDirectory()||a.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(a.name))continue;let c=h.join(n,a.name),l=h.join(c,".rapidkit","context.json"),f=h.join(c,".rapidkit","project.json");if(await R__default.pathExists(l)||await R__default.pathExists(f)){e.push(c);continue}o.push(c);}}return e}function bl(t){return ti(t)}async function Ho(){let t=ri(),e=h.basename(t),r=Je(t);await R__default.ensureDir(h.join(t,".rapidkit")),await b$4(t,d$2(e,b()));let o=h.join(t,".rapidkit","workspace.json");return await R__default.pathExists(o)||await yt(o,{name:e,workspace_name:e,profile:"minimal",createdAt:new Date().toISOString(),createdBy:"rapidkit-npm-import-fallback"}),{workspacePath:t,created:!r}}async function Wo(t){let r=await Ve("go",{runCommandInCwd:U,runCoreRapidkit:e$1}).initProject(t);return Z(r)}function Z(t){return t.message&&console.log(i.red(`\u274C ${t.message}`)),t.exitCode}async function ht(t,e){let r=Ve("node",{runCommandInCwd:U,runCoreRapidkit:e$1});if(t==="init"){let n=await r.initProject(e);return Z(n)}if(t==="dev"){let n=await r.runDev(e);return Z(n)}if(t==="test"){let n=await r.runTest(e);return Z(n)}if(t==="build"){let n=await r.runBuild(e);return Z(n)}if(t==="lint"){let n=await r.runLint?.(e);return Z(n??{exitCode:1,message:"Lint is not supported."})}if(t==="format"){let n=await r.runFormat?.(e);return Z(n??{exitCode:1,message:"Format is not supported."})}let o=await r.runStart(e);return Z(o)}async function Qe(t,e){let r=Ve("java",{runCommandInCwd:U,runCoreRapidkit:e$1});if(t==="init"){let n=await r.initProject(e);return Z(n)}if(t==="dev"){let n=await r.runDev(e);return Z(n)}if(t==="test"){let n=await r.runTest(e);return Z(n)}if(t==="build"){let n=await r.runBuild(e);return Z(n)}if(t==="lint"){let n=await r.runLint?.(e);return Z(n??{exitCode:1,message:"Lint is not supported."})}if(t==="format"){let n=await r.runFormat?.(e);return Z(n??{exitCode:1,message:"Format is not supported."})}let o=await r.runStart(e);return Z(o)}async function mi(t,e=Vo){let r=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof r>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let s=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 se=x.match(/^\s*mode:\s*([a-zA-Z]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase()==="strict"?"strict":"warn",ke=(Ee,ze)=>{let Nt=x.match(new RegExp(`^\\s*${Ee}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return Nt?Nt[1].toLowerCase()==="true":ze};return {mode:se,dependency_sharing_mode:_i(x),rules:{enforce_workspace_marker:ke("enforce_workspace_marker",true),enforce_toolchain_lock:ke("enforce_toolchain_lock",false),disallow_untrusted_tool_sources:ke("disallow_untrusted_tool_sources",false),enforce_compatibility_matrix:ke("enforce_compatibility_matrix",false),require_mirror_lock_for_offline:ke("require_mirror_lock_for_offline",true)}}};let c=["init"],l,f=false,u=false,p=false,d$1=false;for(let x=1;x<t.length;x+=1){let N=t[x];if(N==="--ci"){f=true;continue}if(N==="--offline"){u=true;continue}if(N==="--json"){p=true;continue}if(N==="--compliance-only"){d$1=true;continue}if(N==="--profile"){let Q=t[x+1];if(!Q||Q.startsWith("-"))return console.log(i.yellow("Usage: rapidkit bootstrap [path] [--profile <minimal|java-only|go-only|dotnet-only|python-only|node-only|polyglot|enterprise>] [--ci] [--offline] [--json] [--compliance-only]")),1;l=Q,x+=1;continue}if(N.startsWith("--profile=")){l=N.slice(10);continue}c.push(N);}let m=s(l);if(l&&!m)return console.log(i.red(`Invalid profile: ${l}. Use one of: minimal, java-only, go-only, dotnet-only, python-only, node-only, polyglot, enterprise.`)),1;let g=process.cwd(),w=c.slice(1).filter(x=>!x.startsWith("-"));if(w.length>0){let x=h.resolve(g,w[0]),N=a$4(x),Q=j.existsSync(x)?await wt(x):"unknown";if(!Je(x)&&(b$3(N,x)||d(N,x)||e$2(N,x)||c$1(N,x)||f$1(N,x)||Q!=="unknown"))return await e(c)}let y=h.join(g,".rapidkit-workspace"),v=h.join(g,".rapidkit","workspace.json"),P;!j.existsSync(y)&&j.existsSync(v)?P=g:(P=re(g),P||(P=gl(g)));let k=[],E=null,C=null;if(P)try{let x=h.join(P,".rapidkit","workspace.json"),N=await j.promises.readFile(x,"utf-8"),Q=JSON.parse(N);C=s(Q.profile);}catch{C=null;}let I=["minimal","java-only","python-only","node-only","go-only","dotnet-only","polyglot","enterprise"],H={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"},z=m;if(!!P&&!m&&!f&&!p&&!!process.stdin.isTTY&&!!process.stdout.isTTY){let x=C||"minimal",{chosenProfile:N}=await He.prompt([{type:"rawlist",name:"chosenProfile",message:`Select workspace profile for bootstrap (current: ${x})`,choices:I.map(Q=>({name:Q===x?`${H[Q]} \u2190 current`:H[Q],value:Q})),default:I.indexOf(x)}]);z=N;}let L=z||C||"minimal";if(P)try{let N=L==="python-only"||L==="polyglot"||L==="enterprise"?"poetry":"venv",Q;try{let ze=(await j.promises.readFile(h.join(P,".python-version"),"utf-8")).trim();ze&&(Q=ze);}catch{}let{syncWorkspaceFoundationFiles:se}=await import('./create-7R4CGABE.js'),ke=await se(P,{workspaceName:h.basename(P),installMethod:N,pythonVersion:Q,profile:L,writeMarker:true,writeGitignore:true,onlyIfMissing:true});k.push({id:"workspace.legacy.sync",status:ke.length>0?"passed":"skipped",message:ke.length>0?`Legacy workspace foundation synchronized: ${ke.join(", ")}`:"Workspace foundation files are already up to date."});}catch(x){k.push({id:"workspace.legacy.sync",status:"failed",message:`Failed to synchronize legacy workspace foundation files: ${x.message}`});}if(P&&z&&z!==C)try{let x=h.join(P,".rapidkit","workspace.json"),N=await j.promises.readFile(x,"utf-8"),Q=JSON.parse(N);Q.profile=z,await j.promises.writeFile(x,JSON.stringify(Q,null,2)+`
|
|
201
|
+
`,"utf-8");}catch{}let O={mode:"warn",dependency_sharing_mode:"isolated",rules:{enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true}},Pe=null;if(P)try{let x=await j.promises.readFile(h.join(P,".rapidkit","policies.yml"),"utf-8");Pe=x,O=a(x);}catch{k.push({id:"policy.file",status:"skipped",message:"No workspace policy file found; using default bootstrap policy."});}else k.push({id:"workspace.detect",status:"skipped",message:"No workspace marker found; bootstrap runs in project/single-path mode."});if(P){let x=Ai(Pe);O.dependency_sharing_mode=x.mode,k.push({id:"policy.schema.dependency_sharing_mode",status:x.status,message:x.message}),k.push({id:"policy.dependency_sharing_mode.effective",status:"passed",message:O.dependency_sharing_mode==="isolated"?"Effective dependency mode: isolated (default secure mode).":O.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 N=j.existsSync(h.join(P,".rapidkit-workspace"));k.push({id:"policy.enforce_workspace_marker",status:!O.rules.enforce_workspace_marker||N?"passed":"failed",message:!O.rules.enforce_workspace_marker||N?"Workspace marker policy satisfied.":"Workspace marker policy failed: .rapidkit-workspace is missing."});let Q=j.existsSync(h.join(P,".rapidkit","toolchain.lock"));k.push({id:"policy.enforce_toolchain_lock",status:!O.rules.enforce_toolchain_lock||Q?"passed":"failed",message:!O.rules.enforce_toolchain_lock||Q?"Toolchain lock policy satisfied.":"Toolchain lock policy failed: .rapidkit/toolchain.lock is missing."});let se=process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||j.existsSync(h.join(P,".rapidkit","trusted-sources.lock"));k.push({id:"policy.disallow_untrusted_tool_sources",status:!O.rules.disallow_untrusted_tool_sources||se?"passed":"failed",message:!O.rules.disallow_untrusted_tool_sources||se?"Trusted tool sources policy satisfied.":"Trusted tool sources policy failed: set RAPIDKIT_TRUSTED_SOURCES=1 or provide .rapidkit/trusted-sources.lock."});let ke=h.join(P,".rapidkit","compatibility-matrix.json"),Ee=j.existsSync(ke),ze=O.rules.enforce_compatibility_matrix;if(k.push({id:"policy.enforce_compatibility_matrix",status:!ze||Ee?"passed":"failed",message:!ze||Ee?"Compatibility matrix policy satisfied.":"Compatibility matrix policy failed: .rapidkit/compatibility-matrix.json is missing."}),Ee)try{let B=await j.promises.readFile(ke,"utf-8"),ee=JSON.parse(B),Ut=!!ee&&typeof ee=="object";k.push({id:"compatibility.matrix.parse",status:Ut?"passed":"failed",message:Ut?"Compatibility matrix parsed successfully.":"Compatibility matrix parse failed: invalid JSON object."});}catch{k.push({id:"compatibility.matrix.parse",status:"failed",message:"Compatibility matrix parse failed: invalid JSON."});}let Nt=h.join(P,".rapidkit","mirror-config.json"),Ni=h.join(P,".rapidkit","mirror.lock"),Tr=j.existsSync(Nt),Wr=j.existsSync(Ni),zo={};if(Tr)try{zo=JSON.parse(await j.promises.readFile(Nt,"utf-8")),k.push({id:"mirror.config.parse",status:"passed",message:"Mirror configuration parsed successfully."});}catch{k.push({id:"mirror.config.parse",status:"failed",message:"Mirror configuration parse failed: invalid JSON in .rapidkit/mirror-config.json."});}let Fr=await Ro(P,{ciMode:f,offlineMode:u});if(k.push(...Fr.checks.map(B=>({id:B.id,status:B.status,message:B.message}))),E=Fr.details,Fr.details.lockWritten&&(Wr=true),u){let B=process.env.RAPIDKIT_MIRROR_ENABLED==="1"||zo.enabled===true;k.push({id:"offline.mirror.enabled",status:B?"passed":"failed",message:B?"Offline mode mirror is enabled.":'Offline mode requires mirror enablement (set RAPIDKIT_MIRROR_ENABLED=1 or .rapidkit/mirror-config.json {"enabled": true}).'});let ee=O.rules.require_mirror_lock_for_offline;k.push({id:"offline.mirror.lock",status:!ee||Wr?"passed":"failed",message:!ee||Wr?"Offline mode mirror lock policy satisfied.":"Offline mode mirror lock policy failed: .rapidkit/mirror.lock is missing."});}else k.push({id:"offline.mirror.enabled",status:"skipped",message:"Offline mirror checks skipped (offline mode is disabled)."});let Di=await Uo(P),ie=new Set;for(let B of Di){let ee=a$4(B);if(b$3(ee,B)){ie.add("go");continue}if(d(ee,B)){ie.add("java");continue}if(e$2(ee,B)){ie.add("dotnet");continue}if(c$1(ee,B)){ie.add("node");continue}if(f$1(ee,B)){ie.add("python");continue}ie.add("unknown");}if(L==="go-only"){let B=ie.size===0||[...ie].every(ee=>ee==="go");k.push({id:"profile.go-only",status:B?"passed":"failed",message:B?"go-only profile validated for discovered projects.":`go-only profile mismatch: detected runtimes [${[...ie].join(", ")}].`});}else if(L==="java-only"){let B=ie.size===0||[...ie].every(ee=>ee==="java");k.push({id:"profile.java-only",status:B?"passed":"failed",message:B?"java-only profile validated for discovered projects.":`java-only profile mismatch: detected runtimes [${[...ie].join(", ")}].`});}else if(L==="dotnet-only"){let B=ie.size===0||[...ie].every(ee=>ee==="dotnet");k.push({id:"profile.dotnet-only",status:B?"passed":"failed",message:B?"dotnet-only profile validated for discovered projects.":`dotnet-only profile mismatch: detected runtimes [${[...ie].join(", ")}].`});}else if(L==="python-only"){let B=ie.size===0||[...ie].every(ee=>ee==="python");k.push({id:"profile.python-only",status:B?"passed":"failed",message:B?"python-only profile validated for discovered projects.":`python-only profile mismatch: detected runtimes [${[...ie].join(", ")}].`});}else if(L==="node-only"){let B=ie.size===0||[...ie].every(ee=>ee==="node");k.push({id:"profile.node-only",status:B?"passed":"failed",message:B?"node-only profile validated for discovered projects.":`node-only profile mismatch: detected runtimes [${[...ie].join(", ")}].`});}else if(L==="minimal"){let B=[...ie].filter(Ut=>Ut!=="unknown"),ee=B.length<=1;k.push({id:"profile.minimal",status:ee?"passed":"failed",message:ee?"minimal profile is compatible with detected runtime mix.":`minimal profile mismatch: multiple runtimes detected [${B.join(", ")}].`});}else L==="enterprise"&&(k.push({id:"profile.enterprise.ci",status:f?"passed":"failed",message:f?"enterprise profile running with --ci.":"enterprise profile expects --ci for deterministic non-interactive mode."}),k.push({id:"profile.enterprise.compatibility-matrix",status:Ee?"passed":"failed",message:Ee?"enterprise profile has compatibility matrix.":"enterprise profile requires .rapidkit/compatibility-matrix.json."}),k.push({id:"profile.enterprise.mirror-config",status:Tr?"passed":"failed",message:Tr?"enterprise profile has mirror configuration.":"enterprise profile requires .rapidkit/mirror-config.json."}));}f&&(process.env.RAPIDKIT_BOOTSTRAP_CI="1"),u&&(process.env.RAPIDKIT_OFFLINE_MODE="1");let K=k.some(x=>x.id.startsWith("policy.schema.")&&x.status==="failed")||O.mode==="strict"&&k.some(x=>x.status==="failed"),S=P||g,X=h.join(S,".rapidkit","reports"),ce=new Date().toISOString().replace(/[:.]/g,"-"),q=h.join(X,`bootstrap-compliance-${ce}.json`),we=h.join(X,"bootstrap-compliance.latest.json"),Ae={command:"bootstrap",timestamp:new Date().toISOString(),workspacePath:P,profile:L,options:{ci:f,offline:u,strict:O.mode==="strict"},policyMode:O.mode,policyRules:O.rules,mirrorLifecycle:E,checks:k};if(K){let x={...Ae,result:"blocked",initExitCode:null};return await R__default.ensureDir(X),await yt(q,x),await yt(we,x),p?process.stdout.write(`${JSON.stringify(x,null,2)}
|
|
202
|
+
`):(console.log(i.red("\u274C Bootstrap blocked by strict policy checks.")),console.log(i.gray(`Compliance report: ${q}`))),1}let Ne=0;p&&d$1||(Ne=await e(c));let Re=k.filter(x=>x.status==="failed").length,G=Ne!==0?"failed":Re>0?"ok_with_warnings":"ok",dt={...Ae,result:G,initExitCode:Ne,complianceOnly:p&&d$1};if(await R__default.ensureDir(X),await yt(q,dt),await yt(we,dt),P&&Ne===0)try{let{syncWorkspaceProjects:x}=await import('./workspace-ZDL5IQU4.js');await x(P,p),await Ze(P,{silent:p});}catch{}if(p)process.stdout.write(`${JSON.stringify(dt,null,2)}
|
|
203
|
+
`);else {let x=k.filter(N=>N.status==="failed").length;x>0&&console.log(i.yellow(`\u26A0\uFE0F Bootstrap completed with ${x} policy/profile warnings.`)),console.log(i.gray(`Compliance report: ${q}`));}return Ne}finally{typeof r>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=r;}}async function fi(t){if(t.includes("--help")||t.includes("-h"))return console.log(i.yellow("Usage: rapidkit setup <python|node|go|java|dotnet> [--warm-deps]")),0;let e=(t[1]||"").toLowerCase(),r=t.includes("--warm-deps")||t.includes("--warm-dependencies");if(!e||!["python","node","go","java","dotnet"].includes(e))return console.log(i.yellow("Usage: rapidkit setup <python|node|go|java|dotnet> [--warm-deps]")),1;let o=async(p,d)=>{if(p==="node"){if(!j.existsSync(h.join(d,"package.json")))return {exitCode:0,message:"Node warm-up skipped: package.json not found in current directory."};let g=j.existsSync(h.join(d,"pnpm-lock.yaml")),w=j.existsSync(h.join(d,"yarn.lock"));return g?{exitCode:await U("pnpm",["install","--lockfile-only","--ignore-scripts"],d)}:w?{exitCode:await U("yarn",["install","--ignore-scripts"],d)}:{exitCode:await U("npm",["install","--package-lock-only","--ignore-scripts"],d)}}if(p==="go")return j.existsSync(h.join(d,"go.mod"))?{exitCode:await U("go",["mod","download"],d)}:{exitCode:0,message:"Go warm-up skipped: go.mod not found in current directory."};if(p==="java"){let m=j.existsSync(h.join(d,"pom.xml")),g=j.existsSync(h.join(d,"build.gradle"))||j.existsSync(h.join(d,"build.gradle.kts")),w=h.join(d,process.platform==="win32"?"gradlew.bat":"gradlew"),y=j.existsSync(w);return !m&&!g?{exitCode:0,message:"Java warm-up skipped: pom.xml or build.gradle not found in current directory."}:m?{exitCode:await U("mvn",["-B","-q","-DskipTests","dependency:go-offline"],d)}:{exitCode:await U(y?w:"gradle",["--no-daemon","dependencies"],d)}}return p==="dotnet"?(()=>{let g=[{dir:d,depth:0}],w=new Set(["bin","obj",".git","node_modules",".rapidkit"]);for(;g.length>0;){let y=g.shift();if(!y||y.depth>3)continue;let v=[];try{v=j.readdirSync(y.dir,{withFileTypes:true});}catch{continue}for(let P of v)if(P.isFile()){let k=P.name.toLowerCase();if(k.endsWith(".sln")||k.endsWith(".csproj"))return true}else P.isDirectory()&&!w.has(P.name)&&g.push({dir:h.join(y.dir,P.name),depth:y.depth+1});}return false})()?{exitCode:await U("dotnet",["restore"],d)}:{exitCode:0,message:".NET warm-up skipped: .sln or *.csproj not found in current project tree."}:{exitCode:0,message:"Dependency warm-up currently applies to node/go/java/dotnet runtimes."}},n=Ve(e,{runCommandInCwd:U,runCoreRapidkit:(p,d)=>e$1(p,{...d,cwd:void 0})}),s=await n.checkPrereqs(),a=await n.doctorHints(process.cwd()),c=re(process.cwd()),l=c||process.cwd(),f=null,u=async()=>e!=="java"||!c?[]:f||(f=(await Uo(c)).filter(d$1=>{let m=a$4(d$1);return d(m,d$1)}),f);if(s.exitCode===0){console.log(i.green(`\u2705 ${e} prerequisites look good.`));let p=["python","node","go","java","dotnet"].filter(d=>d!==e).join("/");if(console.log(i.gray(` Scope: validated ${e} runtime only. ${p} checks are optional unless your workspace profile uses them.`)),e==="python"&&console.log(i.gray(" Note: Poetry is recommended, but venv/pipx-based flows are supported in workspace creation.")),n.warmSetupCache&&((await n.warmSetupCache(l)).exitCode===0?console.log(i.gray(` ${e} cache warm-up completed.`)):console.log(i.yellow(` ${e} cache warm-up skipped (non-fatal).`))),r)if(e==="java"&&c){let d=await u();if(d.length>0){let m=0,g=0,w=0;for(let y of d){let v=await o("java",y),P=/skipped/i.test(v.message||""),k=h.relative(c,y)||h.basename(y);v.message&&console.log(i.gray(` [${k}] ${v.message}`)),v.exitCode===0&&!P?m+=1:v.exitCode===0&&P?w+=1:g+=1;}m>0&&console.log(i.gray(` java dependency warm-up completed for ${m} project(s) (--warm-deps).`)),g>0&&console.log(i.yellow(` java dependency warm-up failed for ${g} project(s) (non-fatal).`)),m===0&&g===0&&w>0&&console.log(i.gray(" java dependency warm-up skipped for discovered workspace projects."));}else {let m=await o("java",l),g=/skipped/i.test(m.message||"");m.message&&console.log(i.gray(` ${m.message}`)),m.exitCode===0&&!g?console.log(i.gray(` ${e} dependency warm-up completed (--warm-deps).`)):m.exitCode!==0&&console.log(i.yellow(` ${e} dependency warm-up failed (non-fatal).`));}}else {let d=await o(e,l),m=/skipped/i.test(d.message||"");d.message&&console.log(i.gray(` ${d.message}`)),d.exitCode===0&&!m?console.log(i.gray(` ${e} dependency warm-up completed (--warm-deps).`)):d.exitCode!==0&&console.log(i.yellow(` ${e} dependency warm-up failed (non-fatal).`));}if(c)try{let d=h.join(c,".rapidkit","toolchain.lock"),m={};try{m=JSON.parse(await j.promises.readFile(d,"utf-8"));}catch{}(!m.runtime||typeof m.runtime!="object")&&(m.runtime={});let g=m.runtime;if(e==="python"){let w=null;try{let{execa:y}=await import('execa');for(let v of qo()){let k=await y(v,v==="py"?["-3","--version"]:["--version"],{cwd:c,stdio:"pipe",reject:false,timeout:3e3});if(k.exitCode===0){let C=(k.stdout||k.stderr||"").match(/Python\s+(\S+)/);if(w=C?C[1]:null,w)break}}}catch{}g.python={...g.python||{},version:w,last_setup:new Date().toISOString()};}else if(e==="node")g.node={...g.node||{},version:process.version,last_setup:new Date().toISOString()};else if(e==="go"){let w=null;try{let{execa:y}=await import('execa'),P=((await y("go",["version"],{cwd:c,stdio:"pipe"})).stdout||"").match(/go(\d+\.\d+(?:\.\d+)?)/i);w=P?P[1]:null;}catch{}g.go={...g.go||{},version:w,last_setup:new Date().toISOString()};}else if(e==="java"){let w=null,y=null,v=null,P=await u(),E=j.existsSync(h.join(l,"pom.xml"))||j.existsSync(h.join(l,"build.gradle"))||j.existsSync(h.join(l,"build.gradle.kts"))?l:P[0]||l;try{let{execa:C}=await import('execa'),I=await C("java",["-version"],{cwd:c,stdio:"pipe",reject:false,timeout:3e3}),z=`${I.stdout||""}
|
|
204
|
+
${I.stderr||""}`.match(/version\s+"([^"]+)"/i);w=z?z[1]:null;let oe=j.existsSync(h.join(E,"pom.xml")),L=j.existsSync(h.join(E,"build.gradle"))||j.existsSync(h.join(E,"build.gradle.kts"));if(oe){y="maven";let O=(()=>{let S=h.join(E,"mvnw.cmd");if(process.platform==="win32"&&j.existsSync(S))return S;let X=h.join(E,"mvnw");return j.existsSync(X)?X:"mvn"})(),Pe=await C(O,["-version"],{cwd:E,stdio:"pipe",reject:false,timeout:3e3}),K=`${Pe.stdout||""}
|
|
205
|
+
${Pe.stderr||""}`.match(/Apache Maven\s+(\S+)/i);v=K?K[1]:null;}else if(L){y="gradle";let O=(()=>{let S=h.join(E,"gradlew.bat");if(process.platform==="win32"&&j.existsSync(S))return S;let X=h.join(E,"gradlew");return j.existsSync(X)?X:"gradle"})(),Pe=await C(O,["--version"],{cwd:E,stdio:"pipe",reject:false,timeout:3e3}),K=`${Pe.stdout||""}
|
|
206
206
|
${Pe.stderr||""}`.match(/Gradle\s+(\S+)/i);v=K?K[1]:null;}}catch{}g.java={...g.java||{},version:w,build_tool:y,build_tool_version:v,last_setup:new Date().toISOString()};}else if(e==="dotnet"){let w=null;try{let{execa:y}=await import('execa'),P=((await y("dotnet",["--version"],{cwd:c,stdio:"pipe",reject:false,timeout:3e3})).stdout||"").trim();w=P.length>0?P:null;}catch{}g.dotnet={...g.dotnet||{},version:w,sdk:w,last_setup:new Date().toISOString()};}m.updated_at=new Date().toISOString(),await j.promises.writeFile(d,JSON.stringify(m,null,2)+`
|
|
207
207
|
`,"utf-8"),console.log(i.gray(" toolchain.lock updated (.rapidkit/toolchain.lock)"));}catch{}}else console.log(i.red(`\u274C ${e} prerequisites check failed.`));if(a.length>0){console.log(i.gray(`
|
|
208
|
-
Hints:`));for(let
|
|
209
|
-
`)){let o=r.trim(),n=o.match(/^strategy:\s*(\S+)/);n&&(e.strategy=n[1].replace(/['"]]/g,""));let s=o.match(/^prune_on_bootstrap:\s*(true|false)/);s&&(e.prune_on_bootstrap=s[1]==="true");let a=o.match(/^self_heal:\s*(true|false)/);a&&(e.self_heal=a[1]==="true");let c=o.match(/^verify_integrity:\s*(true|false)/);c&&(e.verify_integrity=c[1]==="true");}return e}async function gi(t){if(t.includes("--help")||t.includes("-h"))return console.log(i.yellow("Usage: rapidkit cache <status|clear|prune|repair>")),0;let e=(t[1]||"status").toLowerCase(),r=Rr.getInstance(),o=re(process.cwd()),n={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};if(o)try{let s=await j.promises.readFile(h.join(o,".rapidkit","cache-config.yml"),"utf-8");n=xl(s);}catch{}return e==="status"?(console.log(i.cyan("RapidKit cache is enabled")),console.log(i.cyan("RapidKit cache status")),o?(console.log(i.gray(` Workspace: ${o}`)),console.log(i.gray(` Strategy: ${n.strategy}`)),console.log(i.gray(` Self-heal: ${n.self_heal}`)),console.log(i.gray(` Prune on bootstrap:${n.prune_on_bootstrap}`)),console.log(i.gray(` Verify integrity: ${n.verify_integrity}`))):console.log(i.gray(" (not inside a workspace \u2014 showing in-memory cache only)")),console.log(i.gray(" In-memory cache: enabled")),console.log(i.gray(" Use: rapidkit cache clear|prune|repair")),0):e==="clear"?(await r.clear(),console.log(i.green("Cache clear completed")),console.log(i.green("\u2705 Cache cleared (all entries removed).")),0):e==="prune"?(await r.clear(),console.log(i.green("\u2705 Cache pruned (stale entries removed).")),n.prune_on_bootstrap||console.log(i.gray(" Tip: set prune_on_bootstrap: true in .rapidkit/cache-config.yml to auto-prune on every bootstrap.")),0):e==="repair"?n.self_heal?(await r.clear(),console.log(i.green("\u2705 Cache repaired (self-heal applied, stale entries evicted).")),n.verify_integrity&&console.log(i.gray(" Integrity verification is enabled in cache-config.yml.")),0):(console.log(i.yellow("\u26A0\uFE0F self_heal is disabled in .rapidkit/cache-config.yml \u2014 skipping repair.")),0):(console.log(i.yellow("Usage: rapidkit cache <status|clear|prune|repair>")),1)}async function Sl(t,e,r,o){let n=(e||"show").toLowerCase(),s=h.join(t,".rapidkit","policies.yml");if(n==="show"||n==="status"||n==="get"){let
|
|
210
|
-
`,"utf-8"),console.log(i.gray(" mirror-config.json created with defaults (.rapidkit/mirror-config.json)"));}catch{}let
|
|
211
|
-
`),0):(console.log(i.cyan("RapidKit mirror status")),console.log(i.gray(`Workspace: ${o}`)),console.log(i.gray(`Config: ${
|
|
212
|
-
`),1;console.log(i.red("\u274C Mirror verify failed."));for(let
|
|
213
|
-
`),1;console.log(i.yellow(`\u26A0\uFE0F Mirror ${e} completed with ${
|
|
214
|
-
`),0):e==="rotate"?(console.log(i.green(`\u2705 Mirror rotate completed. Rotated files: ${p.details.rotatedFiles}.`)),0):e==="verify"?(console.log(i.green(`\u2705 Mirror verify completed. Verified artifacts: ${p.details.verifiedArtifacts}.`)),0):(console.log(i.green(`\u2705 Mirror sync completed. Synced artifacts: ${p.details.syncedArtifacts}.`)),0)}return console.log(i.yellow("Usage: rapidkit mirror <status|sync|verify|rotate> [--json]")),1}async function Vo(t){let e=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof e>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let r=process.cwd(),o=await Ii(r,async()=>{let n=re(r),s=Ve("python",{runCommandInCwd:U,runCoreRapidkit:e$1}),a=Ve("dotnet",{runCommandInCwd:U,runCoreRapidkit:e$1}),c=t.slice(1).filter(g=>!g.startsWith("-"));if(c.length>0){let g=h.resolve(r,c[0]),w=a$4(g),y=await wt(g);return b$3(w,g)||y==="go"?await Wo(g):d(w,g)||y==="java"?await Qe("init",g):e$2(w,g)||y==="dotnet"?Z(await a.initProject(g)):c$1(w,g)||y==="node"?await Oo(g):f$1(w,g)||y==="python"?await Mo(g,s):await e$1(t,{cwd:r})}let l=a$4(r),f=!!re(r)&&r===re(r);if(!f&&b$3(l,r))return await Wo(r);let
|
|
215
|
-
`).toLowerCase(),I=C.includes("\\.rapidkit\\rapidkit"),H=C.includes("\\.rapidkit\\rapidkit.cmd")||C.includes("\\.rapidkit\\rapidkit.exe")||C.includes("\\.venv\\scripts\\rapidkit.exe");return I&&!H}catch{return false}},e=process.cwd(),r=process.argv.slice(2),o=r[0],n=o==="init",s=new Set(h$2),a$2=!o||o==="--help"||o==="-h"||o==="help",c=Je(e),l=j.existsSync(h.join(e,".rapidkit","project.json")),f=a$4(e),
|
|
208
|
+
Hints:`));for(let p of a)console.log(i.gray(`- ${p}`));}return s.exitCode}function xl(t){let e={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};for(let r of t.split(`
|
|
209
|
+
`)){let o=r.trim(),n=o.match(/^strategy:\s*(\S+)/);n&&(e.strategy=n[1].replace(/['"]]/g,""));let s=o.match(/^prune_on_bootstrap:\s*(true|false)/);s&&(e.prune_on_bootstrap=s[1]==="true");let a=o.match(/^self_heal:\s*(true|false)/);a&&(e.self_heal=a[1]==="true");let c=o.match(/^verify_integrity:\s*(true|false)/);c&&(e.verify_integrity=c[1]==="true");}return e}async function gi(t){if(t.includes("--help")||t.includes("-h"))return console.log(i.yellow("Usage: rapidkit cache <status|clear|prune|repair>")),0;let e=(t[1]||"status").toLowerCase(),r=Rr.getInstance(),o=re(process.cwd()),n={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};if(o)try{let s=await j.promises.readFile(h.join(o,".rapidkit","cache-config.yml"),"utf-8");n=xl(s);}catch{}return e==="status"?(console.log(i.cyan("RapidKit cache is enabled")),console.log(i.cyan("RapidKit cache status")),o?(console.log(i.gray(` Workspace: ${o}`)),console.log(i.gray(` Strategy: ${n.strategy}`)),console.log(i.gray(` Self-heal: ${n.self_heal}`)),console.log(i.gray(` Prune on bootstrap:${n.prune_on_bootstrap}`)),console.log(i.gray(` Verify integrity: ${n.verify_integrity}`))):console.log(i.gray(" (not inside a workspace \u2014 showing in-memory cache only)")),console.log(i.gray(" In-memory cache: enabled")),console.log(i.gray(" Use: rapidkit cache clear|prune|repair")),0):e==="clear"?(await r.clear(),console.log(i.green("Cache clear completed")),console.log(i.green("\u2705 Cache cleared (all entries removed).")),0):e==="prune"?(await r.clear(),console.log(i.green("\u2705 Cache pruned (stale entries removed).")),n.prune_on_bootstrap||console.log(i.gray(" Tip: set prune_on_bootstrap: true in .rapidkit/cache-config.yml to auto-prune on every bootstrap.")),0):e==="repair"?n.self_heal?(await r.clear(),console.log(i.green("\u2705 Cache repaired (self-heal applied, stale entries evicted).")),n.verify_integrity&&console.log(i.gray(" Integrity verification is enabled in cache-config.yml.")),0):(console.log(i.yellow("\u26A0\uFE0F self_heal is disabled in .rapidkit/cache-config.yml \u2014 skipping repair.")),0):(console.log(i.yellow("Usage: rapidkit cache <status|clear|prune|repair>")),1)}async function Sl(t,e,r,o){let n=(e||"show").toLowerCase(),s=h.join(t,".rapidkit","policies.yml");if(n==="show"||n==="status"||n==="get"){let u=await ui(t),p=di(u);return console.log(i.cyan(`Policy file: ${s}`)),console.log(i.gray(` mode: ${p.mode}`)),console.log(i.gray(` dependency_sharing_mode: ${p.dependency_sharing_mode}`)),console.log(i.gray(" rules:")),console.log(i.gray(` enforce_workspace_marker: ${p.rules.enforce_workspace_marker}`)),console.log(i.gray(` enforce_toolchain_lock: ${p.rules.enforce_toolchain_lock}`)),console.log(i.gray(` disallow_untrusted_tool_sources: ${p.rules.disallow_untrusted_tool_sources}`)),console.log(i.gray(` enforce_compatibility_matrix: ${p.rules.enforce_compatibility_matrix}`)),console.log(i.gray(` require_mirror_lock_for_offline: ${p.rules.require_mirror_lock_for_offline}`)),console.log(i.gray("Examples:")),console.log(i.gray(" npx rapidkit workspace policy set mode strict")),console.log(i.gray(" npx rapidkit workspace policy set dependency_sharing_mode shared-runtime-caches")),console.log(i.gray(" npx rapidkit workspace policy set rules.enforce_toolchain_lock true")),0}if(n!=="set")return console.log(i.red(`Unknown workspace policy action: ${e||""}`)),console.log(i.gray("Available: show, set")),1;if(!r||typeof o>"u")return console.log(i.yellow("Usage: rapidkit workspace policy set <key> <value>")),console.log(i.gray("Allowed keys:")),console.log(i.gray(" mode (warn|strict)")),console.log(i.gray(" dependency_sharing_mode (isolated|shared-runtime-caches|shared-node-deps)")),console.log(i.gray(" rules.enforce_workspace_marker (true|false)")),console.log(i.gray(" rules.enforce_toolchain_lock (true|false)")),console.log(i.gray(" rules.disallow_untrusted_tool_sources (true|false)")),console.log(i.gray(" rules.enforce_compatibility_matrix (true|false)")),console.log(i.gray(" rules.require_mirror_lock_for_offline (true|false)")),1;let a=r.trim(),l=await ui(t);if(a==="mode"){let u=o.trim().toLowerCase();if(u!=="warn"&&u!=="strict")return console.log(i.red("\u274C Invalid mode. Use: warn | strict")),1;l=pi(l,"mode",`${u} # "warn" or "strict"`);}else if(a==="dependency_sharing_mode"){let u=o.trim().toLowerCase();if(u!=="isolated"&&u!=="shared-runtime-caches"&&u!=="shared-node-deps")return console.log(i.red("\u274C Invalid dependency_sharing_mode. Use: isolated | shared-runtime-caches | shared-node-deps")),1;l=pi(l,"dependency_sharing_mode",`${u} # "isolated" or "shared-runtime-caches" or "shared-node-deps"`);}else if(a.startsWith("rules.")){let u=a.slice(6);if(!(u in Ei))return console.log(i.red(`\u274C Unknown policy rule: ${u}`)),1;let p=vl(o);if(p===null)return console.log(i.red("\u274C Rule values must be boolean: true | false")),1;l=yl(l,u,p);}else return console.log(i.red(`\u274C Unknown policy key: ${a}`)),1;await kl(t,l);let f=di(l);return console.log(i.green(`\u2705 Updated ${a} in .rapidkit/policies.yml`)),console.log(i.gray(` mode: ${f.mode}`)),console.log(i.gray(` dependency_sharing_mode: ${f.dependency_sharing_mode}`)),console.log(i.gray(" Tip: run `npx rapidkit workspace policy show` to inspect all values.")),0}async function hi(t){if(t.includes("--help")||t.includes("-h"))return console.log(i.yellow("Usage: rapidkit mirror <status|sync|verify|rotate> [--json]")),0;let e=(t[1]||"status").toLowerCase(),r=t.includes("--json"),o=re(process.cwd());if(!o)return console.log(i.red("\u274C Not inside a RapidKit workspace")),console.log(i.gray("\u{1F4A1} Run this command from within a workspace directory")),1;let n=h.join(o,".rapidkit"),s=h.join(n,"mirror-config.json"),a=h.join(n,"mirror.lock"),c=h.join(n,"mirror","artifacts"),l=h.join(n,"reports");async function f(p){let d=new Date().toISOString().replace(/[:.]/g,"-"),m=h.join(l,`mirror-ops-${d}.json`),g=h.join(l,"mirror-ops.latest.json");await R__default.ensureDir(l),await yt(m,p),await yt(g,p);}async function u(){let p=await R__default.pathExists(s),d=await R__default.pathExists(a),m=0;return await R__default.pathExists(c)&&(m=(await j.promises.readdir(c,{withFileTypes:true})).filter(g=>g.isFile()).length),{configExists:p,lockExists:d,artifactsCount:m}}if(e==="status"){if(!await R__default.pathExists(s))try{let v={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 R__default.ensureDir(n),await j.promises.writeFile(s,JSON.stringify(v,null,2)+`
|
|
210
|
+
`,"utf-8"),console.log(i.gray(" mirror-config.json created with defaults (.rapidkit/mirror-config.json)"));}catch{}let d=await R__default.pathExists(s),m=await R__default.pathExists(c),g=await R__default.pathExists(a),w=m?(await j.promises.readdir(c,{withFileTypes:true})).filter(v=>v.isFile()).length:0,y={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:o,mirror:{configExists:d,lockExists:g,artifactsCount:w}};return await f(y),r?(process.stdout.write(`${JSON.stringify(y,null,2)}
|
|
211
|
+
`),0):(console.log(i.cyan("RapidKit mirror status")),console.log(i.gray(`Workspace: ${o}`)),console.log(i.gray(`Config: ${d?"present":"missing"} (${s})`)),console.log(i.gray(`Lock: ${g?"present":"missing"} (${a})`)),console.log(i.gray(`Artifacts: ${w}`)),0)}if(e==="sync"||e==="verify"||e==="rotate"){let p=await Ro(o,{ciMode:true,offlineMode:e==="verify",forceRun:true}),d=p.checks.filter(w=>w.status==="failed"),m=p.checks.some(w=>w.id.startsWith("mirror.verify.")&&w.status==="failed");if(e==="verify"&&m){let w={command:"mirror",action:e,result:"failed",timestamp:new Date().toISOString(),workspacePath:o,mirror:await u(),details:p.details,checks:p.checks};if(await f(w),r)return process.stdout.write(`${JSON.stringify(w,null,2)}
|
|
212
|
+
`),1;console.log(i.red("\u274C Mirror verify failed."));for(let y of p.checks.filter(v=>v.id.startsWith("mirror.verify.")))console.log(i.gray(`- ${y.id}: ${y.message}`));return 1}if(d.length>0){let w={command:"mirror",action:e,result:"failed",timestamp:new Date().toISOString(),workspacePath:o,mirror:await u(),details:p.details,checks:p.checks};if(await f(w),r)return process.stdout.write(`${JSON.stringify(w,null,2)}
|
|
213
|
+
`),1;console.log(i.yellow(`\u26A0\uFE0F Mirror ${e} completed with ${d.length} issue(s).`));for(let y of d)console.log(i.gray(`- ${y.id}: ${y.message}`));return 1}let g={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:o,mirror:await u(),details:p.details,checks:p.checks};return await f(g),r?(process.stdout.write(`${JSON.stringify(g,null,2)}
|
|
214
|
+
`),0):e==="rotate"?(console.log(i.green(`\u2705 Mirror rotate completed. Rotated files: ${p.details.rotatedFiles}.`)),0):e==="verify"?(console.log(i.green(`\u2705 Mirror verify completed. Verified artifacts: ${p.details.verifiedArtifacts}.`)),0):(console.log(i.green(`\u2705 Mirror sync completed. Synced artifacts: ${p.details.syncedArtifacts}.`)),0)}return console.log(i.yellow("Usage: rapidkit mirror <status|sync|verify|rotate> [--json]")),1}async function Vo(t){let e=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof e>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let r=process.cwd(),o=await Ii(r,async()=>{let n=re(r),s=Ve("python",{runCommandInCwd:U,runCoreRapidkit:e$1}),a=Ve("dotnet",{runCommandInCwd:U,runCoreRapidkit:e$1}),c=t.slice(1).filter(g=>!g.startsWith("-"));if(c.length>0){let g=h.resolve(r,c[0]),w=a$4(g),y=await wt(g);return b$3(w,g)||y==="go"?await Wo(g):d(w,g)||y==="java"?await Qe("init",g):e$2(w,g)||y==="dotnet"?Z(await a.initProject(g)):c$1(w,g)||y==="node"?await Oo(g):f$1(w,g)||y==="python"?await Mo(g,s):await e$1(t,{cwd:r})}let l=a$4(r),f=!!re(r)&&r===re(r);if(!f&&b$3(l,r))return await Wo(r);let u=await wt(r);if(!f&&(d(l,r)||u==="java"))return await Qe("init",r);if(!f&&(e$2(l,r)||u==="dotnet"))return Z(await a.initProject(r));if(!f&&(c$1(l,r)||u==="node"))return await Oo(r);if(!f&&(f$1(l,r)||u==="python"))return await Mo(r,s);let p=n||re(r),d$1=Ri(r),m=d$1?h.dirname(h.dirname(d$1)):null;if(m&&m!==p){let g=a$4(m),w=await wt(m);return b$3(g,m)||w==="go"?await Wo(m):d(g,m)||w==="java"?await Qe("init",m):e$2(g,m)||w==="dotnet"?Z(await a.initProject(m)):c$1(g,m)||w==="node"?await Oo(m):f$1(g,m)||w==="python"?await Mo(m,s):await e$1(["init"],{cwd:m})}if(p&&r===p){console.log(i.yellow("\u26A0\uFE0F Running `npx rapidkit init` at workspace root.")),console.log(i.gray(" Root `init`, `workspace init`, and `workspace run init` now share the same full-init flow:\n workspace-profile dependencies first, then project dependency initialization.\n"));let g=await Bo(p);if(g!==0)return g;let{runWorkspaceStage:w}=await import('./workspace-run-NIKH2IKF.js');return (await w({workspacePath:p,stage:"init",affected:false,blastRadius:false,parallel:false,continueOnError:false,strict:false,json:false,enforceGates:false})).summary.exitCode}if(!p){let g=await a$2(),w=Dr(),{name:y}=bl(w);await R__default.ensureDir(w);let{createProject:v}=await import('./create-7R4CGABE.js');return await v(y,{yes:true,userConfig:g,parentDirectory:w}),0}return await e$1(t,{cwd:r})});return o.ok?o.value:o.code}finally{typeof e>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=e;}}async function yi(t){let e=re(t);if(!e)return [];let r="warn";try{let l=await j.promises.readFile(h.join(e,".rapidkit","policies.yml"),"utf-8");(l.match(/^\s*enforcement_mode:\s*(warn|strict)\s*(?:#.*)?$/m)??l.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m))?.[1]==="strict"&&(r="strict");}catch{return []}if(r!=="strict")return [];let o=[],n=h.join(e,".rapidkit","toolchain.lock");if(!j.existsSync(n))return o.push("toolchain.lock is missing \u2014 run `rapidkit bootstrap` first (strict mode requires a reproducible toolchain)."),o;let s={};try{s=JSON.parse(await j.promises.readFile(n,"utf-8"));}catch{return o.push("toolchain.lock is invalid JSON \u2014 regenerate it with `rapidkit bootstrap` before running commands in strict mode."),o}let a=s.runtime??{},c=a$4(t);b$3(c,t)&&!a.go?.version?o.push("go.version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."):c$1(c,t)&&!a.node?.version?o.push("node.version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."):d(c,t)&&!a.java?.version?o.push("java.version is not pinned in toolchain.lock \u2014 run `rapidkit setup java` first."):e$2(c,t)&&!a.dotnet?.version?o.push("dotnet.version is not pinned in toolchain.lock \u2014 run `rapidkit setup dotnet` first."):f$1(c,t)&&!a.python?.version&&o.push("python.version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");try{let f=JSON.parse(await j.promises.readFile(h.join(e,".rapidkit","workspace.json"),"utf-8")).profile??"";f==="python-only"&&(b$3(c,t)||c$1(c,t)||d(c,t)||e$2(c,t))?o.push('Workspace profile is "python-only" but this project is not Python.'):f==="node-only"&&(b$3(c,t)||f$1(c,t)||d(c,t)||e$2(c,t))?o.push('Workspace profile is "node-only" but this project is not Node.'):f==="go-only"&&(c$1(c,t)||f$1(c,t)||d(c,t)||e$2(c,t))?o.push('Workspace profile is "go-only" but this project is not Go.'):f==="java-only"&&(f$1(c,t)||c$1(c,t)||b$3(c,t)||e$2(c,t))?o.push('Workspace profile is "java-only" but this project is not Java.'):f==="dotnet-only"&&(f$1(c,t)||c$1(c,t)||b$3(c,t)||d(c,t))&&o.push('Workspace profile is "dotnet-only" but this project is not .NET.');}catch{}return o}async function Cl(){let t=async k=>{if(!a()||!k.toLowerCase().endsWith(".cmd"))return false;try{let C=(await R__default.readFile(k,"utf8")).replace(/\r\n/g,`
|
|
215
|
+
`).toLowerCase(),I=C.includes("\\.rapidkit\\rapidkit"),H=C.includes("\\.rapidkit\\rapidkit.cmd")||C.includes("\\.rapidkit\\rapidkit.exe")||C.includes("\\.venv\\scripts\\rapidkit.exe");return I&&!H}catch{return false}},e=process.cwd(),r=process.argv.slice(2),o=r[0],n=o==="init",s=new Set(h$2),a$2=!o||o==="--help"||o==="-h"||o==="help",c=Je(e),l=j.existsSync(h.join(e,".rapidkit","project.json")),f=a$4(e),u=await wt(e),p=b$3(f,e)||c$1(f,e)||f$1(f,e)||d(f,e)||e$2(f,e)||m(u??void 0),d$1=!!o&&s.has(o)&&p,m$1=process.env.RAPIDKIT_LOCAL_LAUNCHER_BYPASS==="1";if(Vt(r)||r[0]==="create")return false;if(Ko(r))return true;if(r[0]==="init"&&c&&!l)return false;if(Lo(r))return true;try{let k=o==="shell"&&r[1]==="activate",E=o==="create",C=await yn(e,{cwd:e,timeoutMs:1200});if(C.ok&&C.data?.isRapidkitProject&&C.data.engine==="python"){let I=E||Vt(r);if(!a$2&&!k&&!I&&!n&&!d$1&&qr(r)){if(o&&ai.includes(o)){let z=await yi(e).catch(()=>[]);if(z.length>0){process.stderr.write(i.red("\u274C Strict policy violations prevent running this command:")+`
|
|
216
216
|
`);for(let oe of z)process.stderr.write(i.red(` \u2022 ${oe}`)+`
|
|
217
|
-
`);process.exit(1);}}let H=await e$1(process.argv.slice(2),{cwd:e});process.exit(H);}}}catch{}let g=Ri(e),w=a(),y=m$1?[]:i$1(e),v=null;for(let k of y)if(await
|
|
218
|
-
`);for(let
|
|
219
|
-
`);process.exit(1);}}if(v&&o&&ii.includes(o)&&!P&&!n&&!d$1){a$1.debug(`Delegating to local CLI: ${v} ${r.join(" ")}`);let k=o==="init"?ni():process.env,
|
|
217
|
+
`);process.exit(1);}}let H=await e$1(process.argv.slice(2),{cwd:e});process.exit(H);}}}catch{}let g=Ri(e),w=a(),y=m$1?[]:i$1(e),v=null;for(let k of y)if(await R__default.pathExists(k)){if(await t(k)){a$1.warn(`Skipping legacy/broken Windows launcher candidate: ${k}. Falling back to core bridge.`);continue}v=k;break}let P=o==="create";if(o==="init"&&c&&!l)return false;if(o&&ai.includes(o)){let k=await yi(e);if(k.length>0){process.stderr.write(i.red("\u274C Strict policy violations prevent running this command:")+`
|
|
218
|
+
`);for(let E of k)process.stderr.write(i.red(` \u2022 ${E}`)+`
|
|
219
|
+
`);process.exit(1);}}if(v&&o&&ii.includes(o)&&!P&&!n&&!d$1){a$1.debug(`Delegating to local CLI: ${v} ${r.join(" ")}`);let k=o==="init"?ni():process.env,E=spawn(v,r,{stdio:"inherit",cwd:e,shell:w,env:k});return E.on("close",C=>{process.exit(C??0);}),E.on("error",C=>{a$1.error(`Failed to run local rapidkit: ${C.message}`),process.exit(1);}),true}if(g&&await R__default.pathExists(g))try{let k=await R__default.readJson(g);if(kn(k.engine)){let E=r[0],C=m$1?[]:i$1(e),I=null;for(let H of C)if(await R__default.pathExists(H)){if(await t(H)){a$1.warn(`Skipping legacy/broken Windows launcher candidate: ${H}. Falling back to core bridge.`);continue}I=H;break}if(I&&E&&ii.includes(E)&&E!=="init"&&!d$1){a$1.debug(`Delegating to local CLI (early detection): ${I} ${r.join(" ")}`);let H=E==="init"?ni():process.env,z=spawn(I,r,{stdio:"inherit",cwd:e,env:H});return z.on("close",oe=>process.exit(oe??0)),z.on("error",oe=>{a$1.error(`Failed to run local rapidkit: ${oe.message}`),process.exit(1);}),true}if(E==="shell"&&r[1]==="activate"){let H=a()?`# RapidKit: activation snippet (PowerShell)
|
|
220
220
|
$venv = ".venv"
|
|
221
221
|
if (Test-Path "$venv\\Scripts\\Activate.ps1") { . "$venv\\Scripts\\Activate.ps1" }
|
|
222
222
|
$env:RAPIDKIT_PROJECT_ROOT = (Get-Location).Path
|
|
@@ -238,7 +238,7 @@ export PATH="$(pwd)/.rapidkit:$(pwd):$PATH"
|
|
|
238
238
|
\u2705 Activation snippet \u2014 run the following to activate this project in your current shell:
|
|
239
239
|
`)),console.log(H),console.log(i.gray(`
|
|
240
240
|
\u{1F4A1} After activation you can run: rapidkit dev
|
|
241
|
-
`)),process.exit(0);}if(!a$2&&!Vt(r)&&
|
|
241
|
+
`)),process.exit(0);}if(!a$2&&!Vt(r)&&E!=="init"&&!d$1&&qr(r)){let H=await e$1(r,{cwd:e});process.exit(H);}}}catch{}return false}var lt=null,Mr=false,ne=new Command,Rl=process.env.RAPIDKIT_SHOW_LEGACY==="1"||process.env.RAPIDKIT_SHOW_LEGACY?.toLowerCase()==="true";async function El(t){if(t.length===0)return false;let e=t[0],r=t[1];if(s(t)||al.includes(e))return false;if(i$2.includes(e)){if(e==="lint"||e==="format"){let n=a$4(process.cwd()),s=await wt(process.cwd());if(c$1(n,process.cwd())||s==="node"){let a=i$3(process.cwd(),n);if(g(process.cwd(),e,{framework:a.key})!==null)return false}if(f$1(n,process.cwd())||s==="python")return true;if(p(process.cwd()))return false}return true}if(Vt(t)||e==="shell"&&r==="activate")return false;if(t.includes("--tui"))return true;if(e==="--help"||e==="-h"||e==="help"||e==="--version"||e==="-V"||e==="-v"||t.includes("--template")||t.includes("-t"))return false;let o=await i$4();return Vr(e,o)?true:t.some(n=>Br.has(n))?false:o?o.has(e):!!(a$7.has(e)||t.length>1)}ne.name("rapidkit").description("Create RapidKit workspaces and projects").version(b());var _l=a()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";ne.addHelpText("beforeAll",`RapidKit NPM CLI
|
|
242
242
|
|
|
243
243
|
Create workspaces, scaffold projects, and manage your development toolchain.
|
|
244
244
|
`);ne.addHelpText("afterAll",`
|
|
@@ -278,21 +278,21 @@ Use "rapidkit help <command>" for more information.
|
|
|
278
278
|
\u{1F680} Welcome to RapidKit NPM CLI!
|
|
279
279
|
`)),t||($i(),process.exit(0));try{Pt(t);}catch(c){throw c instanceof e&&(a$1.error(`
|
|
280
280
|
\u274C ${c.message}`),c.details&&a$1.warn(`\u{1F4A1} ${c.details}
|
|
281
|
-
`),process.exit(1)),c}let s=!!e$2.template,a=s?h.resolve(process.cwd(),t):$o(t);if(lt=a,!e$2.dryRun){s||await
|
|
281
|
+
`),process.exit(1)),c}let s=!!e$2.template,a=s?h.resolve(process.cwd(),t):$o(t);if(lt=a,!e$2.dryRun){s||await R__default.ensureDir(h.dirname(a));let c=s?void 0:No(t);(c&&await R__default.pathExists(c)||await R__default.pathExists(a))&&(a$1.error(`
|
|
282
282
|
\u274C Directory "${t}" already exists`),c&&c!==a&&console.log(i.gray(` Found at: ${c}`)),console.log(i.cyan(`
|
|
283
283
|
\u{1F4A1} Choose a different name or delete the existing directory.
|
|
284
284
|
`)),process.exit(1));}if(e$2.dryRun){console.log(i.cyan(`
|
|
285
285
|
\u{1F50D} Dry-run mode - showing what would be created:
|
|
286
286
|
`)),console.log(i.white("\u{1F4C2} Path:"),a),console.log(i.white("\u{1F4E6} Type:"),s?`Project (${e$2.template})`:"Workspace"),console.log();return}if(!e$2.yes&&!s?await He.prompt([{type:"input",name:"author",message:"Author name:",default:process.env.USER||"RapidKit User"}]):e$2.yes&&console.log(i.gray(`Using default values (--yes flag)
|
|
287
|
-
`)),s){let c=String(e$2.template||"").trim(),l=Is(c);if(Er(l)){let v=await Jo(["create","project",l,t,...e$2.skipGit?["--skip-git"]:[]]);v!==0&&process.exit(v);return}if(!!!Go(process.cwd())){let{registerWorkspaceAtPath:v}=await import('./create-
|
|
288
|
-
`),a$1.debug(`Synced Python version ${
|
|
289
|
-
`),a$1.debug(`Re-synced Python version ${C.trim()} after init`);}}catch(C){a$1.debug("Could not re-sync Python version after init:",C);}}}}else {let{createProject:c}=await import('./create-
|
|
287
|
+
`)),s){let c=String(e$2.template||"").trim(),l=Is(c);if(Er(l)){let v=await Jo(["create","project",l,t,...e$2.skipGit?["--skip-git"]:[]]);v!==0&&process.exit(v);return}if(!!!Go(process.cwd())){let{registerWorkspaceAtPath:v}=await import('./create-7R4CGABE.js');if(e$2.createWorkspace)await v(process.cwd(),{skipGit:e$2.skipGit,yes:e$2.yes,userConfig:r});else if(!e$2.noWorkspace)if(e$2.yes)await v(process.cwd(),{skipGit:e$2.skipGit,yes:true,userConfig:r});else {let{createWs:P}=await He.prompt([{type:"confirm",name:"createWs",message:"This project will be created outside a RapidKit workspace. Create and register a workspace here?",default:true}]);P&&await v(process.cwd(),{skipGit:e$2.skipGit,yes:false,userConfig:r});}}let u=["create","project",l,t,"--output",process.cwd()];e$2.yes&&u.push("--yes");let p=re(process.cwd()),d=!!e$2.skipInstall,m=d||!!p;d&&u.push("--skip-essentials");let g=m?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0,w=await f(u,{cwd:process.cwd(),env:g});w!==0&&process.exit(w),p&&!e$2.skipInstall&&(console.log(i.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(i.white(" Next: cd <project-name> && npx rapidkit init")));let y=Go(process.cwd());if(y){let v=h.dirname(y),P=h.join(v,".python-version"),k=h.join(a,".python-version");try{if(await R__default.pathExists(P)){let E=j.readFileSync(P,"utf-8");j.writeFileSync(k,E.trim()+`
|
|
288
|
+
`),a$1.debug(`Synced Python version ${E.trim()} from workspace to project`);}}catch(E){a$1.debug("Could not sync Python version from workspace:",E);}}if(!e$2.skipInstall){let v=await e$1(["init",a],{cwd:process.cwd()});if(v!==0&&process.exit(v),y){let P=h.dirname(y),k=h.join(P,".python-version"),E=h.join(a,".python-version");try{if(await R__default.pathExists(k)){let C=j.readFileSync(k,"utf-8");j.writeFileSync(E,C.trim()+`
|
|
289
|
+
`),a$1.debug(`Re-synced Python version ${C.trim()} after init`);}}catch(C){a$1.debug("Could not re-sync Python version after init:",C);}}}}else {let{createProject:c}=await import('./create-7R4CGABE.js');await c(t,{skipGit:e$2.skipGit,dryRun:e$2.dryRun,yes:e$2.yes,userConfig:n,installMethod:e$2.installMethod,profile:e$2.profile,parentDirectory:h.dirname(a)}),console.log(i.gray(`\u2139\uFE0F Workspace root: ${a}`));}}catch(r){r instanceof e?(a$1.error(`
|
|
290
290
|
\u274C ${r.message}`),r.details&&a$1.warn(`\u{1F4A1} ${r.details}`),a$1.debug("Error code:",r.code)):(a$1.error(`
|
|
291
|
-
\u274C An unexpected error occurred:`),console.error(r)),process.exit(1);}finally{lt=null;}});Vn(ne);Yn(ne);xs(ne);ne.command("commands").description("Show effective RapidKit command ownership and runtime support").option("--json","Emit machine-readable JSON output").action(async t=>{ml({json:t.json});});ne.command("analyze").description("Analyze workspace/project health and generate enterprise-ready evidence").option("--workspace <path>","Workspace/root path to analyze").option("--json","Output as JSON").option("--output <file>","Write JSON report to a file").option("--strict","Treat warnings as blocking in the verdict").action(async t=>{try{let{runAnalyze:e,printAnalyzeReport:r}=await import('./analyze-IIPDLLM2.js'),o=await e({workspacePath:t.workspace,json:t.json===true,output:t.output,strict:t.strict===true});t.json?console.log(JSON.stringify(o,null,2)):r(o),o.summary.verdict==="blocked"&&process.exit(2);}catch(e){let r=e instanceof Error?e.message:String(e);t.json?console.log(JSON.stringify({schemaVersion:"rapidkit-analyze-error-v1",ok:false,error:{message:r}},null,2)):console.error(i.red(`Analyze failed: ${r}`)),process.exit(1);}});Sn(ne);ne.command("shell <action>").description("Shell helpers (activate virtualenv in current shell)").action(async t=>{t!=="activate"&&(console.log(i.red(`Unknown shell command: ${t}`)),process.exit(1));let e=process.cwd();function r(l){let f=l;for(;;){let p=h.join(f,".rapidkit","context.json");if(j.existsSync(p))return p;let u=h.dirname(f);if(u===f)break;f=u;}return null}let o=r(e);function n(l){let f=l;for(;;){let p=h.join(f,".venv"),u=h.join(f,".rapidkit","activate");if(j.existsSync(u)||j.existsSync(p))return {venv:p,activateFile:u};let d=h.dirname(f);if(d===f)break;f=d;}return null}let s=n(e);!o&&!s&&(console.log(i.yellow("No RapidKit project found in this directory")),process.exit(1));let a$1;s&&j.existsSync(s.activateFile)?a$1=s.activateFile:s&&j.existsSync(s.venv)?a$1=h$1(s.venv):(console.log(i.yellow("No virtual environment found")),process.exit(1));let c=a();console.log(c?`call "${a$1}"`:`. "${a$1}"`);});ne.command("readiness").description("\u{1F6A6} Generate machine-readable release readiness summary (env + doctor + analyze + verify + dependency)").option("--json","Output readiness result in JSON format").option("--strict","Exit with code 1 unless overall readiness is pass").option("--skip-verify","Skip verify gate (use for workspaces without extension verify artifacts)").action(async t=>{await b$2({json:t.json,strict:t.strict,skipVerify:t.skipVerify});});ne.command("pipeline").description("\u{1F517} Run governance pipeline: sync \u2192 doctor \u2192 analyze \u2192 readiness \u2192 autopilot (writes pipeline-last-run.json)").option("--json","Output pipeline report as JSON").option("--strict","Treat warnings as blocking and propagate non-zero exit codes").option("--skip-verify","Skip readiness verify gate").option("--skip-analyze","Skip analyze stage").option("--skip-autopilot","Skip autopilot release stage").option("--autopilot-mode <mode>","Autopilot mode when stage is enabled: audit | safe-fix | enforce","audit").action(async t=>{let e=String(t.autopilotMode||"audit").trim().toLowerCase();["audit","safe-fix","enforce"].includes(e)||(console.log(i.red(`Invalid autopilot mode: ${t.autopilotMode}`)),process.exit(1));let{runPipelineCommand:r}=await import('./pipeline-7OTUIB6D.js');await r({json:t.json===true,strict:t.strict===true,skipVerify:t.skipVerify===true,skipAnalyze:t.skipAnalyze===true,skipAutopilot:t.skipAutopilot===true,autopilotMode:e});});ne.command("autopilot <action>").description("Run end-to-end release autopilot workflows").option("--mode <mode>","Autopilot mode: audit | safe-fix | enforce","audit").option("--json","Emit machine-readable JSON output").option("--output <file>","Write autopilot report to an additional output path").option("--since <ref>","Git ref for affected project selection (default: HEAD~1)").option("--parallel","Run workspace stage execution in parallel").option("--max-workers <count>","Maximum parallel workers").action(async(t,e)=>{t!=="release"&&(console.log(i.red(`Unknown autopilot action: ${t}`)),console.log(i.gray("Available: release")),process.exit(1));let r=String(e.mode||"audit").trim().toLowerCase();["audit","safe-fix","enforce"].includes(r)||(console.log(i.red(`Invalid autopilot mode: ${e.mode}`)),console.log(i.gray("Allowed modes: audit | safe-fix | enforce")),process.exit(1));let o=Number(e.maxWorkers??""),n=Number.isFinite(o)?Math.max(1,Math.trunc(o)):void 0,{runAutopilotRelease:s}=await import('./autopilot-release-EO7GQS4P.js'),a;try{a=await s({workspacePath:process.cwd(),mode:r,since:e.since,parallel:e.parallel===true,maxWorkers:n,json:e.json===true,output:e.output});}catch(c){let l=c instanceof Error?c.message:String(c);console.log(i.red(`Autopilot release failed: ${l}`)),process.exit(3);}e.json&&console.log(JSON.stringify(a,null,2)),a.summary.exitCode!==0&&process.exit(a.summary.exitCode);});ne.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 r=await Pl(t,e);r!==0&&process.exit(r);});ne.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 r=await jl(t,e);r!==0&&process.exit(r);});var Or=ne.command("snapshot").description("Create, list, and restore RapidKit workspace snapshots");Or.command("create [name]").description("Create a recoverable workspace snapshot").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--reason <text>","Reason recorded in the snapshot manifest").option("--include-projects","Include project source files in the snapshot").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let r=await _t({workspacePath:e.workspace,name:t,reason:e.reason,includeProjects:e.includeProjects===true});if(e.json){console.log(JSON.stringify(r,null,2));return}console.log(i.green(`\u2714 Workspace snapshot created: ${r.manifest.name}`)),console.log(i.gray(` Mode: ${r.manifest.mode}`)),console.log(i.gray(` Path: ${r.snapshotPath}`));}catch(r){console.log(i.red(`\u274C Snapshot create failed: ${r.message}`)),process.exit(1);}});Or.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 ts({workspacePath:t.workspace});if(t.json){console.log(JSON.stringify({snapshots:e},null,2));return}if(e.length===0){console.log(i.yellow("No workspace snapshots found."));return}for(let r of e)console.log(i.cyan(r.name)),console.log(i.gray(` ${r.createdAt} | ${r.mode} | ${r.projects.length} project(s)`)),console.log(i.gray(` ${r.snapshotPath}`));}catch(e){console.log(i.red(`\u274C Snapshot list failed: ${e.message}`)),process.exit(1);}});Or.command("inspect <name>").description("Inspect snapshot manifest and estimated payload size").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let r=await es({workspacePath:e.workspace,name:t});if(e.json){console.log(JSON.stringify(r,null,2));return}console.log(i.cyan(`Snapshot: ${r.manifest.name}`)),console.log(i.gray(` Mode: ${r.manifest.mode}`)),console.log(i.gray(` Created: ${r.manifest.createdAt}`)),console.log(i.gray(` Projects: ${r.manifest.projects.length}`)),console.log(i.gray(` Files: ${r.estimatedFileCount}`)),console.log(i.gray(` Bytes: ${r.estimatedBytes}`)),console.log(i.gray(` Path: ${r.snapshotPath}`));}catch(r){console.log(i.red(`\u274C Snapshot inspect failed: ${r.message}`)),process.exit(1);}});Or.command("restore <name>").description("Restore a workspace snapshot").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--reason <text>","Reason recorded in the audit log").option("--dry-run","Show what would be restored without changing files").option("--force","Required to apply a restore").option("--no-safety-snapshot","Do not create a pre-restore metadata snapshot").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let r=await rs({workspacePath:e.workspace,name:t,reason:e.reason,dryRun:e.dryRun===true||process.argv.includes("--dry-run"),force:e.force===true,safetySnapshot:e.safetySnapshot});if(e.json){console.log(JSON.stringify(r,null,2));return}r.dryRun?console.log(i.cyan(`Snapshot restore dry-run: ${t}`)):console.log(i.green(`\u2714 Workspace snapshot restored: ${t}`)),console.log(i.gray(` Snapshot: ${r.snapshotPath}`)),console.log(i.gray(` Restored paths: ${r.restoredPaths.join(", ")}`)),r.safetySnapshotPath&&console.log(i.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(i.red(`\u274C Snapshot restore failed: ${r.message}`)),process.exit(1);}});var qt=ne.command("project").description("Safe workspace project lifecycle operations");qt.command("commands").description("Show effective commands supported by the current RapidKit project").option("--json","Emit machine-readable JSON output").action(async t=>{Ci({json:t.json});});qt.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 lo({workspacePath:t.workspace});if(t.json){console.log(JSON.stringify({archives:e},null,2));return}if(e.length===0){console.log(i.yellow("No archived projects found."));return}for(let r of e)console.log(i.cyan(r.projectName)),console.log(i.gray(` Archived: ${r.archivedAt}`)),console.log(i.gray(` Path: ${r.archivePath}`)),r.reason&&console.log(i.gray(` Reason: ${r.reason}`));}catch(e){console.log(i.red(`\u274C Project archive list failed: ${e.message}`)),process.exit(1);}});qt.command("archive <project>").description("Move a project into .rapidkit/archive with a safety snapshot").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--reason <text>","Reason recorded in the archive manifest").option("--dry-run","Show what would be archived without changing files").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let r=await po({workspacePath:e.workspace,project:t,reason:e.reason,dryRun:e.dryRun===true||process.argv.includes("--dry-run")});if(e.json){console.log(JSON.stringify(r,null,2));return}console.log(r.dryRun?i.cyan(`Project archive dry-run: ${r.projectName}`):i.green(`\u2714 Project archived: ${r.projectName}`)),console.log(i.gray(` From: ${r.projectPath}`)),r.archivePath&&console.log(i.gray(` To: ${r.archivePath}`)),r.safetySnapshotPath&&console.log(i.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(i.red(`\u274C Project archive failed: ${r.message}`)),process.exit(1);}});qt.command("restore <archive>").description("Restore an archived project back into the workspace").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--name <projectName>","Restore using a new project folder name").option("--reason <text>","Reason recorded in the audit log").option("--force","Overwrite an existing restore target").option("--dry-run","Show what would be restored without changing files").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let r=await as({workspacePath:e.workspace,archive:t,targetName:e.name,reason:e.reason,force:e.force===true,dryRun:e.dryRun===true});if(e.json){console.log(JSON.stringify(r,null,2));return}console.log(r.dryRun?i.cyan(`Project restore dry-run: ${r.projectName}`):i.green(`\u2714 Project restored: ${r.projectName}`)),console.log(i.gray(` From: ${r.archivePath}`)),console.log(i.gray(` To: ${r.projectPath}`)),r.safetySnapshotPath&&console.log(i.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(i.red(`\u274C Project restore failed: ${r.message}`)),process.exit(1);}});qt.command("delete <project>").description("Archive by default; permanently delete only with --permanent and exact --confirm").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--reason <text>","Reason recorded in the safety snapshot/archive manifest").option("--permanent","Permanently delete the project directory").option("--confirm <projectName>","Required exact project name for --permanent").option("--dry-run","Show what would be deleted without changing files").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let r=await is({workspacePath:e.workspace,project:t,reason:e.reason,permanent:e.permanent===true,confirm:e.confirm,dryRun:e.dryRun===true||process.argv.includes("--dry-run")});if(e.json){console.log(JSON.stringify(r,null,2));return}let o=r.action==="archive"?"archived":"deleted";console.log(r.dryRun?i.cyan(`Project ${o} dry-run: ${r.projectName}`):i.green(`\u2714 Project ${o}: ${r.projectName}`)),console.log(i.gray(` Path: ${r.projectPath}`)),r.archivePath&&console.log(i.gray(` Archive: ${r.archivePath}`)),r.safetySnapshotPath&&console.log(i.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(i.red(`\u274C Project delete failed: ${r.message}`)),process.exit(1);}});ne.command("doctor [scope]").description("\u{1FA7A} Check RapidKit system health by default; use workspace or project for scoped checks").option("--workspace","Check entire workspace (including all projects)").option("--project","Check only the current project (or nearest parent project)").option("--json","Output results in JSON format (for CI/CD pipelines)").option("--strict","Exit 1 on health errors or warnings (workspace/project scope)").option("--ci","CI gate: exit 1 on errors, exit 2 on warnings only").option("--fix","Automatically fix common issues (with confirmation)").option("--plan","Generate remediation plan without applying changes").option("--apply","Apply remediation plan non-interactively").action(async(t,e)=>{t&&t!=="workspace"&&t!=="project"&&(console.log(i.red(`Unknown doctor scope: ${t}`)),console.log(i.gray("Available: workspace, project")),console.log(i.gray("Usage: npx rapidkit doctor | npx rapidkit doctor workspace | npx rapidkit doctor project")),process.exit(1)),e.plan&&(e.fix||e.apply)&&(console.log(i.red("Invalid doctor flags: --plan cannot be combined with --fix or --apply")),process.exit(1));let r=await fl({scope:t,workspaceFlag:e.workspace});r.detected&&!e.json&&(console.log(i.yellow("\u26A0\uFE0F Local launcher shadow detected for doctor workspace checks.")),r.candidatePath&&console.log(i.gray(` Candidate: ${r.candidatePath}`)),console.log(i.gray(" Running npm-wrapper doctor workflow directly as safe fallback to avoid ambiguous rapidkit binary resolution.")),console.log(i.gray(" If this happens in a shell call, run: npx --yes --package rapidkit rapidkit doctor workspace")));let{runDoctor:o}=await import('./doctor-DG3TBPZN.js'),n=await o({...e,workspace:e.workspace||t==="workspace",project:e.project||t==="project",strict:e.strict===true,ci:e.ci===true});n!==0&&process.exit(n);});ne.command("workspace <action> [subaction] [key] [value]").description(`Manage RapidKit workspaces (list, sync, policy, share, export, hydrate, run)
|
|
291
|
+
\u274C An unexpected error occurred:`),console.error(r)),process.exit(1);}finally{lt=null;}});Vn(ne);Yn(ne);xs(ne);ne.command("commands").description("Show effective RapidKit command ownership and runtime support").option("--json","Emit machine-readable JSON output").action(async t=>{ml({json:t.json});});ne.command("analyze").description("Analyze workspace/project health and generate enterprise-ready evidence").option("--workspace <path>","Workspace/root path to analyze").option("--json","Output as JSON").option("--output <file>","Write JSON report to a file").option("--strict","Treat warnings as blocking in the verdict").action(async t=>{try{let{runAnalyze:e,printAnalyzeReport:r}=await import('./analyze-HXO6R656.js'),o=await e({workspacePath:t.workspace,json:t.json===true,output:t.output,strict:t.strict===true});t.json?console.log(JSON.stringify(o,null,2)):r(o),o.summary.verdict==="blocked"&&process.exit(2);}catch(e){let r=e instanceof Error?e.message:String(e);t.json?console.log(JSON.stringify({schemaVersion:"rapidkit-analyze-error-v1",ok:false,error:{message:r}},null,2)):console.error(i.red(`Analyze failed: ${r}`)),process.exit(1);}});Sn(ne);ne.command("shell <action>").description("Shell helpers (activate virtualenv in current shell)").action(async t=>{t!=="activate"&&(console.log(i.red(`Unknown shell command: ${t}`)),process.exit(1));let e=process.cwd();function r(l){let f=l;for(;;){let u=h.join(f,".rapidkit","context.json");if(j.existsSync(u))return u;let p=h.dirname(f);if(p===f)break;f=p;}return null}let o=r(e);function n(l){let f=l;for(;;){let u=h.join(f,".venv"),p=h.join(f,".rapidkit","activate");if(j.existsSync(p)||j.existsSync(u))return {venv:u,activateFile:p};let d=h.dirname(f);if(d===f)break;f=d;}return null}let s=n(e);!o&&!s&&(console.log(i.yellow("No RapidKit project found in this directory")),process.exit(1));let a$1;s&&j.existsSync(s.activateFile)?a$1=s.activateFile:s&&j.existsSync(s.venv)?a$1=h$1(s.venv):(console.log(i.yellow("No virtual environment found")),process.exit(1));let c=a();console.log(c?`call "${a$1}"`:`. "${a$1}"`);});ne.command("readiness").description("\u{1F6A6} Generate machine-readable release readiness summary (env + doctor + analyze + verify + dependency)").option("--json","Output readiness result in JSON format").option("--strict","Exit with code 1 unless overall readiness is pass").option("--skip-verify","Skip verify gate (use for workspaces without extension verify artifacts)").action(async t=>{await b$2({json:t.json,strict:t.strict,skipVerify:t.skipVerify});});ne.command("pipeline").description("\u{1F517} Run governance pipeline: sync \u2192 doctor \u2192 analyze \u2192 readiness \u2192 autopilot (writes pipeline-last-run.json)").option("--json","Output pipeline report as JSON").option("--strict","Treat warnings as blocking and propagate non-zero exit codes").option("--skip-verify","Skip readiness verify gate").option("--skip-analyze","Skip analyze stage").option("--skip-autopilot","Skip autopilot release stage").option("--autopilot-mode <mode>","Autopilot mode when stage is enabled: audit | safe-fix | enforce","audit").action(async t=>{let e=String(t.autopilotMode||"audit").trim().toLowerCase();["audit","safe-fix","enforce"].includes(e)||(console.log(i.red(`Invalid autopilot mode: ${t.autopilotMode}`)),process.exit(1));let{runPipelineCommand:r}=await import('./pipeline-23AEXNF2.js');await r({json:t.json===true,strict:t.strict===true,skipVerify:t.skipVerify===true,skipAnalyze:t.skipAnalyze===true,skipAutopilot:t.skipAutopilot===true,autopilotMode:e});});ne.command("autopilot <action>").description("Run end-to-end release autopilot workflows").option("--mode <mode>","Autopilot mode: audit | safe-fix | enforce","audit").option("--json","Emit machine-readable JSON output").option("--output <file>","Write autopilot report to an additional output path").option("--since <ref>","Git ref for affected project selection (default: HEAD~1)").option("--parallel","Run workspace stage execution in parallel").option("--max-workers <count>","Maximum parallel workers").action(async(t,e)=>{t!=="release"&&(console.log(i.red(`Unknown autopilot action: ${t}`)),console.log(i.gray("Available: release")),process.exit(1));let r=String(e.mode||"audit").trim().toLowerCase();["audit","safe-fix","enforce"].includes(r)||(console.log(i.red(`Invalid autopilot mode: ${e.mode}`)),console.log(i.gray("Allowed modes: audit | safe-fix | enforce")),process.exit(1));let o=Number(e.maxWorkers??""),n=Number.isFinite(o)?Math.max(1,Math.trunc(o)):void 0,{runAutopilotRelease:s}=await import('./autopilot-release-FMQ5KND5.js'),a;try{a=await s({workspacePath:process.cwd(),mode:r,since:e.since,parallel:e.parallel===true,maxWorkers:n,json:e.json===true,output:e.output});}catch(c){let l=c instanceof Error?c.message:String(c);console.log(i.red(`Autopilot release failed: ${l}`)),process.exit(3);}e.json&&console.log(JSON.stringify(a,null,2)),a.summary.exitCode!==0&&process.exit(a.summary.exitCode);});ne.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 r=await Pl(t,e);r!==0&&process.exit(r);});ne.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 r=await jl(t,e);r!==0&&process.exit(r);});var Or=ne.command("snapshot").description("Create, list, and restore RapidKit workspace snapshots");Or.command("create [name]").description("Create a recoverable workspace snapshot").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--reason <text>","Reason recorded in the snapshot manifest").option("--include-projects","Include project source files in the snapshot").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let r=await _t({workspacePath:e.workspace,name:t,reason:e.reason,includeProjects:e.includeProjects===true});if(e.json){console.log(JSON.stringify(r,null,2));return}console.log(i.green(`\u2714 Workspace snapshot created: ${r.manifest.name}`)),console.log(i.gray(` Mode: ${r.manifest.mode}`)),console.log(i.gray(` Path: ${r.snapshotPath}`));}catch(r){console.log(i.red(`\u274C Snapshot create failed: ${r.message}`)),process.exit(1);}});Or.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 ts({workspacePath:t.workspace});if(t.json){console.log(JSON.stringify({snapshots:e},null,2));return}if(e.length===0){console.log(i.yellow("No workspace snapshots found."));return}for(let r of e)console.log(i.cyan(r.name)),console.log(i.gray(` ${r.createdAt} | ${r.mode} | ${r.projects.length} project(s)`)),console.log(i.gray(` ${r.snapshotPath}`));}catch(e){console.log(i.red(`\u274C Snapshot list failed: ${e.message}`)),process.exit(1);}});Or.command("inspect <name>").description("Inspect snapshot manifest and estimated payload size").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let r=await es({workspacePath:e.workspace,name:t});if(e.json){console.log(JSON.stringify(r,null,2));return}console.log(i.cyan(`Snapshot: ${r.manifest.name}`)),console.log(i.gray(` Mode: ${r.manifest.mode}`)),console.log(i.gray(` Created: ${r.manifest.createdAt}`)),console.log(i.gray(` Projects: ${r.manifest.projects.length}`)),console.log(i.gray(` Files: ${r.estimatedFileCount}`)),console.log(i.gray(` Bytes: ${r.estimatedBytes}`)),console.log(i.gray(` Path: ${r.snapshotPath}`));}catch(r){console.log(i.red(`\u274C Snapshot inspect failed: ${r.message}`)),process.exit(1);}});Or.command("restore <name>").description("Restore a workspace snapshot").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--reason <text>","Reason recorded in the audit log").option("--dry-run","Show what would be restored without changing files").option("--force","Required to apply a restore").option("--no-safety-snapshot","Do not create a pre-restore metadata snapshot").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let r=await rs({workspacePath:e.workspace,name:t,reason:e.reason,dryRun:e.dryRun===true||process.argv.includes("--dry-run"),force:e.force===true,safetySnapshot:e.safetySnapshot});if(e.json){console.log(JSON.stringify(r,null,2));return}r.dryRun?console.log(i.cyan(`Snapshot restore dry-run: ${t}`)):console.log(i.green(`\u2714 Workspace snapshot restored: ${t}`)),console.log(i.gray(` Snapshot: ${r.snapshotPath}`)),console.log(i.gray(` Restored paths: ${r.restoredPaths.join(", ")}`)),r.safetySnapshotPath&&console.log(i.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(i.red(`\u274C Snapshot restore failed: ${r.message}`)),process.exit(1);}});var qt=ne.command("project").description("Safe workspace project lifecycle operations");qt.command("commands").description("Show effective commands supported by the current RapidKit project").option("--json","Emit machine-readable JSON output").action(async t=>{Ci({json:t.json});});qt.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 lo({workspacePath:t.workspace});if(t.json){console.log(JSON.stringify({archives:e},null,2));return}if(e.length===0){console.log(i.yellow("No archived projects found."));return}for(let r of e)console.log(i.cyan(r.projectName)),console.log(i.gray(` Archived: ${r.archivedAt}`)),console.log(i.gray(` Path: ${r.archivePath}`)),r.reason&&console.log(i.gray(` Reason: ${r.reason}`));}catch(e){console.log(i.red(`\u274C Project archive list failed: ${e.message}`)),process.exit(1);}});qt.command("archive <project>").description("Move a project into .rapidkit/archive with a safety snapshot").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--reason <text>","Reason recorded in the archive manifest").option("--dry-run","Show what would be archived without changing files").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let r=await po({workspacePath:e.workspace,project:t,reason:e.reason,dryRun:e.dryRun===true||process.argv.includes("--dry-run")});if(e.json){console.log(JSON.stringify(r,null,2));return}console.log(r.dryRun?i.cyan(`Project archive dry-run: ${r.projectName}`):i.green(`\u2714 Project archived: ${r.projectName}`)),console.log(i.gray(` From: ${r.projectPath}`)),r.archivePath&&console.log(i.gray(` To: ${r.archivePath}`)),r.safetySnapshotPath&&console.log(i.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(i.red(`\u274C Project archive failed: ${r.message}`)),process.exit(1);}});qt.command("restore <archive>").description("Restore an archived project back into the workspace").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--name <projectName>","Restore using a new project folder name").option("--reason <text>","Reason recorded in the audit log").option("--force","Overwrite an existing restore target").option("--dry-run","Show what would be restored without changing files").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let r=await as({workspacePath:e.workspace,archive:t,targetName:e.name,reason:e.reason,force:e.force===true,dryRun:e.dryRun===true});if(e.json){console.log(JSON.stringify(r,null,2));return}console.log(r.dryRun?i.cyan(`Project restore dry-run: ${r.projectName}`):i.green(`\u2714 Project restored: ${r.projectName}`)),console.log(i.gray(` From: ${r.archivePath}`)),console.log(i.gray(` To: ${r.projectPath}`)),r.safetySnapshotPath&&console.log(i.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(i.red(`\u274C Project restore failed: ${r.message}`)),process.exit(1);}});qt.command("delete <project>").description("Archive by default; permanently delete only with --permanent and exact --confirm").option("--workspace <path>","Workspace root path (defaults to nearest RapidKit workspace)").option("--reason <text>","Reason recorded in the safety snapshot/archive manifest").option("--permanent","Permanently delete the project directory").option("--confirm <projectName>","Required exact project name for --permanent").option("--dry-run","Show what would be deleted without changing files").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let r=await is({workspacePath:e.workspace,project:t,reason:e.reason,permanent:e.permanent===true,confirm:e.confirm,dryRun:e.dryRun===true||process.argv.includes("--dry-run")});if(e.json){console.log(JSON.stringify(r,null,2));return}let o=r.action==="archive"?"archived":"deleted";console.log(r.dryRun?i.cyan(`Project ${o} dry-run: ${r.projectName}`):i.green(`\u2714 Project ${o}: ${r.projectName}`)),console.log(i.gray(` Path: ${r.projectPath}`)),r.archivePath&&console.log(i.gray(` Archive: ${r.archivePath}`)),r.safetySnapshotPath&&console.log(i.gray(` Safety snapshot: ${r.safetySnapshotPath}`));}catch(r){console.log(i.red(`\u274C Project delete failed: ${r.message}`)),process.exit(1);}});ne.command("doctor [scope]").description("\u{1FA7A} Check RapidKit system health by default; use workspace or project for scoped checks").option("--workspace","Check entire workspace (including all projects)").option("--project","Check only the current project (or nearest parent project)").option("--json","Output results in JSON format (for CI/CD pipelines)").option("--strict","Exit 1 on health errors or warnings (workspace/project scope)").option("--ci","CI gate: exit 1 on errors, exit 2 on warnings only").option("--fix","Automatically fix common issues (with confirmation)").option("--plan","Generate remediation plan without applying changes").option("--apply","Apply remediation plan non-interactively").action(async(t,e)=>{t&&t!=="workspace"&&t!=="project"&&(console.log(i.red(`Unknown doctor scope: ${t}`)),console.log(i.gray("Available: workspace, project")),console.log(i.gray("Usage: npx rapidkit doctor | npx rapidkit doctor workspace | npx rapidkit doctor project")),process.exit(1)),e.plan&&(e.fix||e.apply)&&(console.log(i.red("Invalid doctor flags: --plan cannot be combined with --fix or --apply")),process.exit(1));let r=await fl({scope:t,workspaceFlag:e.workspace});r.detected&&!e.json&&(console.log(i.yellow("\u26A0\uFE0F Local launcher shadow detected for doctor workspace checks.")),r.candidatePath&&console.log(i.gray(` Candidate: ${r.candidatePath}`)),console.log(i.gray(" Running npm-wrapper doctor workflow directly as safe fallback to avoid ambiguous rapidkit binary resolution.")),console.log(i.gray(" If this happens in a shell call, run: npx --yes --package rapidkit rapidkit doctor workspace")));let{runDoctor:o}=await import('./doctor-DG3TBPZN.js'),n=await o({...e,workspace:e.workspace||t==="workspace",project:e.project||t==="project",strict:e.strict===true,ci:e.ci===true});n!==0&&process.exit(n);});ne.command("workspace <action> [subaction] [key] [value]").description(`Manage RapidKit workspaces (list, sync, policy, share, export, hydrate, run)
|
|
292
292
|
workspace run <stage> \u2014 fleet stage execution across discovered projects
|
|
293
|
-
stages: init | test | build | start (dev excluded by design)`).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("--for-agent [agent]","Build an agent-ready workspace context pack").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("--dry-run","Preview hydrate without writing files").option("--affected","Run only affected projects (requires git diff context)").option("--blast-radius","Include downstream dependents from workspace dependency graph").option("--since <ref>","Git ref for affected calculation (default: HEAD~1)").option("--parallel","Run project stages in parallel").option("--max-workers <count>","Maximum parallel workers (default: min(4, selected))").option("--continue-on-error","Continue running remaining projects after a failure").option("--json","Emit machine-readable JSON output").option("--strict","Return non-zero exit on warn/fail gate outcomes").option("--no-gates","Skip doctor/readiness pre-run gates").action(async function(t,e,r,o){let n=this.opts(),s=l=>{let p=(n.workspace?h.resolve(n.workspace):null)??a$6(process.cwd())??re(process.cwd());(!p||!Je(p))&&(console.log(i.red("\u274C Not inside a RapidKit workspace")),console.log(i.gray("\u{1F4A1} Run from a workspace directory or pass --workspace <path>.")),process.exit(1));let u=h.resolve(process.cwd()),d=h.resolve(p);return u!==d&&console.log(i.gray(`\u2139 Using workspace root ${p} for "${l}" (current directory: ${u}).`)),p},a=l=>process.argv.includes(l),c=()=>{if(!n.scanDepth)return;let l=Number.parseInt(n.scanDepth,10);return Number.isFinite(l)?l:void 0};if(t==="list"){let{listWorkspaces:l}=await import('./workspace-ZXWYIZOR.js');await l();}else if(t==="model"){let l=s("model"),{buildWorkspaceModel:f,writeWorkspaceModel:p}=await import('./workspace-model-OO4WOBJS.js'),u=await f({workspacePath:l,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:c(),strict:n.strict===true||a("--strict")}),d;(n.write===true||a("--write"))&&(d=await p(u,l));let m=(n.strict===true||a("--strict"))&&u.validation?.status!=="passed";if(n.json){console.log(JSON.stringify({...u,...d?{outputPath:d}:{}},null,2)),m&&process.exit(1);return}console.log(i.green(`\u2714 Workspace model: ${u.workspace.name}`)),console.log(i.gray(` Projects: ${u.summary.projectCount}`)),console.log(i.gray(` Runtimes: ${u.summary.runtimes.join(", ")||"none"}`)),console.log(i.gray(` Frameworks: ${u.summary.frameworks.join(", ")||"none"}`)),console.log(i.gray(` Workspace type: ${u.identity.workspaceType}`)),console.log(i.gray(` Validation: ${u.validation?.status??"unknown"} (${u.validation?.errors??0} error, ${u.validation?.warnings??0} warning)`)),console.log(d?i.gray(` Written: ${d}`):i.gray(" Add --write to persist .rapidkit/reports/workspace-model.json")),m&&process.exit(1);}else if(t==="context"){let l=s("context");n.forAgent!==true&&typeof n.forAgent!="string"&&e!=="agent"&&(console.log(i.red("\u274C workspace context currently requires --for-agent")),console.log(i.gray(" npx rapidkit workspace context --for-agent --json [--scope project:<name>]")),process.exit(1));let{buildWorkspaceAgentContext:f,writeWorkspaceAgentContext:p}=await import('./workspace-context-YFQQROOZ.js'),u=n.strict===true||a("--strict"),d=await f({workspacePath:l,agent:n.forAgent||r||e,scope:n.scope,includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:c(),strict:u&&!n.json}),m;(n.write===true||a("--write"))&&(m=await p(d,l));let g=u&&d.validation.status!=="passed";if(n.json){console.log(JSON.stringify({...d,...m?{outputPath:m}:{}},null,2)),g&&process.exit(1);return}console.log(i.green(`\u2714 Workspace context: ${d.workspace.name}`)),console.log(i.gray(` Agent: ${d.agent}`)),console.log(i.gray(` Scope: ${d.scope.activeProject??d.scope.requested}`)),console.log(i.gray(` Projects included: ${d.projects.length}`)),console.log(i.gray(` Safe commands: ${d.safeCommands.length}`)),console.log(i.gray(` Validation: ${d.validation.status} (${d.validation.errors} error, ${d.validation.warnings} warning)`)),console.log(m?i.gray(` Written: ${m}`):i.gray(" Add --write to persist .rapidkit/reports/workspace-context-agent.json"));}else if(t==="snapshot"){let l=s("snapshot"),{buildWorkspaceModelSnapshot:f,writeWorkspaceModelSnapshot:p}=await import('./workspace-intelligence-NXIO55GJ.js'),u=await f({workspacePath:l,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:c()}),d=await p(u,l);if(n.json){console.log(JSON.stringify({...u,outputPath:d},null,2));return}console.log(i.green(`\u2714 Workspace model snapshot: ${u.model.workspace.name}`)),console.log(i.gray(` Hash: ${u.modelHash}`)),console.log(i.gray(` Projects: ${u.model.summary.projectCount}`)),console.log(i.gray(` Workspace type: ${u.model.identity.workspaceType}`)),console.log(i.gray(` Written: ${d}`));}else if(t==="diff"){let l=s("diff"),f=n.from||e;f||(console.log(i.red("\u274C workspace diff requires --from <snapshot-or-model-report|git[:ref]>")),console.log(i.gray(" npx rapidkit workspace diff --from .rapidkit/reports/workspace-model-snapshot.json --json")),console.log(i.gray(" npx rapidkit workspace diff --from git --json (uses snapshot baseline + git working tree)")),process.exit(1));let{diffWorkspaceModel:p,writeWorkspaceModelDiff:u}=await import('./workspace-intelligence-NXIO55GJ.js'),d=await p({workspacePath:l,fromPath:f,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:c()}),m=await u(d,l);if(n.json){console.log(JSON.stringify({...d,outputPath:m},null,2));return}let g=d.summary.changed?i.yellow:i.green;console.log(g(`\u2714 Workspace model diff: ${d.summary.changed?"changed":"clean"}`)),console.log(i.gray(` From: ${d.fromRef}`)),console.log(i.gray(` Added projects: ${d.summary.addedProjects}`)),console.log(i.gray(` Removed projects: ${d.summary.removedProjects}`)),console.log(i.gray(` Changed projects: ${d.summary.changedProjects}`)),console.log(i.gray(` Workspace changes: ${d.summary.workspaceChanges}`)),console.log(i.gray(` Validation changes: ${d.summary.validationChanges}`)),d.git?.available&&console.log(i.gray(` Git: ${d.git.dirty?"dirty":"clean"} (${d.summary.gitChangedFiles} mapped change(s))`));for(let w of d.changes.slice(0,12))console.log(i.gray(` \u2022 ${w.type} ${w.target}: ${w.message}`));d.changes.length>12&&console.log(i.gray(` \u2026 ${d.changes.length-12} more change(s)`)),console.log(i.gray(` Written: ${m}`));}else if(t==="impact"){let l=s("impact"),f=n.from||e;f||(console.log(i.red("\u274C workspace impact requires --from <snapshot-model-or-diff-report>")),console.log(i.gray(" npx rapidkit workspace impact --from .rapidkit/reports/workspace-model-diff-last-run.json --json")),process.exit(1));let{buildWorkspaceImpact:p,writeWorkspaceImpact:u}=await import('./workspace-intelligence-NXIO55GJ.js'),d=await p({workspacePath:l,fromPath:f,scope:n.scope,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:c()}),m=await u(d,l);if(n.json){console.log(JSON.stringify({...d,outputPath:m},null,2));return}let g=d.summary.risk==="critical"||d.summary.risk==="high"?i.red:d.summary.risk==="medium"?i.yellow:i.green;console.log(g(`\u2714 Workspace impact: ${d.summary.risk}`)),console.log(i.gray(` From: ${d.fromRef}`)),console.log(i.gray(` Affected projects: ${d.summary.affectedProjects}`)),console.log(i.gray(` Workspace items: ${d.summary.workspaceItems}`)),console.log(i.gray(` Recommended commands: ${d.summary.recommendedCommands}`));for(let w of d.affectedProjects.slice(0,8))console.log(i.gray(` \u2022 ${w.title}: ${w.summary}`));d.affectedProjects.length>8&&console.log(i.gray(` \u2026 ${d.affectedProjects.length-8} more project(s)`)),console.log(i.gray(` Written: ${m}`));}else if(t==="verify"){let l=s("verify"),{buildWorkspaceVerify:f,writeWorkspaceVerify:p,workspaceVerifyExitCode:u}=await import('./workspace-verify-K56NI3AI.js'),d=await f({workspacePath:l,fromImpactPath:n.fromImpact||e,scope:n.scope,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:c()}),m=await p(d,l),g=u(d,{strict:n.strict===true||a("--strict")});if(n.json){console.log(JSON.stringify({...d,outputPath:m},null,2)),g!==0&&process.exit(g);return}let w=d.summary.verdict==="ready"?i.green:d.summary.verdict==="needs-attention"?i.yellow:i.red;console.log(w(`\u2714 Workspace verify: ${d.summary.verdict}`)),console.log(i.gray(` Impact risk: ${d.impact.risk}`)),console.log(i.gray(` Steps: ${d.steps.length}`)),console.log(i.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(i.gray(` \u2022 ${y.id}: ${y.status} \u2014 ${y.message}`));d.steps.length>10&&console.log(i.gray(` \u2026 ${d.steps.length-10} more step(s)`)),console.log(i.gray(` Written: ${m}`)),g!==0&&process.exit(g);}else if(t==="sync"){let l=s("sync"),{syncWorkspaceProjects:f}=await import('./workspace-ZXWYIZOR.js');n.json||console.log(i.cyan(`\u{1F4C2} Scanning workspace: ${h.basename(l)}`));let p=await f(l,n.json===true);await Ze(l,{silent:n.json===true}),n.json&&console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-sync-v1",workspacePath:l,registry:p,contractSynced:true},null,2));}else if(t==="foundation"){let l=s("foundation"),f=e||"ensure";f!=="ensure"&&(console.log(i.red(`\u274C Unknown workspace foundation action: ${f}`)),console.log(i.gray(" npx rapidkit workspace foundation ensure [--force] [--json]")),process.exit(1));let{ensureWorkspaceFoundation:p}=await import('./workspace-foundation-TYLH5SAU.js'),u=await p(l,{force:n.force===true||a("--force")});if(n.json){console.log(JSON.stringify(u,null,2));return}u.created.length>0?console.log(i.green(`\u2714 Workspace foundation ensured: ${u.created.join(", ")}`)):console.log(i.gray("Workspace foundation files are already up to date."));}else if(t==="policy"){let l=s("policy"),f=await Sl(l,e,r,o);f!==0&&process.exit(f);}else if(t==="contract"){let l=s("contract"),{buildWorkspaceContractGraph:f,readWorkspaceContract:p,verifyWorkspaceContract:u,writeWorkspaceContract:d,WORKSPACE_CONTRACT_PATH:m}=await import('./workspace-contract-A6QP7FPA.js'),g=e||"inspect",w=n.output;try{if(g==="init"){let y=await d({workspacePath:l,outputPath:w,force:n.force===true||a("--force")});if(n.json){console.log(JSON.stringify(y,null,2));return}console.log(i.green(`\u2714 Workspace contract initialized: ${y.contractPath}`)),console.log(i.gray(` Projects: ${y.contract.projects.length}`));return}if(g==="inspect"){let y=await p({workspacePath:l,contractPath:w});if(n.json){console.log(JSON.stringify(y,null,2));return}console.log(i.green(`\u2714 Workspace contract: ${y.contractPath}`)),console.log(i.gray(` Workspace: ${y.contract.workspace.name}`)),console.log(i.gray(` Projects: ${y.contract.projects.length}`)),console.log(i.gray(` Schema: v${y.contract.schemaVersion}`));return}if(g==="verify"){let y=await u({workspacePath:l,contractPath:w,strict:n.strict===true||a("--strict")});if(n.json)console.log(JSON.stringify(y,null,2));else {let v=y.status==="passed"?i.green:i.red;console.log(v(`\u2714 Workspace contract verification ${y.status}: ${y.contractPath}`)),console.log(i.gray(` Projects: ${y.projectCount}`));for(let P of y.checks){let k=P.status==="passed"?"\u2714":"\u2718";console.log(i.gray(` ${k} ${P.id}: ${P.message}`));}for(let P of y.violations)console.log(i.gray(` Violation: ${P}`));}(y.status==="failed"||y.status!=="passed"&&n.strict)&&process.exit(1);return}if(g==="graph"){let y=await f({workspacePath:l,contractPath:w});if(n.json){console.log(JSON.stringify(y,null,2));return}console.log(i.green(`\u2714 Workspace contract graph: ${y.contractPath}`)),console.log(i.gray(` Workspace: ${y.graph.workspace.name}`)),console.log(i.gray(` Projects: ${y.graph.summary.projectCount}`)),console.log(i.gray(` Dependencies: ${y.graph.summary.dependencyEdges}`)),console.log(i.gray(` Event links: ${y.graph.summary.eventEdges}`)),console.log(i.gray(` Ports: ${y.graph.summary.portCount}`));for(let v of y.graph.nodes){let P=v.ports.map(k=>`${k.name}:${k.port}`).join(", ")||"none";console.log(i.gray(` \u2022 ${v.id} (${v.runtime||"unknown"}${v.framework?`/${v.framework}`:""}) ports=${P}`));}for(let v of y.graph.edges){let P=v.type==="event"?`event:${v.label}`:v.label;console.log(i.gray(` ${v.from} -> ${v.to} [${P}]`));}return}console.log(i.red(`\u274C Unknown workspace contract action: ${g}`)),console.log(i.white(` npx rapidkit workspace contract init|inspect|verify|graph [--output ${m}]`)),process.exit(1);}catch(y){console.log(i.red(`\u274C Workspace contract ${g} failed: ${y.message}`)),process.exit(1);}}else if(t==="share"){let l=s("share"),f=n.output||e,{createWorkspaceShareBundle:p}=await import('./workspace-ZXWYIZOR.js'),u=await p(l,{outputPath:f,includePaths:n.includePaths===true,includeDoctorEvidence:n.doctor!==false,includeBlueprint:n.blueprint!==false});console.log(i.green(`\u2714 Workspace share bundle exported: ${u}`)),console.log(i.gray("Share this JSON with your team for reproducible workspace/project diagnostics."));}else if(t==="export"){let l=s("export"),{exportWorkspaceArchive:f}=await import('./workspace-archive-EJIGYKSR.js'),p=await f({workspacePath:l,outputPath:n.output||e,includeEnv:n.includeEnv===true||a("--include-env")});if(n.json){console.log(JSON.stringify(p,null,2));return}let u=(p.bytesWritten/(1024*1024)).toFixed(2);console.log(i.green(`\u2714 Workspace archive exported: ${p.archivePath}`)),console.log(i.gray(` Files: ${p.manifest.files.length}`)),console.log(i.gray(` Size: ${u} MB`)),p.manifest.security.envFilesIncluded||console.log(i.gray(" Secrets: excluded (.env, private keys, logs, dependency caches)"));}else if(t==="archive"&&(e==="inspect"||e==="verify"||e==="doctor")){let l=r;l||(console.log(i.red(`\u274C workspace archive ${e} requires an archive path or URL.`)),console.log(i.white(` npx rapidkit workspace archive ${e} team.rapidkit-archive.zip`)),process.exit(1));let{doctorWorkspaceArchive:f,inspectWorkspaceArchive:p,verifyWorkspaceArchive:u}=await import('./workspace-archive-EJIGYKSR.js');try{if(e==="inspect"){let m=await p({archivePathOrUrl:l});if(n.json){console.log(JSON.stringify(m,null,2));return}let g=(m.totalBytes/(1024*1024)).toFixed(2);console.log(i.green(`\u2714 Workspace archive: ${m.archivePath}`)),console.log(i.gray(` Workspace: ${m.manifest.workspaceName}`)),console.log(i.gray(` Exported: ${m.manifest.exportedAt}`)),console.log(i.gray(` Exporter: ${m.manifest.exportedBy||"unknown"}`)),console.log(i.gray(` Files: ${m.fileCount}`)),console.log(i.gray(` Payload: ${g} MB`));return}if(e==="doctor"){let m=await f({archivePathOrUrl:l,strict:n.strict===true||a("--strict")});if(n.json)console.log(JSON.stringify(m,null,2));else {let g=m.status==="passed"?i.green:m.status==="warning"?i.yellow:i.red;console.log(g(`\u2714 Workspace archive doctor ${m.status}: ${m.archivePath}`)),console.log(i.gray(` Workspace: ${m.workspaceName}`)),console.log(i.gray(` Files: ${m.fileCount}`));for(let w of m.checks){let y=w.status==="passed"?"\u2714":w.status==="warning"?"\u26A0":"\u2718";console.log(i.gray(` ${y} ${w.id}: ${w.message}`));}for(let w of m.recommendedActions)console.log(i.gray(` Next: ${w}`));}(m.status==="failed"||m.status==="warning"&&n.strict)&&process.exit(1);return}let d=await u({archivePathOrUrl:l,requireChecksums:n.strict===true||a("--strict")});if(n.json)console.log(JSON.stringify(d,null,2));else if(d.status==="passed")console.log(i.green(`\u2714 Workspace archive verified: ${d.archivePath}`)),console.log(i.gray(` Files: ${d.verifiedFiles}/${d.fileCount}`));else {let m=d.status==="failed"?i.red:i.yellow;console.log(m(`\u274C Workspace archive verification ${d.status}: ${d.archivePath}`)),d.missingArchiveEntries.length&&console.log(i.gray(` Missing entries: ${d.missingArchiveEntries.join(", ")}`)),d.extraArchiveEntries.length&&console.log(i.gray(` Unexpected entries: ${d.extraArchiveEntries.join(", ")}`)),d.mismatches.length&&console.log(i.gray(` Mismatches: ${d.mismatches.map(g=>g.path).join(", ")}`)),d.missingChecksumFiles.length&&console.log(i.gray(` Missing checksums: ${d.missingChecksumFiles.join(", ")}`));}(d.status==="failed"||d.status==="warning"&&n.strict)&&process.exit(1);}catch(d){console.log(i.red(`\u274C Workspace archive ${e} failed: ${d.message}`)),process.exit(1);}}else if(t==="hydrate"||t==="import"){let l=e;l||(console.log(i.red(`\u274C workspace ${t} requires an archive path or URL.`)),console.log(i.white(` npx rapidkit workspace ${t} team.rapidkit-archive.zip --output ./team`)),process.exit(1));let{hydrateWorkspaceArchive:f}=await import('./workspace-archive-EJIGYKSR.js');try{let p=await f({archivePathOrUrl:l,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(p,null,2));return}console.log(i.green(p.dryRun?`\u2714 Workspace archive hydrate preview: ${p.outputPath}`:`\u2714 Workspace archive hydrated: ${p.outputPath}`)),console.log(i.gray(` Files: ${p.files.length}`)),p.manifest?.workspaceName&&console.log(i.gray(` Workspace: ${p.manifest.workspaceName}`));}catch(p){console.log(i.red(`\u274C Workspace ${t} failed: ${p.message}`)),process.exit(1);}}else if(t==="run"){let l=s(`run ${e||""}`.trim());(!e||!["init","test","build","start"].includes(e))&&(console.log(i.red(`Unknown workspace run stage: ${e||"(none provided)"}`)),console.log(i.gray("Available stages: init | test | build | start")),console.log(i.gray(" \u2022 init \u2014 run install/bootstrap across the project fleet")),console.log(i.gray(" \u2022 test \u2014 run test suite across selected projects")),console.log(i.gray(" \u2022 build \u2014 compile/package across selected projects")),console.log(i.gray(" \u2022 start \u2014 start services (smoke/e2e scenarios)")),console.log(i.gray(" Note: dev is excluded \u2014 it is a local-only primitive, not a CI stage")),process.exit(2));let f=Number(n.maxWorkers??""),p=Number.isFinite(f)?Math.max(1,Math.trunc(f)):void 0;if(e==="init"){let m=await Bo(l);m!==0&&process.exit(m);}let{runWorkspaceStage:u}=await import('./workspace-run-AZ63D75J.js'),d=await u({workspacePath:l,stage:e,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});n.json&&console.log(JSON.stringify(d,null,2)),d.summary.exitCode!==0&&process.exit(d.summary.exitCode);}else if(t==="init"){console.log(i.yellow("\u2139 workspace init is an alias of: npx rapidkit workspace run init")),console.log(i.gray(` Equivalent full-init aliases at workspace root:
|
|
293
|
+
stages: init | test | build | start (dev excluded by design)`).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("--for-agent [agent]","Build an agent-ready workspace context pack").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("--dry-run","Preview hydrate without writing files").option("--affected","Run only affected projects (requires git diff context)").option("--blast-radius","Include downstream dependents from workspace dependency graph").option("--since <ref>","Git ref for affected calculation (default: HEAD~1)").option("--parallel","Run project stages in parallel").option("--max-workers <count>","Maximum parallel workers (default: min(4, selected))").option("--continue-on-error","Continue running remaining projects after a failure").option("--json","Emit machine-readable JSON output").option("--strict","Return non-zero exit on warn/fail gate outcomes").option("--no-gates","Skip doctor/readiness pre-run gates").action(async function(t,e,r,o){let n=this.opts(),s=l=>{let u=(n.workspace?h.resolve(n.workspace):null)??a$6(process.cwd())??re(process.cwd());(!u||!Je(u))&&(console.log(i.red("\u274C Not inside a RapidKit workspace")),console.log(i.gray("\u{1F4A1} Run from a workspace directory or pass --workspace <path>.")),process.exit(1));let p=h.resolve(process.cwd()),d=h.resolve(u);return p!==d&&console.log(i.gray(`\u2139 Using workspace root ${u} for "${l}" (current directory: ${p}).`)),u},a=l=>process.argv.includes(l),c=()=>{if(!n.scanDepth)return;let l=Number.parseInt(n.scanDepth,10);return Number.isFinite(l)?l:void 0};if(t==="list"){let{listWorkspaces:l}=await import('./workspace-ZDL5IQU4.js');await l();}else if(t==="model"){let l=s("model"),{buildWorkspaceModel:f,writeWorkspaceModel:u}=await import('./workspace-model-OO4WOBJS.js'),p=await f({workspacePath:l,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:c(),strict:n.strict===true||a("--strict")}),d;(n.write===true||a("--write"))&&(d=await u(p,l));let m=(n.strict===true||a("--strict"))&&p.validation?.status!=="passed";if(n.json){console.log(JSON.stringify({...p,...d?{outputPath:d}:{}},null,2)),m&&process.exit(1);return}console.log(i.green(`\u2714 Workspace model: ${p.workspace.name}`)),console.log(i.gray(` Projects: ${p.summary.projectCount}`)),console.log(i.gray(` Runtimes: ${p.summary.runtimes.join(", ")||"none"}`)),console.log(i.gray(` Frameworks: ${p.summary.frameworks.join(", ")||"none"}`)),console.log(i.gray(` Workspace type: ${p.identity.workspaceType}`)),console.log(i.gray(` Validation: ${p.validation?.status??"unknown"} (${p.validation?.errors??0} error, ${p.validation?.warnings??0} warning)`)),console.log(d?i.gray(` Written: ${d}`):i.gray(" Add --write to persist .rapidkit/reports/workspace-model.json")),m&&process.exit(1);}else if(t==="context"){let l=s("context");n.forAgent!==true&&typeof n.forAgent!="string"&&e!=="agent"&&(console.log(i.red("\u274C workspace context currently requires --for-agent")),console.log(i.gray(" npx rapidkit workspace context --for-agent --json [--scope project:<name>]")),process.exit(1));let{buildWorkspaceAgentContext:f,writeWorkspaceAgentContext:u}=await import('./workspace-context-YFQQROOZ.js'),p=n.strict===true||a("--strict"),d=await f({workspacePath:l,agent:n.forAgent||r||e,scope:n.scope,includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:c(),strict:p&&!n.json}),m;(n.write===true||a("--write"))&&(m=await u(d,l));let g=p&&d.validation.status!=="passed";if(n.json){console.log(JSON.stringify({...d,...m?{outputPath:m}:{}},null,2)),g&&process.exit(1);return}console.log(i.green(`\u2714 Workspace context: ${d.workspace.name}`)),console.log(i.gray(` Agent: ${d.agent}`)),console.log(i.gray(` Scope: ${d.scope.activeProject??d.scope.requested}`)),console.log(i.gray(` Projects included: ${d.projects.length}`)),console.log(i.gray(` Safe commands: ${d.safeCommands.length}`)),console.log(i.gray(` Validation: ${d.validation.status} (${d.validation.errors} error, ${d.validation.warnings} warning)`)),console.log(m?i.gray(` Written: ${m}`):i.gray(" Add --write to persist .rapidkit/reports/workspace-context-agent.json"));}else if(t==="snapshot"){let l=s("snapshot"),{buildWorkspaceModelSnapshot:f,writeWorkspaceModelSnapshot:u}=await import('./workspace-intelligence-VLA2RILM.js'),p=await f({workspacePath:l,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:c()}),d=await u(p,l);if(n.json){console.log(JSON.stringify({...p,outputPath:d},null,2));return}console.log(i.green(`\u2714 Workspace model snapshot: ${p.model.workspace.name}`)),console.log(i.gray(` Hash: ${p.modelHash}`)),console.log(i.gray(` Projects: ${p.model.summary.projectCount}`)),console.log(i.gray(` Workspace type: ${p.model.identity.workspaceType}`)),console.log(i.gray(` Written: ${d}`));}else if(t==="diff"){let l=s("diff"),f=n.from||e;f||(console.log(i.red("\u274C workspace diff requires --from <snapshot-or-model-report|git[:ref]>")),console.log(i.gray(" npx rapidkit workspace diff --from .rapidkit/reports/workspace-model-snapshot.json --json")),console.log(i.gray(" npx rapidkit workspace diff --from git --json (uses snapshot baseline + git working tree)")),process.exit(1));let{diffWorkspaceModel:u,writeWorkspaceModelDiff:p}=await import('./workspace-intelligence-VLA2RILM.js'),d=await u({workspacePath:l,fromPath:f,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:c()}),m=await p(d,l);if(n.json){console.log(JSON.stringify({...d,outputPath:m},null,2));return}let g=d.summary.changed?i.yellow:i.green;console.log(g(`\u2714 Workspace model diff: ${d.summary.changed?"changed":"clean"}`)),console.log(i.gray(` From: ${d.fromRef}`)),console.log(i.gray(` Added projects: ${d.summary.addedProjects}`)),console.log(i.gray(` Removed projects: ${d.summary.removedProjects}`)),console.log(i.gray(` Changed projects: ${d.summary.changedProjects}`)),console.log(i.gray(` Workspace changes: ${d.summary.workspaceChanges}`)),console.log(i.gray(` Validation changes: ${d.summary.validationChanges}`)),d.git?.available&&console.log(i.gray(` Git: ${d.git.dirty?"dirty":"clean"} (${d.summary.gitChangedFiles} mapped change(s))`));for(let w of d.changes.slice(0,12))console.log(i.gray(` \u2022 ${w.type} ${w.target}: ${w.message}`));d.changes.length>12&&console.log(i.gray(` \u2026 ${d.changes.length-12} more change(s)`)),console.log(i.gray(` Written: ${m}`));}else if(t==="impact"){let l=s("impact"),f=n.from||e;f||(console.log(i.red("\u274C workspace impact requires --from <snapshot-model-or-diff-report>")),console.log(i.gray(" npx rapidkit workspace impact --from .rapidkit/reports/workspace-model-diff-last-run.json --json")),process.exit(1));let{buildWorkspaceImpact:u,writeWorkspaceImpact:p}=await import('./workspace-intelligence-VLA2RILM.js'),d=await u({workspacePath:l,fromPath:f,scope:n.scope,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:c()}),m=await p(d,l);if(n.json){console.log(JSON.stringify({...d,outputPath:m},null,2));return}let g=d.summary.risk==="critical"||d.summary.risk==="high"?i.red:d.summary.risk==="medium"?i.yellow:i.green;console.log(g(`\u2714 Workspace impact: ${d.summary.risk}`)),console.log(i.gray(` From: ${d.fromRef}`)),console.log(i.gray(` Affected projects: ${d.summary.affectedProjects}`)),console.log(i.gray(` Workspace items: ${d.summary.workspaceItems}`)),console.log(i.gray(` Recommended commands: ${d.summary.recommendedCommands}`));for(let w of d.affectedProjects.slice(0,8))console.log(i.gray(` \u2022 ${w.title}: ${w.summary}`));d.affectedProjects.length>8&&console.log(i.gray(` \u2026 ${d.affectedProjects.length-8} more project(s)`)),console.log(i.gray(` Written: ${m}`));}else if(t==="verify"){let l=s("verify"),{buildWorkspaceVerify:f,writeWorkspaceVerify:u,workspaceVerifyExitCode:p}=await import('./workspace-verify-XEXRCET7.js'),d=await f({workspacePath:l,fromImpactPath:n.fromImpact||e,scope:n.scope,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:c()}),m=await u(d,l),g=p(d,{strict:n.strict===true||a("--strict")});if(n.json){console.log(JSON.stringify({...d,outputPath:m},null,2)),g!==0&&process.exit(g);return}let w=d.summary.verdict==="ready"?i.green:d.summary.verdict==="needs-attention"?i.yellow:i.red;console.log(w(`\u2714 Workspace verify: ${d.summary.verdict}`)),console.log(i.gray(` Impact risk: ${d.impact.risk}`)),console.log(i.gray(` Steps: ${d.steps.length}`)),console.log(i.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(i.gray(` \u2022 ${y.id}: ${y.status} \u2014 ${y.message}`));d.steps.length>10&&console.log(i.gray(` \u2026 ${d.steps.length-10} more step(s)`)),console.log(i.gray(` Written: ${m}`)),g!==0&&process.exit(g);}else if(t==="sync"){let l=s("sync"),{syncWorkspaceProjects:f}=await import('./workspace-ZDL5IQU4.js');n.json||console.log(i.cyan(`\u{1F4C2} Scanning workspace: ${h.basename(l)}`));let u=await f(l,n.json===true);await Ze(l,{silent:n.json===true}),n.json&&console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-sync-v1",workspacePath:l,registry:u,contractSynced:true},null,2));}else if(t==="foundation"){let l=s("foundation"),f=e||"ensure";f!=="ensure"&&(console.log(i.red(`\u274C Unknown workspace foundation action: ${f}`)),console.log(i.gray(" npx rapidkit workspace foundation ensure [--force] [--json]")),process.exit(1));let{ensureWorkspaceFoundation:u}=await import('./workspace-foundation-QVWALXMP.js'),p=await u(l,{force:n.force===true||a("--force")});if(n.json){console.log(JSON.stringify(p,null,2));return}p.created.length>0?console.log(i.green(`\u2714 Workspace foundation ensured: ${p.created.join(", ")}`)):console.log(i.gray("Workspace foundation files are already up to date."));}else if(t==="policy"){let l=s("policy"),f=await Sl(l,e,r,o);f!==0&&process.exit(f);}else if(t==="contract"){let l=s("contract"),{buildWorkspaceContractGraph:f,readWorkspaceContract:u,verifyWorkspaceContract:p,writeWorkspaceContract:d,WORKSPACE_CONTRACT_PATH:m}=await import('./workspace-contract-A6QP7FPA.js'),g=e||"inspect",w=n.output;try{if(g==="init"){let y=await d({workspacePath:l,outputPath:w,force:n.force===true||a("--force")});if(n.json){console.log(JSON.stringify(y,null,2));return}console.log(i.green(`\u2714 Workspace contract initialized: ${y.contractPath}`)),console.log(i.gray(` Projects: ${y.contract.projects.length}`));return}if(g==="inspect"){let y=await u({workspacePath:l,contractPath:w});if(n.json){console.log(JSON.stringify(y,null,2));return}console.log(i.green(`\u2714 Workspace contract: ${y.contractPath}`)),console.log(i.gray(` Workspace: ${y.contract.workspace.name}`)),console.log(i.gray(` Projects: ${y.contract.projects.length}`)),console.log(i.gray(` Schema: v${y.contract.schemaVersion}`));return}if(g==="verify"){let y=await p({workspacePath:l,contractPath:w,strict:n.strict===true||a("--strict")});if(n.json)console.log(JSON.stringify(y,null,2));else {let v=y.status==="passed"?i.green:i.red;console.log(v(`\u2714 Workspace contract verification ${y.status}: ${y.contractPath}`)),console.log(i.gray(` Projects: ${y.projectCount}`));for(let P of y.checks){let k=P.status==="passed"?"\u2714":"\u2718";console.log(i.gray(` ${k} ${P.id}: ${P.message}`));}for(let P of y.violations)console.log(i.gray(` Violation: ${P}`));}(y.status==="failed"||y.status!=="passed"&&n.strict)&&process.exit(1);return}if(g==="graph"){let y=await f({workspacePath:l,contractPath:w});if(n.json){console.log(JSON.stringify(y,null,2));return}console.log(i.green(`\u2714 Workspace contract graph: ${y.contractPath}`)),console.log(i.gray(` Workspace: ${y.graph.workspace.name}`)),console.log(i.gray(` Projects: ${y.graph.summary.projectCount}`)),console.log(i.gray(` Dependencies: ${y.graph.summary.dependencyEdges}`)),console.log(i.gray(` Event links: ${y.graph.summary.eventEdges}`)),console.log(i.gray(` Ports: ${y.graph.summary.portCount}`));for(let v of y.graph.nodes){let P=v.ports.map(k=>`${k.name}:${k.port}`).join(", ")||"none";console.log(i.gray(` \u2022 ${v.id} (${v.runtime||"unknown"}${v.framework?`/${v.framework}`:""}) ports=${P}`));}for(let v of y.graph.edges){let P=v.type==="event"?`event:${v.label}`:v.label;console.log(i.gray(` ${v.from} -> ${v.to} [${P}]`));}return}console.log(i.red(`\u274C Unknown workspace contract action: ${g}`)),console.log(i.white(` npx rapidkit workspace contract init|inspect|verify|graph [--output ${m}]`)),process.exit(1);}catch(y){console.log(i.red(`\u274C Workspace contract ${g} failed: ${y.message}`)),process.exit(1);}}else if(t==="share"){let l=s("share"),f=n.output||e,{createWorkspaceShareBundle:u}=await import('./workspace-ZDL5IQU4.js'),p=await u(l,{outputPath:f,includePaths:n.includePaths===true,includeDoctorEvidence:n.doctor!==false,includeBlueprint:n.blueprint!==false});console.log(i.green(`\u2714 Workspace share bundle exported: ${p}`)),console.log(i.gray("Share this JSON with your team for reproducible workspace/project diagnostics."));}else if(t==="export"){let l=s("export"),{exportWorkspaceArchive:f}=await import('./workspace-archive-EJIGYKSR.js'),u=await f({workspacePath:l,outputPath:n.output||e,includeEnv:n.includeEnv===true||a("--include-env")});if(n.json){console.log(JSON.stringify(u,null,2));return}let p=(u.bytesWritten/(1024*1024)).toFixed(2);console.log(i.green(`\u2714 Workspace archive exported: ${u.archivePath}`)),console.log(i.gray(` Files: ${u.manifest.files.length}`)),console.log(i.gray(` Size: ${p} MB`)),u.manifest.security.envFilesIncluded||console.log(i.gray(" Secrets: excluded (.env, private keys, logs, dependency caches)"));}else if(t==="archive"&&(e==="inspect"||e==="verify"||e==="doctor")){let l=r;l||(console.log(i.red(`\u274C workspace archive ${e} requires an archive path or URL.`)),console.log(i.white(` npx rapidkit workspace archive ${e} team.rapidkit-archive.zip`)),process.exit(1));let{doctorWorkspaceArchive:f,inspectWorkspaceArchive:u,verifyWorkspaceArchive:p}=await import('./workspace-archive-EJIGYKSR.js');try{if(e==="inspect"){let m=await u({archivePathOrUrl:l});if(n.json){console.log(JSON.stringify(m,null,2));return}let g=(m.totalBytes/(1024*1024)).toFixed(2);console.log(i.green(`\u2714 Workspace archive: ${m.archivePath}`)),console.log(i.gray(` Workspace: ${m.manifest.workspaceName}`)),console.log(i.gray(` Exported: ${m.manifest.exportedAt}`)),console.log(i.gray(` Exporter: ${m.manifest.exportedBy||"unknown"}`)),console.log(i.gray(` Files: ${m.fileCount}`)),console.log(i.gray(` Payload: ${g} MB`));return}if(e==="doctor"){let m=await f({archivePathOrUrl:l,strict:n.strict===true||a("--strict")});if(n.json)console.log(JSON.stringify(m,null,2));else {let g=m.status==="passed"?i.green:m.status==="warning"?i.yellow:i.red;console.log(g(`\u2714 Workspace archive doctor ${m.status}: ${m.archivePath}`)),console.log(i.gray(` Workspace: ${m.workspaceName}`)),console.log(i.gray(` Files: ${m.fileCount}`));for(let w of m.checks){let y=w.status==="passed"?"\u2714":w.status==="warning"?"\u26A0":"\u2718";console.log(i.gray(` ${y} ${w.id}: ${w.message}`));}for(let w of m.recommendedActions)console.log(i.gray(` Next: ${w}`));}(m.status==="failed"||m.status==="warning"&&n.strict)&&process.exit(1);return}let d=await p({archivePathOrUrl:l,requireChecksums:n.strict===true||a("--strict")});if(n.json)console.log(JSON.stringify(d,null,2));else if(d.status==="passed")console.log(i.green(`\u2714 Workspace archive verified: ${d.archivePath}`)),console.log(i.gray(` Files: ${d.verifiedFiles}/${d.fileCount}`));else {let m=d.status==="failed"?i.red:i.yellow;console.log(m(`\u274C Workspace archive verification ${d.status}: ${d.archivePath}`)),d.missingArchiveEntries.length&&console.log(i.gray(` Missing entries: ${d.missingArchiveEntries.join(", ")}`)),d.extraArchiveEntries.length&&console.log(i.gray(` Unexpected entries: ${d.extraArchiveEntries.join(", ")}`)),d.mismatches.length&&console.log(i.gray(` Mismatches: ${d.mismatches.map(g=>g.path).join(", ")}`)),d.missingChecksumFiles.length&&console.log(i.gray(` Missing checksums: ${d.missingChecksumFiles.join(", ")}`));}(d.status==="failed"||d.status==="warning"&&n.strict)&&process.exit(1);}catch(d){console.log(i.red(`\u274C Workspace archive ${e} failed: ${d.message}`)),process.exit(1);}}else if(t==="hydrate"||t==="import"){let l=e;l||(console.log(i.red(`\u274C workspace ${t} requires an archive path or URL.`)),console.log(i.white(` npx rapidkit workspace ${t} team.rapidkit-archive.zip --output ./team`)),process.exit(1));let{hydrateWorkspaceArchive:f}=await import('./workspace-archive-EJIGYKSR.js');try{let u=await f({archivePathOrUrl:l,outputPath:n.output,force:n.force===true||a("--force"),dryRun:n.dryRun===true||a("--dry-run"),strict:n.strict===true||a("--strict")});if(n.json){console.log(JSON.stringify(u,null,2));return}console.log(i.green(u.dryRun?`\u2714 Workspace archive hydrate preview: ${u.outputPath}`:`\u2714 Workspace archive hydrated: ${u.outputPath}`)),console.log(i.gray(` Files: ${u.files.length}`)),u.manifest?.workspaceName&&console.log(i.gray(` Workspace: ${u.manifest.workspaceName}`));}catch(u){console.log(i.red(`\u274C Workspace ${t} failed: ${u.message}`)),process.exit(1);}}else if(t==="run"){let l=s(`run ${e||""}`.trim());(!e||!["init","test","build","start"].includes(e))&&(console.log(i.red(`Unknown workspace run stage: ${e||"(none provided)"}`)),console.log(i.gray("Available stages: init | test | build | start")),console.log(i.gray(" \u2022 init \u2014 run install/bootstrap across the project fleet")),console.log(i.gray(" \u2022 test \u2014 run test suite across selected projects")),console.log(i.gray(" \u2022 build \u2014 compile/package across selected projects")),console.log(i.gray(" \u2022 start \u2014 start services (smoke/e2e scenarios)")),console.log(i.gray(" Note: dev is excluded \u2014 it is a local-only primitive, not a CI stage")),process.exit(2));let f=Number(n.maxWorkers??""),u=Number.isFinite(f)?Math.max(1,Math.trunc(f)):void 0;if(e==="init"){let m=await Bo(l);m!==0&&process.exit(m);}let{runWorkspaceStage:p}=await import('./workspace-run-NIKH2IKF.js'),d=await p({workspacePath:l,stage:e,scope:n.scope,affected:n.affected===true,blastRadius:n.blastRadius===true,since:n.since,parallel:n.parallel===true,maxWorkers:u,continueOnError:n.continueOnError===true,strict:n.strict===true,json:n.json===true,enforceGates:n.gates});n.json&&console.log(JSON.stringify(d,null,2)),d.summary.exitCode!==0&&process.exit(d.summary.exitCode);}else if(t==="init"){console.log(i.yellow("\u2139 workspace init is an alias of: npx rapidkit workspace run init")),console.log(i.gray(` Equivalent full-init aliases at workspace root:
|
|
294
294
|
npx rapidkit init | npx rapidkit workspace init | npx rapidkit workspace run init
|
|
295
|
-
`));let l=s("init"),f=Number(n.maxWorkers??""),
|
|
295
|
+
`));let l=s("init"),f=Number(n.maxWorkers??""),u=Number.isFinite(f)?Math.max(1,Math.trunc(f)):void 0,p=await Bo(l);p!==0&&process.exit(p);let{runWorkspaceStage:d}=await import('./workspace-run-NIKH2IKF.js'),m=await d({workspacePath:l,stage:"init",scope:n.scope,affected:n.affected===true,blastRadius:n.blastRadius===true,since:n.since,parallel:n.parallel===true,maxWorkers:u,continueOnError:n.continueOnError===true,strict:n.strict===true,json:n.json===true,enforceGates:n.gates});n.json&&console.log(JSON.stringify(m,null,2)),m.summary.exitCode!==0&&process.exit(m.summary.exitCode);}else console.log(i.red(`Unknown workspace action: ${t}`)),console.log(i.gray("Available: list, model, context, snapshot, diff, impact, sync, policy, share, export, hydrate, import, run")),process.exit(1);});function $i(){let t=a()?"npx rapidkit init; npx rapidkit dev":"npx rapidkit init && npx rapidkit dev";console.log(i.white(`Usage:
|
|
296
296
|
`)),console.log(i.cyan(` npx rapidkit <workspace-name> [options]
|
|
297
297
|
`)),console.log(i.bold("Quick start \u2014 workspace workflow:")),console.log(i.cyan(" npx rapidkit my-workspace ")+i.gray("# Create workspace (interactive profile picker)")),console.log(i.cyan(" cd my-workspace")),console.log(i.cyan(" npx rapidkit bootstrap ")+i.gray("# Bootstrap all runtime toolchains")),console.log(i.cyan(" npx rapidkit create project ")+i.gray("# Interactive kit picker")),console.log(i.cyan(" npx rapidkit create frontend nextjs web ")+i.gray("# Create a frontend with the official generator")),console.log(i.cyan(" cd my-api")),console.log(i.cyan(` ${t}
|
|
298
298
|
`)),console.log(i.bold("Workspace profiles (asked during creation):")),console.log(i.gray(" minimal Foundation files only \u2014 fastest bootstrap (default)")),console.log(i.gray(" java-only Java runtime (Spring Boot services)")),console.log(i.gray(" python-only Python + Poetry (FastAPI, Django, ML)")),console.log(i.gray(" node-only Node.js runtime (NestJS, Express, Next.js)")),console.log(i.gray(" go-only Go runtime (Fiber, Gin, gRPC)")),console.log(i.gray(" dotnet-only .NET runtime (ASP.NET Core services)")),console.log(i.gray(" polyglot Python + Node.js + Go + Java + .NET multi-runtime")),console.log(i.gray(` enterprise Polyglot + governance + Sigstore
|
|
@@ -304,11 +304,11 @@ Use "rapidkit help <command>" for more information.
|
|
|
304
304
|
`))):console.log(i.gray(`Tip: set RAPIDKIT_SHOW_LEGACY=1 to show legacy template flags in help.
|
|
305
305
|
`));}var wi="__rapidkit_signal_handlers_registered__",ki=globalThis;ki[wi]||(ki[wi]=true,process.on("SIGINT",async()=>{if(!Mr){if(Mr=true,console.log(i.yellow(`
|
|
306
306
|
|
|
307
|
-
\u26A0\uFE0F Interrupted by user`)),lt&&await
|
|
307
|
+
\u26A0\uFE0F Interrupted by user`)),lt&&await R__default.pathExists(lt)){console.log(i.gray("Cleaning up partial installation..."));try{await R__default.remove(lt),console.log(i.green("\u2713 Cleanup complete"));}catch(t){a$1.debug("Cleanup failed:",t);}}process.exit(130);}}),process.on("SIGTERM",async()=>{if(!Mr){if(Mr=true,a$1.debug("Received SIGTERM"),lt&&await R__default.pathExists(lt))try{await R__default.remove(lt);}catch(t){a$1.debug("Cleanup failed:",t);}process.exit(143);}}));var Al=process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test",Il=(()=>{let t=process.argv[1];if(!t)return false;let e=t.replace(/\\/g,"/"),r=e.endsWith("/dist/index.js")||e.endsWith("/src/index.ts");try{return j.realpathSync(t)===j.realpathSync(fileURLToPath(import.meta.url))||r}catch{return h.resolve(t)===h.resolve(fileURLToPath(import.meta.url))||r}})(),$l=!Al||Il;function Nl(){for(let t of [process.stdout,process.stderr])t._handle?.setBlocking?.(true);}async function ge(t){await new Promise(e=>setImmediate(e)),await new Promise(e=>setTimeout(e,25)),await Promise.all([process.stdout,process.stderr].map(e=>new Promise(r=>{e.write("",()=>r());}))),process.exit(t);}if($l){Nl();let t=process.argv.slice(2),e=t[0],r=process.cwd(),o=Je(r),n=j.existsSync(h.join(r,".rapidkit","project.json")),s=pl(),a=ci(t),c=s&&Vt(t),l=e==="init"&&o&&!n;(t.length===0||t.length===1&&(e==="--help"||e==="-h"||e==="help"))&&(console.log(i.blue.bold(`
|
|
308
308
|
\u{1F680} Welcome to RapidKit NPM CLI!
|
|
309
|
-
`)),$i(),process.exit(0)),t.some(
|
|
310
|
-
`),process.exit(1);}):a||c?ne.parseAsync().then(()=>ge(0)).catch(
|
|
311
|
-
`),process.exit(1);}):l?Vo(t).then(
|
|
312
|
-
`),process.exit(1);}):Cl().then(async
|
|
313
|
-
`),ci(
|
|
314
|
-
`),d$1){let m=await e$1(
|
|
309
|
+
`)),$i(),process.exit(0)),t.some(u=>u==="--version"||u==="-V"||u==="-v")&&!t.some(u=>u==="--help"||u==="-h"||u==="help")&&(console.log(b()),process.exit(0)),Ko(t)&&process.exit(0),c&&li(e)?(async()=>{e==="bootstrap"&&await ge(await mi(t)),e==="setup"&&await ge(await fi(t)),e==="cache"&&await ge(await gi(t)),await ge(await hi(t));})().catch(u=>{process.stderr.write(`RapidKit (npm) failed to run ${e}: ${u?.message??u}
|
|
310
|
+
`),process.exit(1);}):a||c?ne.parseAsync().then(()=>ge(0)).catch(u=>{process.stderr.write(`RapidKit (npm) failed: ${u?.message??u}
|
|
311
|
+
`),process.exit(1);}):l?Vo(t).then(u=>ge(u)).catch(u=>{process.stderr.write(`RapidKit (npm) failed to run workspace init: ${u?.message??u}
|
|
312
|
+
`),process.exit(1);}):Cl().then(async u=>{if(!u){let p=process.argv.slice(2);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] argv=${JSON.stringify(p)}
|
|
313
|
+
`),ci(p)){await ne.parseAsync();return}if(Ko(p)&&await ge(0),p[0]==="create"){let m=await bi(p);await ge(m);}if(p[0]==="init"){let m=await Vo(p);await ge(m);}if(li(p[0])){if(p[0]==="bootstrap"){let g=await mi(p);await ge(g);}if(p[0]==="setup"){let g=await fi(p);await ge(g);}if(p[0]==="cache"){let g=await gi(p);await ge(g);}let m=await hi(p);await ge(m);}if(j$1(p[0])){if(Lo(p))return;let m=p[0],g=a$4(process.cwd()),w=await wt(process.cwd()),y=re(process.cwd()),v=false;if(y){let C=h.join(y,".rapidkit","policies.yml");if(await R__default.pathExists(C))try{let I=await j.promises.readFile(C,"utf-8");if(v=((I.match(/^\s*enforcement_mode:\s*(warn|strict)\s*(?:#.*)?$/m)??I.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m))?.[1]??"warn")==="strict",v){let oe=h.join(y,".rapidkit","toolchain.lock"),L=[];if(!await R__default.pathExists(oe))L.push("toolchain.lock is missing \u2014 run `rapidkit bootstrap` first (strict mode requires a reproducible toolchain).");else try{let T=JSON.parse(await j.promises.readFile(oe,"utf-8")).runtime??{};b$3(g,process.cwd())&&!T.go?.version&&L.push("Go runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup go` first."),c$1(g,process.cwd())&&!T.node?.version&&L.push("Node runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup node` first."),d(g,process.cwd())&&!T.java?.version&&L.push("Java runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup java` first."),e$2(g,process.cwd())&&!T.dotnet?.version&&L.push(".NET runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup dotnet` first."),f$1(g,process.cwd())&&!T.python?.version&&L.push("Python runtime version is not pinned in toolchain.lock \u2014 run `rapidkit setup python` first.");}catch{L.push("toolchain.lock is invalid JSON \u2014 regenerate it with `rapidkit bootstrap` before running commands in strict mode.");}let O=h.join(y,".rapidkit","workspace.json");if(await R__default.pathExists(O))try{let T=JSON.parse(await j.promises.readFile(O,"utf-8")).profile??"";T==="python-only"&&(b$3(g,process.cwd())||c$1(g,process.cwd())||d(g,process.cwd())||e$2(g,process.cwd()))&&L.push('Workspace profile is "python-only" but this project is not Python. Update the workspace profile or use a polyglot workspace.'),T==="node-only"&&(b$3(g,process.cwd())||f$1(g,process.cwd())||d(g,process.cwd())||e$2(g,process.cwd()))&&L.push('Workspace profile is "node-only" but this project is not Node. Update the workspace profile or use a polyglot workspace.'),T==="go-only"&&(f$1(g,process.cwd())||c$1(g,process.cwd())||d(g,process.cwd())||e$2(g,process.cwd()))&&L.push('Workspace profile is "go-only" but this project is not Go. Update the workspace profile or use a polyglot workspace.'),T==="java-only"&&(f$1(g,process.cwd())||c$1(g,process.cwd())||b$3(g,process.cwd())||e$2(g,process.cwd()))&&L.push('Workspace profile is "java-only" but this project is not Java. Update the workspace profile or use a polyglot workspace.'),T==="dotnet-only"&&(f$1(g,process.cwd())||c$1(g,process.cwd())||b$3(g,process.cwd())||d(g,process.cwd()))&&L.push('Workspace profile is "dotnet-only" but this project is not .NET. Update the workspace profile or use a polyglot workspace.');}catch{}if(L.length>0){console.log(i.red(`\u274C Strict policy violations block \`${m}\`:`));for(let Pe of L)console.log(i.red(` \u2022 ${Pe}`));console.log(i.gray("\u{1F4A1} Fix violations or switch to warn mode: set mode: warn in .rapidkit/policies.yml")),await ge(1);}}}catch{}}let P=await a$5({startPath:process.cwd(),action:m,writeReport:true}),k=v||process.env.RAPIDKIT_LIFECYCLE_ENFORCE_READINESS==="1"||process.env.RAPIDKIT_ENFORCE_READINESS==="1";if(P.blocking&&k){console.log(i.red(`\u274C Release readiness blocks \`${m}\`:`));for(let C of P.blockingReasons)console.log(i.red(` \u2022 ${C}`));P.evidencePath&&console.log(i.gray(`\u2139\uFE0F Readiness evidence: ${P.evidencePath}`)),await ge(1);}P.overallStatus!=="pass"&&!k&&(console.log(i.yellow(`\u26A0\uFE0F Release readiness is ${P.overallStatus}. Command continues in warn mode.`)),P.evidencePath&&console.log(i.gray(` Evidence: ${P.evidencePath} (set RAPIDKIT_LIFECYCLE_ENFORCE_READINESS=1 to block)`)));let E=await Ii(process.cwd(),async()=>{if(b$3(g,process.cwd())||w==="go"){let C=Ve("go",{runCommandInCwd:U,runCoreRapidkit:e$1});if(m==="lint")return Z(await C.runLint?.(process.cwd())??{exitCode:1,message:"Lint is not supported."});if(m==="format")return Z(await C.runFormat?.(process.cwd())??{exitCode:1,message:"Format is not supported."});let I=m==="dev"?await C.runDev(process.cwd()):m==="test"?await C.runTest(process.cwd()):m==="build"?await C.runBuild(process.cwd()):await C.runStart(process.cwd());return I.message&&console.log(i.red(`\u274C ${I.message}`)),I.exitCode}if(d(g,process.cwd())||w==="java")return m==="dev"?await Qe("dev",process.cwd()):m==="test"?await Qe("test",process.cwd()):m==="build"?await Qe("build",process.cwd()):m==="lint"?await Qe("lint",process.cwd()):m==="format"?await Qe("format",process.cwd()):await Qe("start",process.cwd());if(e$2(g,process.cwd())||w==="dotnet"){let C=Ve("dotnet",{runCommandInCwd:U,runCoreRapidkit:e$1});if(m==="lint")return Z(await C.runLint?.(process.cwd())??{exitCode:1,message:"Lint is not supported."});if(m==="format")return Z(await C.runFormat?.(process.cwd())??{exitCode:1,message:"Format is not supported."});let I=m==="dev"?await C.runDev(process.cwd()):m==="test"?await C.runTest(process.cwd()):m==="build"?await C.runBuild(process.cwd()):await C.runStart(process.cwd());return I.message&&console.log(i.red(`\u274C ${I.message}`)),I.exitCode}if(c$1(g,process.cwd())||w==="node")return m==="dev"?await ht("dev",process.cwd()):m==="test"?await ht("test",process.cwd()):m==="build"?await ht("build",process.cwd()):m==="lint"?await ht("lint",process.cwd()):m==="format"?await ht("format",process.cwd()):await ht("start",process.cwd());if(f$1(g,process.cwd())||w==="python"){if(m==="lint"||m==="format")return await e$1([m],{cwd:process.cwd()});let C=Ve("python",{runCommandInCwd:U,runCoreRapidkit:e$1});return Z(m==="dev"?await C.runDev(process.cwd()):m==="test"?await C.runTest(process.cwd()):m==="build"?await C.runBuild(process.cwd()):await C.runStart(process.cwd()))}return -1});if(!E.ok){await ge(E.code);return}if(E.ok&&E.value>=0){await ge(E.value);return}if(E.ok&&E.value===-1){console.error(i.red(`\u274C RapidKit cannot run \`${m}\` for this project runtime.`)),console.error(i.gray("Run `rapidkit project commands` to inspect supported commands.")),await ge(1);return}}if(p[0]==="add"||p[0]==="module"&&p[1]==="add"){let m=a$4(process.cwd());if(m?.module_support===false){let g=m?.runtime==="java"?"Spring Boot":m?.runtime==="dotnet"?"ASP.NET Core":"Go";console.error(i.red(`\u274C RapidKit modules are not available for ${g} npm-level kits.`)),console.error(i.gray(" The module system requires Python and is currently only supported for FastAPI and NestJS projects.")),await ge(1);}}if(Lo(p))return;let d$1=await El(p);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[rapidkit-npm] shouldForwardToCore=${d$1}
|
|
314
|
+
`),d$1){let m=await e$1(p,{cwd:process.cwd()});await ge(m);}await ne.parseAsync();}});}export{il as NPM_ONLY_SCOPED_COMMANDS,xi as NPM_ONLY_TOP_LEVEL_COMMANDS,al as WRAPPER_ORCHESTRATED_PROJECT_COMMANDS,fl as detectWindowsDoctorWorkspaceShadow,ul as getGlobalCommandCapabilities,jl as handleAdoptCommand,mi as handleBootstrapCommand,gi as handleCacheCommand,bi as handleCreateOrFallback,Pl as handleImportCommand,Vo as handleInitCommand,hi as handleMirrorCommand,fi as handleSetupCommand,Bo as installWorkspaceDependencies,pl as isNpmExecInvocation,El as shouldForwardToCore};
|