rapidkit 0.38.0 → 0.39.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/README.md +36 -9
- package/contracts/runtime-command-surface.v1.json +33 -0
- package/contracts/workspace-intelligence/workspace-dependency-graph.v1.json +92 -0
- package/contracts/workspace-intelligence/workspace-impact.v1.json +32 -2
- package/contracts/workspace-intelligence/workspace-model.v1.json +5 -0
- package/contracts/workspace-intelligence/workspace-verify.v1.json +103 -1
- package/dist/analyze-RHQM4AB2.js +1 -0
- package/dist/autopilot-release-FWKOY2BD.js +1 -0
- package/dist/chunk-3YLMCP3V.js +1 -0
- package/dist/chunk-4FJQWL7P.js +4 -0
- package/dist/chunk-4Q2ZZKGB.js +1 -0
- package/dist/chunk-6G2KSHP6.js +2 -0
- package/dist/{chunk-PPQYTYQG.js → chunk-6KD5F6LX.js} +4 -4
- package/dist/{chunk-TVIOAZ6E.js → chunk-ERCD6NFF.js} +15 -15
- package/dist/chunk-G76C74EV.js +1 -0
- package/dist/chunk-GOM3RFB3.js +2 -0
- package/dist/{chunk-NKNMGWAZ.js → chunk-GYNIVEYP.js} +1 -1
- package/dist/chunk-HTYMXMQM.js +1 -0
- package/dist/chunk-KYH364KQ.js +1 -0
- package/dist/chunk-OWNGSAO3.js +2 -0
- package/dist/chunk-PYCJWW4B.js +1 -0
- package/dist/chunk-QPEBI6AB.js +2 -0
- package/dist/{chunk-5NBYSXOZ.js → chunk-RXWM5DSC.js} +2 -2
- package/dist/chunk-S5KTATOU.js +1 -0
- package/dist/chunk-TYZPPUBH.js +1 -0
- package/dist/chunk-UY4KRFNL.js +2 -0
- package/dist/chunk-VQMZC5TC.js +9 -0
- package/dist/{chunk-JBDQADHY.js → chunk-WHCON2VN.js} +11 -11
- package/dist/chunk-X7PWDIQW.js +1 -0
- package/dist/{chunk-7XW2I6MP.js → chunk-ZWKLRZE5.js} +2 -2
- package/dist/{create-Y3XJOKL5.js → create-XVDDQA42.js} +1 -1
- package/dist/{demo-kit-3VTLJBP7.js → demo-kit-RWGOEDW4.js} +1 -1
- package/dist/{doctor-QC662YLH.js → doctor-UOLOGJ2Z.js} +1 -1
- package/dist/{dotnet-webapi-clean-FX533F5U.js → dotnet-webapi-clean-RTBRPDPL.js} +1 -1
- package/dist/{gofiber-standard-35CJZ7S3.js → gofiber-standard-UGIRKPKL.js} +1 -1
- package/dist/{gogin-standard-SAX6C4ZK.js → gogin-standard-HJ7SPFNT.js} +1 -1
- package/dist/index.d.ts +32 -1
- package/dist/index.js +153 -153
- package/dist/pipeline-O5ANBQMK.js +5 -0
- package/dist/{springboot-standard-SFMSLTX4.js → springboot-standard-IWJSVDLZ.js} +1 -1
- package/dist/{workspace-WBKFXH4Z.js → workspace-L4ITCKMM.js} +1 -1
- package/dist/{workspace-agent-sync-3FFFJYKF.js → workspace-agent-sync-SALW6TVR.js} +1 -1
- package/dist/{workspace-context-V4UGIHSC.js → workspace-context-NMMQMHNU.js} +1 -1
- package/dist/{workspace-foundation-T45HAWKL.js → workspace-foundation-HNIRAIBF.js} +1 -1
- package/dist/workspace-graph-ICB7OVAZ.js +3 -0
- package/dist/workspace-history-LHUTLE3S.js +1 -0
- package/dist/{workspace-intelligence-MGL3Z25K.js → workspace-intelligence-64IWAYHS.js} +1 -1
- package/dist/workspace-model-SDHH5RBC.js +1 -0
- package/dist/workspace-run-EP7XGEM6.js +1 -0
- package/dist/workspace-verify-6Q6MGRG6.js +1 -0
- package/dist/workspace-watch-JDXVGW4H.js +1 -0
- package/docs/contracts/ARTIFACT_CATALOG.md +148 -0
- package/docs/contracts/CLI_LOG_EVENT_STREAM.md +123 -0
- package/package.json +8 -5
- package/dist/analyze-6RFG7C7Z.js +0 -1
- package/dist/autopilot-release-SBPGNGAB.js +0 -1
- package/dist/chunk-2ED6SPXP.js +0 -1
- package/dist/chunk-3R7UJAX5.js +0 -1
- package/dist/chunk-6E5TBB2C.js +0 -2
- package/dist/chunk-6P5DCHBQ.js +0 -4
- package/dist/chunk-ABPDGFVD.js +0 -2
- package/dist/chunk-B2KOIORF.js +0 -1
- package/dist/chunk-C7WILE56.js +0 -1
- package/dist/chunk-HEG6DIGW.js +0 -2
- package/dist/chunk-IW3KLQXE.js +0 -2
- package/dist/chunk-RELR4O5E.js +0 -2
- package/dist/chunk-T5LN7EO5.js +0 -9
- package/dist/chunk-XESEBTPE.js +0 -1
- package/dist/pipeline-C4UCLETO.js +0 -5
- package/dist/workspace-model-IKMGY2BX.js +0 -1
- package/dist/workspace-run-HOR56FON.js +0 -1
- package/dist/workspace-verify-A3J6D7T2.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {k,e as e$
|
|
1
|
+
import {k,e as e$2}from'./chunk-G76C74EV.js';import {b as b$2}from'./chunk-3YLMCP3V.js';import {e,g,f as f$2,b as b$3,c as c$2,d as d$2}from'./chunk-ZWKLRZE5.js';import {a,d,b as b$1}from'./chunk-RV6HBTFC.js';import {b}from'./chunk-6KD5F6LX.js';import {f,c,e as e$3}from'./chunk-6G2KSHP6.js';import {a as a$1,e as e$1,d as d$1,f as f$1,c as c$1,k as k$1}from'./chunk-Z5LKRG57.js';import {promises}from'fs';import*as P from'fs-extra';import m from'path';import t from'chalk';import {execa}from'execa';async function H(e,o={}){let n=m.resolve(e),r=o.workspaceName??m.basename(n);try{let{registerWorkspace:a}=await import('./workspace-L4ITCKMM.js');await a(n,r);}catch(a){o.silent||console.warn(t.gray(`Note: Could not register workspace in shared registry: ${a?.message??a}`));}try{let{syncWorkspaceContract:a}=await import('./workspace-contract-D5O4OZD5.js'),c=await a({workspacePath:n});if(o.silent||console.log(t.gray(`\u2139\uFE0F Workspace intelligence synced (contract + registry summary, ${c.contract.projects.length} project(s)).`)),!o.silent&&c.verification.status!=="passed"){console.log(t.yellow("\u26A0\uFE0F Workspace contract verification reported issues."));for(let d of c.verification.violations)console.log(t.gray(` Violation: ${d}`));console.log(t.white(" Next: npx rapidkit workspace contract inspect"));}}catch(a){o.silent||console.warn(t.gray(`Note: Could not sync workspace intelligence layer: ${a?.message??a}`));}}function S(){return c$1()}async function B(e,o,n,r){let a=d(o,b(),n);r&&(a.metadata||(a.metadata={}),a.metadata.python={version:r}),await b$1(e,a);}async function z(e){await P.outputFile(m.join(e,".gitignore"),`.venv/
|
|
2
2
|
__pycache__/
|
|
3
3
|
*.pyc
|
|
4
4
|
.env
|
|
@@ -36,11 +36,11 @@ cache:
|
|
|
36
36
|
self_heal: true
|
|
37
37
|
verify_integrity: false
|
|
38
38
|
`}async function Et(){try{let{stdout:e}=await execa("go",["version"],{timeout:3e3,stdio:"pipe"}),o=e.match(/go(\d+\.\d+(?:\.\d+)?)/i);return o?o[1]:void 0}catch{return}}async function Ct(){try{let{stdout:e}=await execa("dotnet",["--version"],{timeout:3e3,stdio:"pipe"}),o=e.trim();return o.length>0?o:void 0}catch{return}}async function Q(e,o,n,r,a,c){let[d,p]=await Promise.all([Et(),Ct()]);await P.outputFile(m.join(e,".rapidkit","workspace.json"),xt(o,n,r,a,c),"utf-8"),await P.outputFile(m.join(e,".rapidkit","toolchain.lock"),It(n,r,process.version,d,p),"utf-8"),await P.outputFile(m.join(e,".rapidkit","policies.yml"),Rt(),"utf-8"),await P.outputFile(m.join(e,".rapidkit","cache-config.yml"),_t(),"utf-8");}async function ke(e,o){let{workspaceName:n=m.basename(e),installMethod:r="venv",pythonVersion:a$1,profile:c,writeMarker:d$1=true,writeGitignore:p=true,onlyIfMissing:y=true}=o||{},h=[],[g,s]=await Promise.all([Et(),Ct()]),i=[{relPath:m.join(".rapidkit","workspace.json"),content:xt(n,r,a$1,c)},{relPath:m.join(".rapidkit","toolchain.lock"),content:It(r,a$1,process.version,g,s)},{relPath:m.join(".rapidkit","policies.yml"),content:Rt()},{relPath:m.join(".rapidkit","cache-config.yml"),content:_t()}];for(let f of i){let u=m.join(e,f.relPath);y&&await P.pathExists(u)||(await P.outputFile(u,f.content,"utf-8"),h.push(f.relPath));}if(d$1&&(!!!await a(e)||!y)){let u=d(n,b(),r);a$1&&(u.metadata||(u.metadata={}),u.metadata.python={version:a$1}),await b$1(e,u),h.push(".rapidkit-workspace");}if(p){let f=m.join(e,".gitignore");(!y||!await P.pathExists(f))&&(await z(e),h.push(".gitignore"));}return h}var jt=new Set(["go-only","java-only","dotnet-only","node-only","minimal"]),Ot={"python-only":"minimal",polyglot:"node-only",enterprise:"polyglot"};function Vt(e){let o=e,n=new Set;for(;!jt.has(o);){if(n.has(o))return "minimal";n.add(o);let r=Ot[o];if(!r)return "minimal";o=r;}return o}var F="3.10",$t=["3.10","3.11","3.12"];async function Pt(e){try{let{stdout:o}=await execa(e,["--version"],{timeout:3e3}),n=o.match(/Python (\d+\.\d+\.\d+)/);if(n)return n[1]}catch{}return null}async function Lt(e,o){try{await promises.writeFile(m.join(e,".python-version"),`${o}
|
|
39
|
-
`,"utf-8"),
|
|
39
|
+
`,"utf-8"),f.debug(`Created .python-version with ${o}`);}catch(n){f.warn(`Failed to create .python-version: ${n}`);}}function V(){let n=[...(process.env.PATH||"").split(m.delimiter).filter(Boolean)];for(let r of k$1())n.includes(r)||n.unshift(r);process.env.PATH=n.join(m.delimiter);}async function it(e,o){V(),e.start("Checking pipx installation");try{return await execa("pipx",["--version"]),e.succeed("pipx found"),{kind:"binary"}}catch{}let n=S();try{return await execa(n,["-m","pipx","--version"]),e.succeed("pipx found"),{kind:"python-module",pythonCmd:n}}catch{}if(o)throw new d$2;e.stop?.();let{installPipx:r}=await b$2([{type:"confirm",name:"installPipx",message:"pipx is not installed. Install it now (user install via python -m pip)?",default:true}]);if(!r)throw new d$2;e.start("Installing pipx (user install)");try{try{await execa(n,["-m","pip","install","--user","--upgrade","pip"]);}catch{}await execa(n,["-m","pip","install","--user","--upgrade","pipx"]);}catch(a){let c=a,d=String(c?.stderr||c?.shortMessage||c?.message||"");throw new f$2("Install pipx with python -m pip",a instanceof Error?a:new Error(d))}e.succeed("pipx installed"),V();try{return await execa(n,["-m","pipx","--version"]),{kind:"python-module",pythonCmd:n}}catch(a){let c=a,d=String(c?.stderr||c?.shortMessage||c?.message||"pipx not runnable after install");throw new f$2("Verify pipx after install",new Error(`${d}
|
|
40
40
|
|
|
41
|
-
Try reopening your terminal or run: ${n} -m pipx ensurepath`))}}async function O(e,o){return e.kind==="binary"?execa("pipx",o):execa(e.pythonCmd,["-m","pipx",...o])}function Gt(e){let o=e.match(/^(\d+)\.(\d+)/);return o?`${o[1]}.${o[2]}`:null}function bt(e){if(!e)return null;let o=e.match(/Python\s+(\d+)\.(\d+)(?:\.\d+)?/i);return o?`${o[1]}.${o[2]}`:null}function ut(e,o){let[n,r]=e.split(".").map(d=>Number(d)),[a,c]=o.split(".").map(d=>Number(d));return n!==a?n-a:r-c}function U(e,o){return ut(e,o)>=0}async function Wt(e){let o=new Set,n=e$
|
|
41
|
+
Try reopening your terminal or run: ${n} -m pipx ensurepath`))}}async function O(e,o){return e.kind==="binary"?execa("pipx",o):execa(e.pythonCmd,["-m","pipx",...o])}function Gt(e){let o=e.match(/^(\d+)\.(\d+)/);return o?`${o[1]}.${o[2]}`:null}function bt(e){if(!e)return null;let o=e.match(/Python\s+(\d+)\.(\d+)(?:\.\d+)?/i);return o?`${o[1]}.${o[2]}`:null}function ut(e,o){let[n,r]=e.split(".").map(d=>Number(d)),[a,c]=o.split(".").map(d=>Number(d));return n!==a?n-a:r-c}function U(e,o){return ut(e,o)>=0}async function Wt(e){let o=new Set,n=e$1(14,10);for(let s of n)try{let i=await execa(s.command,s.args,{timeout:2500}),f=bt(`${i.stdout||""}
|
|
42
42
|
${i.stderr||""}`);f&&U(f,F)&&o.add(f);}catch{}let r=null;try{let s=await execa(S(),["--version"],{timeout:2500}),i=bt(`${s.stdout||""}
|
|
43
|
-
${s.stderr||""}`);i&&U(i,F)&&(r=i,o.add(i));}catch{}let a=$t.filter(s=>U(s,F)),c=new Set([...a,...o]),d=Array.from(c).sort((s,i)=>ut(i,s)),p=e?Gt(e):null,y=p&&U(p,F)?p:r||d[0]||F;return c.has(y)||c.add(y),{choices:Array.from(c).sort((s,i)=>ut(i,s)).map(s=>{let i=[];return s===r&&i.push("current system"),s===F&&i.push("minimum supported"),o.has(s)&&s!==r&&i.push("detected"),{name:i.length>0?`${s} (${i.join(", ")})`:s,value:s}}),defaultValue:y}}async function Ht(){V();let e=false,o=false;try{await execa("poetry",["--version"],{timeout:2500}),e=true;}catch{e=false;}try{await execa("pipx",["--version"],{timeout:2500}),o=true;}catch{let n=c$1();try{await execa(n,["-m","pipx","--version"],{timeout:2500}),o=true;}catch{o=false;}}return {poetry:e,pipx:o}}async function At(){V();try{return await execa("poetry",["--version"],{timeout:2500}),true}catch{return false}}function zt(e,o){return e==="poetry"&&o.poetry?"poetry":e==="pipx"&&o.pipx?"pipx":e==="venv"?"venv":o.poetry?"poetry":"venv"}async function Ut(e,o){V(),e.start("Checking Poetry installation");try{await execa("poetry",["--version"]),e.succeed("Poetry found");return}catch{}if(o)throw new c$2;let{installPoetry:n}=await b$2([{type:"confirm",name:"installPoetry",message:"Poetry is not installed. Install it now using pipx?",default:true}]);if(!n)throw new c$2;let r=await it(e,o);e.start("Installing Poetry with pipx");try{await O(r,["install","poetry"]);}catch(a){let c=a,d=String(c?.stderr||c?.shortMessage||c?.message||"");if(/already\s+installed|already\s+seems\s+to\s+be\s+installed|exists/i.test(d))try{await O(r,["upgrade","poetry"]);}catch{}else throw new f$
|
|
43
|
+
${s.stderr||""}`);i&&U(i,F)&&(r=i,o.add(i));}catch{}let a=$t.filter(s=>U(s,F)),c=new Set([...a,...o]),d=Array.from(c).sort((s,i)=>ut(i,s)),p=e?Gt(e):null,y=p&&U(p,F)?p:r||d[0]||F;return c.has(y)||c.add(y),{choices:Array.from(c).sort((s,i)=>ut(i,s)).map(s=>{let i=[];return s===r&&i.push("current system"),s===F&&i.push("minimum supported"),o.has(s)&&s!==r&&i.push("detected"),{name:i.length>0?`${s} (${i.join(", ")})`:s,value:s}}),defaultValue:y}}async function Ht(){V();let e=false,o=false;try{await execa("poetry",["--version"],{timeout:2500}),e=true;}catch{e=false;}try{await execa("pipx",["--version"],{timeout:2500}),o=true;}catch{let n=c$1();try{await execa(n,["-m","pipx","--version"],{timeout:2500}),o=true;}catch{o=false;}}return {poetry:e,pipx:o}}async function At(){V();try{return await execa("poetry",["--version"],{timeout:2500}),true}catch{return false}}function zt(e,o){return e==="poetry"&&o.poetry?"poetry":e==="pipx"&&o.pipx?"pipx":e==="venv"?"venv":o.poetry?"poetry":"venv"}async function Ut(e,o){V(),e.start("Checking Poetry installation");try{await execa("poetry",["--version"]),e.succeed("Poetry found");return}catch{}if(o)throw new c$2;let{installPoetry:n}=await b$2([{type:"confirm",name:"installPoetry",message:"Poetry is not installed. Install it now using pipx?",default:true}]);if(!n)throw new c$2;let r=await it(e,o);e.start("Installing Poetry with pipx");try{await O(r,["install","poetry"]);}catch(a){let c=a,d=String(c?.stderr||c?.shortMessage||c?.message||"");if(/already\s+installed|already\s+seems\s+to\s+be\s+installed|exists/i.test(d))try{await O(r,["upgrade","poetry"]);}catch{}else throw new f$2("Install Poetry with pipx",a instanceof Error?a:new Error(d))}e.succeed("Poetry installed"),V();try{await execa("poetry",["--version"]);}catch(a){let c=a,d=String(c?.stderr||c?.shortMessage||c?.message||"Poetry not found on PATH");throw new f$2("Verify Poetry after pipx install",new Error(`${d}
|
|
44
44
|
|
|
45
45
|
Poetry may be installed but not on PATH yet. Try reopening your terminal or run: pipx ensurepath`))}}function qt(e){let o=e==="poetry";return `#!/usr/bin/env sh
|
|
46
46
|
set -eu
|
|
@@ -111,7 +111,7 @@ echo RapidKit launcher could not find a local Python CLI. 1>&2
|
|
|
111
111
|
echo Tip: run .venv\\Scripts\\rapidkit.exe --help 1>&2
|
|
112
112
|
echo Tip: for npm-owned workspace commands, run npx --yes --package rapidkit rapidkit %* from a shell where npm is on PATH. 1>&2
|
|
113
113
|
exit /b 1
|
|
114
|
-
`}async function St(e,o){await P.outputFile(m.join(e,"rapidkit"),qt(o),{encoding:"utf-8",mode:493}),await P.outputFile(m.join(e,"rapidkit.cmd"),Yt(o),"utf-8");}async function Pe(e$
|
|
114
|
+
`}async function St(e,o){await P.outputFile(m.join(e,"rapidkit"),qt(o),{encoding:"utf-8",mode:493}),await P.outputFile(m.join(e,"rapidkit.cmd"),Yt(o),"utf-8");}async function Pe(e$1,o){let{skipGit:n=false,testMode:r=false,demoMode:a=false,dryRun:c$1=false,yes:d=false,userConfig:p={},installMethod:y,profile:h,parentDirectory:g}=o,s=e$1||"rapidkit",i=g?m.resolve(g,s):m.resolve(process.cwd(),s);if(await P.pathExists(i))throw new e(s);if(c$1){let w=h||(d?"minimal":void 0),R=y||p.defaultInstallMethod||"poetry",b=p.pythonVersion||"3.10";await Jt(i,s,a,p,w,R,b);return}if(a){await Bt(i,s,n);return}let f$1=new Set(["python-only","polyglot","enterprise"]),u=h||"";if(!d&&!h){let{selectedProfile:w}=await b$2([{type:"rawlist",name:"selectedProfile",message:"Select workspace profile:",choices:[{name:"minimal \u2014 Foundation files only (fastest bootstrap, mixed projects)",value:"minimal"},{name:"java-only \u2014 Java runtime (Spring Boot services)",value:"java-only"},{name:"python-only \u2014 Python + Poetry (FastAPI, Django, ML pipelines)",value:"python-only"},{name:"node-only \u2014 Node.js runtime (NestJS, Express, Next.js)",value:"node-only"},{name:"go-only \u2014 Go runtime (Fiber, Gin, gRPC, microservices)",value:"go-only"},{name:"dotnet-only \u2014 .NET runtime (ASP.NET Core services)",value:"dotnet-only"},{name:"polyglot \u2014 Python + Node.js + Go + Java + .NET multi-runtime workspace",value:"polyglot"},{name:"enterprise \u2014 Polyglot + governance + Sigstore verification",value:"enterprise"}],default:1}]);u=w;}else u||(u="minimal");let E=!d&&f$1.has(u),T=typeof p.pythonVersion=="string"&&p.pythonVersion.trim().length>0?p.pythonVersion.trim():void 0,_=y||p.defaultInstallMethod||"poetry",L=E?await Ht():{poetry:true,pipx:true},X=E?await Wt(T):{choices:$t.map(w=>({name:w,value:w})),defaultValue:F},Nt=zt(_,L),Ft=[{name:L.poetry?"\u{1F3AF} Poetry (Recommended - includes virtual env + dependency mgmt)":"\u{1F3AF} Poetry (Recommended) \u2014 not detected (we can install it)",value:"poetry"},{name:"\u{1F4E6} pip with venv (Standard, zero extra tools)",value:"venv"},{name:L.pipx?"\u{1F527} pipx (Global isolated - RapidKit CLI only, no local venv)":"\u{1F527} pipx (Global isolated) \u2014 not detected (we can install it)",value:"pipx"}],x=E?await b$2([{type:"rawlist",name:"pythonVersion",message:"Select Python version for RapidKit:",choices:X.choices,default:X.defaultValue},{type:"rawlist",name:"installMethod",message:"How would you like to manage the workspace environment?",choices:Ft,default:Nt}]):await(async()=>{let w=y||p.defaultInstallMethod||await(async()=>{try{return await execa("poetry",["--version"],{timeout:3e3}),"poetry"}catch{return f.warn("Poetry not found \u2014 auto-selecting venv. Pass --install-method poetry to override."),"venv"}})();return {pythonVersion:p.pythonVersion||"3.10",installMethod:w}})();E&&(console.log(t.gray(`
|
|
115
115
|
\u{1F4CC} Configuration notes:`)),x.pythonVersion==="3.10"?console.log(t.gray(" \u2022 Python 3.10: Latest stable with widespread compatibility")):x.pythonVersion==="3.11"?console.log(t.gray(" \u2022 Python 3.11: Newer, faster (3.10-3.11: ~10% speed improvement)")):x.pythonVersion==="3.12"&&console.log(t.gray(" \u2022 Python 3.12: Cutting edge, excellent for performance")),x.installMethod==="poetry"?console.log(t.gray(" \u2022 Poetry: Dependency management + virtual env (recommended for teams)")):x.installMethod==="venv"?console.log(t.gray(" \u2022 venv: Standard library approach, lightweight, zero dependencies")):console.log(t.gray(" \u2022 pipx: Global isolated, RapidKit CLI only, no local venv")),console.log(""));let at=jt;if(at.has(u)){let w=c("Creating workspace",{component:"create",phase:"workspace.python-free"});try{await P.ensureDir(i),w.succeed("Directory created"),await B(i,s,"venv",void 0),await Q(i,s,"venv",void 0,u),await z(i),await J(i,s);let R={"go-only":"Go-only","java-only":"Java-only","dotnet-only":".NET-only","node-only":"Node.js-only",minimal:"Minimal"};if(await P.outputFile(m.join(i,"README.md"),`# ${s}
|
|
116
116
|
|
|
117
117
|
RapidKit **${R[u]}** workspace.
|
|
@@ -213,7 +213,7 @@ npx rapidkit dev
|
|
|
213
213
|
`)),console.log(t.cyan(`\u{1F4A1} Add Python later:
|
|
214
214
|
`)),console.log(t.gray(" 1. Install Python 3.10+")),console.log(t.gray(` 2. Run: ${k(i)} && rapidkit bootstrap --profile ${b}
|
|
215
215
|
`)),console.log("");return}catch($){throw j.fail("Failed to create workspace"),console.error(t.red(`
|
|
216
|
-
\u274C Error:`),$),$}}}}
|
|
216
|
+
\u274C Error:`),$),$}}}}f.step(1,3,"Setting up RapidKit environment");let I=c("Creating directory",{component:"create",phase:"workspace.directory"});try{await P.ensureDir(i),I.succeed("Directory created"),I.start("Detecting Python version");let w=null,R=await Mt(x.pythonVersion);if(R)w=await Pt(R),w?(f.info(` Detected Python ${w}`),I.succeed(`Python ${w} detected`)):I.warn("Could not detect exact Python version");else {let b=S();w=await Pt(b),w?I.succeed(`Python ${w} detected`):I.warn("Could not detect Python version, proceeding with defaults");}if(x.installMethod==="poetry"&&!await At()&&(I.warn("Poetry not found \u2014 auto-fallback to pip + venv"),x.installMethod="venv"),await B(i,s,x.installMethod,w||void 0),w&&await Lt(i,w),await Q(i,s,x.installMethod,w||x.pythonVersion,u||h),await z(i),await J(i,s),x.installMethod==="poetry")try{await Dt(i,x.pythonVersion,I,r,p,d);}catch(b){let v=b?.details||b?.message||String(b);if(v.includes("pyenv")||v.includes("exit status 127")||v.includes("returned non-zero exit status 127")){I.warn("Poetry encountered Python discovery issues, trying venv method"),f.debug(`Poetry error (attempting venv fallback): ${v}`);try{await yt(i,x.pythonVersion,I,r,p),x.installMethod="venv";}catch(j){throw j}}else throw b}else x.installMethod==="venv"?await yt(i,x.pythonVersion,I,r,p):await Kt(i,I,r,p,d);if(await St(i,x.installMethod),await Tt(i,x.installMethod),I.succeed("RapidKit environment ready!"),!o.skipGit){I.start("Initializing git repository");try{await execa("git",["init"],{cwd:i}),await execa("git",["add","."],{cwd:i}),await execa("git",["commit","-m","Initial commit: RapidKit environment"],{cwd:i}),I.succeed("Git repository initialized");}catch{I.warn("Could not initialize git repository");}}if(await H(i,{workspaceName:s,silent:r}),console.log(t.green(`
|
|
217
217
|
\u2728 RapidKit environment created successfully!
|
|
218
218
|
`)),console.log(t.cyan("\u{1F4C2} Location:"),t.white(i)),console.log(t.cyan("\u2699\uFE0F Configuration:")),console.log(t.gray(` \u2022 Profile: ${u}`)),console.log(t.gray(` \u2022 Python: ${x.pythonVersion}`)),console.log(t.gray(` \u2022 Install method: ${x.installMethod}`)),console.log(t.cyan(`
|
|
219
219
|
\u{1F680} Get started:
|
|
@@ -225,7 +225,7 @@ npx rapidkit dev
|
|
|
225
225
|
\u{1F4A1} Profile management:`)),console.log(t.gray(" \u2022 Add Python? \u2192 rapidkit bootstrap --profile python-only|polyglot")),console.log(t.gray(" \u2022 Add Node.js? \u2192 rapidkit bootstrap --profile node-only|polyglot")),console.log(t.gray(" \u2022 Add Go? \u2192 rapidkit bootstrap --profile go-only|polyglot")),console.log(t.gray(" \u2022 Add .NET? \u2192 rapidkit bootstrap --profile dotnet-only|polyglot")),console.log(t.gray(" \u2022 Full setup? \u2192 rapidkit bootstrap --profile enterprise")),console.log(t.cyan(`
|
|
226
226
|
\u{1F4D6} Common commands:`)),console.log(t.white(" rapidkit create - Create a new project (interactive)")),console.log(t.white(" rapidkit list - List available kits")),console.log(t.white(" rapidkit modules - List available modules")),console.log(t.white(" rapidkit doctor - Check workspace health")),console.log(t.white(` rapidkit bootstrap --help - Advanced workspace configuration
|
|
227
227
|
`));try{let{stdout:b}=await execa("go",["version"],{timeout:3e3}),v=b.match(/go version go(\d+\.\d+(?:\.\d+)?)/),M=v?v[1]:"unknown";console.log(t.gray(`\u{1F439} Go ${M} detected \u2014 ready for gofiber.standard projects`));}catch{console.log(t.yellow("\u26A0\uFE0F Go not installed \u2014 needed for gofiber.standard/gogin.standard projects")),console.log(t.gray(" Install: https://go.dev/dl/"));}console.log("");}catch(w){I.fail("Failed to create RapidKit environment"),console.error(t.red(`
|
|
228
|
-
\u274C Error:`),w);try{await P.remove(i);}catch{}throw w}}async function Mt(e){let o=[];if(!a$1())try{let{stdout:c}=await execa("pyenv",["which","python"]),d=c.trim();d&&o.push(d);}catch{}let n=Number(e.split(".")[1]),r=e$
|
|
228
|
+
\u274C Error:`),w);try{await P.remove(i);}catch{}throw w}}async function Mt(e){let o=[];if(!a$1())try{let{stdout:c}=await execa("pyenv",["which","python"]),d=c.trim();d&&o.push(d);}catch{}let n=Number(e.split(".")[1]),r=e$1(n,10).map(c=>c.command).filter(Boolean);o.push(`python${e}`,...r,...d$1());let a=[...new Set(o)];for(let c of a)try{let d=c==="py"?["-3","--version"]:["--version"],p=c==="py"?["-3","-c","import sys; sys.exit(0)"]:["-c","import sys; sys.exit(0)"],{stdout:y}=await execa(c,d,{timeout:2e3}),h=y.match(/Python (\d+\.\d+)/)?.[1];if(h&&U(h,e))return await execa(c,p,{timeout:2e3}),c}catch{continue}return null}async function Dt(e,o,n,r,a,c=false){await Ut(n,c),n.start("Finding Python interpreter");let d=await Mt(o);d?(f.debug(`Found working Python: ${d}`),n.succeed("Python found")):n.warn("Could not verify Python path, proceeding with default"),n.start("Initializing Poetry project");let p=m.join(e,"pyproject.toml"),h=(await P.pathExists(p)?await promises.readFile(p,"utf-8"):"").includes("rapidkit-core");if(h)n.succeed("Poetry project initialized");else {await execa("poetry",["init","--no-interaction","--python",`^${o}`],{cwd:e}),n.succeed("Poetry project initialized");let f=await promises.readFile(p,"utf-8");f.includes("[tool.poetry]")?f=f.replace("[tool.poetry]",`[tool.poetry]
|
|
229
229
|
package-mode = false`):f.includes("[project]")&&(f.includes("[build-system]")?f=f.replace("[build-system]",`
|
|
230
230
|
[tool.poetry]
|
|
231
231
|
package-mode = false
|
|
@@ -234,33 +234,33 @@ package-mode = false
|
|
|
234
234
|
|
|
235
235
|
[tool.poetry]
|
|
236
236
|
package-mode = false
|
|
237
|
-
`),await promises.writeFile(p,f,"utf-8");}n.start("Configuring Poetry");try{await execa("poetry",["config","virtualenvs.in-project","true","--local"],{cwd:e}),n.succeed("Poetry configured");}catch{n.warn("Could not configure Poetry virtualenvs.in-project");}n.start("Creating virtualenv");let g$1=d||S(),s=f(m.join(e,".venv"));try{await execa(g$1,["-m","venv",".venv"],{cwd:e,timeout:6e4}),n.succeed("Virtualenv created");}catch(i){
|
|
237
|
+
`),await promises.writeFile(p,f,"utf-8");}n.start("Configuring Poetry");try{await execa("poetry",["config","virtualenvs.in-project","true","--local"],{cwd:e}),n.succeed("Poetry configured");}catch{n.warn("Could not configure Poetry virtualenvs.in-project");}n.start("Creating virtualenv");let g$1=d||S(),s=f$1(m.join(e,".venv"));try{await execa(g$1,["-m","venv",".venv"],{cwd:e,timeout:6e4}),n.succeed("Virtualenv created");}catch(i){f.debug(`python -m venv failed: ${i}`),n.warn("Could not pre-create virtualenv, Poetry will try"),s=d||S();}try{await execa("poetry",["env","use",s||S()],{cwd:e}),f.debug(`Poetry env set to: ${s}`);}catch(i){f.debug(`Could not set Poetry env: ${i}`);}if(n.start("Installing RapidKit"),h&&!r){let i=e$2(a||{}),f$1=i?await P.pathExists(i):false,u=f$1&&i?i:"rapidkit-core";i&&!f$1&&f.warn(`RAPIDKIT_DEV_PATH is set but path does not exist: ${i}. Falling back to PyPI.`),n.text=f$1?"Installing RapidKit from local path":"Installing RapidKit from PyPI";let E=false,T=null;for(let _=1;_<=3;_++)try{f$1||e$3({status:"started",message:"Installing RapidKit from PyPI",installMethod:"poetry",attempt:_,maxAttempts:3}),await execa(s,["-m","pip","install",u,"--quiet"],{cwd:e,timeout:18e4}),E=true,f$1||e$3({status:"succeeded",message:"RapidKit installed from PyPI",installMethod:"poetry",attempt:_,maxAttempts:3});break}catch(L){T=L,f.debug(`pip install rapidkit-core attempt ${_} failed: ${L}`),_<3&&(n.text=`Retrying installation (attempt ${_+1}/3)`,await new Promise(X=>setTimeout(X,2e3)));}if(!E){let _=T?.stderr||T?.message||"Unknown error";throw f.debug(`All pip install attempts failed. Last error: ${_}`),_.includes("Could not find")||_.includes("No matching distribution")?new g:new f$2("Install rapidkit-core with pip",new Error(`Failed to install rapidkit-core after 3 attempts.
|
|
238
238
|
Error: ${_}
|
|
239
239
|
|
|
240
240
|
Possible solutions:
|
|
241
241
|
1. Check your internet connection
|
|
242
242
|
2. Try installing manually: cd ${m.basename(e)} && poetry add rapidkit-core
|
|
243
|
-
3. Use venv method instead: npx rapidkit ${m.basename(e)} --install-method=venv`))}}else {n.text="Syncing Poetry environment";try{await execa("poetry",["install","--no-root"],{cwd:e,timeout:12e4}),n.succeed("Poetry environment synced");}catch(i){
|
|
243
|
+
3. Use venv method instead: npx rapidkit ${m.basename(e)} --install-method=venv`))}}else {n.text="Syncing Poetry environment";try{await execa("poetry",["install","--no-root"],{cwd:e,timeout:12e4}),n.succeed("Poetry environment synced");}catch(i){f.debug(`poetry install --no-root failed: ${i}`),n.warn("Could not sync Poetry environment, proceeding with add command");}if(n.start("Installing RapidKit"),r){let i=e$2(a||{});if(!i)throw new f$2("Test mode installation",new Error("No local RapidKit path configured. Set RAPIDKIT_DEV_PATH environment variable."));f.debug(`Installing from local path: ${i}`),n.text="Installing RapidKit from local path (test mode)",await execa("poetry",["add",i],{cwd:e});}else {n.text="Installing RapidKit from PyPI";let i=false,f$1=null;for(let u=1;u<=3;u++)try{e$3({status:"started",message:"Installing RapidKit from PyPI",installMethod:"poetry",attempt:u,maxAttempts:3}),await execa("poetry",["add","rapidkit-core"],{cwd:e,timeout:6e4*u}),i=true,e$3({status:"succeeded",message:"RapidKit installed from PyPI",installMethod:"poetry",attempt:u,maxAttempts:3});break}catch(E){f$1=E,f.debug(`Poetry add attempt ${u} failed: ${E}`),u<3&&(n.text=`Retrying installation (attempt ${u+1}/3)`,await new Promise(T=>setTimeout(T,2e3)));}if(!i){let u=f$1?.stderr||f$1?.message||"Unknown error";throw f.debug(`All Poetry install attempts failed. Last error: ${u}`),u.includes("Could not find")||u.includes("No matching distribution")?new g:new f$2("Install rapidkit-core with Poetry",new Error(`Failed to install rapidkit-core after 3 attempts.
|
|
244
244
|
Error: ${u}
|
|
245
245
|
|
|
246
246
|
Possible solutions:
|
|
247
247
|
1. Check your internet connection
|
|
248
248
|
2. Try installing manually: cd ${m.basename(e)} && poetry add rapidkit-core
|
|
249
|
-
3. Use venv method instead: npx rapidkit ${m.basename(e)} --install-method=venv`))}}}n.succeed("RapidKit installed in project virtualenv");try{let{checkRapidkitCoreAvailable:i}=await import('./pythonRapidkitExec-MNWRC4F2.js');if(!await i()&&!r){n.start("Checking optional global pipx installation");let u=await it(n,true);try{n.start("Installing RapidKit globally with pipx for CLI access"),await O(u,["install","rapidkit-core"]),n.succeed("RapidKit installed globally");}catch(E){n.warn("Could not install globally (non-fatal, project virtualenv has RapidKit)"),
|
|
249
|
+
3. Use venv method instead: npx rapidkit ${m.basename(e)} --install-method=venv`))}}}n.succeed("RapidKit installed in project virtualenv");try{let{checkRapidkitCoreAvailable:i}=await import('./pythonRapidkitExec-MNWRC4F2.js');if(!await i()&&!r){n.start("Checking optional global pipx installation");let u=await it(n,true);try{n.start("Installing RapidKit globally with pipx for CLI access"),await O(u,["install","rapidkit-core"]),n.succeed("RapidKit installed globally");}catch(E){n.warn("Could not install globally (non-fatal, project virtualenv has RapidKit)"),f.debug(`pipx install failed: ${E}`);}}}catch(i){n.succeed("Skipped optional global pipx installation"),f.debug(`Global install check skipped: ${i}`);}}async function yt(e,o,n,r,a,c=false){n.start(`Checking Python ${o}`);let d=S();try{let{stdout:y}=await execa(d,["--version"]),h=y.match(/Python (\d+\.\d+)/)?.[1];if(h&&!U(h,o))throw new b$3(o,h);n.succeed(`Python ${h} found`);}catch(y){throw y instanceof b$3?y:new b$3(o)}n.start("Creating virtual environment");try{await execa(d,["-m","venv",".venv"],{cwd:e}),n.succeed("Virtual environment created");}catch(y){if(n.fail("Failed to create virtual environment"),(g=>typeof g=="object"&&g!==null&&"stdout"in g&&typeof g.stdout=="string")(y)&&y.stdout.includes("ensurepip is not")){let g=y.stdout.match(/apt install (python[\d.]+-venv)/),s=g?g[1]:"python3-venv";throw new f$2("Python venv module not available",new Error(`Virtual environment creation failed.
|
|
250
250
|
|
|
251
251
|
On Debian/Ubuntu systems, install the venv package:
|
|
252
252
|
sudo apt install ${s}
|
|
253
253
|
|
|
254
254
|
Or use Poetry instead (recommended):
|
|
255
|
-
npx rapidkit ${m.basename(e)} --yes`))}throw new f$
|
|
255
|
+
npx rapidkit ${m.basename(e)} --yes`))}throw new f$2("Virtual environment creation",y instanceof Error?y:new Error(String(y)))}n.start("Installing RapidKit");let p=f$1(m.join(e,".venv"));if(await execa(p,["-m","pip","install","--upgrade","pip"],{cwd:e}),r){let y=e$2(a||{});if(!y)throw new f$2("Test mode installation",new Error("No local RapidKit path configured. Set RAPIDKIT_DEV_PATH environment variable."));f.debug(`Installing from local path: ${y}`),n.text="Installing RapidKit from local path (test mode)",await execa(p,["-m","pip","install","-e",y],{cwd:e});}else {n.text="Installing RapidKit from PyPI";let y=false,h=null;for(let g=1;g<=3;g++)try{e$3({status:"started",message:"Installing RapidKit from PyPI",installMethod:"venv",attempt:g,maxAttempts:3}),await execa(p,["-m","pip","install","rapidkit-core"],{cwd:e,timeout:6e4*g}),y=true,e$3({status:"succeeded",message:"RapidKit installed from PyPI",installMethod:"venv",attempt:g,maxAttempts:3});break}catch(s){h=s,f.debug(`pip install attempt ${g} failed: ${s}`),g<3&&(n.text=`Retrying installation (attempt ${g+1}/3)`,await new Promise(i=>setTimeout(i,2e3)));}if(!y){let g$1=h?.stderr||h?.message||"Unknown error";throw f.debug(`All pip install attempts failed. Last error: ${g$1}`),g$1.includes("Could not find")||g$1.includes("No matching distribution")?new g:new f$2("Install rapidkit-core with pip",new Error(`Failed to install rapidkit-core after 3 attempts.
|
|
256
256
|
Error: ${g$1}
|
|
257
257
|
|
|
258
258
|
Possible solutions:
|
|
259
259
|
1. Check your internet connection
|
|
260
|
-
2. Try installing manually: cd ${m.basename(e)} && ${f(".venv")} -m pip install rapidkit-core
|
|
261
|
-
3. Use Poetry instead: npx rapidkit ${m.basename(e)} --install-method=poetry`))}}n.succeed("RapidKit installed in project virtualenv");try{let{checkRapidkitCoreAvailable:y}=await import('./pythonRapidkitExec-MNWRC4F2.js');if(!await y()&&!r){n.start("Checking optional global pipx installation");let g=await it(n,true);try{n.start("Installing RapidKit globally with pipx for CLI access"),await O(g,["install","rapidkit-core"]),n.succeed("RapidKit installed globally");}catch(s){n.warn("Could not install globally (non-fatal, project virtualenv has RapidKit)"),
|
|
262
|
-
`,"utf-8");return}p.reason==="constraint-missing"?o.warn('Version-aware global reuse skipped: no explicit rapidkit-core version constraint found. Set RAPIDKIT_CORE_PYTHON_PACKAGE (example: RAPIDKIT_CORE_PYTHON_PACKAGE="rapidkit-core>=0.4.0,<0.9.0") to enable version-aware reuse. Proceeding with pipx install/upgrade.'):p.reason==="constraint-unsupported"&&o.warn('Version-aware global reuse skipped: RAPIDKIT_CORE_PYTHON_PACKAGE uses an unsupported spec (path/url/git). Use a version range instead (example: RAPIDKIT_CORE_PYTHON_PACKAGE="rapidkit-core==0.4.0" or "rapidkit-core>=0.4.0,<0.9.0"). Proceeding with pipx install/upgrade.'),
|
|
263
|
-
`,"utf-8");}async function be(e,o){let{skipGit:n=false,testMode:r=false,userConfig:a={},yes:c$1=false,installMethod:d,pythonVersion:p="3.10"}=o||{},y=d||a.defaultInstallMethod||await(async()=>{try{return await execa("poetry",["--version"],{timeout:3e3}),"poetry"}catch{return
|
|
260
|
+
2. Try installing manually: cd ${m.basename(e)} && ${f$1(".venv")} -m pip install rapidkit-core
|
|
261
|
+
3. Use Poetry instead: npx rapidkit ${m.basename(e)} --install-method=poetry`))}}n.succeed("RapidKit installed in project virtualenv");try{let{checkRapidkitCoreAvailable:y}=await import('./pythonRapidkitExec-MNWRC4F2.js');if(!await y()&&!r){n.start("Checking optional global pipx installation");let g=await it(n,true);try{n.start("Installing RapidKit globally with pipx for CLI access"),await O(g,["install","rapidkit-core"]),n.succeed("RapidKit installed globally");}catch(s){n.warn("Could not install globally (non-fatal, project virtualenv has RapidKit)"),f.debug(`pipx install failed: ${s}`);}}}catch(y){n.succeed("Skipped optional global pipx installation"),f.debug(`Global install check skipped: ${y}`);}}async function Kt(e,o,n,r,a=false){if(!n)try{let{checkRapidkitCoreVersionCompatible:d}=await import('./pythonRapidkitExec-MNWRC4F2.js'),p=await d();if(p.isCompatible){o.succeed(`RapidKit ${p.installedVersion??""} already compatible globally; skipping pipx installation`),await P.outputFile(m.join(e,".rapidkit-global"),`RapidKit already available globally (version ${p.installedVersion??"unknown"}) and satisfies expected constraint ${p.expectedConstraint??"n/a"}; workspace will reuse the existing installation
|
|
262
|
+
`,"utf-8");return}p.reason==="constraint-missing"?o.warn('Version-aware global reuse skipped: no explicit rapidkit-core version constraint found. Set RAPIDKIT_CORE_PYTHON_PACKAGE (example: RAPIDKIT_CORE_PYTHON_PACKAGE="rapidkit-core>=0.4.0,<0.9.0") to enable version-aware reuse. Proceeding with pipx install/upgrade.'):p.reason==="constraint-unsupported"&&o.warn('Version-aware global reuse skipped: RAPIDKIT_CORE_PYTHON_PACKAGE uses an unsupported spec (path/url/git). Use a version range instead (example: RAPIDKIT_CORE_PYTHON_PACKAGE="rapidkit-core==0.4.0" or "rapidkit-core>=0.4.0,<0.9.0"). Proceeding with pipx install/upgrade.'),f.debug(`Global RapidKit install is not reusable via version-aware policy (reason=${p.reason}, installed=${p.installedVersion??"unknown"}, expected=${p.expectedConstraint??"none"}). Proceeding with pipx install/upgrade.`);}catch(d){f.debug(`Global RapidKit version-aware check failed before pipx install: ${d}`);}let c=await it(o,a);if(o.start("Installing RapidKit globally with pipx"),n){let d=e$2(r||{});if(!d)throw new f$2("Test mode installation",new Error("No local RapidKit path configured. Set RAPIDKIT_DEV_PATH environment variable."));f.debug(`Installing from local path: ${d}`),o.text="Installing RapidKit from local path (test mode)",await O(c,["install","-e",d]);}else {o.text="Installing RapidKit from PyPI",e$3({status:"started",message:"Installing RapidKit from PyPI",installMethod:"pipx"});try{await O(c,["install","rapidkit-core"]),e$3({status:"succeeded",message:"RapidKit installed from PyPI",installMethod:"pipx"});}catch(d){try{o.text="RapidKit already installed globally, upgrading to match expected version",await O(c,["upgrade","rapidkit-core"]),e$3({status:"succeeded",message:"RapidKit upgraded from PyPI",installMethod:"pipx"});}catch(p){throw f.debug(`pipx install/upgrade failed: install=${d}, upgrade=${p}`),new g}}}o.succeed("RapidKit installed globally"),await P.outputFile(m.join(e,".rapidkit-global"),`RapidKit installed globally with pipx
|
|
263
|
+
`,"utf-8");}async function be(e,o){let{skipGit:n=false,testMode:r=false,userConfig:a={},yes:c$1=false,installMethod:d,pythonVersion:p="3.10"}=o||{},y=d||a.defaultInstallMethod||await(async()=>{try{return await execa("poetry",["--version"],{timeout:3e3}),"poetry"}catch{return f.warn("Poetry not found \u2014 auto-selecting venv. Pass --install-method poetry to override."),"venv"}})(),h=y==="poetry"&&!await At()?"venv":y;await B(e,m.basename(e),h),await z(e),await Q(e,m.basename(e),h,p,o?.profile);let g=c("Registering workspace",{component:"create",phase:"workspace.register"});try{if(h==="poetry"?(await J(e,m.basename(e)),await Dt(e,p,g,r,a,c$1)):h==="venv"?await yt(e,p,g,r,a):await Kt(e,g,r,a,c$1),await St(e,h),await Tt(e,h),g.succeed("Workspace registered"),await H(e,{workspaceName:m.basename(e),silent:r}),!n){g.start("Initializing git repository");try{await execa("git",["init"],{cwd:e}),await execa("git",["add","."],{cwd:e}),await execa("git",["commit","-m","Initial commit: RapidKit workspace"],{cwd:e}),g.succeed("Git repository initialized");}catch{g.warn("Could not initialize git repository");}}}catch(s){throw g.fail("Failed to register workspace"),s}}async function Tt(e,o){let n=o==="poetry"?`source $(poetry env info --path)/bin/activate
|
|
264
264
|
# Or simply use: poetry run rapidkit <command>`:o==="venv"?"source .venv/bin/activate # On Windows: .venv\\Scripts\\activate":"N/A (globally installed)",r=o==="poetry"?`# No activation needed (recommended):
|
|
265
265
|
./rapidkit --help
|
|
266
266
|
# or:
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {b as b$1}from'./chunk-3YLMCP3V.js';import {r,j as j$1}from'./chunk-ZWKLRZE5.js';import {f}from'./chunk-6G2KSHP6.js';import {b}from'./chunk-GOM3RFB3.js';import f$1,{promises}from'fs';import i from'path';import E,{homedir}from'os';import {pathToFileURL}from'url';import l from'process';function R(t){let r=t.label.indexOf(" \u2014 ");return r>=0?t.label.slice(r+3).trim():t.label.trim()}function j(){let t=r().map(r=>({value:r.id,label:R(r),hint:r.description,name:r.label})),e=j$1().map(r=>({value:r.kitId,label:r.displayName,hint:r.commandDisplay("my-app"),name:`${r.displayName} \u2014 ${r.framework}`}));return [...t,...e]}var _=".rapidkitrc.json",F=["rapidkit.config.js","rapidkit.config.mjs","rapidkit.config.cjs"];async function yt(){let t=i.join(E.homedir(),_);try{let e=await promises.readFile(t,"utf-8"),r=JSON.parse(e);return f.debug(`Loaded config from ${t}`),r}catch{return f.debug("No user config found, using defaults"),{}}}async function vt(t=process.cwd()){let e=t,r=i.parse(e).root;for(;e!==r;){for(let n of F){let o=i.join(e,n);try{await promises.access(o),f.debug(`Found config file: ${o}`);let m=await import(pathToFileURL(o).href),P=m.default||m;return f.debug(`Loaded RapidKit config from ${n}`),P}catch{continue}}e=i.dirname(e);}return f.debug("No RapidKit config file found, using defaults"),{}}function bt(t,e,r){return {author:r.author||e.workspace?.defaultAuthor||t.author,pythonVersion:r.pythonVersion||e.workspace?.pythonVersion||t.pythonVersion,defaultInstallMethod:r.defaultInstallMethod||e.workspace?.installMethod||t.defaultInstallMethod,defaultKit:r.defaultKit||e.projects?.defaultKit||t.defaultKit,skipGit:r.skipGit??e.projects?.skipGit??t.skipGit,license:r.license||t.license,testRapidKitPath:r.testRapidKitPath||t.testRapidKitPath}}function wt(t){return process.env.RAPIDKIT_DEV_PATH||t.testRapidKitPath||void 0}var x="workspai",Rt="Workspai";function L(t){return f$1.existsSync(i.join(t,".rapidkit-workspace"))||f$1.existsSync(i.join(t,".rapidkit","workspace.json"))}function g(t=homedir()){return i.join(t,"rapidkit","workspaces")}function K(t=homedir()){return i.join(t,"Workspai","rapidkits")}function y(t,e=homedir()){return i.join(g(e),t)}function U(t,e=homedir()){return [y(t,e),i.join(K(e),t)]}function D(t,e={}){let r=e.homeDir??homedir();return e.outputDir?i.resolve(e.outputDir,t):y(t,r)}function jt(t,e=homedir()){for(let r of U(t,e))if(f$1.existsSync(r))return r}function Et(t,e="my-workspace"){let r=1;for(;;){let n=r===1?e:`${e}-${r}`,o=i.join(t,n);if(!f$1.existsSync(o))return {name:n,targetPath:o};r+=1;}}function S(t=homedir()){return [i.join(g(t),x),i.join(K(t),x)]}function Mt(t=homedir()){for(let e of S(t))if(L(e))return e;return y(x,t)}function T(t,e){let r=t.indexOf(e);if(r>=0&&r+1<t.length)return t[r+1];let n=t.find(o=>o.startsWith(`${e}=`));if(n)return n.slice(e.length+1)}function N(t){return t.includes("--here")}function W(t,e=l.cwd()){if(N(t))return i.resolve(e);let r=T(t,"--output");if(r)return i.resolve(r)}function $t(t,e=l.cwd()){let r=i.resolve(t),n=i.resolve(e),o=i.relative(n,r);return o.length>0&&!o.startsWith("..")&&!i.isAbsolute(o)?`cd ${o}`:`cd ${r}`}function Gt(t,e={}){let r=e.argv??[],n=e.outputParent??W(r,l.cwd());return D(t.trim(),{homeDir:e.homeDir,outputDir:n})}async function Ot(t,e={}){let r=e.cwd??l.cwd(),n=e.homeDir??homedir(),o=W(t,r);if(o!==void 0)return o;let h=e.hasYes??(t.includes("--yes")||t.includes("-y"));if(!(e.interactive??(!h&&!!l.stdin.isTTY&&!b())))return;let P=g(n),{location:A}=await b$1([{type:"rawlist",name:"location",message:"Where should the workspace be created?",choices:[{value:"managed",label:"Managed home",hint:P},{value:"here",label:"Current directory",hint:r}],default:0}]);if(A==="here")return i.resolve(r)}export{j as a,yt as b,vt as c,bt as d,wt as e,Rt as f,g,jt as h,Et as i,Mt as j,$t as k,Gt as l,Ot as m};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var a="cli-log-event-v1";var m="RAPIDKIT_LOG_FORMAT";function c(e=process.argv){let r=process.env[m]?.trim().toLowerCase();if(r==="json")return "json";if(r==="text")return "text";for(let o=0;o<e.length;o+=1){let t=e[o];if(t==="--log-json")return "json";if(t==="--log-format"){let n=e[o+1]?.trim().toLowerCase();if(n==="json")return "json";if(n==="text")return "text"}if(t?.startsWith("--log-format=")){let n=t.slice(13).trim().toLowerCase();if(n==="json")return "json";if(n==="text")return "text"}}return "text"}function l(e=process.argv){return c(e)==="json"}var g="unknown-run";function I(e){g=e;}function u(){return g}function L(e){return {schemaVersion:a,runId:u(),timestamp:new Date().toISOString(),level:e.level,event:e.event,component:e.component,message:e.message,...e.command?{command:e.command}:{},...e.metadata&&Object.keys(e.metadata).length>0?{metadata:f(e.metadata)}:{}}}function y(e){l()&&p(L(e));}function p(e){process.stderr.write(`${JSON.stringify(e)}
|
|
2
|
+
`);}function f(e){let r={};for(let[o,t]of Object.entries(e))if(t!==void 0){if(t instanceof Error){r[o]={name:t.name,message:t.message};continue}if(t===null||typeof t=="string"||typeof t=="number"||typeof t=="boolean"){r[o]=t;continue}if(Array.isArray(t)){r[o]=t.map(n=>typeof n=="string"||typeof n=="number"||typeof n=="boolean"?n:String(n));continue}r[o]=String(t);}return r}export{c as a,l as b,a as c,I as d,u as e,y as f,p as g};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {a}from'./chunk-
|
|
1
|
+
import {a}from'./chunk-UY4KRFNL.js';import {a as a$1,d}from'./chunk-FV5A3N3I.js';import {a as a$2}from'./chunk-KMUWWZRT.js';import l from'chalk';import Y from'fs';import y from'path';import {execa}from'execa';var Z="autopilot-release-last-run.json",ee="autopilot-release.json";function $(s){try{return JSON.parse(s)}catch{return null}}function ge(s){let t=y.resolve(s),o=a$2(t);if(!o)throw new Error("No RapidKit workspace found in current directory or parents");return o}async function b(s,t){let o=process.argv[1];if(!o)return {exitCode:1,stdout:"",stderr:"RapidKit entrypoint is unavailable for autopilot execution.",crashed:true};try{let a=await execa(process.execPath,[o,...s],{cwd:t,reject:false,env:{...process.env,RAPIDKIT_AUTOPILOT_CHILD:"1"}});return {exitCode:Number(a.exitCode??1),stdout:a.stdout,stderr:a.stderr,crashed:false}}catch(a){return {exitCode:1,stdout:"",stderr:a instanceof Error?a.message:String(a),crashed:true}}}function te(s){let t=s.toLowerCase();return t==="pass"?"pass":t==="warn"?"warn":t==="fail"?"fail":"warn"}function se(s){return s.summary.failed>0||s.gates.results.some(t=>t.status==="fail")?"fail":s.gates.results.some(t=>t.status==="warn")?"warn":"pass"}function we(s){let t=s.filter(a=>a.status!=="skipped");if(t.length===0)return 100;let o=t.reduce((a,e)=>e.status==="pass"?a+1:e.status==="warn"?a+.6:a,0);return Math.round(o/t.length*100)}function he(s){return s.executionError?["Re-run: npx rapidkit autopilot release --mode audit --json","Inspect .rapidkit/reports/autopilot-release-last-run.json for execution failure details"]:s.blockers.length>0?["Run: npx rapidkit doctor workspace --plan","Run: npx rapidkit readiness --json --strict","Run: npx rapidkit workspace run test --affected --strict"]:s.hasWarnings&&s.mode!=="enforce"?["Review warning-level findings in autopilot report","Optionally run: npx rapidkit autopilot release --mode safe-fix"]:["Workspace is release-ready based on current autopilot policy"]}async function U(s,t){await Y.promises.mkdir(y.dirname(s),{recursive:true}),await Y.promises.writeFile(s,`${JSON.stringify(t,null,2)}
|
|
2
2
|
`,"utf-8");}async function je(s){let t=ge(s.workspacePath),o=s.mode,a$2=[],e=[],F,B,C,O,J,G=0,f=false,I=0,T=0,D=-1,N=-1,c="skipped",p="skipped",re=o==="enforce"?["doctor","workspace","--json","--strict"]:["doctor","workspace","--json","--ci"];if(s.skipPipelineStages)a$2.push({name:"doctor-workspace",status:"skipped",durationMs:0,summary:"doctor stage skipped (pipeline already executed)"},{name:"analyze",status:"skipped",durationMs:0,summary:"analyze stage skipped (pipeline already executed)"},{name:"readiness",status:"skipped",durationMs:0,summary:"readiness stage skipped (pipeline already executed)"});else {let r=Date.now(),i=await b([...re],t),m=Date.now()-r;if(c="pass",i.crashed)c="fail",f=true,e.push(`doctor workspace execution error: ${i.stderr||"unknown error"}`);else if(i.exitCode===1)c="fail",e.push("doctor workspace command failed or reported errors");else if(i.exitCode===2)c="warn",e.push("doctor workspace reported warnings");else if(i.exitCode!==0)c="fail",e.push("doctor workspace command failed");else {let d=$(i.stdout),j=d&&d.healthScore&&typeof d.healthScore=="object"?d.healthScore:{},k=Number(j.errors??0),E=Number(j.warnings??0);Number.isFinite(k)&&k>0?(c="fail",e.push(`doctor workspace reports ${k} error(s)`)):Number.isFinite(E)&&E>0&&(c="warn");}D=a$2.push({name:"doctor-workspace",status:c,durationMs:m,summary:c==="pass"?"doctor workspace passed":c==="warn"?"doctor workspace reported warnings":"doctor workspace reported errors"})-1,o==="enforce"&&c==="warn"&&e.push("doctor workspace reported warnings under enforce mode");let g=Date.now(),w=await b(["analyze","--json"],t),v=Date.now()-g;B=y.join(t,".rapidkit","reports","analyze-last-run.json");let n="pass";if(w.crashed)n="fail",f=true,e.push(`analyze execution error: ${w.stderr||"unknown error"}`);else if(w.exitCode!==0)n=w.exitCode===2?"warn":"fail",e.push(w.exitCode===2?"analyze reported needs-attention verdict":"analyze command failed or reported blocked verdict");else {let d=$(w.stdout),j=d&&d.summary&&typeof d.summary=="object"?d.summary:{},k=String(j.verdict??"ready");k==="blocked"?(n="fail",e.push("analyze reported blocked verdict")):k==="needs-attention"&&(n="warn");}a$2.push({name:"analyze",status:n,durationMs:v,summary:n==="pass"?"analyze passed":n==="warn"?"analyze reported needs-attention":"analyze reported blocked verdict"}),o==="enforce"&&n==="warn"&&e.push("analyze reported warnings under enforce mode");let P=Date.now(),h=await b(["readiness","--json"],t),R=Date.now()-P;if(p="fail",h.crashed)p="fail",f=true,e.push(`readiness execution error: ${h.stderr||"unknown error"}`);else if(h.exitCode!==0)p="fail",e.push("readiness command failed");else {let d=$(h.stdout),j=String(d?.overallStatus??"fail");if(p=te(j),typeof d?.evidencePath=="string"&&d.evidencePath.trim().length>0&&(F=d.evidencePath),p==="fail"){let k=Array.isArray(d?.blockingReasons)?d?.blockingReasons.filter(E=>typeof E=="string"):[];k.length>0?e.push(...k.map(E=>`readiness: ${E}`)):e.push("readiness overall status is fail");}}N=a$2.push({name:"readiness",status:p,durationMs:R,summary:`readiness overall status is ${p}`})-1,o==="enforce"&&p==="warn"&&e.push("readiness reported warnings under enforce mode");}let ae=Date.now(),M=await b(["doctor","workspace","--plan","--json"],t),oe=Date.now()-ae,S="warn";if(M.crashed)S="fail",f=true,e.push(`doctor remediation plan execution error: ${M.stderr||"unknown error"}`);else if(M.exitCode!==0)S="fail",e.push("doctor remediation plan command failed");else {let r=$(M.stdout),i=r&&r.remediationPlan&&typeof r.remediationPlan=="object"?r.remediationPlan:null,m=Number(i?.totalSteps??0),g=Number(i?.executableSteps??0);Number.isFinite(m)&&m>0&&(I=m),Number.isFinite(g)&&g>0&&(T=g),Number.isFinite(m)&&m===0?S="pass":S="warn";}if(a$2.push({name:"remediation-plan",status:S,durationMs:oe,summary:S==="pass"?"no remediation steps required":"remediation steps available"}),o==="enforce"&&S==="warn"&&e.push("remediation plan has pending steps under enforce mode"),o==="safe-fix"){let r=Date.now(),i=await b(["doctor","workspace","--apply"],t),m=Date.now()-r,g=i.crashed||i.exitCode!==0?"fail":"pass";if(i.crashed)f=true,e.push(`doctor remediation apply execution error: ${i.stderr||"unknown error"}`);else if(g==="fail")e.push("doctor remediation apply failed");else {G=T>0?T:I>0?I:1;let w=await b(["doctor","workspace","--json"],t);if(w.crashed)c="fail",f=true,e.push(`post-apply doctor execution error: ${w.stderr||"unknown error"}`);else if(w.exitCode!==0)c="fail",e.push("post-apply doctor workspace command failed");else {let n=$(w.stdout),P=n&&n.healthScore&&typeof n.healthScore=="object"?n.healthScore:{},h=Number(P.errors??0),R=Number(P.warnings??0);Number.isFinite(h)&&h>0?(c="fail",e.push(`post-apply doctor reports ${h} error(s)`)):Number.isFinite(R)&&R>0?c="warn":c="pass";}D>=0&&(a$2[D].status=c,a$2[D].summary=`doctor workspace post-apply status is ${c}`);let v=await b(["readiness","--json"],t);if(v.crashed)p="fail",f=true,e.push(`post-apply readiness execution error: ${v.stderr||"unknown error"}`);else if(v.exitCode!==0)p="fail",e.push("post-apply readiness command failed");else {let n=$(v.stdout),P=String(n?.overallStatus??"fail");if(p=te(P),typeof n?.evidencePath=="string"&&n.evidencePath.trim().length>0&&(F=n.evidencePath),p==="fail"){let h=Array.isArray(n?.blockingReasons)?n?.blockingReasons.filter(R=>typeof R=="string"):[];h.length>0?e.push(...h.map(R=>`post-apply readiness: ${R}`)):e.push("post-apply readiness overall status is fail");}}N>=0&&(a$2[N].status=p,a$2[N].summary=`readiness post-apply overall status is ${p}`);}a$2.push({name:"remediation-apply",status:g,durationMs:m,summary:g==="pass"?"safe remediation apply completed":"safe remediation apply failed"});}else a$2.push({name:"remediation-apply",status:"skipped",durationMs:0,summary:"remediation apply is skipped for this mode"});let ne=Date.now(),x="pass",A="workspace test/build completed for selected projects";try{let r=await a({workspacePath:t,stage:"test",affected:true,since:s.since,parallel:s.parallel,maxWorkers:s.maxWorkers,strict:true,json:true,enforceGates:false});C=y.join(t,".rapidkit","reports",a$1),await d(t,r),O=C;let i=se(r);if(i==="fail")x="fail",A="workspace test stage failed for selected projects",e.push("workspace run test failed for selected projects");else {i==="warn"&&(x="warn",A="workspace test stage completed with warnings",o==="enforce"&&e.push("workspace run test reported warnings under enforce mode"));let m=await a({workspacePath:t,stage:"build",affected:true,since:s.since,parallel:s.parallel,maxWorkers:s.maxWorkers,strict:true,json:true,enforceGates:false});await d(t,m),J=C;let g=se(m);g==="fail"?(x="fail",A="workspace build stage failed for selected projects",e.push("workspace run build failed for selected projects")):g==="warn"&&(x="warn",A="workspace test/build completed with warnings",o==="enforce"&&e.push("workspace run test/build reported warnings under enforce mode"));}}catch(r){x="fail",A="workspace test/build orchestration failed",f=true,e.push(`workspace run orchestration error: ${r instanceof Error?r.message:String(r)}`);}let ie=Date.now()-ne;a$2.push({name:"workspace-run-test-build",status:x,durationMs:ie,summary:A});let z=a$2.filter(r=>r.status==="warn").length,le=a$2.filter(r=>r.status==="fail").length,L=o==="enforce"?a$2.some(r=>r.status==="warn"||r.status==="fail"):le>0,W=[...new Set(e)],ce=f||L?Math.max(1,W.length):0,de=we(a$2),pe=f||L?"blocked":z>0?"partial":"approved",ue=f?3:L?1:z>0?2:0,fe=he({mode:o,executionError:f,blockers:W,hasWarnings:z>0}),V=y.join(t,".rapidkit","reports"),H=y.join(V,Z),q=y.join(V,ee),u={schemaVersion:"autopilot-release-v1",generatedAt:new Date().toISOString(),workspacePath:t,mode:o,summary:{releaseScore:de,verdict:pe,blockers:ce,warnings:z,safeFixesApplied:G,manualActions:W.length,exitCode:ue},stages:a$2,blockingReasons:W,nextActions:fe,artifacts:{reportPath:H,aliasEvidencePath:q,analyzeEvidencePath:B,readinessEvidencePath:F,workspaceRunEvidencePath:C,workspaceRunTestPath:O,workspaceRunBuildPath:J},enterpriseControls:{jsonReady:true,evidencePath:`.rapidkit/reports/${Z}`,aliasEvidencePath:`.rapidkit/reports/${ee}`}};if(await U(H,u),await U(q,u),s.output&&await U(y.resolve(s.output),u),!s.json){console.log(l.bold.cyan(`
|
|
3
3
|
\u{1F680} RapidKit Autopilot Release
|
|
4
4
|
`)),console.log(l.bold(`Workspace: ${l.cyan(y.basename(t))}`)),console.log(l.gray(`Path: ${t}`)),console.log(l.white(`Mode: ${o}`)),console.log(l.white(`Verdict: ${u.summary.verdict==="approved"?l.green("approved"):u.summary.verdict==="partial"?l.yellow("partial"):l.red("blocked")}`)),console.log(l.white(`Release score: ${u.summary.releaseScore}`));for(let r of u.stages){let i=r.status==="pass"?l.green("PASS"):r.status==="warn"?l.yellow("WARN"):r.status==="skipped"?l.gray("SKIP"):l.red("FAIL");console.log(` - ${r.name}: ${i} ${r.summary} (${r.durationMs}ms)`);}if(u.blockingReasons.length>0){console.log(l.bold.red(`
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {a,b}from'./chunk-S5KTATOU.js';function w(g,i){let a=new Map;for(let c of g)a.set(c,0);for(let c of g){let d=[],h=new Map,s=new Map,r=new Map;for(let e of g)h.set(e,[]),s.set(e,0),r.set(e,-1);s.set(c,1),r.set(c,0);let t=[c],o=0;for(;o<t.length;){let e=t[o++];d.push(e);for(let n of i.get(e)??[])(r.get(n)??-1)<0&&(r.set(n,(r.get(e)??0)+1),t.push(n)),(r.get(n)??-1)===(r.get(e)??0)+1&&(s.set(n,(s.get(n)??0)+(s.get(e)??0)),h.get(n)?.push(e));}let p=new Map;for(let e of g)p.set(e,0);for(;d.length>0;){let e=d.pop(),n=s.get(e)??0;for(let f of h.get(e)??[]){let m=n===0?0:(s.get(f)??0)/n*(1+(p.get(e)??0));p.set(f,(p.get(f)??0)+m);}e!==c&&a.set(e,(a.get(e)??0)+(p.get(e)??0));}}return a}function C(g){let i=a(g),a$1=[...i.nodeIds].sort((t,o)=>t.localeCompare(o)),c=w(a$1,i.forward),d=a$1.length,h=Math.max(2,Math.ceil((d-1)/2)),s=new Map;for(let t of a$1){let o=i.reverse.get(t)?.length??0,p=i.forward.get(t)?.length??0,e=b(i,[t],{direction:"dependents"}).size-1,n=Math.round((c.get(t)??0)*1e3)/1e3;s.set(t,{id:t,fanIn:o,fanOut:p,reach:e,betweenness:n,isHotspot:e>=2&&e>=h});}let r=[...s.values()].filter(t=>t.isHotspot).sort((t,o)=>o.reach-t.reach||o.betweenness-t.betweenness||t.id.localeCompare(o.id)).map(t=>t.id);return {byId:s,hotspots:r}}export{C as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {a,b}from'./chunk-S5KTATOU.js';import {d}from'./chunk-X7PWDIQW.js';function f(r){let s=new Map;for(let n of r.projects)s.has(n.name)||s.set(n.name,d(n));return s}function j(r){let s=f(r),n=r.graph??{nodes:r.projects.map(t=>({id:t.name,path:t.path})),edges:[]},a$1=a(n),o=new Map;for(let t of n.nodes){let e=s.get(t.id)??d({missing:t.id}),g=[...b(a$1,[t.id],{direction:"dependencies"}).keys()].filter(c=>c!==t.id).sort((c,l)=>c.localeCompare(l)).map(c=>({id:c,hash:s.get(c)??"<unknown>"}));o.set(t.id,{id:t.id,ownHash:e,transitiveInputsHash:d({own:e,dependencies:g})});}return o}function v(r,s){if(!s||Object.keys(s).length===0)return {verdict:"unknown",baseline:"none",changed:[],added:[],removed:[]};let n=[],a=[];for(let[e,i]of r.entries())e in s?s[e]!==i.transitiveInputsHash&&n.push(e):a.push(e);let o=[];for(let e of Object.keys(s))r.has(e)||o.push(e);return n.sort((e,i)=>e.localeCompare(i)),a.sort((e,i)=>e.localeCompare(i)),o.sort((e,i)=>e.localeCompare(i)),{verdict:n.length>0||a.length>0||o.length>0?"stale":"fresh",baseline:"recorded",changed:n,added:a,removed:o}}function w(r){let s={};for(let[n,a]of [...r.entries()].sort((o,t)=>o[0].localeCompare(t[0])))s[n]=a.transitiveInputsHash;return s}export{f as a,j as b,v as c,w as d};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {e,a}from'./chunk-TYZPPUBH.js';import d from'path';import g from'fs-extra';var f="workspace-context.v1",w=".rapidkit/reports/workspace-context-agent.json";function h(e){if(typeof e!="string"||!e.trim()||e==="true")return "generic";let t=e.trim().toLowerCase();return t==="codex"||t==="claude"||t==="cursor"||t==="orca"?t:"generic"}function y(e){return `npx --yes --package rapidkit rapidkit ${e}`.trim()}function j(e){return `npx rapidkit ${e}`.trim()}function i(e){return {id:e.id,scope:e.scope,display:j(e.args),execute:y(e.args),description:e.description,...e.project?{project:e.project}:{}}}function k(e,t){return `workspace run ${t} --scope project:${e.name}`}function C(e){return (e.startsWith("project:")?e.slice(8):e).trim().toLowerCase()}function v(e){return [e.name,e.path,d.basename(e.path),e.absolutePath].filter(t=>typeof t=="string"&&t.trim().length>0).map(t=>t.trim().toLowerCase())}function x(e,t){let s=[i({id:"workspace.model",scope:"workspace",args:"workspace model --json",description:"Read the canonical workspace intelligence model."}),i({id:"workspace.doctor",scope:"workspace",args:"doctor workspace --json",description:"Check workspace health before claiming verification."}),i({id:"workspace.pipeline",scope:"workspace",args:"pipeline --json",description:"Run the governed sync, doctor, analyze, readiness, and autopilot loop."}),i({id:"workspace.contract.verify",scope:"workspace",args:"workspace contract verify --json",description:"Verify workspace contract and dependency edges."}),i({id:"workspace.verify",scope:"workspace",args:"workspace verify --json",description:"Evaluate evidence freshness and verification gates before release decisions."})],r=t?[t]:e.projects;for(let o of r)o.commands.fleetStages.includes("test")&&s.push(i({id:`project.${o.name}.test`,scope:"project",project:o.name,args:k(o,"test"),description:`Run tests for ${o.name} through workspace orchestration.`})),o.commands.fleetStages.includes("build")&&s.push(i({id:`project.${o.name}.build`,scope:"project",project:o.name,args:k(o,"build"),description:`Build ${o.name} through workspace orchestration.`}));return s}function W(e){return e.commands.fleetStages.filter(t=>t==="test"||t==="build").map(t=>`workspace run ${t}`)}function b(e,t){if(!t?.startsWith("project:"))return;let s=C(t);if(s)return e.projects.find(r=>v(r).includes(s))}function S(e,t,s){let r=[...e.validation?.issues??[]];t?.startsWith("project:")&&!s&&r.push({severity:"error",code:"context.scope.project.missing",message:`Requested project scope was not found: ${t}`,target:t});let o=r.filter(a=>a.severity==="error").length,c=r.filter(a=>a.severity==="warning").length;return {status:o>0?"failed":c>0?"warning":"passed",errors:o,warnings:c,issues:r}}function P(e){let t=[],s=[];for(let[r,o]of Object.entries(e.evidence))o?.exists?t.push(`${r}: ${o.path}`):s.push(r);return {available:t.sort(),missing:s.sort()}}function A(e){let t=e.summary.projectCount,s=e.summary.runtimes.length?e.summary.runtimes.join(", "):"no runtime",r=e.identity.surfaces.length?e.identity.surfaces.join(", "):"no detected surfaces";return `${e.workspace.name} is a ${e.identity.workspaceType} with ${t} project${t===1?"":"s"}, ${s} runtime coverage, and ${r}.`}function M(e){let t=["Do not claim a command passed unless a report or command output proves it.","Do not infer secrets or environment values from file names.","Do not change project scope without checking the selected project."];return e.contracts.exists||t.push("Workspace contract is missing; dependency and API edges may be incomplete."),e.summary.observedProjects>0&&t.push("Some projects are observed rather than first-class; command support may be partial."),t}async function V(e$1){let t=e$1.model??await e({workspacePath:e$1.workspacePath,includeEvidence:e$1.includeEvidence===true,observableScanDepth:e$1.observableScanDepth,now:e$1.now}),s=h(e$1.agent),r=b(t,e$1.scope),o=S(t,e$1.scope,r);if(e$1.strict===true&&o.status!=="passed"){let n=o.issues.map(p=>`${p.severity}:${p.code}:${p.target}`).join(", ");throw new Error(`Workspace context strict validation failed: ${n}`)}let c=(r?[r]:t.projects).map(n=>({name:n.name,path:n.path,kind:n.kind,runtime:n.runtime,framework:n.frameworkDisplayName,...n.generator?{generator:n.generator}:{},createCapability:n.createCapability,supportTier:n.supportTier,safeCommands:W(n),importantFiles:n.importantFiles})),a=P(t),m=A(t);return {schemaVersion:f,generatedAt:(e$1.now??new Date).toISOString(),agent:s,workspaceSummary:m,modelRef:".rapidkit/reports/workspace-model.json",workspace:{name:t.workspace.name,root:t.workspace.root,type:t.identity.workspaceType,...t.workspace.profile?{profile:t.workspace.profile}:{}},scope:{requested:e$1.scope??"workspace",...r?{activeProject:r.name}:{}},projects:c,safeCommands:x(t,r),evidence:a,policies:{mode:t.policies.mode,source:t.policies.source},contracts:{exists:t.contracts.exists,path:t.contracts.workspaceContractPath},validation:o,agentInstructions:["Read `.rapidkit/reports/INDEX.json` first, then this context pack and linked evidence reports.","Use this context as the workspace source of truth before inspecting random files.","Prefer workspace-level evidence over generic framework assumptions.","Use `display` commands when explaining steps to a human.","Use `execute` commands when launching commands from automation or tooling.","Keep project-scoped advice tied to the active project scope.","Regenerate stale grounding with `npx rapidkit workspace agent-sync --write --refresh-context`."],unsafeAssumptions:M(t),humanSummary:[m,`Evidence available: ${a.available.length}. Missing evidence groups: ${a.missing.join(", ")||"none"}.`,r?`Active project scope: ${r.name} (${r.frameworkDisplayName}).`:"Scope: whole workspace."].join(`
|
|
2
|
+
`)}}async function N(e,t){let s=d.join(t,w);return await g.ensureDir(d.dirname(s)),await g.writeJSON(s,a(e),{spaces:2}),s}export{f as a,w as b,V as c,N as d};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function C(s){let o=s.slice(0,-1);if(o.length===0)return s;let t=0;for(let c=1;c<o.length;c+=1)o[c].localeCompare(o[t])<0&&(t=c);let i=[...o.slice(t),...o.slice(0,t)];return i.push(i[0]),i}function G(s,o){let g=new Map;for(let e of s)g.set(e,0);let a=[],d=new Set,n=e=>{let r=[{id:e,index:0}];g.set(e,1);let h=[e];for(;r.length>0;){let l=r[r.length-1],f=o.get(l.id)??[];if(l.index>=f.length){g.set(l.id,2),r.pop(),h.pop();continue}let p=f[l.index];l.index+=1;let u=g.get(p)??0;if(u===1){let m=h.lastIndexOf(p);if(m>=0){let y=C([...h.slice(m),p]),k=y.join(">");d.has(k)||(d.add(k),a.push(y));}continue}u===0&&(g.set(p,1),r.push({id:p,index:0}),h.push(p));}};for(let e of s)g.get(e)===0&&n(e);return a.sort((e,r)=>e.join(">").localeCompare(r.join(">")))}function x(s){let o=[...new Set(s.nodes.map(n=>n.id))].sort((n,e)=>n.localeCompare(e)),t=new Set(o),i=[],c=new Map,g=new Set;for(let n of o)c.set(n,[]);for(let n of s.edges){let e=!t.has(n.from),r=!t.has(n.to);if(e||r){i.push({from:n.from,to:n.to,kind:n.kind,missing:e&&r?"both":e?"from":"to"});continue}c.get(n.from)?.push(n.to),g.add(n.from),g.add(n.to);}for(let n of c.values())n.sort((e,r)=>e.localeCompare(r));let a=G(o,c),d=o.filter(n=>!g.has(n));return i.sort((n,e)=>n.from.localeCompare(e.from)||n.to.localeCompare(e.to)||n.kind.localeCompare(e.kind)),{ok:a.length===0&&i.length===0,cycles:a,danglingEdges:i,orphans:d,stats:{nodeCount:o.length,edgeCount:s.edges.length,cycleCount:a.length,danglingCount:i.length,orphanCount:d.length}}}function I(s){let o=[];for(let t of s.cycles)o.push(`graph.integrity.cycle: ${t.join(" -> ")}`);for(let t of s.danglingEdges)o.push(`graph.integrity.dangling: ${t.from} -> ${t.to} (${t.kind}); missing ${t.missing} endpoint.`);return o}export{x as a,I as b};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {a as a$1}from'./chunk-HTYMXMQM.js';import {e,c,a,b as b$1}from'./chunk-TYZPPUBH.js';import {c as c$1}from'./chunk-S5KTATOU.js';import pe from'crypto';import u from'path';import w from'fs-extra';import {spawnSync}from'child_process';function S(e,t){let r=spawnSync("git",t,{cwd:e,encoding:"utf8",stdio:["ignore","pipe","ignore"]});return r.status!==0?{ok:false,stdout:""}:{ok:true,stdout:(r.stdout??"").trim()}}function ce(e){let t=[],r=[],n=[];for(let c of e.split(`
|
|
2
|
+
`)){if(!c.trim())continue;let o=c.slice(0,2),i=c.slice(3).trim();if(i){if(o==="??"){r.push(i);continue}o.includes("D")&&n.push(i),t.push(i);}}return {changedFiles:[...new Set(t)].sort(),untrackedFiles:[...new Set(r)].sort(),deletedFiles:[...new Set(n)].sort()}}function z(e,t){let r={available:false,dirty:false,changedFiles:[],untrackedFiles:[],deletedFiles:[]},n=S(e,["rev-parse","--is-inside-work-tree"]);if(!n.ok||n.stdout!=="true")return r;let c=S(e,["rev-parse","--abbrev-ref","HEAD"]),o=S(e,["rev-parse","HEAD"]),i=S(e,["status","--porcelain=v1","--untracked-files=all"]),p=ce(i.stdout),m=p.changedFiles.length>0||p.untrackedFiles.length>0||p.deletedFiles.length>0;return {available:true,branch:c.ok?c.stdout:void 0,commit:o.ok?o.stdout:void 0,ref:t?.ref,dirty:m,changedFiles:p.changedFiles,untrackedFiles:p.untrackedFiles,deletedFiles:p.deletedFiles}}var Q="workspace-model-snapshot.v1",T="workspace-model-diff.v1",E=".rapidkit/reports/workspace-model-snapshot.json",X=".rapidkit/reports/workspace-model-diff-last-run.json",de="workspace-impact.v1",le=".rapidkit/reports/workspace-impact-last-run.json";function Z(e){let t=e.trim().toLowerCase();return t==="git"||t.startsWith("git:")}function me(e){let t=e.trim();return t.toLowerCase()==="git"?"HEAD":t.toLowerCase().startsWith("git:")&&t.slice(4).trim()||"HEAD"}function _(e){if(Array.isArray(e))return e.map(t=>_(t));if(e&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=_(e[r]);return t}return e}function k(e){return JSON.stringify(_(e))}function $(e){let{runId:t,...r}=e,n={...r,generatedAt:"<ignored>",graph:e.graph?{...e.graph,generatedAt:"<ignored>"}:void 0,validation:e.validation?{...e.validation,issues:e.validation.issues.map(c=>({...c})).sort((c,o)=>{let i=`${c.severity}:${c.code}:${c.target}:${c.message}`,p=`${o.severity}:${o.code}:${o.target}:${o.message}`;return i.localeCompare(p)})}:void 0};return pe.createHash("sha256").update(k(n)).digest("hex")}function ee(e,t){return u.isAbsolute(t)?t:u.join(e,t)}async function fe(e){let t=await w.readJson(e);if(!t||typeof t!="object"||Array.isArray(t))throw new Error(`Workspace model input is not a JSON object: ${e}`);let r=t;if(r.schemaVersion===Q){let n=r;if(!n.model||n.model.schemaVersion!==b$1)throw new Error(`Invalid workspace model snapshot: ${e}`);return {model:n.model,hash:n.modelHash||$(n.model)}}if(r.schemaVersion===b$1){let n=r;return {model:n,hash:$(n)}}throw r.schemaVersion===T?new Error(`workspace diff --from received a diff report (${u.basename(e)}). Use a workspace model snapshot or model report as baseline, e.g. ${E}. To analyze an existing diff report, run: npx rapidkit workspace impact --from ${u.basename(e)} --json`):new Error(`Unsupported workspace model input schema: ${String(r.schemaVersion)}`)}async function ue(e){let t=await w.readJson(e);if(!t||typeof t!="object"||Array.isArray(t))throw new Error(`Workspace diff input is not a JSON object: ${e}`);let r=t;if(r.schemaVersion!==T)return null;let n=r;if(!n.currentModel||n.currentModel.schemaVersion!==b$1||!n.summary||!Array.isArray(n.changes))throw new Error(`Invalid workspace model diff report: ${e}`);return n}async function Ve(e$1){let t=e$1.model??await e({workspacePath:e$1.workspacePath,includeAbsolutePaths:e$1.includeAbsolutePaths,includeEvidence:e$1.includeEvidence,observableScanDepth:e$1.observableScanDepth,now:e$1.now});return {schemaVersion:Q,generatedAt:(e$1.now??new Date).toISOString(),modelHash:$(t),modelRef:c,model:t}}async function Ge(e,t){let r=u.join(t,E);return await w.ensureDir(u.dirname(r)),await w.writeJson(r,a(e),{spaces:2}),r}function A(e){return {name:e.name,path:e.path,kind:e.kind,runtime:e.runtime,framework:e.framework,generator:e.generator,supportTier:e.supportTier,commands:e.commands,importantFiles:e.importantFiles}}function h(e,t){e.push(t);}function ge(e,t){let r=[],n=["name","profile","type"],c=["workspaceType","surfaces","runtimeFamilies","businessCapabilities"];for(let o of n){let i=e.workspace[o],p=t.workspace[o];k(i)!==k(p)&&h(r,{type:"workspace.changed",severity:"info",target:`workspace.${o}`,message:`Workspace metadata field changed: ${String(o)}`,before:i,after:p});}for(let o of c){let i=e.identity[o],p=t.identity[o];k(i)!==k(p)&&h(r,{type:"workspace.changed",severity:"info",target:`identity.${o}`,message:`Workspace identity field changed: ${String(o)}`,before:i,after:p});}return k(e.policies)!==k(t.policies)&&h(r,{type:"workspace.changed",severity:"warning",target:"policies",message:"Workspace policy summary changed.",before:e.policies,after:t.policies}),k(e.evidence)!==k(t.evidence)&&h(r,{type:"workspace.changed",severity:"info",target:"evidence",message:"Workspace evidence summary changed.",before:e.evidence,after:t.evidence}),k(e.discovery)!==k(t.discovery)&&h(r,{type:"workspace.changed",severity:"info",target:"discovery",message:"Workspace discovery settings changed.",before:e.discovery,after:t.discovery}),e.contracts.exists!==t.contracts.exists&&h(r,{type:"workspace.changed",severity:t.contracts.exists?"info":"warning",target:t.contracts.workspaceContractPath,message:"Workspace contract presence changed.",before:e.contracts.exists,after:t.contracts.exists}),r}function ke(e,t){let r=e.validation??null,n=t.validation??null;return k(r)===k(n)?[]:[{type:"validation.changed",severity:n?.status==="failed"?"critical":"warning",target:"validation",message:"Workspace model validation changed.",before:r,after:n}]}function he(e,t){let r=[],n=new Map(e.projects.map(o=>[o.path,o])),c=new Map(t.projects.map(o=>[o.path,o]));for(let[o,i]of c.entries()){let p=n.get(o);if(!p){h(r,{type:"project.added",severity:"info",target:o,message:`Project added: ${i.name}`,after:A(i)});continue}let m=A(p),l=A(i);if(k(m)!==k(l)){let f=p.runtime!==i.runtime||p.framework!==i.framework;h(r,{type:"project.changed",severity:f?"warning":"info",target:o,message:`Project changed: ${i.name}`,before:m,after:l});}}for(let[o,i]of n.entries())c.has(o)||h(r,{type:"project.removed",severity:"warning",target:o,message:`Project removed: ${i.name}`,before:A(i)});return r.sort((o,i)=>`${o.type}:${o.target}`.localeCompare(`${i.type}:${i.target}`))}async function we(e$1){let t=u.resolve(e$1.workspacePath),r=Z(e$1.fromPath),n=r?me(e$1.fromPath):void 0,c$1=e$1.fromPath;if(r){let g=u.join(t,E);if(!await w.pathExists(g))throw new Error("Git-aware workspace diff requires an existing snapshot at .rapidkit/reports/workspace-model-snapshot.json. Run: npx rapidkit workspace snapshot --json");c$1=E;}let o=ee(t,c$1),i=await fe(o),p=e$1.model??await e({workspacePath:t,includeAbsolutePaths:e$1.includeAbsolutePaths,includeEvidence:e$1.includeEvidence,observableScanDepth:e$1.observableScanDepth,now:e$1.now}),m=$(p),l=[...ge(i.model,p),...he(i.model,p),...ke(i.model,p)],f;e$1.includeGitObservation!==false&&(f=e$1.gitObservation??z(t,{ref:n}),f.available&&ve(l,f,p));let v=l.filter(g=>g.type.startsWith("git.")).length,I=i.hash!==m,y=r?`git:${n??"HEAD"}`:u.relative(t,o).split(u.sep).join("/");return {schemaVersion:T,generatedAt:(e$1.now??new Date).toISOString(),fromRef:y,toRef:c,fromHash:i.hash,toHash:m,summary:{changed:I||v>0,addedProjects:l.filter(g=>g.type==="project.added").length,removedProjects:l.filter(g=>g.type==="project.removed").length,changedProjects:l.filter(g=>g.type==="project.changed").length,workspaceChanges:l.filter(g=>g.type==="workspace.changed").length,validationChanges:l.filter(g=>g.type==="validation.changed").length,gitChangedFiles:v},git:f?.available?je(f,n):{available:false,dirty:false,changedFiles:0,untrackedFiles:0,deletedFiles:0},changes:l,currentModel:p}}async function Ne(e,t){let r=u.join(t,X);return await w.ensureDir(u.dirname(r)),await w.writeJson(r,a(e),{spaces:2}),r}function M(e){return {none:0,low:1,medium:2,high:3,critical:4}[e]}function q(e){return e.reduce((t,r)=>M(r)>M(t)?r:t,"none")}var H=["none","low","medium","high","critical"];function ye(e){let t=Math.max(1,M(e)-1);return H[t]}function We(e){let t=Math.min(H.length-1,M(e)+1);return H[t]}function J(e){return e.join(" ")}function b(e,t,r,n){return {id:e,label:t,scope:n.scope,project:n.project,display:J(["npx","rapidkit",...r]),execute:J(["npx","--yes","--package","rapidkit","rapidkit",...r]),required:n.required!==false}}function U(e){let t=`project:${e.name}`;return [b(`project.${e.name}.test`,`Run tests for ${e.name}`,["workspace","run","test","--scope",t,"--json"],{scope:"project",project:e.name,required:e.commands.fleetStages.includes("test")}),b(`project.${e.name}.build`,`Run build for ${e.name}`,["workspace","run","build","--scope",t,"--json"],{scope:"project",project:e.name,required:e.commands.fleetStages.includes("build")})]}function D(){return [b("workspace.doctor","Run workspace doctor",["doctor","workspace","--json"],{scope:"workspace"}),b("workspace.contract.verify","Verify workspace contract",["workspace","contract","verify","--json"],{scope:"workspace"}),b("workspace.readiness","Run release readiness",["readiness","--json"],{scope:"workspace"}),b("workspace.analyze","Run workspace analyze",["analyze","--json"],{scope:"workspace",required:false}),b("workspace.pipeline","Run governance pipeline",["pipeline","--json"],{scope:"workspace",required:false})]}function be(e,t){let r=t.split(u.sep).join("/");return e.projects.filter(c=>{let o=c.path.split(u.sep).join("/");return r===o||r.startsWith(`${o}/`)}).sort((c,o)=>o.path.length-c.path.length)[0]}function ve(e,t,r){let n=new Set(e.map(o=>o.target)),c=(o,i)=>{let p=i.split(u.sep).join("/"),m=`git:${p}`;if(n.has(m))return;let l=be(r,p),f=l?`${l.name} (${l.path})`:"workspace";h(e,{type:o,severity:o==="git.deleted"?"warning":"info",target:m,message:`Git ${o==="git.untracked"?"untracked":o==="git.deleted"?"deleted":"changed"} file affects ${f}: ${p}`,after:{path:p,project:l?.name,projectPath:l?.path}}),n.add(m);};for(let o of t.changedFiles)c("git.file.changed",o);for(let o of t.untrackedFiles)c("git.untracked",o);for(let o of t.deletedFiles)c("git.deleted",o);}function je(e,t){return {available:true,ref:t??e.ref,branch:e.branch,commit:e.commit,dirty:e.dirty,changedFiles:e.changedFiles.length,untrackedFiles:e.untrackedFiles.length,deletedFiles:e.deletedFiles.length}}function Me(e){let t=new Set,r=[];for(let n of e){let c=`${n.scope}:${n.project??""}:${n.display}`;t.has(c)||(t.add(c),r.push(n));}return r}function Pe(e){return e.type==="project.removed"?"high":e.severity==="critical"?"critical":e.severity==="warning"?"high":("medium")}function Ie(e,t){return e.severity==="critical"?"critical":e.target==="policies"||e.target.includes("contract")?"high":e.type==="validation.changed"?(t?.projectCount??0)===0?"low":"high":e.target==="evidence"?"low":e.severity==="warning"?"medium":"low"}function Ce(e){return e.affectedProjects>0||e.projectCount>0||!e.changes.every(r=>r.severity==="critical"?false:r.type.startsWith("git.")||r.type==="validation.changed")?e.risk:M(e.risk)>=M("high")||e.risk==="medium"?"low":e.risk}function Y(e,t){if(!e||e==="workspace")return true;let r=(e.startsWith("project:")?e.slice(8):e).trim().toLowerCase();return [t.name,t.path,u.basename(t.path),t.absolutePath].filter(n=>typeof n=="string"&&n.trim().length>0).map(n=>n.trim().toLowerCase()).includes(r)}function Re(e){if(!e.changed)return {headline:"No workspace model impact detected.",bullets:["The current workspace model matches the provided snapshot/report."],unsafeAssumptions:["Do not claim runtime verification passed unless a report exists."]};let t=e.affectedProjects.map(r=>r.project?.name??r.target);return {headline:`Workspace impact risk: ${e.risk}.`,bullets:[`Affected projects: ${t.length?t.join(", "):"none"}.`,`Workspace-level items: ${e.workspaceImpact.length}.`,"Use the verification plan before recommending apply, rollback, or release actions."],unsafeAssumptions:["Do not infer test/build success from impact alone.","Do not apply fixes without project scope and verification evidence.","Use display commands for users and execute commands for automation."]}}async function Be(e){let t=u.resolve(e.workspacePath),r=Z(e.fromPath),n=e.diff;if(!n&&!r){let a=ee(t,e.fromPath);n=await ue(a)??void 0;}n||(n=await we({workspacePath:t,fromPath:e.fromPath,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,includeGitObservation:e.includeGitObservation,gitObservation:e.gitObservation,now:e.now,model:e.model}));let c=new Map(n.currentModel.projects.map(a=>[a.path,a])),o=new Map(n.currentModel.projects.map(a=>[a.name,a])),i=n.changes.filter(a=>a.type.startsWith("project.")),p=new Map;for(let a of i){let d=(c.get(a.target)??(typeof a.before?.name=="string"?o.get(a.before.name):void 0))?.path??a.target,W=p.get(d)??[];W.push(a),p.set(d,W);}let m=[];for(let[a,s]of p.entries()){let d=c.get(a);if(d&&!Y(e.scope,d))continue;let W=q(s.map(Pe)),C=d?.name??(typeof s[0]?.before?.name=="string"?String(s[0].before.name):a);m.push({id:`project:${C}`,scope:"project",target:a,title:`Project impact: ${C}`,summary:s.map(j=>j.message).join(" "),risk:W,reasons:s.map(j=>`${j.type}: ${j.message}`),project:d?{name:d.name,path:d.path,kind:d.kind,runtime:d.runtime,framework:d.framework,supportTier:d.supportTier,...d.generator?{generator:d.generator}:{}}:void 0,verification:d?U(d):D()});}let l=n.currentModel.graph,f=l?a$1(l):void 0,v=new Set(m.map(a=>a.project?.name).filter(a=>typeof a=="string")),I=new Map;for(let a of m)if(a.project?.name){let s=f?.byId.get(a.project.name);s&&(a.centrality={fanIn:s.fanIn,fanOut:s.fanOut,reach:s.reach,betweenness:s.betweenness,isHotspot:s.isHotspot},s.isHotspot&&(a.risk=We(a.risk),a.reasons=[...a.reasons,`graph.hotspot: critical-path project with ${s.reach} transitive dependent(s); risk escalated.`])),a.origin="direct",a.distance=0,I.set(a.project.name,a.risk);}let y=[],g=0;if(l&&v.size>0){let a=c$1(l,v);for(let s of a.values()){if(s.distance===0||v.has(s.id))continue;let d=o.get(s.id);if(d&&!Y(e.scope,d))continue;let W=s.path[0],C=s.path[s.path.length-2]??W,j=I.get(W)??"medium",ae=ye(j);g=Math.max(g,s.distance),y.push({id:`transitive:${s.id}`,scope:"project",target:d?.path??s.id,title:`Transitive impact: ${s.id}`,summary:`Depends on changed project ${W}${s.via?` via ${s.via}`:""} (distance ${s.distance}).`,risk:ae,reasons:[`graph.dependent: depends on ${C}${s.via?` via ${s.via}`:""} (path ${s.path.join(" -> ")})`],project:d?{name:d.name,path:d.path,kind:d.kind,runtime:d.runtime,framework:d.framework,supportTier:d.supportTier,...d.generator?{generator:d.generator}:{}}:void 0,verification:d?U(d):D(),origin:"transitive",distance:s.distance,path:s.path,via:s.via,...f?.byId.get(s.id)?{centrality:{fanIn:f.byId.get(s.id).fanIn,fanOut:f.byId.get(s.id).fanOut,reach:f.byId.get(s.id).reach,betweenness:f.byId.get(s.id).betweenness,isHotspot:f.byId.get(s.id).isHotspot}}:{}});}}y.sort((a,s)=>a.target.localeCompare(s.target));let te=f?f.hotspots.map(a=>{let s=f.byId.get(a);return {project:a,fanIn:s.fanIn,fanOut:s.fanOut,reach:s.reach,betweenness:s.betweenness}}):[],re=n.changes.filter(a=>!a.type.startsWith("project.")),V=n.currentModel.summary?.projectCount??n.currentModel.projects.length,P=re.map(a=>({id:`workspace:${a.target}`,scope:"workspace",target:a.target,title:`Workspace impact: ${a.target}`,summary:a.message,risk:Ie(a,{projectCount:V}),reasons:[`${a.type}: ${a.message}`],verification:D()})),G=Me([...m.flatMap(a=>a.verification),...y.flatMap(a=>a.verification),...P.flatMap(a=>a.verification),...n.summary.changed?D():[]]).filter(a=>a.required),ne=q([...m.map(a=>a.risk),...y.map(a=>a.risk),...P.map(a=>a.risk)]),N=Ce({risk:ne,affectedProjects:m.length,projectCount:V,changes:n.changes}),B={changed:n.summary.changed,risk:N,affectedProjects:m.length,workspaceItems:P.length,recommendedCommands:G.length,blastRadius:{directlyAffected:m.length,transitivelyAffected:y.length,maxDistance:g,graphEdges:l?.edges.length??0}};return {schemaVersion:de,generatedAt:(e.now??new Date).toISOString(),fromRef:n.fromRef,diffRef:X,workspace:{name:n.currentModel.workspace.name,profile:n.currentModel.workspace.profile,type:n.currentModel.workspace.type},summary:B,affectedProjects:m.sort((a,s)=>a.target.localeCompare(s.target)),transitiveImpact:y,criticalPathHotspots:te,workspaceImpact:P.sort((a,s)=>a.target.localeCompare(s.target)),verificationPlan:G,agentBrief:Re({changed:B.changed,risk:N,affectedProjects:m,workspaceImpact:P}),diff:n}}async function Ke(e,t){let r=u.join(t,le);return await w.ensureDir(u.dirname(r)),await w.writeJson(r,a(e),{spaces:2}),r}export{Q as a,T as b,E as c,X as d,de as e,le as f,Z as g,me as h,Ve as i,Ge as j,we as k,Ne as l,D as m,Be as n,Ke as o};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {c}from'./chunk-NFUXULIF.js';import {a}from'./chunk-A5FBGRJA.js';import {a as a$1}from'./chunk-VKLL63TL.js';import {b}from'./chunk-
|
|
1
|
+
import {c}from'./chunk-NFUXULIF.js';import {a}from'./chunk-A5FBGRJA.js';import {a as a$1}from'./chunk-VKLL63TL.js';import {b}from'./chunk-6KD5F6LX.js';import {j}from'./chunk-Z5LKRG57.js';import {promises}from'fs';import o from'path';import i from'chalk';import N from'ora';import {execa}from'execa';function B(e){let t=a(e.path),r=Array.isArray(e.projects)?e.projects:[],a$1=[],s=new Set;for(let p of r){if(!p||typeof p.name!="string"||typeof p.path!="string")continue;let n=a(p.path);s.has(n)||(s.add(n),a$1.push({name:p.name,path:n}));}return {name:e.name,path:t,mode:e.mode,projects:a$1}}function P(e){let t=[],r=new Set;for(let a of e.workspaces||[]){if(!a||typeof a.name!="string"||typeof a.path!="string")continue;let s=B(a);r.has(s.path)||(r.add(s.path),t.push(s));}return {workspaces:t}}async function F(e){try{let t=await promises.readFile(e,"utf8"),r=JSON.parse(t);if(r&&Array.isArray(r.workspaces))return P(r)}catch{}return {workspaces:[]}}async function T(e,t){try{let r=a(e),a$1=j(),s=o.join(a$1,"workspaces.json");await promises.mkdir(a$1,{recursive:true});let p={name:t,path:r,mode:"full",projects:[]};for(let n=0;n<3;n+=1){let c=await F(s);if(c.workspaces.some(k=>k.path===r)||(c.workspaces.push(p),await promises.writeFile(s,JSON.stringify(c,null,2)),(await F(s)).workspaces.some(k=>k.path===r)))return}console.warn(i.gray("Note: Could not register workspace in shared registry"));}catch{console.warn(i.gray("Note: Could not register workspace in shared registry"));}}async function ne(e,t=false){let r=a(e),a$1={workspacePath:r,workspaceFound:false,added:[],skipped:0};try{let s=j(),p=o.join(s,"workspaces.json"),n={workspaces:[]};try{let f=await promises.readFile(p,"utf8"),h=JSON.parse(f);h&&Array.isArray(h.workspaces)&&(n=P(h));}catch{return t||console.log("\u26A0\uFE0F Workspace registry not found"),a$1}let c=n.workspaces.find(f=>f.path===r);if(!c)return t||console.log("\u26A0\uFE0F Workspace not registered in registry"),a$1;Array.isArray(c.projects)||(c.projects=[]);let l=0,k=0,g=[],m=[e],y=new Set;for(;m.length>0;){let f=m.shift();if(!f||y.has(f))continue;y.add(f);let h=await promises.readdir(f,{withFileTypes:true});for(let w of h){if(!w.isDirectory()||w.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(w.name))continue;let b=o.join(f,w.name),u=a(b),$=o.join(u,".rapidkit","context.json"),W=o.join(u,".rapidkit","project.json");try{let S=false;try{await promises.access($),S=true;}catch{await promises.access(W),S=true;}if(S){let v=o.basename(u);c.projects.some(_=>_.path===u||_.name===v)?k++:(c.projects.push({name:v,path:u}),l++,g.push(u),t||console.log(`\u2714 Added: ${o.relative(e,u)}`));continue}}catch{}m.push(b);}}return l>0?(await promises.writeFile(p,JSON.stringify(n,null,2)),t||console.log(`
|
|
2
2
|
\u2705 Synced ${l} project(s) to registry`)):t||console.log(`
|
|
3
|
-
\u2705 All projects already registered (${k} found)`),{workspacePath:r,workspaceFound:true,added:g,skipped:k}}catch(s){return t||console.error("\u274C Failed to sync projects:",s.message),a$1}}async function se(e,t,r){try{let a$1=a(e),s=a(r),p=j(),n=o.join(p,"workspaces.json"),c={workspaces:[]};try{let m=await promises.readFile(n,"utf8"),y=JSON.parse(m);y&&Array.isArray(y.workspaces)&&(c=P(y));}catch{return}let l=c.workspaces.find(m=>m.path===a$1);if(!l)return;Array.isArray(l.projects)||(l.projects=[]);let k=l.projects.findIndex(m=>m.path===s||m.name===t),g={name:t,path:s};if(k>=0){let m=l.projects[k];(m.name!==g.name||m.path!==g.path)&&(l.projects[k]=g,await promises.writeFile(n,JSON.stringify(c,null,2)));}else l.projects.push({name:t,path:s}),await promises.writeFile(n,JSON.stringify(c,null,2));}catch{}}async function ce(e,t){let r=N("Creating RapidKit workspace...").start();try{await promises.mkdir(e,{recursive:true}),await promises.mkdir(o.join(e,".rapidkit"),{recursive:true});let a={workspace_name:t.name,author:t.author,rapidkit_version:b(),created_at:new Date().toISOString(),type:"workspace"};await promises.writeFile(o.join(e,".rapidkit","config.json"),JSON.stringify(a,null,2));let{syncWorkspaceFoundationFiles:s}=await import('./create-
|
|
3
|
+
\u2705 All projects already registered (${k} found)`),{workspacePath:r,workspaceFound:true,added:g,skipped:k}}catch(s){return t||console.error("\u274C Failed to sync projects:",s.message),a$1}}async function se(e,t,r){try{let a$1=a(e),s=a(r),p=j(),n=o.join(p,"workspaces.json"),c={workspaces:[]};try{let m=await promises.readFile(n,"utf8"),y=JSON.parse(m);y&&Array.isArray(y.workspaces)&&(c=P(y));}catch{return}let l=c.workspaces.find(m=>m.path===a$1);if(!l)return;Array.isArray(l.projects)||(l.projects=[]);let k=l.projects.findIndex(m=>m.path===s||m.name===t),g={name:t,path:s};if(k>=0){let m=l.projects[k];(m.name!==g.name||m.path!==g.path)&&(l.projects[k]=g,await promises.writeFile(n,JSON.stringify(c,null,2)));}else l.projects.push({name:t,path:s}),await promises.writeFile(n,JSON.stringify(c,null,2));}catch{}}async function ce(e,t){let r=N("Creating RapidKit workspace...").start();try{await promises.mkdir(e,{recursive:true}),await promises.mkdir(o.join(e,".rapidkit"),{recursive:true});let a={workspace_name:t.name,author:t.author,rapidkit_version:b(),created_at:new Date().toISOString(),type:"workspace"};await promises.writeFile(o.join(e,".rapidkit","config.json"),JSON.stringify(a,null,2));let{syncWorkspaceFoundationFiles:s}=await import('./create-XVDDQA42.js');await s(e,{workspaceName:t.name,installMethod:"venv",writeMarker:true,writeGitignore:false,onlyIfMissing:true});let{publishWorkspaceRegistrySummary:p}=await import('./workspace-registry-summary-MIPHVB56.js');await p(e);let n=z();await promises.writeFile(o.join(e,"rapidkit"),n),await promises.chmod(o.join(e,"rapidkit"),493);let c=U();await promises.writeFile(o.join(e,"rapidkit.cmd"),c);let l=J(t.name);if(await promises.writeFile(o.join(e,"README.md"),l),await promises.writeFile(o.join(e,".gitignore"),`# RapidKit workspace
|
|
4
4
|
.env
|
|
5
5
|
.env.*
|
|
6
6
|
!.env.example
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function l(r,t){return `${r}\0${t}`}function f(r,t,s){let o=r.get(t);o?o.includes(s)||o.push(s):r.set(t,[s]);}function k(r){let t=new Map,s=new Map,o=new Map,i=new Set(r.nodes.map(e=>e.id));for(let e of r.edges){f(t,e.from,e.to),f(s,e.to,e.from);let n=l(e.from,e.to),d=o.get(n)??[];d.includes(e.kind)||d.push(e.kind),o.set(n,d);}for(let e of t.values())e.sort((n,d)=>n.localeCompare(d));for(let e of s.values())e.sort((n,d)=>n.localeCompare(d));for(let e of o.values())e.sort((n,d)=>n.localeCompare(d));return {forward:t,reverse:s,kindsByPair:o,nodeIds:i}}function v(r,t,s,o){let i=o==="dependents"?l(s,t):l(t,s),e=r.kindsByPair.get(i);return e&&e.length>0?e[0]:null}function m(r,t,s={}){let o=k(r);return x(o,t,s)}function x(r,t,s={}){let o=s.direction??"dependents",i=s.maxDepth??Number.POSITIVE_INFINITY,e=o==="dependents"?r.reverse:r.forward,n=new Map,d=[...new Set(t)].sort((a,p)=>a.localeCompare(p)),g=[];for(let a of d)n.has(a)||(n.set(a,{id:a,distance:0,path:[a],via:null}),g.push(a));let c=0;for(;c<g.length;){let a=g[c++],p=n.get(a);if(!p||p.distance>=i)continue;let h=e.get(a)??[];for(let u of h)n.has(u)||(n.set(u,{id:u,distance:p.distance+1,path:[...p.path,u],via:v(r,a,u,o)}),g.push(u));}return n}function y(r,t,s={}){return m(r,t,{...s,direction:"dependents"})}function D(r,t,s={}){let o=s.maxDepth??Number.POSITIVE_INFINITY,i=new Set,e=new Map,n=[];for(let c of t)i.has(c)||(i.add(c),e.set(c,0),n.push(c));let d=i.size,g=0;for(;g<n.length;){let c=n[g++],a=e.get(c)??0;if(a>=o)continue;let p=r.get(c);if(p)for(let h of p)i.has(h)||(i.add(h),e.set(h,a+1),n.push(h));}return {reached:i,added:i.size-d}}export{k as a,x as b,y as c,D as d};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {e as e$1,a as a$4,d}from'./chunk-X7PWDIQW.js';import {g,a as a$5}from'./chunk-GDGATWR5.js';import {a}from'./chunk-RV6HBTFC.js';import {a as a$3,q as q$1,k}from'./chunk-YBS2HGO3.js';import {i,h}from'./chunk-UZW5QFRW.js';import {a as a$2}from'./chunk-VKLL63TL.js';import {e}from'./chunk-GOM3RFB3.js';import {a as a$1}from'./chunk-HHJAANUC.js';import m from'path';import P from'fs-extra';import rt from'crypto';import {createRequire}from'module';var Ve="unknown-run";function we(t){let e$1=e();return !e$1||e$1===Ve?t:{...t,runId:e$1}}var Ee="workspace-dependency-graph.v1",Pe=["code-import","package-dep","event-pub-sub","service-dependsOn","shared-resource"];var je=".rapidkit/workspace-graph.overrides.json",$e=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),Ke=new Set([".git",".hg",".svn",".rapidkit",".venv","node_modules","dist","build","out","target","coverage","htmlcov",".next",".turbo",".cache"]),be=600,Se=5,He=256*1024,ve={inferred:1,contract:2,manual:3};function Be(t){return t.split(m.sep).join("/")}function H(t,e){return Be(m.relative(t,e)||".")}function Ce(t){let e=new Map;for(let n of t.projects)e.has(n.name)||e.set(n.name,{id:n.name,path:n.path,...n.runtime?{runtime:n.runtime}:{},...n.framework?{framework:n.framework}:{},...n.kind?{kind:n.kind}:{}});return [...e.values()].sort((n,s)=>n.id.localeCompare(s.id))}function We(t,e){let n=new Map,s=new Map;for(let r of e.projects){if(n.has(r.name))continue;let a=r.absolutePath?m.resolve(r.absolutePath):m.resolve(t,r.path);n.set(r.name,a),s.has(a)||s.set(a,r.name);}let o=[...s.entries()].map(([r,a])=>({dir:r,id:a})).sort((r,a)=>a.dir.length-r.dir.length||r.dir.localeCompare(a.dir));return {idToDir:n,dirToId:s,sortedDirs:o}}function B(t,e){let n=m.resolve(e);for(let{dir:s,id:o}of t.sortedDirs)if(n===s||n.startsWith(`${s}${m.sep}`))return o;return null}async function ee(t){try{if(!await P.pathExists(t))return null;let e=await P.readJSON(t);return e&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}async function ne(t){try{return await P.pathExists(t)?await P.readFile(t,"utf8"):null}catch{return null}}async function Re(t,e){let n=[],s=new Map;for(let[o,r]of e.idToDir.entries()){let a=await ee(m.join(r,"package.json")),i=typeof a?.name=="string"?a.name.trim():"";i&&!s.has(i)&&s.set(i,o);}for(let[o,r]of e.idToDir.entries()){let a=await ee(m.join(r,"package.json"));if(a){let i=["dependencies","devDependencies","peerDependencies","optionalDependencies"],c=new Set;for(let p of i){let l=a[p];if(!(!l||typeof l!="object"||Array.isArray(l)))for(let d of Object.keys(l)){let u=s.get(d);!u||u===o||c.has(u)||(c.add(u),n.push({from:o,to:u,kind:"package-dep",source:"inferred",confidence:"high",evidence:[{file:H(t,m.join(r,"package.json")),detail:`declares dependency ${d}`}]}));}}}n.push(...await Le(t,e,o,r)),n.push(...await ze(t,e,o,r));}return n}async function Le(t,e,n,s){let o=await ne(m.join(s,"pyproject.toml"));if(!o)return [];let r=[],a=new Set,i=/path\s*=\s*["']([^"']+)["']/g,c;for(;(c=i.exec(o))!==null;){let p=B(e,m.resolve(s,c[1]));!p||p===n||a.has(p)||(a.add(p),r.push({from:n,to:p,kind:"package-dep",source:"inferred",confidence:"high",evidence:[{file:H(t,m.join(s,"pyproject.toml")),detail:`path dependency ${c[1]}`}]}));}return r}async function ze(t,e,n,s){let o=await ne(m.join(s,"go.mod"));if(!o)return [];let r=[],a=new Set,i=/replace\s+\S+\s+=>\s+(\.[^\s]+)/g,c;for(;(c=i.exec(o))!==null;){let p=B(e,m.resolve(s,c[1]));!p||p===n||a.has(p)||(a.add(p),r.push({from:n,to:p,kind:"package-dep",source:"inferred",confidence:"high",evidence:[{file:H(t,m.join(s,"go.mod")),detail:`go.mod replace ${c[1]}`}]}));}return r}async function Je(t,e){let n=[],s=[t];for(;s.length>0&&n.length<e;){let o=s.shift();if(!o)continue;let r=[];try{r=await P.readdir(o,{withFileTypes:true});}catch{continue}let a=[],i=[];for(let c of r)if(c.isDirectory()){if(Ke.has(c.name)||c.name.startsWith("."))continue;a.push(m.join(o,c.name));}else c.isFile()&&$e.has(m.extname(c.name))&&i.push(m.join(o,c.name));i.sort((c,p)=>c.localeCompare(p)),a.sort((c,p)=>c.localeCompare(p));for(let c of i){if(n.length>=e)break;n.push(c);}s.push(...a);}return n}var qe=[/\bfrom\s+["']([^"']+)["']/g,/\bimport\s+["']([^"']+)["']/g,/\bimport\s*\(\s*["']([^"']+)["']\s*\)/g,/\brequire\s*\(\s*["']([^"']+)["']\s*\)/g];function Ue(t){let e=new Set;for(let n of qe){n.lastIndex=0;let s;for(;(s=n.exec(t))!==null;){let o=s[1];o.startsWith(".")&&e.add(o);}}return [...e]}async function te(t,e,n,s){let o=new Map;for(let[r,a]of e.idToDir.entries()){if(s&&!s.has(r))continue;let i=await Je(a,n);for(let c of i){let p=await P.stat(c).catch(()=>null);if(!p||p.size>He)continue;let l=await ne(c);if(l)for(let d of Ue(l)){let u=m.resolve(m.dirname(c),d),k=B(e,u);if(!k||k===r)continue;let j=`${r}\0${k}`,y=o.get(j);y||(y={from:r,to:k,evidence:[]},o.set(j,y)),y.evidence.length<Se&&y.evidence.push({file:H(t,c),detail:`imports ${d}`});}}}return [...o.values()].map(r=>({from:r.from,to:r.to,kind:"code-import",source:"inferred",confidence:"medium",evidence:r.evidence}))}function Xe(t,e,n){let s=new Map;for(let o of n.projects){let r=Ye(t,e,o);r&&s.set(o.slug,r);}return s}function Ye(t,e,n){let s=[n.relativePath,n.externalPath].filter(o=>typeof o=="string"&&o.length>0);for(let o of s){let r=m.resolve(t,o),a=e.dirToId.get(r)??B(e,r);if(a)return a}return e.idToDir.has(n.slug)?n.slug:null}function Me(t,e,n){let s=[],o=Xe(t,e,n),r=a$5,a=new Map,i=new Map;for(let c of n.projects){let p=o.get(c.slug);if(!p)continue;let l=c.contracts??{publishes:[],consumes:[],dependsOn:[]};for(let d of l.dependsOn??[]){let u=o.get(d);!u||u===p||s.push({from:p,to:u,kind:"service-dependsOn",source:"contract",confidence:"high",evidence:[{file:r,detail:`dependsOn ${d}`}]});}for(let d of l.publishes??[])a.has(d)||a.set(d,new Set),a.get(d)?.add(p);for(let d of l.consumes??[])i.has(d)||i.set(d,new Set),i.get(d)?.add(p);}for(let[c,p]of a.entries()){let l=i.get(c);if(l)for(let d of l)for(let u of p)d!==u&&s.push({from:d,to:u,kind:"event-pub-sub",source:"contract",confidence:"high",evidence:[{file:r,detail:`consumes event ${c}`}]});}return s.push(...Qe(n,o)),s}function Z(t){return t.toLowerCase().replace(/[^a-z0-9]/g,"")}function Qe(t,e){let n=[],s=t.projects.map(o=>({project:o,id:e.get(o.slug)})).filter(o=>!!o.id).filter(o=>Z(o.project.slug).length>=3);for(let o of t.projects){let r=e.get(o.slug);if(!r)continue;let a=o.contracts?.env??[];if(a.length===0)continue;let i=new Set;for(let c of a){let p=Z(c);for(let l of s)l.id===r||i.has(l.id)||!(p.includes(Z(l.project.slug))&&(l.project.ports?.length??0)>0)||(i.add(l.id),n.push({from:r,to:l.id,kind:"shared-resource",source:"inferred",confidence:"low",evidence:[{file:a$5,detail:`env ${c} references ${l.project.slug}`}]}));}}return n}async function xe(t,e){let n=await ee(m.join(t,je)),s=Array.isArray(n?.edges)?n?.edges:[],o=[],r=new Set(Pe);for(let a of s){if(!a||typeof a!="object"||Array.isArray(a))continue;let i=a,c=typeof i.from=="string"?i.from:"",p=typeof i.to=="string"?i.to:"",l=typeof i.kind=="string"?i.kind:"";if(!e.has(c)||!e.has(p)||c===p||!r.has(l))continue;let d=Array.isArray(i.evidence)?i.evidence.map(u=>u&&typeof u=="object"&&typeof u.file=="string"?{file:u.file,...typeof u.detail=="string"?{detail:u.detail}:{}}:null).filter(u=>!!u):[];o.push({from:c,to:p,kind:l,source:"manual",confidence:"high",evidence:d.length>0?d:[{file:je,detail:"manual edge"}]});}return o}function Ze(t){return `${t.from}\0${t.to}\0${t.kind}`}function et(t){let e=new Set,n=[];for(let s of t){let o=`${s.file}\0${s.detail??""}`;e.has(o)||(e.add(o),n.push(s));}return n.sort((s,o)=>s.file.localeCompare(o.file)||(s.detail??"").localeCompare(o.detail??"")).slice(0,Se)}function tt(t){let e=new Map;for(let n of t){let s=Ze(n),o=e.get(s);if(!o){e.set(s,{...n,evidence:[...n.evidence]});continue}let r=ve[o.source],a=ve[n.source];a>r?e.set(s,{...n,evidence:[...n.evidence,...o.evidence]}):a===r&&o.evidence.push(...n.evidence);}return [...e.values()].map(n=>({from:n.from,to:n.to,kind:n.kind,source:n.source,confidence:n.confidence,evidence:et(n.evidence)})).sort((n,s)=>n.from.localeCompare(s.from)||n.to.localeCompare(s.to)||n.kind.localeCompare(s.kind)||n.source.localeCompare(s.source))}function nt(t,e){let n=new Map;for(let c of t)n.set(c.id,[]);for(let c of e)n.has(c.from)||n.set(c.from,[]),n.get(c.from)?.push(c.to);let s=0,o=1,r=2,a=new Map;for(let c of n.keys())a.set(c,s);let i=c=>{let p=[{id:c,index:0}];for(a.set(c,o);p.length>0;){let l=p[p.length-1],d=n.get(l.id)??[];if(l.index>=d.length){a.set(l.id,r),p.pop();continue}let u=d[l.index];l.index+=1;let k=a.get(u)??s;if(k===o)return true;k===s&&(a.set(u,o),p.push({id:u,index:0}));}return false};for(let c of [...n.keys()].sort())if(a.get(c)===s&&i(c))return true;return false}function Ae(t,e,n,s){let o=tt(n.filter(r=>e.has(r.from)&&e.has(r.to)));return {schemaVersion:Ee,generatedAt:(s??new Date).toISOString(),nodes:t,edges:o,stats:{nodeCount:t.length,edgeCount:o.length,inferredEdges:o.filter(r=>r.source==="inferred").length,contractEdges:o.filter(r=>r.source==="contract").length,manualEdges:o.filter(r=>r.source==="manual").length,hasCycle:nt(t,o)}}}async function Ie(t){let e=m.resolve(t.workspacePath),n=t.maxImportFilesPerProject??be,s=Ce(t.model),o=new Set(s.map(i=>i.id)),r=We(e,t.model),a=[];return a.push(...await Re(e,r)),a.push(...await te(e,r,n)),t.contract&&a.push(...Me(e,r,t.contract)),a.push(...await xe(e,o)),Ae(s,o,a,t.now)}async function De(t){let e=m.resolve(t.workspacePath),n=t.maxImportFilesPerProject??be,s=Ce(t.model),o=new Set(s.map(i=>i.id)),r=We(e,t.model),a=[];if(a.push(...await Re(e,r)),t.structuralChange)a.push(...await te(e,r,n));else {a.push(...await te(e,r,n,t.changedProjectIds));for(let i of t.previousGraph.edges)i.kind==="code-import"&&i.source==="inferred"&&!t.changedProjectIds.has(i.from)&&o.has(i.from)&&o.has(i.to)&&a.push({from:i.from,to:i.to,kind:"code-import",source:"inferred",confidence:i.confidence,evidence:i.evidence});}return t.contract&&a.push(...Me(e,r,t.contract)),a.push(...await xe(e,o)),Ae(s,o,a,t.now)}var re="workspace-model-cache.v1",_e=".rapidkit/cache/workspace-model.v1.json",Oe=["package.json","pyproject.toml","requirements.txt","go.mod","go.sum","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","composer.json","Gemfile","rapidkit.project.json",".rapidkit/project.json"],st=[".rapidkit/workspace.contract.json",".rapidkit/workspace.json","rapidkit.workspace.json",".rapidkit/policies.yml",".rapidkit/policies.yaml"],at=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),it=new Set([".git",".rapidkit","node_modules","dist","build","out","target","coverage",".next",".turbo",".cache",".venv"]),ct=1500,_=null;function oe(){if(_)return _;try{_=createRequire(import.meta.url)("../package.json")?.version??"0.0.0";}catch{_="0.0.0";}return _}async function L(t){try{let e=await P.readFile(t);return rt.createHash("sha256").update(e).digest("hex")}catch{return null}}async function dt(t){let e={};for(let o of Oe){let r=await L(m.join(t,o));r&&(e[o]=r);}let n=[],s=[t];for(;s.length>0&&n.length<ct;){let o=s.shift();if(!o)continue;let r=[];try{r=await P.readdir(o,{withFileTypes:true});}catch{continue}let a=[];for(let i of r)if(i.isDirectory()){if(it.has(i.name)||i.name.startsWith("."))continue;a.push(m.join(o,i.name));}else if(i.isFile()&&at.has(m.extname(i.name))){let c=m.join(o,i.name),p=await P.stat(c).catch(()=>null);if(p){let l=m.relative(t,c).split(m.sep).join("/");n.push(`${l}:${p.size}:${Math.round(p.mtimeMs)}`);}}a.sort((i,c)=>i.localeCompare(c)),s.push(...a);}return n.sort((o,r)=>o.localeCompare(r)),d({manifests:e,source:n})}async function z(t,e){let n=m.resolve(t),s={},o=[...new Set(e.map(r=>m.relative(n,m.resolve(r)).split(m.sep).join("/")))].sort((r,a)=>r.localeCompare(a));for(let r of o)s[r]=await dt(m.join(n,r));return s}async function J(t){let e=m.resolve(t),n={};for(let s of st){let o=await L(m.join(e,s));o&&(n[s]=o);}return n}async function q(t){let e=m.resolve(t.workspacePath),n=[...new Set(t.projectPaths.map(r=>m.relative(e,m.resolve(r)).split(m.sep).join("/")))].sort((r,a)=>r.localeCompare(a)),s=[];for(let r of n){let a={};for(let i of Oe){let c=await L(m.join(e,r,i));c&&(a[i]=c);}s.push({project:r,manifests:a});}let o={};for(let r of [".rapidkit/workspace.contract.json",".rapidkit/workspace.json","rapidkit.workspace.json",".rapidkit/policies.yml",".rapidkit/policies.yaml"]){let a=await L(m.join(e,r));a&&(o[r]=a);}return d({cacheSchema:re,cliVersion:t.cliVersion,flags:t.flags,workspaceJson:t.workspaceJson??null,marker:t.marker??null,projects:s,workspaceFiles:o})}async function se(t){let e=m.join(m.resolve(t),_e);try{if(!await P.pathExists(e))return null;let n=await P.readJson(e);return !n||n.schemaVersion!==re||typeof n.inputsHash!="string"||typeof n.cliVersion!="string"||!n.model?null:n}catch{return null}}async function U(t,e){let n=m.join(m.resolve(t),_e);await P.ensureDir(m.dirname(n));let s={schemaVersion:re,...e};return await P.writeJson(n,s,{spaces:2}),n}var pt="workspace-model.v1",lt=".rapidkit/reports/workspace-model.json",ut=["package.json","pyproject.toml","requirements.txt","go.mod","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","composer.json","Gemfile","mix.exs","deno.json","deno.jsonc","bun.lock","bun.lockb","deps.edn","project.clj","build.sbt","docker-compose.yml","docker-compose.yaml","terraform.tf"],mt=new Set([".git",".hg",".svn",".rapidkit",".venv","node_modules","dist","build","target","coverage","htmlcov",".next",".turbo"]);function Ne(t,e){return (m.relative(t,e)||".").split(m.sep).join("/")}async function Te(t){try{if(!await P.pathExists(t))return null;let e=await P.readJSON(t);return e&&typeof e=="object"?e:null}catch{return null}}async function gt(t,e){for(let n of e)if(await P.pathExists(m.join(t,n)))return true;return false}function ae(t){let e=Number.parseInt(process.env.RAPIDKIT_WORKSPACE_MODEL_SCAN_DEPTH??"",10),n=typeof t=="number"&&Number.isFinite(t)?t:Number.isFinite(e)?e:4;return Math.min(12,Math.max(1,Math.trunc(n)))}async function ie(t,e){let n=m.resolve(t),s=[{dirPath:n,depth:0}],o=new Set,r=new Set;for(;s.length>0;){let a=s.shift();if(!a)continue;let i=m.resolve(a.dirPath);if(r.has(i))continue;if(r.add(i),i!==n&&await gt(i,ut)){o.add(i);continue}if(a.depth>=e)continue;let c=[];try{c=await P.readdir(i,{withFileTypes:true});}catch{continue}for(let p of c)!p.isDirectory()||mt.has(p.name)||p.name.startsWith(".")&&p.name!==".config"||s.push({dirPath:m.join(i,p.name),depth:a.depth+1});}return Array.from(o).sort((a,i)=>a.localeCompare(i))}function ce(t){let e=new Set,n=[];for(let s of t){let o=m.resolve(s);e.has(o)||(e.add(o),n.push(o));}return n.sort((s,o)=>s.localeCompare(o))}function Ge(t,e){let n=t?.[e];return typeof n=="string"&&n.trim()?n.trim():void 0}function ft(t,e){return t?.[e]===true}function ht(t,e,n){let s=t?.frontend&&typeof t.frontend=="object"&&!Array.isArray(t.frontend)?t.frontend:void 0,o=Ge(s,"generator"),r=Ge(s,"command_display"),a=typeof e=="string"&&e.startsWith("frontend.");if(!(!o&&!a))return {...o?{id:o}:{},...e?{kit:e}:{},displayName:n,source:ft(s,"official_generator")?"official-generator":"metadata",...r?{commandDisplay:r}:{}}}async function kt(t){let e=[".rapidkit/project.json",".rapidkit/context.json","package.json","pyproject.toml","requirements.txt","go.mod","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","composer.json","Gemfile","mix.exs","deno.json","Dockerfile","docker-compose.yml","README.md"],n=[];for(let s of e)await P.pathExists(m.join(t,s))&&n.push(s);return n}async function v(t,e,n){let s=m.join(t,e),o=await P.pathExists(s),r={path:e.split(m.sep).join("/"),exists:o};if(o&&n){let a=await Te(s);typeof a?.generatedAt=="string"&&(r.generatedAt=a.generatedAt);let i=a?.status??a?.result??a?.verdict;typeof i=="string"&&(r.status=i);}return r}async function yt(t,e,n){let o=`${Ne(t,e)}/.rapidkit/reports`,r=await v(t,`${o}/doctor-project-last-run.json`,n);return {doctor:r?.exists===true?r:await v(t,`${o}/doctor-last-run.json`,n),analyze:await v(t,`${o}/analyze-last-run.json`,n),readiness:await v(t,`${o}/release-readiness-last-run.json`,n)}}async function wt(t,e,n){let s=a$3(e),o=i(e,s),r=q$1(e),a=k(o.runtime),i$1=await e$1(e,s),c=typeof s?.name=="string"&&s.name.trim()?s.name.trim():m.basename(e),p=typeof s?.kit_name=="string"?s.kit_name:typeof s?.kit=="string"?s.kit:void 0,l=typeof s?.engine=="string"?s.engine:r.engine!=="unknown"?r.engine:void 0,d=ht(s,p,o.displayName),u=a$4({kitId:p,framework:o.key,runtime:o.runtime});return {name:c,path:Ne(t,e),...n.includeAbsolutePaths?{absolutePath:e}:{},kind:i$1,runtime:o.runtime,runtimeCandidates:h(e),framework:o.key,frameworkDisplayName:o.displayName,confidence:o.confidence,detectionSource:o.source,supportTier:o.supportTier,runtimeSupportTier:a.tier,runtimeDoctorSupport:a.doctorSupport,moduleSupport:r.moduleSupport,...p?{kit:p}:{},...l?{engine:l}:{},...d?{generator:d}:{},createCapability:u,commands:{supported:r.supportedCommands,unsupported:r.unsupportedCommands,global:r.globalCommands,fleetStages:r.fleetStages,localOnly:r.localOnlyCommands,map:r.commandMap},importantFiles:await kt(e),evidence:await yt(t,e,n.includeEvidence),provenance:{path:"filesystem discovery",runtime:o.source,framework:o.source,commands:"project command capability matrix",createCapability:"create planner capability contract",evidence:"project .rapidkit/reports"}}}async function de(t){return Te(m.join(t,".rapidkit","workspace.json"))}function Et(t){return t.some(e=>e.kind==="frontend")&&t.length>1?"full-stack-workspace":t.some(e=>e.kind==="frontend")?"frontend-workspace":t.length>1?"backend-platform":"backend-workspace"}function Pt(t){let e=new Set;for(let n of t){let s=`${n.name} ${n.path}`.toLowerCase();for(let o of ["auth","billing","payment","notification","order","admin","report","search","analytics"])s.includes(o)&&e.add(o);}return Array.from(e).sort()}function E(t,e,n,s){return {severity:t,code:e,message:n,target:s}}function Fe(t){let e=[];t.workspace.name.trim()||e.push(E("error","workspace.name.missing","Workspace name could not be resolved.","workspace")),t.workspace.type==="observed-workspace"&&e.push(E("warning","workspace.marker.missing","Workspace marker is missing; model is based on filesystem observation.","workspace.marker")),t.summary.projectCount===0&&e.push(E("warning","workspace.projects.empty","No project roots were detected in this workspace.","projects")),t.contracts.exists||e.push(E("warning","workspace.contract.missing","Workspace contract is missing; dependency and API edges may be incomplete.",t.contracts.workspaceContractPath));let n=new Map;for(let r of t.projects){let a=r.name.toLowerCase(),i=n.get(a)??[];i.push(r),n.set(a,i),r.importantFiles.length||e.push(E("warning","project.markers.missing",`Project ${r.name} has no important manifest files recorded.`,r.path)),r.runtime==="unknown"&&e.push(E("warning","project.runtime.unknown",`Project ${r.name} runtime could not be confidently detected.`,r.path));let c=["test","build"];for(let d of c)r.commands.supported.includes(d)&&r.commands.unsupported.includes(d)&&e.push(E("error","project.commands.conflict",`Project ${r.name} marks ${d} as both supported and unsupported.`,r.path));let p=new Set(r.commands.fleetStages),l=new Set(r.commands.localOnly);for(let d of r.commands.fleetStages){l.has(d)&&e.push(E("error","project.commands.scope-conflict",`Project ${r.name} marks ${d} as both fleet and local-only.`,r.path));let u=r.commands.map[d];(!u||u.status!=="supported"||u.fleetEligible!==true||u.executionScope!=="fleet")&&e.push(E("error","project.commands.fleet-stage-invalid",`Project ${r.name} advertises ${d} as a fleet stage without a supported fleet capability.`,r.path));}for(let d of r.commands.localOnly){let u=r.commands.map[d];(!u||u.status!=="supported"||u.executionScope!=="local-only"||u.fleetEligible===true)&&e.push(E("error","project.commands.local-only-invalid",`Project ${r.name} advertises ${d} as local-only without a matching local-only capability.`,r.path));}for(let d of Object.values(r.commands.map))d.status==="supported"&&(d.fleetEligible===true&&!p.has(d.command)&&e.push(E("error","project.commands.fleet-stage-missing",`Project ${r.name} capability ${d.command} is fleet-eligible but missing from fleetStages.`,r.path)),d.executionScope==="local-only"&&d.fleetEligible!==true&&!l.has(d.command)&&e.push(E("error","project.commands.local-only-missing",`Project ${r.name} capability ${d.command} is local-only but missing from localOnly commands.`,r.path)));}for(let[r,a]of n.entries())a.length>1&&e.push(E("error","project.name.duplicate",`Project name "${r}" is ambiguous across ${a.length} project roots.`,a.map(i=>i.path).join(", ")));let s=e.filter(r=>r.severity==="error").length,o=e.filter(r=>r.severity==="warning").length;return {status:s>0?"failed":o>0?"warning":"passed",errors:s,warnings:o,issues:e}}function an(t){return Fe(t)}async function X(t){let e=m.resolve(t.workspacePath),n=t.includeAbsolutePaths===true,s=t.includeEvidence===true,o=ae(t.observableScanDepth),r=t.now??new Date,[a$3,i,c,p,l]=await Promise.all([a(e),de(e),a$1(e),a$2(e,{descendIntoMatchedProjects:false}),ie(e,o)]),d=ce([...p,...l,...c.map(g=>m.isAbsolute(g.path)?g.path:m.join(e,g.path))]),u=t.reuseProjectModels,k=await Promise.all(d.map(g=>{if(u){let W=m.relative(e,m.resolve(g)).split(m.sep).join("/"),R=u.get(W);if(R)return Promise.resolve(R)}return wt(e,g,{includeAbsolutePaths:n,includeEvidence:s})})),j=typeof i?.workspace_name=="string"?i.workspace_name:typeof i?.name=="string"?i.name:a$3?.name||m.basename(e),y=typeof i?.profile=="string"?i.profile:typeof i?.mode=="string"?i.mode:void 0,x=Array.from(new Set(k.map(g=>g.kind))).sort(),C=Array.from(new Set(k.map(g=>g.runtime))).sort(),Y=Array.from(new Set(k.map(g=>g.framework))).sort(),A=[".rapidkit/policies.yml",".rapidkit/policies.yaml"].find(g=>P.existsSync(m.join(e,g))),I=".rapidkit/workspace.contract.json",b=await P.pathExists(m.join(e,I)),O={schemaVersion:pt,generatedAt:r.toISOString(),workspace:{name:j,root:e,...y?{profile:y}:{},type:a$3?"rapidkit-workspace":"observed-workspace",...a$3?{marker:{createdBy:a$3.createdBy,version:a$3.version,createdAt:a$3.createdAt}}:{}},identity:{workspaceType:Et(k),surfaces:x,runtimeFamilies:C,businessCapabilities:Pt(k)},discovery:{observableScanDepth:o},projects:k,policies:{mode:typeof i?.policy_mode=="string"?i.policy_mode:typeof i?.policyMode=="string"?i.policyMode:"warn",source:A??null,exists:!!A},contracts:{workspaceContractPath:I,exists:b,status:b?"known":"missing"},evidence:{doctor:await v(e,".rapidkit/reports/doctor-last-run.json",s),analyze:await v(e,".rapidkit/reports/analyze-last-run.json",s),readiness:await v(e,".rapidkit/reports/release-readiness-last-run.json",s),pipeline:await v(e,".rapidkit/reports/pipeline-last-run.json",s)},summary:{projectCount:k.length,runtimes:C,frameworks:Y,firstClassProjects:k.filter(g=>g.supportTier==="first-class").length,observedProjects:k.filter(g=>g.supportTier==="observed").length}},D=await St(e,O,{contractExists:b,now:r,incrementalGraph:t.incrementalGraph}),G={...O,graph:D},w=Fe(G);return {...G,validation:w}}async function cn(t){if(t.cache!==true)return {model:await X(t),cache:"disabled"};let e=m.resolve(t.workspacePath),n=ae(t.observableScanDepth),s=oe(),[o,r,a$3,i,c]=await Promise.all([a(e),de(e),a$1(e),a$2(e,{descendIntoMatchedProjects:false}),ie(e,n)]),p=ce([...i,...c,...a$3.map(y=>m.isAbsolute(y.path)?y.path:m.join(e,y.path))]),l=await q({workspacePath:e,cliVersion:s,flags:{includeAbsolutePaths:t.includeAbsolutePaths===true,includeEvidence:t.includeEvidence===true,observableScanDepth:n},projectPaths:p,workspaceJson:r,marker:o}),d=await se(e);if(d&&d.cliVersion===s&&d.inputsHash===l)return {model:d.model,cache:"hit"};let u=await X({...t}),[k,j]=await Promise.all([z(e,p),J(e)]);return await U(e,{cliVersion:s,inputsHash:l,generatedAt:(t.now??new Date).toISOString(),model:u,projectSignatures:k,workspaceFileSignatures:j}),{model:u,cache:"miss"}}function jt(t,e){let n=new Set,s=new Set,o=new Set;for(let[r,a]of Object.entries(e))r in t?t[r]!==a&&n.add(r):s.add(r);for(let r of Object.keys(t))r in e||o.add(r);return {changed:n,added:s,removed:o}}function vt(t={},e={}){let n=new Set([...Object.keys(t),...Object.keys(e)]);for(let s of n)if(t[s]!==e[s])return false;return true}async function dn(t){let e=m.resolve(t.workspacePath),n=ae(t.observableScanDepth),s=oe(),o=t.now??new Date,[r,a$3,i,c,p]=await Promise.all([a(e),de(e),a$1(e),a$2(e,{descendIntoMatchedProjects:false}),ie(e,n)]),l=ce([...c,...p,...i.map(w=>m.isAbsolute(w.path)?w.path:m.join(e,w.path))]),d=await se(e),u=async()=>{let w=await X({...t}),g=await q({workspacePath:e,cliVersion:s,flags:{includeAbsolutePaths:t.includeAbsolutePaths===true,includeEvidence:t.includeEvidence===true,observableScanDepth:n},projectPaths:l,workspaceJson:a$3,marker:r}),[W,R]=await Promise.all([z(e,l),J(e)]);return await U(e,{cliVersion:s,inputsHash:g,generatedAt:o.toISOString(),model:w,projectSignatures:W,workspaceFileSignatures:R}),{model:w,mode:"full"}};if(!d||d.cliVersion!==s||!d.projectSignatures||!d.model?.graph)return u();let k=await J(e);if(!vt(d.workspaceFileSignatures,k))return u();let j=await z(e,l),{changed:y,added:x,removed:C}=jt(d.projectSignatures,j);if(y.size===0&&x.size===0&&C.size===0)return {model:d.model,mode:"unchanged"};let Y=new Set([...y,...x]),A=new Map;for(let w of d.model.projects){let g=w.path.split(m.sep).join("/");!Y.has(g)&&!C.has(g)&&A.set(g,w);}let I=new Set,b=false;for(let w of d.model.projects){let g=w.path.split(m.sep).join("/");y.has(g)&&I.add(w.name);}let O=x.size>0||C.size>0,D=await X({...t,reuseProjectModels:A,incrementalGraph:{previousGraph:d.model.graph,changedProjectIds:I,structuralChange:O||b}});for(let w of d.model.projects){let g=w.path.split(m.sep).join("/");if(!y.has(g))continue;let W=D.projects.find(R=>R.path.split(m.sep).join("/")===g);if(W&&W.name!==w.name){b=true;break}}if(b)return u();let G=await q({workspacePath:e,cliVersion:s,flags:{includeAbsolutePaths:t.includeAbsolutePaths===true,includeEvidence:t.includeEvidence===true,observableScanDepth:n},projectPaths:l,workspaceJson:a$3,marker:r});return await U(e,{cliVersion:s,inputsHash:G,generatedAt:o.toISOString(),model:D,projectSignatures:j,workspaceFileSignatures:k}),{model:D,mode:"incremental"}}async function bt(t){try{let{contract:e}=await g({workspacePath:t});return e&&typeof e=="object"?e:null}catch{return null}}async function St(t,e,n){let s=n.contractExists?await bt(t):null;try{return n.incrementalGraph?await De({workspacePath:t,model:e,contract:s,now:n.now,previousGraph:n.incrementalGraph.previousGraph,changedProjectIds:n.incrementalGraph.changedProjectIds,structuralChange:n.incrementalGraph.structuralChange}):await Ie({workspacePath:t,model:e,contract:s,now:n.now})}catch{let o=e.projects.map(r=>({id:r.name,path:r.path}));return {schemaVersion:"workspace-dependency-graph.v1",generatedAt:n.now.toISOString(),nodes:o,edges:[],stats:{nodeCount:o.length,edgeCount:0,inferredEdges:0,contractEdges:0,manualEdges:0,hasCycle:false}}}}async function pn(t,e){let n=m.join(e,lt);return await P.ensureDir(m.dirname(n)),await P.writeJSON(n,we(t),{spaces:2}),n}export{we as a,pt as b,lt as c,an as d,X as e,cn as f,dn as g,pn as h};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {a,b as b$1,d}from'./chunk-FV5A3N3I.js';import {d as d$1}from'./chunk-S5KTATOU.js';import {n,q as q$1,g}from'./chunk-YBS2HGO3.js';import {h,i,f,e}from'./chunk-UZW5QFRW.js';import {a as a$1}from'./chunk-VKLL63TL.js';import M from'fs';import b from'path';import v from'chalk';import {execa}from'execa';function pe(e){return M.existsSync(b.join(e,"bun.lock"))||M.existsSync(b.join(e,"bunfig.toml"))?"bun":M.existsSync(b.join(e,"pnpm-lock.yaml"))?"pnpm":M.existsSync(b.join(e,"yarn.lock"))?"yarn":(M.existsSync(b.join(e,"package-lock.json")),"npm")}function me(e,r,t=pe(e)){return t==="npm"?`npm run ${r}`:`${t} run ${r}`}function ge(e,r=pe(e)){return `${r} install`}var Ae={"python-fastapi":{runtime:"python",framework:"FastAPI",markers:["pyproject.toml","fastapi"],commands:{init:"python -m pip install -e .",test:"pytest",build:"python -m build",start:"uvicorn main:app --reload"},errorPatterns:{setup:["ModuleNotFoundError","No module named","pip: command not found"],"test-failure":["FAILED","ERROR","test session started"],dependency:["ImportError","missing.*dependency"],runtime:["TypeError","AttributeError","ValueError"],timeout:["timeout","Timeout","timed out"],unknown:[]},healthCheck:{stage:"start",type:"http",value:"http://localhost:8000/docs"},validation:{command:"python -m pip list | grep fastapi",error:"FastAPI not installed"}},"python-django":{runtime:"python",framework:"Django",markers:["manage.py","django"],commands:{init:"python manage.py migrate",test:"python manage.py test",build:"python manage.py collectstatic --noinput",start:"python manage.py runserver 0.0.0.0:8000"},errorPatterns:{setup:["ModuleNotFoundError","ProgrammingError.*migrate"],"test-failure":["FAILED","ERROR","Ran.*test"],dependency:["ImportError","missing.*dependency"],runtime:["DatabaseError","ImproperlyConfigured"],timeout:["timeout","Timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:8e3},dependencies:["init"]},"node-nestjs":{runtime:"node",framework:"NestJS",markers:["package.json","@nestjs/core"],commands:{init:"npm install",test:"npm run test",build:"npm run build",start:"npm run start"},errorPatterns:{setup:["npm ERR!","ENOENT","not found"],"test-failure":["Tests.*failed","FAIL","fail.*test"],dependency:["Cannot find module","ERR_MODULE_NOT_FOUND"],runtime:["TypeError","Error: ","ReferenceError"],timeout:["timeout","TIMEOUT"],unknown:[]},healthCheck:{stage:"start",type:"port",value:3e3}},"node-express":{runtime:"node",framework:"Express",markers:["package.json","express"],commands:{init:"npm install",test:"npm run test",build:"npm run build",start:"npm start"},errorPatterns:{setup:["npm ERR!","ENOENT"],"test-failure":["failed","FAIL"],dependency:["Cannot find module"],runtime:["Error","TypeError"],timeout:["timeout"],unknown:[]}},"go-fiber":{runtime:"go",framework:"Fiber",markers:["go.mod","fiber"],commands:{init:"go mod download && go mod tidy",test:"go test ./...",build:"go build -o app .",start:"./app"},errorPatterns:{setup:["go: .*not found","cannot find","go mod tidy"],"test-failure":["FAIL","--- FAIL"],dependency:["missing.*module"],runtime:["panic","fatal","Error"],timeout:["timeout","context deadline"],unknown:[]},dependencies:["init"]},"go-gin":{runtime:"go",framework:"Gin",markers:["go.mod","gin-gonic"],commands:{init:"go mod download && go mod tidy",test:"go test ./...",build:"go build -o app .",start:"./app"},errorPatterns:{setup:["go: .*not found"],"test-failure":["FAIL"],dependency:["missing.*module"],runtime:["panic"],timeout:["timeout"],unknown:[]}},"java-springboot":{runtime:"java",framework:"Spring Boot",markers:["pom.xml","build.gradle","spring-boot"],commands:{init:"mvn dependency:go-offline",test:"mvn test",build:"mvn package -DskipTests",start:"mvn spring-boot:run"},errorPatterns:{setup:["\\[ERROR\\]","BUILD FAILURE","missing dependencies"],"test-failure":["\\[ERROR\\] Tests run:","BUILD FAILURE"],dependency:["missing.*dependency"],runtime:["Exception","Error","NullPointerException"],timeout:["timeout","Timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:8080}},"php-laravel":{runtime:"php",framework:"Laravel",markers:["composer.json","artisan","app/Models"],commands:{init:"composer install && php artisan migrate:fresh --seed",test:"php artisan test",build:"php artisan config:cache && php artisan route:cache && php artisan view:cache",start:"php artisan serve --host=0.0.0.0 --port=8000"},errorPatterns:{setup:["Composer.*lock","Fatal error","Class.*not found"],"test-failure":["FAILED","Tests.*failed"],dependency:["Class.*not found","require.*failed"],runtime:["Fatal error","Exception","Error"],timeout:["timeout","Timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:8e3},dependencies:["init"]},"php-symfony":{runtime:"php",framework:"Symfony",markers:["composer.json","symfony.lock","bin/console"],commands:{init:"composer install && php bin/console doctrine:database:create",test:"php bin/phpunit",build:"php bin/console cache:clear --env=prod",start:"symfony serve --no-tls"},errorPatterns:{setup:["Composer.*error","Fatal error"],"test-failure":["FAILED","failure"],dependency:["Class.*not found"],runtime:["Fatal error","Exception"],timeout:["timeout"],unknown:[]},dependencies:["init"]},"rust-actix":{runtime:"rust",framework:"Actix-web",markers:["Cargo.toml","actix"],commands:{init:"cargo fetch",test:"cargo test",build:"cargo build --release",start:"cargo run --release"},errorPatterns:{setup:["error: .*could not find","failed.*download"],"test-failure":["test result:","FAILED"],dependency:["can.t find.*crate"],runtime:["error\\[E","thread.*panicked"],timeout:["timeout"],unknown:[]},validation:{command:"cargo --version",error:"Rust/Cargo not installed"}},"rust-axum":{runtime:"rust",framework:"Axum",markers:["Cargo.toml","axum"],commands:{init:"cargo fetch",test:"cargo test",build:"cargo build --release",start:"cargo run --release"},errorPatterns:{setup:["error: .*could not find"],"test-failure":["test result:","FAILED"],dependency:["can.t find.*crate"],runtime:["error\\[E"],timeout:["timeout"],unknown:[]}},"rust-rocket":{runtime:"rust",framework:"Rocket",markers:["Cargo.toml","rocket"],commands:{init:"cargo fetch",test:"cargo test",build:"cargo build --release",start:"cargo run --release"},errorPatterns:{setup:["error: .*could not find"],"test-failure":["FAILED"],dependency:["can.t find"],runtime:["error\\[E"],timeout:["timeout"],unknown:[]}},"dotnet-aspnetcore":{runtime:"dotnet",framework:"ASP.NET Core",markers:[".csproj",".sln","Program.cs"],commands:{init:"dotnet restore",test:"dotnet test",build:"dotnet build -c Release",start:"dotnet run"},errorPatterns:{setup:["error CS","CSPROJ.*not found","NuGet.*restore"],"test-failure":["Failed:.*test","FAILED"],dependency:["error NU1101"],runtime:["error CS","Exception"],timeout:["timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:5e3}},"elixir-phoenix":{runtime:"elixir",framework:"Phoenix",markers:["mix.exs","phoenix"],commands:{init:"mix setup",test:"mix test",build:"mix compile --all-warnings",start:"mix phx.server"},errorPatterns:{setup:["\\*\\* \\(.*Error\\)","Mix.InstallError"],"test-failure":["\\d+\\sfailed","FAILED"],dependency:["dependencies are not available"],runtime:["\\*\\* \\(","RuntimeError"],timeout:["timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:4e3},dependencies:["init"]},"ruby-rails":{runtime:"ruby",framework:"Rails",markers:["Gemfile","config/application.rb","bin/rails"],commands:{init:"bundle install && rails db:prepare",test:"rails test",build:"rails assets:precompile",start:"rails server --binding=0.0.0.0 --port=3000"},errorPatterns:{setup:["Bundler::.*Error","Gem::.*Error"],"test-failure":["failures,","error,","FAILED"],dependency:["Could not find.*gem"],runtime:["Error","Exception","NoMethodError"],timeout:["timeout"],unknown:[]},healthCheck:{stage:"start",type:"port",value:3e3},dependencies:["init"]},"ruby-sinatra":{runtime:"ruby",framework:"Sinatra",markers:["Gemfile","app.rb","sinatra"],commands:{init:"bundle install",test:"rspec",build:`echo "Sinatra apps don't require build"`,start:"ruby app.rb"},errorPatterns:{setup:["Bundler.*Error","Gem.*Error"],"test-failure":["failure","FAILED"],dependency:["Could not find.*gem"],runtime:["Error","NoMethodError"],timeout:["timeout"],unknown:[]}}},Te={init:{python:["pip install -e .","poetry install","pip install -r requirements.txt"],node:["npm install","pnpm install","yarn install"],go:["go mod download && go mod tidy","go get ./..."],java:["mvn dependency:go-offline","gradle dependencies"],php:["composer install"],rust:["cargo fetch"],dotnet:["dotnet restore"],elixir:["mix deps.get"],ruby:["bundle install"],"jvm-generic":["mvn dependency:go-offline","gradle dependencies"],unknown:[]},test:{python:["pytest","python -m unittest","python -m pytest"],node:["npm test","npm run test"],go:["go test ./...","make test"],java:["mvn test","gradle test"],php:["php artisan test","phpunit","pest"],rust:["cargo test"],dotnet:["dotnet test"],elixir:["mix test"],ruby:["rspec","ruby -m minitest"],"jvm-generic":["mvn test","gradle test"],unknown:[]},build:{python:["python -m build","python setup.py build"],node:["npm run build"],go:["go build -o app .","go build ./..."],java:["mvn package -DskipTests","gradle build -x test"],php:['echo "PHP build: typically no build step"'],rust:["cargo build --release"],dotnet:["dotnet build -c Release"],elixir:["mix compile"],ruby:["gem build *.gemspec"],"jvm-generic":["mvn package -DskipTests","gradle build"],unknown:[]},start:{python:["python app.py","python main.py","uvicorn main:app --reload"],node:["npm start","node index.js","node src/index.js"],go:["./app","go run main.go","go run ./..."],java:["mvn spring-boot:run","gradle bootRun","java -jar target/*.jar"],php:["php -S 0.0.0.0:8000","php artisan serve"],rust:["cargo run --release","./target/release/app"],dotnet:["dotnet run"],elixir:["mix phx.server","iex -S mix"],ruby:["rails server","ruby app.rb","bundle exec puma"],"jvm-generic":["java -jar *.jar","gradle run"],unknown:[]}};function fe(e$1,r,t){if(r){let o=r.trim().toLowerCase().replace(/[_.\s]+/g,"-"),a=e(r),m=`${e$1}-${a==="gofiber"?"fiber":a==="gogin"?"gin":a==="dotnet"?"aspnetcore":a!=="unknown"?a:o==="fiber"?"fiber":o==="aspnetcore"||o==="asp-net-core"?"aspnetcore":o}`,g=Ae[m];if(g&&g.commands[t])return g.commands[t]}let n=Te[t]?.[e$1]??[];return n.length>0?n[0]:void 0}var Ne={test:"test",build:"build",start:"start"};function J(e){if(e.stage==="init")return e.runtime==="node"?ge(e.projectPath):fe(e.runtime,e.framework,e.stage);if(e.runtime==="node"){let r=Ne[e.stage];if(r){let t=g(e.projectPath,r,{framework:e.framework});if(t)return me(e.projectPath,t.scriptName)}}return fe(e.runtime,e.framework,e.stage)}function Ie(e){let r=h(e).map(t=>t==="python"?"python":t==="node"||t==="bun"?"node":t==="go"?"go":t==="java"?"java":t==="php"?"php":t==="rust"?"rust":t==="dotnet"?"dotnet":t==="elixir"?"elixir":t==="ruby"?"ruby":t==="clojure"||t==="scala"||t==="kotlin"?"jvm-generic":null).filter(t=>t!==null).filter((t,n,o)=>o.indexOf(t)===n);return {primary:r.length>0?r[0]:"unknown",secondary:r.slice(1)}}function ye(e){return Ie(e).primary}function he(e,r){if(!e)return "unknown";r||(r={setup:["ModuleNotFoundError","npm ERR!","error:","not found"],"test-failure":["FAILED","FAIL","failed"],dependency:["cannot find module","import.*error"],runtime:["Exception","Error:","panic","TypeError"],timeout:["timeout","Timeout","deadline exceeded"],unknown:[]});for(let[t,n]of Object.entries(r))for(let o of n)if(new RegExp(o,"i").test(e))return t;return "unknown"}async function G(e){let r=e.split(/[&|;]\s*/)[0].trim().split(/\s+/)[0];if(["echo","cd","pwd","test","true","false","exit"].includes(r))return {valid:true};try{let n=process.platform==="win32"?"where":"which";if((await execa(n,[r],{reject:false})).exitCode===0)return {valid:true}}catch{}return {valid:false,reason:`Command '${r}' not found or not executable`}}function ke(e,r,t){if(!r)return e;let n=typeof r=="object"&&!Array.isArray(r)&&("dev"in r||"staging"in r||"prod"in r||"default"in r)&&!Object.keys(r).some(o=>["init","test","build","start"].includes(o))?r:{};return t&&typeof n[t]=="string"?n[t]:typeof n.default=="string"?n.default:e}var we={init:"init",test:"test",build:"build",start:"start"};function We(e){return e in we?we[e]:null}function be(e,r,t=q$1(e)){let n=We(r);if(!n)return {supported:false,reason:`Workspace stage "${r}" is not part of the RapidKit fleet contract.`};if(!t.projectRoot)return {supported:false,reason:"No RapidKit project metadata was detected for this target."};let o=t.commandMap[n];return !o||o.status!=="supported"?{supported:false,reason:o?.reason??`Command "${n}" is not supported for this project runtime/framework.`}:{supported:true}}var $e=new Set(["init","test","build","start"]),De=new Set([".git","node_modules",".rapidkit",".venv","dist","build","coverage","htmlcov"]);async function T(e){try{return await M.promises.access(e,M.constants.F_OK),true}catch{return false}}async function Me(e,r,t){if(r==="python"){let n=b.join(e,".rapidkit","cli.py");return await T(n)?{valid:true}:{valid:false,reason:"Project-local .rapidkit/cli.py is missing. Run `rapidkit init` in this project first."}}return G(t)}async function Q(e){let r=await M.promises.readFile(e,"utf-8");return JSON.parse(r)}function P(e){return e.replace(/\\/g,"/")}function Oe(e){let r=e?.trim();return r?r.startsWith("project:")?r.slice(8).trim()||null:r:null}async function Le(e){return a$1(e,{skipDirs:De,includeHiddenDirs:false,descendIntoMatchedProjects:false,isProjectDir:async(r,t)=>await T(b.join(r,".rapidkit","context.json"))||await T(b.join(r,".rapidkit","project.json"))?true:b.resolve(r)===b.resolve(t)?false:h(r).length>0})}async function _e(e){for(let r of [b.join(".rapidkit","project.json"),b.join(".rapidkit","context.json")]){let t=b.join(e,r);if(await T(t))try{let n=await Q(t),o=n.name??n.projectName??n.slug;if(typeof o=="string"&&o.trim())return o.trim()}catch{}}return null}async function Ge(e,r,t){let n=Oe(t);if(!n)return {projects:r,normalizedScope:null};let o=P(n).toLowerCase(),a=[];for(let u of r){let m=P(b.relative(e,u)),g=b.basename(u),y=await _e(u);[m,g,y].filter(s=>typeof s=="string"&&s.length>0).map(s=>P(s).toLowerCase()).includes(o)&&a.push(u);}if(a.length===0)throw new Error(`Workspace run scope did not match any project: ${t}`);return {projects:a,normalizedScope:n}}async function Be(e,r,t){let n=await execa("git",["diff","--name-only",`${t}...HEAD`],{cwd:e,reject:false});if(n.exitCode!==0)return new Set(r);let o=n.stdout.split(/\r?\n/).map(u=>u.trim()).filter(u=>u.length>0).map(u=>P(u));if(o.length===0)return new Set;let a=new Set;for(let u of r){let m=P(b.relative(e,u));if(!m||m===".")continue;let g=`${m}/`;o.some(y=>y===m||y.startsWith(g))&&a.add(u);}return a}async function Ke(e,r,t){let n=b.join(e,".rapidkit","workspace.contract.json");if(await T(n))try{let p=await Ve(e,r,t,n);if(p.graphStatus!=="missing")return p}catch{return {expanded:t,graphStatus:"invalid",expansionDepth:0}}let o=b.join(e,".rapidkit","workspace-dependency-graph.json");if(!await T(o))return {expanded:t,graphStatus:"missing",expansionDepth:0};let a;try{a=await Q(o);}catch{return {expanded:t,graphStatus:"invalid",expansionDepth:0}}let u=new Set(r.map(p=>b.resolve(p))),m=new Map;if(!a||typeof a!="object"||Array.isArray(a))return {expanded:t,graphStatus:"invalid",expansionDepth:0};let g=Array.isArray(a.projects)?a.projects:[];for(let p of g){if(!p||typeof p!="object"||Array.isArray(p))continue;let s=p,d=typeof s.path=="string"?s.path:"",f=b.resolve(e,d);if(!u.has(f))continue;let k=Array.isArray(s.dependsOn)?s.dependsOn.filter(R=>typeof R=="string"):[];for(let R of k){let c=b.resolve(e,R);u.has(c)&&(m.has(c)||m.set(c,new Set),m.get(c)?.add(f));}}let y=d$1(m,t);return {expanded:y.reached,graphStatus:"loaded",expansionDepth:y.added}}async function Ve(e,r,t,n){let o=await Q(n);if(!o||typeof o!="object"||Array.isArray(o))return {expanded:t,graphStatus:"invalid",expansionDepth:0};let a=o,u=Array.isArray(a.projects)?a.projects:null;if(!u)return {expanded:t,graphStatus:"invalid",expansionDepth:0};let m=new Map,g=new Map;for(let f of r){let k=P(b.relative(e,f));g.set(k,b.resolve(f));}let y=new Map,p=new Map,s=new Map;for(let f of u){if(!f||typeof f!="object"||Array.isArray(f))continue;let k=f,R=typeof k.slug=="string"?k.slug:"",c=typeof k.relativePath=="string"?P(k.relativePath):R,h=g.get(c);!R||!h||m.set(R,h);}for(let f of u){if(!f||typeof f!="object"||Array.isArray(f))continue;let k=f,R=typeof k.slug=="string"?k.slug:"",c=m.get(R);if(!c)continue;let h=k.contracts&&typeof k.contracts=="object"&&!Array.isArray(k.contracts)?k.contracts:{},N=Array.isArray(h.dependsOn)?h.dependsOn.filter(x=>typeof x=="string"):[],W=Array.isArray(h.publishes)?h.publishes.filter(x=>typeof x=="string"):[],$=Array.isArray(h.consumes)?h.consumes.filter(x=>typeof x=="string"):[];for(let x of N){let S=m.get(x);S&&(s.has(S)||s.set(S,new Set),s.get(S)?.add(c));}for(let x of W)y.has(x)||y.set(x,new Set),y.get(x)?.add(c);for(let x of $)p.has(x)||p.set(x,new Set),p.get(x)?.add(c);}for(let[f,k]of y.entries()){let R=p.get(f);if(R)for(let c of k){s.has(c)||s.set(c,new Set);for(let h of R)h!==c&&s.get(c)?.add(h);}}let d=d$1(s,t);return {expanded:d.reached,graphStatus:"loaded",expansionDepth:d.added}}async function He(e,r){if(typeof r=="boolean")return r;let t=b.join(e,".rapidkit","policies.yml");if(!await T(t))return true;let n="";try{n=await M.promises.readFile(t,"utf-8");}catch{return true}let o=n.match(/^[\t ]*rules\.enforce_workspace_run_gates:\s*(true|false)\s*(?:#.*)?$/m);return o?o[1]==="true":true}async function q(e,r){let t=process.argv[1];if(!t)return {exitCode:1,stdout:"",stderr:"RapidKit entrypoint is unavailable for nested workspace-run execution."};let n=await execa(process.execPath,[t,...e],{cwd:r,reject:false,env:{...process.env,RAPIDKIT_WORKSPACE_RUN_CHILD:"1"}});return {exitCode:Number(n.exitCode??1),stdout:n.stdout,stderr:n.stderr}}function ze(e){return e==="node"||e==="go"||e==="java"||e==="python"||e==="dotnet"}function Ue(){return process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"}async function Je(e){let r=process.cwd();try{process.chdir(e);let{handleInitCommand:t}=await import('./index.js');return {exitCode:await t(["init"]),stdout:"",stderr:""}}finally{process.chdir(r);}}async function qe(e$1){let r=s=>{let d=f(s);return d==="node"||d==="bun"?"node":d==="python"?"python":d==="go"?"go":d==="java"?"java":d==="php"?"php":d==="ruby"?"ruby":d==="rust"?"rust":d==="dotnet"?"dotnet":d==="elixir"?"elixir":d==="clojure"||d==="scala"||d==="kotlin"?"jvm-generic":ye(e$1)},t=s=>{if(!s)return;let d=e(s);if(new Set(["fastapi","django","flask","nestjs","express","fastify","koa","gofiber","gogin","echo","springboot","laravel","symfony","rails","sinatra","dotnet","actix","axum","rocket","phoenix"]).has(d))return d},n$1=n(e$1),o=n$1?.detection??i(e$1,n$1?.projectJson??null),a=n$1?.contextJson,u=r(o.runtime),m=t(o.key),g={},y=new Set(["init","test","build","start"]);if(a?.commands&&typeof a.commands=="object")for(let[s,d]of Object.entries(a.commands))typeof d=="string"&&y.has(s)&&(g[s]=d);let p;if(a?.commandEnvironments&&typeof a.commandEnvironments=="object"){let s=a.commandEnvironments;p={dev:typeof s.dev=="string"?s.dev:void 0,staging:typeof s.staging=="string"?s.staging:void 0,prod:typeof s.prod=="string"?s.prod:void 0,default:typeof s.default=="string"?s.default:void 0};}return {runtime:u,framework:m,commandOverrides:Object.keys(g).length>0?g:void 0,environmentCommandVariants:p,environment:typeof a?.environment=="string"?a.environment:void 0}}async function Ye(e,r,t,n,o,a,u){let m=!o?.[r]&&ze(t),g;if(o&&o[r]?g=o[r]:m?g=`rapidkit ${r}`:g=J({projectPath:e,runtime:t,framework:n,stage:r}),!g)return {exitCode:127,command:`<stage not supported for ${t}>`,message:`No stage command found for runtime '${t}' and framework '${n||"unknown"}'`,errorCategory:"runtime"};let y=ke(g,a,u);if(!y)return {exitCode:127,command:g,message:"Failed to resolve stage command",errorCategory:"runtime"};let p=J({projectPath:e,runtime:t,framework:n,stage:r});if(m){if(p){let c=m?await Me(e,t,p):await G(p);if(!c.valid)return {exitCode:127,command:y,message:c.reason||"Command not available",errorCategory:"setup"}}}else {let c=await G(y);if(!c.valid)return {exitCode:127,command:y,message:c.reason||"Command not available",errorCategory:"setup"}}let s=0,d="",f="",k;try{let c=m?r==="init"&&Ue()?await Je(e):await q([r],e):await execa(y,[],{cwd:e,reject:false,shell:true});if(s=Number(c.exitCode??0),d=c.stdout,f=c.stderr,s!==0){let h=`${d}
|
|
2
|
+
${f}`;k=he(h);}}catch(c){return {exitCode:1,command:y,message:c instanceof Error?c.message:"Command execution failed",errorCategory:"runtime"}}return {exitCode:s,command:y,errorCategory:k,healthStatus:void 0,message:s!==0?`Stage failed with exit code ${s}`:void 0}}function xe(e){try{return JSON.parse(e)}catch{return null}}function Qe(e){switch(e){case "dotnet":return "Install .NET 8+ SDK, then rerun `npx rapidkit setup dotnet` or `npx rapidkit init`.";case "go":return "Install Go 1.21+, then rerun `npx rapidkit setup go` or `npx rapidkit init`.";case "java":case "jvm-generic":return "Install Java 21+ and Maven/Gradle, then rerun `npx rapidkit setup java` or `npx rapidkit init`.";case "node":return "Install Node.js LTS and npm/pnpm/yarn, then rerun `npx rapidkit setup node` or `npx rapidkit init`.";case "python":return "Install Python 3.10+ and pip/Poetry, then rerun `npx rapidkit setup python` or `npx rapidkit init`.";default:return null}}async function Xe(e){let r=[],t=await q(["doctor","workspace","--json"],e);if(t.exitCode!==0)r.push({gate:"doctor-workspace",status:"fail",summary:"doctor workspace command failed"});else {let a=xe(t.stdout)?.healthScore,u=Number(a?.errors??0);Number.isFinite(u)&&u>0?r.push({gate:"doctor-workspace",status:"fail",summary:`doctor workspace reports ${u} error(s)`}):r.push({gate:"doctor-workspace",status:"pass",summary:"doctor workspace passed"});}let n=await q(["readiness","--json"],e);if(n.exitCode!==0)r.push({gate:"readiness",status:"fail",summary:"readiness command failed"});else {let o=xe(n.stdout),a=String(o?.overallStatus??"").toLowerCase();a==="fail"?r.push({gate:"readiness",status:"fail",summary:"readiness overall status is fail"}):a==="warn"?r.push({gate:"readiness",status:"warn",summary:"readiness overall status is warn"}):r.push({gate:"readiness",status:"pass",summary:"readiness overall status is pass"});}return r}function Ze(e){return $e.has(e)}function et(e,r){let t=Math.max(1,Math.min(4,r)),n=Number(e??t);return Number.isFinite(n)?Math.max(1,Math.min(16,Math.trunc(n))):t}async function Ft(e){if(!Ze(e.stage))throw new Error(`Unsupported workspace run stage: ${e.stage}`);let r=Date.now(),t=b.resolve(e.workspacePath),n=await Le(t),{projects:o,normalizedScope:a$1}=await Ge(t,n,e.scope),u=e.affected===true,m=e.blastRadius===true,g=e.since?.trim()||"HEAD~1",y=u?await Be(t,o,g):new Set(o),p,s="not-applicable",d$1=0,f="all";if(u&&m){let l=await Ke(t,n,y);p=l.expanded,s=l.graphStatus,d$1=l.expansionDepth,f="affected+blast-radius";}else u?(p=y,f="affected"):(p=y,f="all");let k=e.stage==="init"?false:await He(t,e.enforceGates),R=k?await Xe(t):[{gate:"doctor-workspace",status:"skipped",summary:"workspace run gates disabled"},{gate:"readiness",status:"skipped",summary:"workspace run gates disabled"}],c=R.find(l=>l.status==="fail"),h=o.filter(l=>p.has(l)),N=e.continueOnError===true||e.stage==="init",W=e.parallel===true,$=et(e.maxWorkers,h.length),x=h.length,S=0;e.json||console.log(v.gray(`Workspace run (${e.stage}) started: ${x} target(s), ${W?`parallel x${$}`:"sequential"}`));let F=new Map;for(let l of n){let w=o.includes(l),i=w&&p.has(l);F.set(l,{path:l,relativePath:P(b.relative(t,l)),selected:i,affected:i,status:"skipped",exitCode:null,durationMs:0,reason:i?void 0:w?"not affected":"outside scope",framework:void 0,runtimeDetected:void 0,executionCommand:void 0});}if(c)for(let l of h){let w=F.get(l);w&&(w.status="skipped",w.reason=`blocked by ${c.gate}`);}else {let l=async w=>{let i=F.get(w);if(!i)return;let I=P(b.relative(t,w));e.json||console.log(v.gray(`\u23F3 [${S}/${x}] ${e.stage} ${I}`)),i.selected=true,i.affected=true;let E=Date.now(),{runtime:j,framework:C,commandOverrides:je,environmentCommandVariants:Se,environment:Ee}=await qe(w);i.runtimeDetected=j,i.framework=C;let re=be(w,e.stage);if(!re.supported){i.status="skipped",i.reason=re.reason??`stage "${e.stage}" unsupported for project`,i.durationMs=Date.now()-E,i.exitCode=null,S+=1;return}let A=await Ye(w,e.stage,j,C,je,Se,Ee);if(i.executionCommand=A.command,i.errorCategory=A.errorCategory,i.healthStatus=A.healthStatus,i.durationMs=Date.now()-E,i.exitCode=A.exitCode,A.exitCode===0?(i.status="passed",i.reason=void 0):(i.status="failed",i.reason=A.message||"stage command failed",i.errorMessage=A.message),S+=1,!e.json){let Ce=x>0?Math.round(S/x*100):100,Pe=i.status==="passed"?v.green("\u2705"):v.red("\u274C");if(console.log(v.gray(`${Pe} [${S}/${x}] (${Ce}%) ${I} ${i.durationMs}ms`)),i.status==="failed"){i.reason&&console.log(v.red(` Reason: ${i.reason}`)),i.executionCommand&&console.log(v.gray(` Command: ${i.executionCommand}`));let ne=Qe(i.runtimeDetected);ne&&i.errorCategory==="setup"&&console.log(v.gray(` Hint: ${ne}`));}}};if(W&&h.length>1){let w=0,i=false,I=new Array($).fill(null).map(async()=>{for(;w<h.length;){if(i&&!N)return;let E=w;w+=1;let j=h[E];await l(j),F.get(j)?.status==="failed"&&(i=true);}});if(await Promise.all(I),!N&&i){let E=false;for(let j of h){let C=F.get(j);if(C){if(C.status==="failed"){E=true;continue}E&&C.status==="skipped"&&(C.reason=C.reason||"stopped after failure");}}}}else for(let w of h){await l(w);let i=F.get(w);if(!N&&i?.status==="failed"){let I=h.slice(h.indexOf(w)+1);for(let E of I){let j=F.get(E);j&&(j.status="skipped",j.reason="stopped after failure");}break}}}let D=[];for(let l of n){let w=F.get(l);w&&D.push(w);}let X=D.filter(l=>l.status==="passed").length,K=D.filter(l=>l.status==="failed").length,Z=D.filter(l=>l.status==="skipped").length,ee=e.strict===true,Re=K>0||ee&&R.some(l=>l.status==="fail"||l.status==="warn")?1:0,te={schemaVersion:"1.0",workspacePath:t,stage:e.stage,generatedAt:new Date().toISOString(),durationMs:Date.now()-r,options:{affected:u,blastRadius:m,since:u?g:null,parallel:W,maxWorkers:$,continueOnError:N,strict:ee,enforceGates:k,scope:a$1},selection:{mode:f,since:u?g:null,scope:a$1,graphStatus:s,expansionDepth:d$1},gates:{enforced:k,results:R,blocked:!!c,blockingGate:c?.gate},summary:{projectCount:n.length,selectedCount:h.length,passed:X,failed:K,skipped:Z,exitCode:Re},projects:D,enterpriseControls:{jsonReady:true,evidencePath:b$1}},ve=b.join(t,".rapidkit","reports",a);return await d(t,te),e.json||(c&&(console.log(v.red(`\u274C Workspace run blocked by ${c.gate}`)),console.log(v.gray(` ${c.summary}`))),console.log(v.cyan(`Workspace run (${e.stage}) => passed: ${X}, failed: ${K}, skipped: ${Z}`)),console.log(v.gray(`Report: ${ve}`))),te}export{Ft as a};
|