Lines 126-166javascript
126`)),console.log(s.gray(`Workspace: ${t.workspacePath}`)),t.workspaceName&&console.log(s.gray(`Name: ${t.workspaceName}`)),console.log(s.gray(`Strategy: ${t.strategy} (sidecar compose)`)),console.log(s.gray(`Compose: ${t.composePath}`)),console.log(s.gray(`Plan report: ${Wt}`)),console.log(s.gray(`Env example: ${t.envExamplePath}`)),console.log(""),t.services.length===0)console.log(s.yellow("No infrastructure services detected."));else {console.log(s.bold("Services:"));for(let o of t.services){let r=o.ports.map(n=>`${n.host}:${n.container}`).join(", ");console.log(s.cyan(` ${o.id}`),s.gray(`($ ...
127`)):(console.log(s.green("Artifacts written:")),console.log(s.gray(` ${i.composePath}`)),console.log(s.gray(` ${i.planPath}`)),console.log(s.gray(` ${i.envExamplePath}
128`)));}catch(r){console.error(s.red(`
129\u274C ${r instanceof Error?r.message:String(r)}
130`)),process.exit(1);}}),e.command("up").description("Start planned infrastructure services via Docker Compose").option("--workspace <path>","Workspace root path").option("--detach","Run containers in background",true).option("--build","Build images before starting").option("--no-plan","Skip refreshing plan artifacts before starting").action(async o=>{try{let r=Go(o.workspace);if(o.plan!==false){let l=await Qr({workspacePath:r});await Xr({workspacePath:r,plan:l});}if((await Zr(r)).services.length===0)throw new Error("Infra plan has no services. Run: npx workspai infra plan (from a workspace wit ...
132`)),process.exit(a.exitCode);}o.detach!==false&&(console.log(s.green(`
133\u2705 Infrastructure stack started.
134`)),console.log(s.gray(`Check status: npx workspai infra status
135`)));}catch(r){console.error(s.red(`
136\u274C ${r instanceof Error?r.message:String(r)}
137`)),process.exit(1);}}),e.command("down").description("Stop planned infrastructure services").option("--workspace <path>","Workspace root path").option("--volumes","Remove named volumes").action(async o=>{try{let r=Go(o.workspace);await Zr(r);let n=["down"
138\u2705 Infrastructure stack stopped.
139`));}catch(r){console.error(s.red(`
140\u274C ${r instanceof Error?r.message:String(r)}
141`)),process.exit(1);}}),e.command("status").description("Show Docker Compose status for planned infrastructure").option("--workspace <path>","Workspace root path").option("--json","Print docker compose ps JSON output").option("--strict","Exit non-zero when any container is not healthy/running").action(async o=>{try{let r=Go(o.workspace),n=await
143`)),console.log(s.gray(`Workspace: ${r}`)),console.log(s.gray(`Planned services: ${n.services.map(l=>l.id).join(", ")||"none"}`)),console.log(""),a.stdout.trim()?process.stdout.write(a.stdout):(console.log(s.yellow
144`))),a.exitCode!==0&&(a.stderr&&process.stderr.write(a.stderr),process.exit(a.exitCode)),o.strict&&/Restarting|Exit|unhealthy/i.test(a.stdout)&&(console.log(""),console.log(s.red("One or more infra containers are not healthy.")),console.log(s.gray(`Inspect logs with: docker logs workspai-postgres (or redis/mailpit)
145`)),process.exit(1));}catch(r){console.error(s.red(`
146\u274C ${r instanceof Error?r.message:String(r)}
147`)),process.exit(1);}});}function ol(t){try{let e=v.join(t,"Makefile");return P.existsSync(e)?P.readFileSync(e,"utf8"):""}catch{return ""}}function ze(t,
148${r.stderr||""}`,i=n.match(/version\s+"([^"]+)"/i);if(i?.[1])return this.parseMajorJavaVersion(i[1]);let a=n.match(/(?:openjdk|java)\s+(\d+(?:[._]\d+)?)/i);return a?.[1]?this.parseMajorJavaVersion(a[1]):null}catch{return null}}parseMavenVersion(e){if(!e)return null;let o=e.match(/Apache Maven\s+(\d+)\.(\d+)\.(\d+)/i);return o?[Number.parseInt(o[1],10),Number.parseInt(o[2],10),Number.parseInt(o[3],10)]:null}isMavenVersionAtLeast(e,o){for(let r=0;r<3;r+=1){if(e[r]>o[r])return true;if(e[r]<o[r])return false}return true}async checkSystemMavenVersion(e){try{let o=await execa("mvn",["-version"],{ ...
HighSame File Env Network Execution
A single source file combines environment access, network access, and code or shell execution; review context before blocking.
dist/index.jsView on unpkg · L146 149${o.stderr||""}`);return r?this.isMavenVersionAtLeast(r,[3,9,0])?{exitCode:0}:{exitCode:1,message:`Maven ${r.join(".")} detected; Maven 3.9+ is required.`}:{exitCode:1,message:"Unable to parse Maven version. Ensure Maven 3.9+ is installed and retry."}}catch{return {exitCode:1,message:"Maven version check failed. Install Maven 3.9+ and ensure mvn is on PATH."
150`,"utf-8");}function Ke(t,e){return v.isAbsolute(e)?e:v.join(t,e)}function hl(t,e){if(t.target)return t.target;if(t.source)return v.basename(t.source);if(t.url)try{let o=new URL(t.url).pathname,r=v.basename(o);if(r&&r!=="/")return r}catch{}return `${e}.artifact`}async function yl(t){let e=o(t,"trusted-sources.lock").find(r=>E.pathExistsSync(r)),o$1=new Set(["localhost","127.0.0.1"]);if(!e)return o$1;try{let n=(await promises.readFile(e,"utf-8")).split(/\r?\n/).map(i=>i.trim()).filter(i=>i.length>0&&!i.startsWith("#"));for(let i of n)o$1.add(i.toLowerCase());}catch{}return o$1}async function wl ...
151`,"utf-8"),n}function Pl(t,e){if(!e?.enabled)return {headers:{}};let o=process.env[e.hmacKeyEnv];if(!o)return {headers:{},error:`Evidence signing key env is missing: ${e.hmacKeyEnv}`};let r=(e.algorithm||"sha256").toLowerCase(),n=e.headerName||"x-rapidkit-evidence-signature",i
152`,"utf-8"),r.lockWritten=true,o$1.push({id:"mirror.lock.write",status:"passed",message:`Mirror lock updated at ${v.relative(t,i)}.`}),r.transparencyEvidenceRecords=I.length,I.length>0){let U={schemaVersion:"1.0",generatedAt:new Date().toISOString(),environment:y,records:I},D=new Date().toISOString().replace(/[:.]/g,"-"),R=v.join(l$1,`transparency-evidence-${D}.json`),ue=v.join(l$1,"transparency-evidence.latest.json");if(await E.ensureDir(l$1),await Gi(R,U),await Gi(ue,U),r.transparencyEvidenceWritten=true,o$1.push({id:"sigstore.evidence.write",status:"passed",message:`Transparency evidence wri ...
153`,"utf-8"),r.evidenceExported=true,r.evidenceExportTarget=H,o$1.push({id:"sigstore.evidence.export.file",status:"passed",message:`Transparency evidence exported to file sink ${H}.`});}catch(H){o$1.push({id:"sigstore.evidence.export.file",status:"failed",message:`Evidence file export failed: ${H.message}`});}else if(w.target==="http")if(!w.endpoint)o$1.push({id:"sigstore.evidence.export.http",status:"failed",message:"Evidence export target=http requires security.evidenceExport.endpoint."});else {let H=Math.max(0,w.retries??0),Z=Math.max(0,w.backoffMs??500),je=Pl(U,w.signing);je.error&&o$1.push( ...
154`),1;try{h(r);}catch(d){let m=d instanceof Error?d.message:String(d);return process.stderr.write(`${m}
155`),1}let n=rd(o.id,t);if(n)return process.stderr.write(`${n}
156`),1;let i=Ie(t,"--output")||process.cwd(),a=v.resolve(i,r),l=t.includes("--skip-git")||t.includes("--no-git"),c=t.includes("--skip-install");try{let{default:d}=await import('fs-extra');if
157`),1;await d.ensureDir(a),await e$2(o,{projectName:r,projectPath:a,args:t,skipGit:l,skipInstall:c});let m=oe(process.cwd());if(m){let{syncWorkspaceProjects:p}=await import('./workspace-PR6VZRBG.js');await p(m,true);}return 0}catch(d){return process.stderr.write(`Workspai ${
158`),1}}async function ca(t){let e=k$3(t[2]);if(!e)return 1;try{let o=await o$2({args:t});if(!o.dryRun){let r=oe(process.cwd()),n=false;r||(r
159`),t[3]||process.stderr.write(`Usage: ${n$1(e.id)}
160`),1}}async function ir(t,e){if(t.includes("--json"))return process.stderr.write("Workspai CLI 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(`Workspai CLI could not run the Python core engine for \`create\`.
162Install Python 3.10+ to use the interactive wizard and full kit catalog.
163`),1;let n=t[2],i=t[3];if(!n||!i)return process.stderr.write(`Usage: npx workspai create project <kit> <name> [--output <dir>]
164Tip: offline fallback supports only fastapi* and nestjs* kits.
165`),1;let a=Xl(n);if(!a)return process.stderr.write(`Workspai CLI could not run the Python core engine to create this kit.
Long lines were clipped for display.