workspai 0.77.0 → 0.79.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/contracts/create-planner-capabilities.v1.json +27 -3
- package/contracts/runtime-command-surface.v1.json +2 -0
- package/contracts/workspace-intelligence-architecture.v1.json +2 -0
- package/dist/analyze-SKOIUD6F.js +1 -0
- package/dist/autopilot-release-MDMVMU67.js +1 -0
- package/dist/{chunk-UP3UWAJV.js → chunk-2ZVE7VE2.js} +1 -1
- package/dist/{chunk-47UR6ZH4.js → chunk-3O344BX3.js} +1 -1
- package/dist/{chunk-IDETNYCF.js → chunk-4H3VNKOJ.js} +1 -1
- package/dist/{chunk-LUPKDFQ3.js → chunk-7EMG3C3H.js} +2 -2
- package/dist/{chunk-O3TVVQ6X.js → chunk-7HV4U2OV.js} +1 -1
- package/dist/{chunk-DWKCFHHL.js → chunk-7MIOAM4A.js} +1 -1
- package/dist/{chunk-E7WJ2QX7.js → chunk-7SN4V3RC.js} +1 -1
- package/dist/{chunk-X5XFT5UZ.js → chunk-BGUCDG5N.js} +1 -1
- package/dist/{chunk-IAXRGH4Q.js → chunk-CJBDYDVC.js} +1 -1
- package/dist/{chunk-UTIK3K3M.js → chunk-EPFEUMYF.js} +1 -1
- package/dist/{chunk-4CXV3PPV.js → chunk-ETTZXKAS.js} +1 -1
- package/dist/{chunk-V6HVDVKJ.js → chunk-FVG5FBA4.js} +5 -5
- package/dist/{chunk-J2MPBSQJ.js → chunk-GUCZOQUS.js} +1 -1
- package/dist/{chunk-SC43A6LH.js → chunk-H24MEOML.js} +50 -50
- package/dist/{chunk-ZIWWE4BQ.js → chunk-HXTNPR3M.js} +1 -1
- package/dist/chunk-ICPL4WNK.js +2 -0
- package/dist/{chunk-475GQJ2D.js → chunk-KRTVIBPC.js} +1 -1
- package/dist/{chunk-GLBFY7AB.js → chunk-KTOKU6HQ.js} +2 -2
- package/dist/{chunk-QCX6BO2M.js → chunk-MNZAJ6PP.js} +1 -1
- package/dist/chunk-O4TZKLEC.js +1 -0
- package/dist/{chunk-HRVHQBTA.js → chunk-R7R5FX4B.js} +1 -1
- package/dist/chunk-RQXZF7BZ.js +1 -0
- package/dist/{chunk-UNEK3VVR.js → chunk-RRZQPFFR.js} +2171 -109
- package/dist/{chunk-3EPR3D5Q.js → chunk-SKHRUHXO.js} +1 -1
- package/dist/{chunk-WC2K5QFI.js → chunk-SV7X5LJW.js} +1 -1
- package/dist/{chunk-TGNPMOM6.js → chunk-TQW2SZHH.js} +1 -1
- package/dist/{chunk-JVZA35OL.js → chunk-U5WP4HDH.js} +1 -1
- package/dist/{chunk-223SWPTL.js → chunk-VT4WPXTO.js} +1 -1
- package/dist/chunk-WU5M6UP7.js +2 -0
- package/dist/{chunk-3EMAC3MF.js → chunk-ZDLF77IS.js} +1 -1
- package/dist/{chunk-3SQIV3F4.js → chunk-ZONAHZBG.js} +1 -1
- package/dist/{create-YPAZJYCE.js → create-M3TWRHV6.js} +1 -1
- package/dist/{doctor-W5PXJ5FL.js → doctor-FF3WLJSP.js} +1 -1
- package/dist/{goal-lifecycle-5R55CA7H.js → goal-lifecycle-O4MYYTRU.js} +1 -1
- package/dist/{goal-pack-IS6GGJPH.js → goal-pack-NUDKANPM.js} +1 -1
- package/dist/index.js +92 -91
- package/dist/{pipeline-LW3SW2WT.js → pipeline-V5P2FX2P.js} +1 -1
- package/dist/{project-agent-entry-5TYKK5IV.js → project-agent-entry-6O7FKWSL.js} +1 -1
- package/dist/{project-intelligence-lens-TEOSTKNU.js → project-intelligence-lens-OQTZ4K7L.js} +1 -1
- package/dist/{project-test-coverage-T4TIWGKN.js → project-test-coverage-EJ3MBSZ3.js} +1 -1
- package/dist/{proof-carrying-change-2TKRADCW.js → proof-carrying-change-GV37YLDQ.js} +1 -1
- package/dist/{verified-goal-RN4TOV34.js → verified-goal-VB7IOTNO.js} +1 -1
- package/dist/{workspace-A33YMF2N.js → workspace-AXU6ODER.js} +1 -1
- package/dist/{workspace-agent-sync-VCA4G4DT.js → workspace-agent-sync-6427FNME.js} +1 -1
- package/dist/{workspace-context-YBWLSKR6.js → workspace-context-VVZARI5K.js} +1 -1
- package/dist/{workspace-contract-3QUZDBMM.js → workspace-contract-N2BJCAJ7.js} +1 -1
- package/dist/{workspace-explain-NXYRAQFI.js → workspace-explain-5WKK6ENK.js} +1 -1
- package/dist/{workspace-foundation-DZ52PECX.js → workspace-foundation-GYL3D7TW.js} +1 -1
- package/dist/{workspace-graph-stream-4VT46HZ7.js → workspace-graph-stream-26ME2JJS.js} +1 -1
- package/dist/{workspace-intelligence-FKYQQDJ6.js → workspace-intelligence-ZTET7JHS.js} +1 -1
- package/dist/{workspace-intelligence-runner-3K2JZH6Q.js → workspace-intelligence-runner-2EJ7GXG5.js} +1 -1
- package/dist/{workspace-knowledge-graph-CPBKNXQI.js → workspace-knowledge-graph-4RSZTEFJ.js} +1 -1
- package/dist/workspace-knowledge-graph-snapshot-UTJHALST.js +1 -0
- package/dist/{workspace-mcp-serve-UXPKX7K6.js → workspace-mcp-serve-BSA6Q4EB.js} +1 -1
- package/dist/{workspace-model-POCPMNRT.js → workspace-model-LBICKRVI.js} +1 -1
- package/dist/{workspace-onboarding-KLG3GG7S.js → workspace-onboarding-NH4WFJ5N.js} +1 -1
- package/dist/{workspace-registry-summary-M4WMFDQ4.js → workspace-registry-summary-3PXZENLC.js} +1 -1
- package/dist/{workspace-repair-engine-2VGN42QD.js → workspace-repair-engine-ODTFFM6O.js} +1 -1
- package/dist/workspace-run-VDQ6BYLS.js +1 -0
- package/dist/{workspace-verify-PLAKTF3J.js → workspace-verify-UQWAFGNQ.js} +1 -1
- package/dist/{workspace-watch-VNU4KVYN.js → workspace-watch-BKIZQ2SM.js} +1 -1
- package/docs/agent-framework-adapters.md +88 -32
- package/docs/ci-workflows.md +10 -7
- package/docs/commands-reference.md +13 -9
- package/docs/create-planner-capabilities.md +1 -1
- package/docs/creating-workspaces-and-projects.md +24 -20
- package/docs/doctor-command.md +5 -3
- package/docs/model-gateways.md +23 -23
- package/docs/native-kit-baselines.md +2 -2
- package/package.json +4 -1
- package/scripts/enterprise-package-smoke.mjs +50 -0
- package/dist/analyze-TJM66CPF.js +0 -1
- package/dist/autopilot-release-C7Q4OTPY.js +0 -1
- package/dist/chunk-5KXOV7W4.js +0 -1
- package/dist/chunk-IHWS3ALP.js +0 -2
- package/dist/chunk-N7DOKE7V.js +0 -2
- package/dist/chunk-SEZTSMRR.js +0 -1
- package/dist/workspace-knowledge-graph-snapshot-67XDXUOT.js +0 -1
- package/dist/workspace-run-5YQR7GEZ.js +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {r,m,n,l}from'./chunk-
|
|
1
|
+
import {r,m,n,l}from'./chunk-O4TZKLEC.js';import {a}from'./chunk-HTYMXMQM.js';import {c}from'./chunk-S5KTATOU.js';import {d as d$1}from'./chunk-WU5M6UP7.js';import {h as h$1}from'./chunk-BLEIUQL6.js';import {a as a$1}from'./chunk-AFIFZTOY.js';import {e,d,b as b$1}from'./chunk-EWZZUQBR.js';import {q,p}from'./chunk-ODK4LCEL.js';import k from'path';import V from'fs-extra';import {spawnSync}from'child_process';function ue(){let e={...process.env};return delete e.GIT_DIR,delete e.GIT_WORK_TREE,delete e.GIT_INDEX_FILE,delete e.GIT_PREFIX,e}function x(e,t,a){let r=spawnSync("git",t,{cwd:e,env:ue(),encoding:"utf8",stdio:["ignore","pipe","ignore"]});if(r.status!==0)return {ok:false,stdout:""};let i=r.stdout??"";return {ok:true,stdout:a?.preserveWhitespace?i:i.trim()}}function ge(e){let t=e.replace(/\\/g,"/").replace(/^\.\//,"");return t===".workspai/AGENT-GROUNDING.md"?true:[".workspai/reports/",".workspai/cache/",".rapidkit/reports/",".rapidkit/cache/"].some(a=>t.startsWith(a))}function ke(e){let t=[],a=[],r=[];for(let i of e.split(`
|
|
2
2
|
`)){if(!i.trim())continue;let n=i.slice(0,2),c=i.slice(3).trim();if(c&&!ge(c)){if(n==="??"){a.push(c);continue}n.includes("D")&&r.push(c),t.push(c);}}return {changedFiles:[...new Set(t)].sort(),untrackedFiles:[...new Set(a)].sort(),deletedFiles:[...new Set(r)].sort()}}function Q(e,t){let a={available:false,dirty:false,changedFiles:[],untrackedFiles:[],deletedFiles:[]},r=x(e,["rev-parse","--is-inside-work-tree"]);if(!r.ok||r.stdout!=="true")return a;let i=x(e,["rev-parse","--abbrev-ref","HEAD"]),n=x(e,["rev-parse","HEAD"]),c=x(e,["status","--porcelain=v1","--untracked-files=all"],{preserveWhitespace:true}),p=ke(c.stdout),m=p.changedFiles.length>0||p.untrackedFiles.length>0||p.deletedFiles.length>0;return {available:true,branch:i.ok?i.stdout:void 0,commit:n.ok?n.stdout:void 0,ref:t?.ref,dirty:m,changedFiles:p.changedFiles,untrackedFiles:p.untrackedFiles,deletedFiles:p.deletedFiles}}var oe=q.snapshot,L=q.diff,T=p.snapshot,ae=p.diff,he=q.impact,we=p.impact;function ye(e$1){if(e$1.model.projectTopology||!e$1.model.graph||e$1.modelHash!==e(e$1.model))return null;let t={...e$1.model,projectTopology:e$1.model.graph,graph:e$1.model.graph};return {...e$1,modelHash:d(t),model:t}}function ne(e){let t=e.trim().toLowerCase();return t==="git"||t.startsWith("git:")}function We(e){let t=e.trim();return t.toLowerCase()==="git"?"HEAD":t.toLowerCase().startsWith("git:")&&t.slice(4).trim()||"HEAD"}function se(e,t){return k.isAbsolute(t)?t:k.join(e,t)}async function be(e){let t=await V.readJson(e);if(!t||typeof t!="object"||Array.isArray(t))throw new Error(`Workspace model input is not a JSON object: ${e}`);let a=t;if(a.schemaVersion===oe){a$1(t,"contracts/workspace-intelligence/workspace-model-snapshot.v1.json",`Workspace model snapshot ${e}`);let r=a;if(!r.model||r.model.schemaVersion!==l)throw new Error(`Invalid workspace model snapshot: ${e}`);let i=d(r.model);if(r.modelHash!==i){let n=ye(r);if(!n)throw new Error(`Workspace model snapshot hash mismatch: ${e}`);return {model:n.model,hash:n.modelHash}}return {model:r.model,hash:r.modelHash}}if(a.schemaVersion===l){a$1(t,"contracts/workspace-intelligence/workspace-model.v1.json",`Workspace model ${e}`);let r=a;return {model:r,hash:d(r)}}throw a.schemaVersion===L?new Error(`workspace diff --from received a diff report (${k.basename(e)}). Use a workspace model snapshot or model report as baseline, e.g. ${T}. To analyze an existing diff report, run: npx workspai workspace impact --from ${k.basename(e)} --json`):new Error(`Unsupported workspace model input schema: ${String(a.schemaVersion)}`)}async function ve(e){let t=await V.readJson(e);if(!t||typeof t!="object"||Array.isArray(t))throw new Error(`Workspace diff input is not a JSON object: ${e}`);let a=t;if(a.schemaVersion!==L)return null;a$1(t,"contracts/workspace-intelligence/workspace-model-diff.v1.json",`Workspace model diff ${e}`);let r=a;if(!r.currentModel||r.currentModel.schemaVersion!==l||!r.summary||!Array.isArray(r.changes))throw new Error(`Invalid workspace model diff report: ${e}`);if(r.toHash!==d(r.currentModel))throw new Error(`Workspace model diff current-model hash mismatch: ${e}`);return r}async function Ye(e){let t=e.model??await r({workspacePath:e.workspacePath,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,observableScanDepth:e.observableScanDepth,now:e.now});return {schemaVersion:oe,generatedAt:(e.now??new Date).toISOString(),modelHash:d(t),modelRef:m,model:t}}async function Qe(e,t){return h$1(t,T,d$1(e))}function F(e){let{evidence:t,...a}=e;return a}function h(e,t){e.push(t);}function je(e,t){let a=[],r=["name","profile","type"],i=["workspaceType","surfaces","runtimeFamilies","businessCapabilities"];for(let n of r){let c=e.workspace[n],p=t.workspace[n];b$1(c)!==b$1(p)&&h(a,{type:"workspace.changed",severity:"info",target:`workspace.${n}`,message:`Workspace metadata field changed: ${String(n)}`,before:c,after:p});}for(let n of i){let c=e.identity[n],p=t.identity[n];b$1(c)!==b$1(p)&&h(a,{type:"workspace.changed",severity:"info",target:`identity.${n}`,message:`Workspace identity field changed: ${String(n)}`,before:c,after:p});}return b$1(e.policies)!==b$1(t.policies)&&h(a,{type:"workspace.changed",severity:"warning",target:"policies",message:"Workspace policy summary changed.",before:e.policies,after:t.policies}),b$1(e.discovery)!==b$1(t.discovery)&&h(a,{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(a,{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}),a}function Me(e,t){let a=e.validation??null,r=t.validation??null;return b$1(a)===b$1(r)?[]:[{type:"validation.changed",severity:r?.status==="failed"?"critical":"warning",target:"validation",message:"Workspace model validation changed.",before:a,after:r}]}function Ie(e,t){let a=[],r=new Map(e.projects.map(n=>[n.path,n])),i=new Map(t.projects.map(n=>[n.path,n]));for(let[n,c]of i.entries()){let p=r.get(n);if(!p){h(a,{type:"project.added",severity:"info",target:n,message:`Project added: ${c.name}`,after:F(c)});continue}let m=F(p),l=F(c);if(b$1(m)!==b$1(l)){let u=p.runtime!==c.runtime||p.framework!==c.framework;h(a,{type:"project.changed",severity:u?"warning":"info",target:n,message:`Project changed: ${c.name}`,before:m,after:l});}}for(let[n,c]of r.entries())i.has(n)||h(a,{type:"project.removed",severity:"warning",target:n,message:`Project removed: ${c.name}`,before:F(c)});return a.sort((n,c)=>`${n.type}:${n.target}`.localeCompare(`${c.type}:${c.target}`))}async function Pe(e){let t=k.resolve(e.workspacePath),a=ne(e.fromPath),r$1=a?We(e.fromPath):void 0,i=e.fromPath;if(a){let f=k.join(t,T);if(!await V.pathExists(f))throw new Error("Git-aware workspace diff requires an existing snapshot at .workspai/reports/workspace-model-snapshot.json. Run: npx workspai workspace snapshot --json");i=T;}let n=se(t,i),c=await be(n),p=e.model??await r({workspacePath:t,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,observableScanDepth:e.observableScanDepth,now:e.now}),m$1=d(p),l=[...je(c.model,p),...Ie(c.model,p),...Me(c.model,p)],u;e.includeGitObservation!==false&&(u=e.gitObservation??Q(t,{ref:r$1}),u.available&&Se(l,u,p));let v=c.hash!==m$1;v&&!l.some(f=>!f.type.startsWith("git."))&&h(l,{type:"workspace.changed",severity:"warning",target:"model.structural-hash",message:"Workspace structural identity changed outside the currently classified diff fields.",before:c.hash,after:m$1});let P=l.filter(f=>f.type.startsWith("git.")).length,w=a?`git:${r$1??"HEAD"}`:k.relative(t,n).split(k.sep).join("/");return {schemaVersion:L,generatedAt:(e.now??new Date).toISOString(),fromRef:w,toRef:m,fromHash:c.hash,toHash:m$1,summary:{changed:v||P>0,addedProjects:l.filter(f=>f.type==="project.added").length,removedProjects:l.filter(f=>f.type==="project.removed").length,changedProjects:l.filter(f=>f.type==="project.changed").length,workspaceChanges:l.filter(f=>f.type==="workspace.changed").length,validationChanges:l.filter(f=>f.type==="validation.changed").length,gitChangedFiles:P},git:u?.available?Oe(u,r$1):{available:false,dirty:false,changedFiles:0,untrackedFiles:0,deletedFiles:0},changes:l,currentModel:p}}async function Ze(e,t){return h$1(t,ae,d$1(e))}function I(e){return {none:0,low:1,medium:2,high:3,critical:4}[e]}function Z(e){return e.reduce((t,a)=>I(a)>I(t)?a:t,"none")}var N=["none","low","medium","high","critical"];function Re(e){let t=Math.max(1,I(e)-1);return N[t]}function Ce(e){let t=Math.min(N.length-1,I(e)+1);return N[t]}function ee(e){return e.join(" ")}function b(e,t,a,r){return {id:e,label:t,scope:r.scope,project:r.project,display:ee(["npx","workspai",...a]),execute:ee(["npx","--yes","--package","workspai","workspai",...a]),required:r.required!==false}}function te(e){let t=`project:${e.name}`,a=e.commands.fleetStages,r={init:`Run init for ${e.name}`,test:`Run tests for ${e.name}`,build:`Run build for ${e.name}`,start:`Run start for ${e.name}`};return ["init","test","build","start"].filter(i=>a.includes(i)).map(i=>b(`project.${e.name}.${i}`,r[i],["workspace","run",i,"--scope",t,"--json"],{scope:"project",project:e.name}))}function _(){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}),b("workspace.doctor-fix","Verify doctor fix result",["doctor","workspace","--fix","--json"],{scope:"workspace",required:false})]}function Ee(e,t){let a=t.split(k.sep).join("/");return e.projects.filter(i=>{let n=i.path.split(k.sep).join("/");return a===n||a.startsWith(`${n}/`)}).sort((i,n)=>n.path.length-i.path.length)[0]}function Se(e,t,a){let r=new Set(e.map(n=>n.target)),i=(n,c)=>{let p=c.split(k.sep).join("/"),m=`git:${p}`;if(r.has(m))return;let l=Ee(a,p),u=l?`${l.name} (${l.path})`:"workspace";h(e,{type:n,severity:n==="git.deleted"?"warning":"info",target:m,message:`Git ${n==="git.untracked"?"untracked":n==="git.deleted"?"deleted":"changed"} file affects ${u}: ${p}`,after:{path:p,project:l?.name,projectPath:l?.path}}),r.add(m);};for(let n of t.changedFiles)i("git.file.changed",n);for(let n of t.untrackedFiles)i("git.untracked",n);for(let n of t.deletedFiles)i("git.deleted",n);}function Oe(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 Ae(e){let t=new Set,a=[];for(let r of e){let i=`${r.scope}:${r.project??""}:${r.display}`;t.has(i)||(t.add(i),a.push(r));}return a}function De(e){return e.type==="project.removed"?"high":e.severity==="critical"?"critical":e.severity==="warning"?"high":("medium")}function $e(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 xe(e){return e.affectedProjects>0||e.projectCount>0||!e.changes.every(a=>a.severity==="critical"?false:a.type.startsWith("git.")||a.type==="validation.changed")?e.risk:I(e.risk)>=I("high")||e.risk==="medium"?"low":e.risk}function re(e,t){if(!e||e==="workspace")return true;let a=(e.startsWith("project:")?e.slice(8):e).trim().toLowerCase();return [t.name,t.path,k.basename(t.path),t.absolutePath].filter(r=>typeof r=="string"&&r.trim().length>0).map(r=>r.trim().toLowerCase()).includes(a)}function Fe(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(a=>a.project?.name??a.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 et(e){let t=k.resolve(e.workspacePath),a$1=ne(e.fromPath),r=e.diff;if(!r&&!a$1){let o=se(t,e.fromPath);r=await ve(o)??void 0;}r||(r=await Pe({workspacePath:t,fromPath:e.fromPath,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,includeGitObservation:e.includeGitObservation,gitObservation:e.gitObservation,now:e.now,model:e.model}));let i=new Map(r.currentModel.projects.map(o=>[o.path,o])),n$1=new Map(r.currentModel.projects.map(o=>[o.name,o])),c$1=r.changes.filter(o=>o.type.startsWith("project.")),p=new Map;for(let o of c$1){let d=(i.get(o.target)??(typeof o.before?.name=="string"?n$1.get(o.before.name):void 0))?.path??o.target,y=p.get(d)??[];y.push(o),p.set(d,y);}let m=[];for(let[o,s]of p.entries()){let d=i.get(o);if(d&&!re(e.scope,d))continue;let y=Z(s.map(De)),C=d?.name??(typeof s[0]?.before?.name=="string"?String(s[0].before.name):o);m.push({id:`project:${C}`,scope:"project",target:o,title:`Project impact: ${C}`,summary:s.map(j=>j.message).join(" "),risk:y,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?te(d):_()});}let l=n(r.currentModel),u=l?a(l):void 0,v=new Set(m.map(o=>o.project?.name).filter(o=>typeof o=="string")),P=new Map;for(let o of m)if(o.project?.name){let s=u?.byId.get(o.project.name);s&&(o.centrality={fanIn:s.fanIn,fanOut:s.fanOut,reach:s.reach,betweenness:s.betweenness,isHotspot:s.isHotspot},s.isHotspot&&(o.risk=Ce(o.risk),o.reasons=[...o.reasons,`graph.hotspot: critical-path project with ${s.reach} transitive dependent(s); risk escalated.`])),o.origin="direct",o.distance=0,P.set(o.project.name,o.risk);}let w=[],f=0;if(l&&v.size>0){let o=c(l,v);for(let s of o.values()){if(s.distance===0||v.has(s.id))continue;let d=n$1.get(s.id);if(d&&!re(e.scope,d))continue;let y=s.path[0],C=s.path[s.path.length-2]??y,j=P.get(y)??"medium",de=Re(j),M=u?.byId.get(s.id);f=Math.max(f,s.distance),w.push({id:`transitive:${s.id}`,scope:"project",target:d?.path??s.id,title:`Transitive impact: ${s.id}`,summary:`Depends on changed project ${y}${s.via?` via ${s.via}`:""} (distance ${s.distance}).`,risk:de,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?te(d):_(),origin:"transitive",distance:s.distance,path:s.path,via:s.via,...M?{centrality:{fanIn:M.fanIn,fanOut:M.fanOut,reach:M.reach,betweenness:M.betweenness,isHotspot:M.isHotspot}}:{}});}}w.sort((o,s)=>o.target.localeCompare(s.target));let ie=u?u.hotspots.flatMap(o=>{let s=u.byId.get(o);return s?[{project:o,fanIn:s.fanIn,fanOut:s.fanOut,reach:s.reach,betweenness:s.betweenness}]:[]}):[],ce=r.changes.filter(o=>!o.type.startsWith("project.")),K=r.currentModel.summary?.projectCount??r.currentModel.projects.length,R=ce.map(o=>({id:`workspace:${o.target}`,scope:"workspace",target:o.target,title:`Workspace impact: ${o.target}`,summary:o.message,risk:$e(o,{projectCount:K}),reasons:[`${o.type}: ${o.message}`],verification:_()})),B=Ae([...m.flatMap(o=>o.verification),...w.flatMap(o=>o.verification),...R.flatMap(o=>o.verification),...r.summary.changed?_():[]]).filter(o=>o.required),pe=Z([...m.map(o=>o.risk),...w.map(o=>o.risk),...R.map(o=>o.risk)]),z=xe({risk:pe,affectedProjects:m.length,projectCount:K,changes:r.changes}),q={changed:r.summary.changed,risk:z,affectedProjects:m.length,workspaceItems:R.length,recommendedCommands:B.length,blastRadius:{directlyAffected:m.length,transitivelyAffected:w.length,maxDistance:f,graphEdges:l?.edges.length??0}};return {schemaVersion:he,generatedAt:(e.now??new Date).toISOString(),fromRef:r.fromRef,diffRef:ae,workspace:{name:r.currentModel.workspace.name,profile:r.currentModel.workspace.profile,type:r.currentModel.workspace.type},summary:q,affectedProjects:m.sort((o,s)=>o.target.localeCompare(s.target)),transitiveImpact:w,criticalPathHotspots:ie,workspaceImpact:R.sort((o,s)=>o.target.localeCompare(s.target)),verificationPlan:B,agentBrief:Fe({changed:q.changed,risk:z,affectedProjects:m,workspaceImpact:R}),diff:r}}async function tt(e,t){return h$1(t,we,d$1(e))}export{Q as a,oe as b,L as c,T as d,ae as e,he as f,we as g,ye as h,ne as i,We as j,Ye as k,Qe as l,Pe as m,Ze as n,_ as o,et as p,tt as q};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {d,b,e}from'./chunk-P5LI5DL3.js';import {a}from'./chunk-NMXGSVMD.js';import {d as d$3}from'./chunk-S5KTATOU.js';import {B,q as q$2,A,u as u$1,z,D}from'./chunk-O3TVVQ6X.js';import {d as d$2,c as c$1}from'./chunk-ROOPODG6.js';import {k,m,g as g$1,f}from'./chunk-LUPKDFQ3.js';import {g}from'./chunk-BLEIUQL6.js';import {q as q$3,e as e$1,g as g$2}from'./chunk-6BO4QHKA.js';import {a as a$1}from'./chunk-TQEMLBAG.js';import {c,d as d$1}from'./chunk-25AWHAB5.js';import {u,q as q$1,t as t$1}from'./chunk-VQZ5PI5J.js';import {p as p$1,t}from'./chunk-ODK4LCEL.js';import J from'fs';import p from'path';import M from'chalk';import {execa}from'execa';var St={"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:[]}}},Rt={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"],c:["cmake -S . -B build"],cpp:["cmake -S . -B build"],elixir:["mix deps.get"],ruby:["bundle install"],clojure:["clojure -P"],scala:["sbt update"],kotlin:["./gradlew dependencies","gradle dependencies"],deno:[],bun:["bun 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"],c:["ctest --test-dir build --output-on-failure"],cpp:["ctest --test-dir build --output-on-failure"],elixir:["mix test"],ruby:["rspec","ruby -m minitest"],clojure:["clojure -X:test"],scala:["sbt test"],kotlin:["./gradlew test","gradle test"],deno:["deno task test","deno test"],bun:["bun test","bun run test"],"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"],c:["cmake --build build"],cpp:["cmake --build build"],elixir:["mix compile"],ruby:["gem build *.gemspec"],clojure:[],scala:["sbt compile"],kotlin:["./gradlew build","gradle build"],deno:["deno task build"],bun:["bun run build"],"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"],c:[],cpp:[],elixir:["mix phx.server","iex -S mix"],ruby:["rails server","ruby app.rb","bundle exec puma"],clojure:["clojure -M:run"],scala:["sbt run"],kotlin:["./gradlew run","gradle run"],deno:["deno task start","deno task dev"],bun:["bun run start","bun run dev"],"jvm-generic":["java -jar *.jar","gradle run"],unknown:[]}};function fe(e,r){if(r){let t=r.trim().toLowerCase().replace(/[_.\s]+/g,"-"),n=f(r),o=`${e}-${n==="gofiber"?"fiber":n==="gogin"?"gin":n==="dotnet"?"aspnetcore":n!=="unknown"?n:t==="fiber"?"fiber":t==="aspnetcore"||t==="asp-net-core"?"aspnetcore":t}`;return St[o]}}function Ze(e,r,t){if(r){let n=fe(e,r);if(n&&n.commands[t])return n.commands[t]}if(["init","test","build","start"].includes(t)){let n=Rt[t]?.[e]??[];return n.length>0?n[0]:void 0}}var Ct={test:"test",build:"build",start:"start"};function ge(e){if(e.stage==="init")return e.runtime==="node"?A(e.projectPath):Ze(e.runtime,e.framework,e.stage);if(e.runtime==="node"){let r=Ct[e.stage];if(r){let t=u$1(e.projectPath,r,{framework:e.framework});if(t)return z(e.projectPath,t.scriptName)}}return Ze(e.runtime,e.framework,e.stage)}function Et(e){let r=k(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,s)=>s.indexOf(t)===n);return {primary:r.length>0?r[0]:"unknown",secondary:r.slice(1)}}function rt(e){return Et(e).primary}function nt(e,r,t){if(!e)return "unknown";r||(r={timeout:["timed out","timeout","deadline exceeded","SocketTimeoutException"],dependency:["cannot find module","import.*error","Could not find a package configuration file provided by","CMAKE_PREFIX_PATH","failed to fetch","error while requesting resource","unable to (?:resolve|connect)","could not resolve host","network (?:is )?unreachable","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","getaddrinfo","npm error","npm ERR!","registry.npmjs","pypi.org","Could not fetch URL","Max retries exceeded","NewConnectionError"],setup:["ModuleNotFoundError","No module named","error:","not found"],"test-failure":["FAILED","FAIL","failed"],runtime:["Exception","Error:","panic","TypeError"],unknown:[]});for(let[n,s]of Object.entries(r))if(!(n==="test-failure"&&t&&t!=="test")){for(let o of s)if(new RegExp(o,"i").test(e))return n}return "unknown"}async function ne(e,r){let t=e.split(/[&|;]\s*/)[0].trim(),n=async i=>{let d=p.isAbsolute(i)?i:p.resolve(r??process.cwd(),i);try{return await J.promises.access(d,process.platform==="win32"?J.constants.F_OK:J.constants.X_OK),true}catch{return false}};if((t.includes("/")||t.includes("\\"))&&await n(t))return {valid:true};let s=t.split(/\s+/)[0];if(["echo","cd","pwd","test","true","false","exit"].includes(s))return {valid:true};if(s.includes("/")||s.includes("\\")){let i=p.isAbsolute(s)?s:p.resolve(r??process.cwd(),s);try{return await J.promises.access(i,process.platform==="win32"?J.constants.F_OK:J.constants.X_OK),{valid:true}}catch{return {valid:false,reason:`Command '${s}' not found or not executable in '${r??process.cwd()}'`}}}try{let i=process.platform==="win32"?"where":"which";if((await execa(i,[s],{reject:false})).exitCode===0)return {valid:true}}catch{}return {valid:false,reason:`Command '${s}' not found or not executable`}}function st(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(s=>["init","test","build","start"].includes(s))?r:{};return t&&typeof n[t]=="string"?n[t]:typeof n.default=="string"?n.default:e}async function ot(e,r){if(!e)return {healthy:true};switch(e.type){case "port":{let t=e.value;try{let n=await import('net');return new Promise(s=>{let o=new n.Socket,i=5e3;o.setTimeout(i),o.on("connect",()=>{o.destroy(),s({healthy:true,reason:`Port ${t} is listening`});}),o.on("timeout",()=>{o.destroy(),s({healthy:false,reason:`Port ${t} timeout after ${i}ms`});}),o.on("error",d=>{o.destroy(),s({healthy:false,reason:`Port ${t} error: ${String(d)}`});}),o.connect(t,"localhost");})}catch(n){return {healthy:false,reason:`Port check error: ${n instanceof Error?n.message:String(n)}`}}}case "http":{let t=e.value,n;try{let s=new AbortController;n=setTimeout(()=>s.abort(),5e3);let o=await fetch(t,{method:"GET",signal:s.signal});return {healthy:o.status===200,reason:`HTTP ${o.status}`,metadata:{status:o.status}}}catch(s){return {healthy:false,reason:`HTTP check error: ${s instanceof Error?s.message:String(s)}`}}finally{n&&clearTimeout(n);}}case "log":{let t=e.value;if(!r)return {healthy:true};try{let n=[p.join(r,".workspai","last-run.log"),p.join(r,".rapidkit","last-run.log")].find(s=>J.existsSync(s));if(n){let s=J.readFileSync(n,"utf-8"),o=new RegExp(t,"i");return {healthy:o.test(s),reason:o.test(s)?"Log pattern found":"Log pattern not found"}}return {healthy:true,reason:"No log file to check"}}catch(n){return {healthy:false,reason:`Log check error: ${n instanceof Error?n.message:String(n)}`}}}case "command":{let t=e.value;try{let n=await execa(t,[],{cwd:r,reject:false,shell:true});return {healthy:n.exitCode===0,reason:n.exitCode===0?"Health check passed":"Health check failed",metadata:{exitCode:n.exitCode}}}catch(n){return {healthy:false,reason:`Command check error: ${n instanceof Error?n.message:String(n)}`}}}default:return {healthy:true}}}var at={init:"init",test:"test",build:"build",start:"start"};function jt(e){return e in at?at[e]:null}function Pt(e,r){let n=q$2(e)?.contextJson?.commands;if(!n||typeof n!="object"||Array.isArray(n))return;let s=n[r];if(typeof s=="string"&&s.trim().length>0)return s.trim();if(s&&typeof s=="object"&&!Array.isArray(s)){let o=s,i=o.default??o.dev;if(typeof i=="string"&&i.trim().length>0)return i.trim()}}function it(e,r,t=D(e)){let n=jt(r);if(!n)return Pt(e,r)?{supported:true}:{supported:false,reason:`Workspace stage "${r}" is not part of the Workspai fleet contract.`};if(!t.projectRoot)return {supported:false,reason:"No Workspai project metadata was detected for this target."};let s=t.commandMap[n];if(!s||s.status!=="supported"){let o=t.runtimeSupportTier==="observed"||t.frameworkSupportTier==="observed";return {supported:false,reason:s?.reason??`Command "${n}" is not supported for this project runtime/framework.`,shouldFail:!o}}return {supported:true}}var At=new Set(["init","test","build","start"]),Ft=new Set([".git","node_modules",".workspai",".rapidkit",".venv","dist","build","coverage","htmlcov"]);async function q(e){try{return await J.promises.access(e,J.constants.F_OK),true}catch{return false}}function ut(e,r){let t=p.relative(p.resolve(e),p.resolve(r));return t===""||!t.startsWith(`..${p.sep}`)&&t!==".."&&!p.isAbsolute(t)}function Ot(e){let r=p.resolve(e.projectPath,e.unit.root);return !e.selectedProjectPaths.some(t=>p.resolve(t)===p.resolve(e.projectPath)?false:ut(e.projectPath,t)&&ut(t,r))}async function Tt(e){for(let r of e)if(await q(r))return true;return false}async function Dt(e,r,t){if(r==="python"){let i=[p.join(e,".workspai","cli.py"),p.join(e,".rapidkit","cli.py")];for(let d of i)if(await q(d))return {valid:true};return {valid:false,reason:"Project-local .workspai/cli.py is missing. Run `workspai init` in this project first."}}let s={go:"go",rust:"cargo",dotnet:"dotnet",php:"php"}[r];if(s)return ne(s,e);let o=t.trim().split(/\s+/)[0];if(o&&["npm","npx","pnpm","yarn"].includes(o)){let i=e$1(o);if((await execa(i.command,[...i.prefixArgs,"--version"],{reject:false,env:g$2()})).exitCode===0)return {valid:true}}return ne(t,e)}async function oe(e){let r=await J.promises.readFile(e,"utf-8");return JSON.parse(r)}function U(e){return e.replace(/\\/g,"/")}function It(e){let r=e?.trim();return r?r.startsWith("project:")?r.slice(8).trim()||null:r:null}async function $t(e){let r=p.join(e,p$1.model);if(await q(r))try{let n=((await oe(r)).projects??[]).map(s=>typeof s.path=="string"?d$2(e,s.path):null).filter(s=>!!s).filter((s,o,i)=>i.indexOf(s)===o).filter(s=>J.existsSync(s));if(n.length>0)return n.sort()}catch{}return a(e,{skipDirs:Ft,includeHiddenDirs:false,descendIntoMatchedProjects:false,isProjectDir:async(t,n)=>await Tt([...u(t,"context.json"),...u(t,"project.json")])?true:p.resolve(t)===p.resolve(n)?false:k(t).length>0})}async function gt(e){for(let r of [p.join(".workspai","project.json"),p.join(".workspai","context.json"),p.join(".rapidkit","project.json"),p.join(".rapidkit","context.json")]){let t=p.join(e,r);if(await q(t))try{let n=await oe(t),s=n.name??n.projectName??n.slug;if(typeof s=="string"&&s.trim())return s.trim()}catch{}}return null}async function Mt(e){for(let r of [p.join(".workspai","project.json"),p.join(".workspai","context.json"),p.join(".rapidkit","project.json"),p.join(".rapidkit","context.json")]){let t=p.join(e,r);if(await q(t))try{let n=await oe(t);for(let s of ["kind","category","project_type"]){let o=n[s];if(typeof o=="string"&&o.trim().toLowerCase()==="gateway")return true}}catch{}}return false}async function Nt(e,r,t){let n=It(t);if(!n)return {projects:r,normalizedScope:null};let s=U(n).toLowerCase(),o=[];for(let i of r){let d=await gt(i);c$1({workspacePath:e,projectPath:i,declaredName:d}).map(g=>U(g).toLowerCase()).includes(s)&&o.push(i);}if(o.length===0)throw new Error(`Workspace run scope did not match any project: ${t}`);return {projects:o,normalizedScope:n}}async function Wt(e,r,t){let n=await execa("git",["diff","--name-only",`${t}...HEAD`],{cwd:e,reject:false,env:a$1()});if(n.exitCode!==0)return new Set(r);let s=n.stdout.split(/\r?\n/).map(i=>i.trim()).filter(i=>i.length>0).map(i=>U(i));if(s.length===0)return new Set;let o=new Set;for(let i of r){let d=U(p.relative(e,i));if(!d||d===".")continue;let u=`${d}/`;s.some(g=>g===d||g.startsWith(u))&&o.add(i);}return o}async function Lt(e,r,t$1){let n=await g(e,t.workspaceContract)??q$1(e,"workspace.contract.json");if(await q(n))try{let l=await _t(e,r,t$1,n);if(l.graphStatus!=="missing")return l}catch{return {expanded:t$1,graphStatus:"invalid",expansionDepth:0}}let s=await g(e,".workspai/workspace-dependency-graph.json")??q$1(e,"workspace-dependency-graph.json");if(!await q(s))return {expanded:t$1,graphStatus:"missing",expansionDepth:0};let o;try{o=await oe(s);}catch{return {expanded:t$1,graphStatus:"invalid",expansionDepth:0}}let i=new Set(r.map(l=>p.resolve(l))),d=new Map;if(!o||typeof o!="object"||Array.isArray(o))return {expanded:t$1,graphStatus:"invalid",expansionDepth:0};let u=Array.isArray(o.projects)?o.projects:[];for(let l of u){if(!l||typeof l!="object"||Array.isArray(l))continue;let c=l,f=typeof c.path=="string"?c.path:"",x=p.resolve(e,f);if(!i.has(x))continue;let v=Array.isArray(c.dependsOn)?c.dependsOn.filter(k=>typeof k=="string"):[];for(let k of v){let R=p.resolve(e,k);i.has(R)&&(d.has(R)||d.set(R,new Set),d.get(R)?.add(x));}}let g$1=d$3(d,t$1);return {expanded:g$1.reached,graphStatus:"loaded",expansionDepth:g$1.added}}async function _t(e,r,t,n){let s=await oe(n);if(!s||typeof s!="object"||Array.isArray(s))return {expanded:t,graphStatus:"invalid",expansionDepth:0};let o=s,i=Array.isArray(o.projects)?o.projects:null;if(!i)return {expanded:t,graphStatus:"invalid",expansionDepth:0};let d=new Map,u=new Map;for(let x of r){let v=U(p.relative(e,x));u.set(v,p.resolve(x));}let g=new Map,l=new Map,c=new Map;for(let x of i){if(!x||typeof x!="object"||Array.isArray(x))continue;let v=x,k=typeof v.slug=="string"?v.slug:"",R=typeof v.relativePath=="string"?U(v.relativePath):k,b=u.get(R);!k||!b||d.set(k,b);}for(let x of i){if(!x||typeof x!="object"||Array.isArray(x))continue;let v=x,k=typeof v.slug=="string"?v.slug:"",R=d.get(k);if(!R)continue;let b=v.contracts&&typeof v.contracts=="object"&&!Array.isArray(v.contracts)?v.contracts:{},E=Array.isArray(b.dependsOn)?b.dependsOn.filter(w=>typeof w=="string"):[],N=Array.isArray(b.publishes)?b.publishes.filter(w=>typeof w=="string"):[],z=Array.isArray(b.consumes)?b.consumes.filter(w=>typeof w=="string"):[];for(let w of E){let A=d.get(w);A&&(c.has(A)||c.set(A,new Set),c.get(A)?.add(R));}for(let w of N)g.has(w)||g.set(w,new Set),g.get(w)?.add(R);for(let w of z)l.has(w)||l.set(w,new Set),l.get(w)?.add(R);}for(let[x,v]of g.entries()){let k=l.get(x);if(k)for(let R of v){c.has(R)||c.set(R,new Set);for(let b of k)b!==R&&c.get(R)?.add(b);}}let f=d$3(c,t);return {expanded:f.reached,graphStatus:"loaded",expansionDepth:f.added}}async function Gt(e,r){if(typeof r=="boolean")return r;let t=t$1(e,"policies.yml").find(o=>J.existsSync(o))??q$1(e,"policies.yml");if(!await q(t))return true;let n="";try{n=await J.promises.readFile(t,"utf-8");}catch{return true}let s=n.match(/^[\t ]*rules\.enforce_workspace_run_gates:\s*(true|false)\s*(?:#.*)?$/m);return s?s[1]==="true":true}function Bt(e,r){let t=process.env.RAPIDKIT_WORKSPACE_RUN_STAGE_TIMEOUT_MS;if(t){let n=Number.parseInt(t,10);if(Number.isFinite(n)&&n>0)return n}return e!=="init"?9e4:r==="python"||r==="java"||r==="jvm-generic"||r==="dotnet"||r==="rust"?6e5:3e5}function Kt(e){let r=e.trim();if(!r||/[&|;<>()$`"'\n\r]/.test(r))return null;let[t,...n]=r.split(/\s+/);return !t||/^[A-Za-z_][A-Za-z0-9_]*=/.test(t)||![t,...n].every(s=>/^[A-Za-z0-9_./:@%+,=\\-]+$/.test(s))?null:{file:t,args:n}}function Ut(e){let r=p.basename(e).toLowerCase();return r==="python"||r==="python3"||r==="python.exe"||r==="python3.exe"||/(?:^|[\\/])\.venv[\\/]/.test(e)}function zt(e,r){let t=q$3({unitRoot:e}),n=[];for(let s of r){let o=s.args[0]==="-m"&&s.args[1]==="venv";if(!(o&&t.venvExists)){if(Ut(s.executable)&&!o){let i=t.usedForDependencyInstall?t.interpreter:p.isAbsolute(s.executable)?s.executable:p.resolve(e,s.executable);n.push({...s,executable:i});continue}n.push(s);}}return n}function Ht(e){return e.map(r=>[r.executable,...r.args].join(" ")).join(" && ")}function Vt(e){let r=e.split(/\s&&\s/),t=[];for(let n of r){let s=Kt(n);if(!s)return null;t.push({executable:s.file,args:s.args});}return t.length>0?t:null}async function ct(e,r,t){let n="",s="",o=0,i=false,d="",u="";for(let l of r){let c=await execa(l.executable,l.args,{cwd:e,reject:false,timeout:t,forceKillAfterDelay:1e3});n+=`${c.stdout??""}
|
|
1
|
+
import {d,b,e}from'./chunk-P5LI5DL3.js';import {a}from'./chunk-NMXGSVMD.js';import {d as d$3}from'./chunk-S5KTATOU.js';import {B,q as q$2,A,u as u$1,z,D}from'./chunk-7HV4U2OV.js';import {d as d$2,c as c$1}from'./chunk-ROOPODG6.js';import {k,m,g as g$1,f}from'./chunk-7EMG3C3H.js';import {g}from'./chunk-BLEIUQL6.js';import {q as q$3,e as e$1,g as g$2}from'./chunk-6BO4QHKA.js';import {a as a$1}from'./chunk-TQEMLBAG.js';import {c,d as d$1}from'./chunk-25AWHAB5.js';import {u,q as q$1,t as t$1}from'./chunk-VQZ5PI5J.js';import {p as p$1,t}from'./chunk-ODK4LCEL.js';import J from'fs';import p from'path';import M from'chalk';import {execa}from'execa';var St={"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:[]}}},Rt={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"],c:["cmake -S . -B build"],cpp:["cmake -S . -B build"],elixir:["mix deps.get"],ruby:["bundle install"],clojure:["clojure -P"],scala:["sbt update"],kotlin:["./gradlew dependencies","gradle dependencies"],deno:[],bun:["bun 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"],c:["ctest --test-dir build --output-on-failure"],cpp:["ctest --test-dir build --output-on-failure"],elixir:["mix test"],ruby:["rspec","ruby -m minitest"],clojure:["clojure -X:test"],scala:["sbt test"],kotlin:["./gradlew test","gradle test"],deno:["deno task test","deno test"],bun:["bun test","bun run test"],"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"],c:["cmake --build build"],cpp:["cmake --build build"],elixir:["mix compile"],ruby:["gem build *.gemspec"],clojure:[],scala:["sbt compile"],kotlin:["./gradlew build","gradle build"],deno:["deno task build"],bun:["bun run build"],"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"],c:[],cpp:[],elixir:["mix phx.server","iex -S mix"],ruby:["rails server","ruby app.rb","bundle exec puma"],clojure:["clojure -M:run"],scala:["sbt run"],kotlin:["./gradlew run","gradle run"],deno:["deno task start","deno task dev"],bun:["bun run start","bun run dev"],"jvm-generic":["java -jar *.jar","gradle run"],unknown:[]}};function fe(e,r){if(r){let t=r.trim().toLowerCase().replace(/[_.\s]+/g,"-"),n=f(r),o=`${e}-${n==="gofiber"?"fiber":n==="gogin"?"gin":n==="dotnet"?"aspnetcore":n!=="unknown"?n:t==="fiber"?"fiber":t==="aspnetcore"||t==="asp-net-core"?"aspnetcore":t}`;return St[o]}}function Ze(e,r,t){if(r){let n=fe(e,r);if(n&&n.commands[t])return n.commands[t]}if(["init","test","build","start"].includes(t)){let n=Rt[t]?.[e]??[];return n.length>0?n[0]:void 0}}var Ct={test:"test",build:"build",start:"start"};function ge(e){if(e.stage==="init")return e.runtime==="node"?A(e.projectPath):Ze(e.runtime,e.framework,e.stage);if(e.runtime==="node"){let r=Ct[e.stage];if(r){let t=u$1(e.projectPath,r,{framework:e.framework});if(t)return z(e.projectPath,t.scriptName)}}return Ze(e.runtime,e.framework,e.stage)}function Et(e){let r=k(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,s)=>s.indexOf(t)===n);return {primary:r.length>0?r[0]:"unknown",secondary:r.slice(1)}}function rt(e){return Et(e).primary}function nt(e,r,t){if(!e)return "unknown";r||(r={timeout:["timed out","timeout","deadline exceeded","SocketTimeoutException"],dependency:["cannot find module","import.*error","Could not find a package configuration file provided by","CMAKE_PREFIX_PATH","failed to fetch","error while requesting resource","unable to (?:resolve|connect)","could not resolve host","network (?:is )?unreachable","ECONNREFUSED","ENOTFOUND","EAI_AGAIN","getaddrinfo","npm error","npm ERR!","registry.npmjs","pypi.org","Could not fetch URL","Max retries exceeded","NewConnectionError"],setup:["ModuleNotFoundError","No module named","error:","not found"],"test-failure":["FAILED","FAIL","failed"],runtime:["Exception","Error:","panic","TypeError"],unknown:[]});for(let[n,s]of Object.entries(r))if(!(n==="test-failure"&&t&&t!=="test")){for(let o of s)if(new RegExp(o,"i").test(e))return n}return "unknown"}async function ne(e,r){let t=e.split(/[&|;]\s*/)[0].trim(),n=async i=>{let d=p.isAbsolute(i)?i:p.resolve(r??process.cwd(),i);try{return await J.promises.access(d,process.platform==="win32"?J.constants.F_OK:J.constants.X_OK),true}catch{return false}};if((t.includes("/")||t.includes("\\"))&&await n(t))return {valid:true};let s=t.split(/\s+/)[0];if(["echo","cd","pwd","test","true","false","exit"].includes(s))return {valid:true};if(s.includes("/")||s.includes("\\")){let i=p.isAbsolute(s)?s:p.resolve(r??process.cwd(),s);try{return await J.promises.access(i,process.platform==="win32"?J.constants.F_OK:J.constants.X_OK),{valid:true}}catch{return {valid:false,reason:`Command '${s}' not found or not executable in '${r??process.cwd()}'`}}}try{let i=process.platform==="win32"?"where":"which";if((await execa(i,[s],{reject:false})).exitCode===0)return {valid:true}}catch{}return {valid:false,reason:`Command '${s}' not found or not executable`}}function st(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(s=>["init","test","build","start"].includes(s))?r:{};return t&&typeof n[t]=="string"?n[t]:typeof n.default=="string"?n.default:e}async function ot(e,r){if(!e)return {healthy:true};switch(e.type){case "port":{let t=e.value;try{let n=await import('net');return new Promise(s=>{let o=new n.Socket,i=5e3;o.setTimeout(i),o.on("connect",()=>{o.destroy(),s({healthy:true,reason:`Port ${t} is listening`});}),o.on("timeout",()=>{o.destroy(),s({healthy:false,reason:`Port ${t} timeout after ${i}ms`});}),o.on("error",d=>{o.destroy(),s({healthy:false,reason:`Port ${t} error: ${String(d)}`});}),o.connect(t,"localhost");})}catch(n){return {healthy:false,reason:`Port check error: ${n instanceof Error?n.message:String(n)}`}}}case "http":{let t=e.value,n;try{let s=new AbortController;n=setTimeout(()=>s.abort(),5e3);let o=await fetch(t,{method:"GET",signal:s.signal});return {healthy:o.status===200,reason:`HTTP ${o.status}`,metadata:{status:o.status}}}catch(s){return {healthy:false,reason:`HTTP check error: ${s instanceof Error?s.message:String(s)}`}}finally{n&&clearTimeout(n);}}case "log":{let t=e.value;if(!r)return {healthy:true};try{let n=[p.join(r,".workspai","last-run.log"),p.join(r,".rapidkit","last-run.log")].find(s=>J.existsSync(s));if(n){let s=J.readFileSync(n,"utf-8"),o=new RegExp(t,"i");return {healthy:o.test(s),reason:o.test(s)?"Log pattern found":"Log pattern not found"}}return {healthy:true,reason:"No log file to check"}}catch(n){return {healthy:false,reason:`Log check error: ${n instanceof Error?n.message:String(n)}`}}}case "command":{let t=e.value;try{let n=await execa(t,[],{cwd:r,reject:false,shell:true});return {healthy:n.exitCode===0,reason:n.exitCode===0?"Health check passed":"Health check failed",metadata:{exitCode:n.exitCode}}}catch(n){return {healthy:false,reason:`Command check error: ${n instanceof Error?n.message:String(n)}`}}}default:return {healthy:true}}}var at={init:"init",test:"test",build:"build",start:"start"};function jt(e){return e in at?at[e]:null}function Pt(e,r){let n=q$2(e)?.contextJson?.commands;if(!n||typeof n!="object"||Array.isArray(n))return;let s=n[r];if(typeof s=="string"&&s.trim().length>0)return s.trim();if(s&&typeof s=="object"&&!Array.isArray(s)){let o=s,i=o.default??o.dev;if(typeof i=="string"&&i.trim().length>0)return i.trim()}}function it(e,r,t=D(e)){let n=jt(r);if(!n)return Pt(e,r)?{supported:true}:{supported:false,reason:`Workspace stage "${r}" is not part of the Workspai fleet contract.`};if(!t.projectRoot)return {supported:false,reason:"No Workspai project metadata was detected for this target."};let s=t.commandMap[n];if(!s||s.status!=="supported"){let o=t.runtimeSupportTier==="observed"||t.frameworkSupportTier==="observed";return {supported:false,reason:s?.reason??`Command "${n}" is not supported for this project runtime/framework.`,shouldFail:!o}}return {supported:true}}var At=new Set(["init","test","build","start"]),Ft=new Set([".git","node_modules",".workspai",".rapidkit",".venv","dist","build","coverage","htmlcov"]);async function q(e){try{return await J.promises.access(e,J.constants.F_OK),true}catch{return false}}function ut(e,r){let t=p.relative(p.resolve(e),p.resolve(r));return t===""||!t.startsWith(`..${p.sep}`)&&t!==".."&&!p.isAbsolute(t)}function Ot(e){let r=p.resolve(e.projectPath,e.unit.root);return !e.selectedProjectPaths.some(t=>p.resolve(t)===p.resolve(e.projectPath)?false:ut(e.projectPath,t)&&ut(t,r))}async function Tt(e){for(let r of e)if(await q(r))return true;return false}async function Dt(e,r,t){if(r==="python"){let i=[p.join(e,".workspai","cli.py"),p.join(e,".rapidkit","cli.py")];for(let d of i)if(await q(d))return {valid:true};return {valid:false,reason:"Project-local .workspai/cli.py is missing. Run `workspai init` in this project first."}}let s={go:"go",rust:"cargo",dotnet:"dotnet",php:"php"}[r];if(s)return ne(s,e);let o=t.trim().split(/\s+/)[0];if(o&&["npm","npx","pnpm","yarn"].includes(o)){let i=e$1(o);if((await execa(i.command,[...i.prefixArgs,"--version"],{reject:false,env:g$2()})).exitCode===0)return {valid:true}}return ne(t,e)}async function oe(e){let r=await J.promises.readFile(e,"utf-8");return JSON.parse(r)}function U(e){return e.replace(/\\/g,"/")}function It(e){let r=e?.trim();return r?r.startsWith("project:")?r.slice(8).trim()||null:r:null}async function $t(e){let r=p.join(e,p$1.model);if(await q(r))try{let n=((await oe(r)).projects??[]).map(s=>typeof s.path=="string"?d$2(e,s.path):null).filter(s=>!!s).filter((s,o,i)=>i.indexOf(s)===o).filter(s=>J.existsSync(s));if(n.length>0)return n.sort()}catch{}return a(e,{skipDirs:Ft,includeHiddenDirs:false,descendIntoMatchedProjects:false,isProjectDir:async(t,n)=>await Tt([...u(t,"context.json"),...u(t,"project.json")])?true:p.resolve(t)===p.resolve(n)?false:k(t).length>0})}async function gt(e){for(let r of [p.join(".workspai","project.json"),p.join(".workspai","context.json"),p.join(".rapidkit","project.json"),p.join(".rapidkit","context.json")]){let t=p.join(e,r);if(await q(t))try{let n=await oe(t),s=n.name??n.projectName??n.slug;if(typeof s=="string"&&s.trim())return s.trim()}catch{}}return null}async function Mt(e){for(let r of [p.join(".workspai","project.json"),p.join(".workspai","context.json"),p.join(".rapidkit","project.json"),p.join(".rapidkit","context.json")]){let t=p.join(e,r);if(await q(t))try{let n=await oe(t);for(let s of ["kind","category","project_type"]){let o=n[s];if(typeof o=="string"&&o.trim().toLowerCase()==="gateway")return true}}catch{}}return false}async function Nt(e,r,t){let n=It(t);if(!n)return {projects:r,normalizedScope:null};let s=U(n).toLowerCase(),o=[];for(let i of r){let d=await gt(i);c$1({workspacePath:e,projectPath:i,declaredName:d}).map(g=>U(g).toLowerCase()).includes(s)&&o.push(i);}if(o.length===0)throw new Error(`Workspace run scope did not match any project: ${t}`);return {projects:o,normalizedScope:n}}async function Wt(e,r,t){let n=await execa("git",["diff","--name-only",`${t}...HEAD`],{cwd:e,reject:false,env:a$1()});if(n.exitCode!==0)return new Set(r);let s=n.stdout.split(/\r?\n/).map(i=>i.trim()).filter(i=>i.length>0).map(i=>U(i));if(s.length===0)return new Set;let o=new Set;for(let i of r){let d=U(p.relative(e,i));if(!d||d===".")continue;let u=`${d}/`;s.some(g=>g===d||g.startsWith(u))&&o.add(i);}return o}async function Lt(e,r,t$1){let n=await g(e,t.workspaceContract)??q$1(e,"workspace.contract.json");if(await q(n))try{let l=await _t(e,r,t$1,n);if(l.graphStatus!=="missing")return l}catch{return {expanded:t$1,graphStatus:"invalid",expansionDepth:0}}let s=await g(e,".workspai/workspace-dependency-graph.json")??q$1(e,"workspace-dependency-graph.json");if(!await q(s))return {expanded:t$1,graphStatus:"missing",expansionDepth:0};let o;try{o=await oe(s);}catch{return {expanded:t$1,graphStatus:"invalid",expansionDepth:0}}let i=new Set(r.map(l=>p.resolve(l))),d=new Map;if(!o||typeof o!="object"||Array.isArray(o))return {expanded:t$1,graphStatus:"invalid",expansionDepth:0};let u=Array.isArray(o.projects)?o.projects:[];for(let l of u){if(!l||typeof l!="object"||Array.isArray(l))continue;let c=l,f=typeof c.path=="string"?c.path:"",x=p.resolve(e,f);if(!i.has(x))continue;let v=Array.isArray(c.dependsOn)?c.dependsOn.filter(k=>typeof k=="string"):[];for(let k of v){let R=p.resolve(e,k);i.has(R)&&(d.has(R)||d.set(R,new Set),d.get(R)?.add(x));}}let g$1=d$3(d,t$1);return {expanded:g$1.reached,graphStatus:"loaded",expansionDepth:g$1.added}}async function _t(e,r,t,n){let s=await oe(n);if(!s||typeof s!="object"||Array.isArray(s))return {expanded:t,graphStatus:"invalid",expansionDepth:0};let o=s,i=Array.isArray(o.projects)?o.projects:null;if(!i)return {expanded:t,graphStatus:"invalid",expansionDepth:0};let d=new Map,u=new Map;for(let x of r){let v=U(p.relative(e,x));u.set(v,p.resolve(x));}let g=new Map,l=new Map,c=new Map;for(let x of i){if(!x||typeof x!="object"||Array.isArray(x))continue;let v=x,k=typeof v.slug=="string"?v.slug:"",R=typeof v.relativePath=="string"?U(v.relativePath):k,b=u.get(R);!k||!b||d.set(k,b);}for(let x of i){if(!x||typeof x!="object"||Array.isArray(x))continue;let v=x,k=typeof v.slug=="string"?v.slug:"",R=d.get(k);if(!R)continue;let b=v.contracts&&typeof v.contracts=="object"&&!Array.isArray(v.contracts)?v.contracts:{},E=Array.isArray(b.dependsOn)?b.dependsOn.filter(w=>typeof w=="string"):[],N=Array.isArray(b.publishes)?b.publishes.filter(w=>typeof w=="string"):[],z=Array.isArray(b.consumes)?b.consumes.filter(w=>typeof w=="string"):[];for(let w of E){let A=d.get(w);A&&(c.has(A)||c.set(A,new Set),c.get(A)?.add(R));}for(let w of N)g.has(w)||g.set(w,new Set),g.get(w)?.add(R);for(let w of z)l.has(w)||l.set(w,new Set),l.get(w)?.add(R);}for(let[x,v]of g.entries()){let k=l.get(x);if(k)for(let R of v){c.has(R)||c.set(R,new Set);for(let b of k)b!==R&&c.get(R)?.add(b);}}let f=d$3(c,t);return {expanded:f.reached,graphStatus:"loaded",expansionDepth:f.added}}async function Gt(e,r){if(typeof r=="boolean")return r;let t=t$1(e,"policies.yml").find(o=>J.existsSync(o))??q$1(e,"policies.yml");if(!await q(t))return true;let n="";try{n=await J.promises.readFile(t,"utf-8");}catch{return true}let s=n.match(/^[\t ]*rules\.enforce_workspace_run_gates:\s*(true|false)\s*(?:#.*)?$/m);return s?s[1]==="true":true}function Bt(e,r){let t=process.env.RAPIDKIT_WORKSPACE_RUN_STAGE_TIMEOUT_MS;if(t){let n=Number.parseInt(t,10);if(Number.isFinite(n)&&n>0)return n}return e!=="init"?9e4:r==="python"||r==="java"||r==="jvm-generic"||r==="dotnet"||r==="rust"?6e5:3e5}function Kt(e){let r=e.trim();if(!r||/[&|;<>()$`"'\n\r]/.test(r))return null;let[t,...n]=r.split(/\s+/);return !t||/^[A-Za-z_][A-Za-z0-9_]*=/.test(t)||![t,...n].every(s=>/^[A-Za-z0-9_./:@%+,=\\-]+$/.test(s))?null:{file:t,args:n}}function Ut(e){let r=p.basename(e).toLowerCase();return r==="python"||r==="python3"||r==="python.exe"||r==="python3.exe"||/(?:^|[\\/])\.venv[\\/]/.test(e)}function zt(e,r){let t=q$3({unitRoot:e}),n=[];for(let s of r){let o=s.args[0]==="-m"&&s.args[1]==="venv";if(!(o&&t.venvExists)){if(Ut(s.executable)&&!o){let i=t.usedForDependencyInstall?t.interpreter:p.isAbsolute(s.executable)?s.executable:p.resolve(e,s.executable);n.push({...s,executable:i});continue}n.push(s);}}return n}function Ht(e){return e.map(r=>[r.executable,...r.args].join(" ")).join(" && ")}function Vt(e){let r=e.split(/\s&&\s/),t=[];for(let n of r){let s=Kt(n);if(!s)return null;t.push({executable:s.file,args:s.args});}return t.length>0?t:null}async function ct(e,r,t){let n="",s="",o=0,i=false,d="",u="";for(let l of r){let c=await execa(l.executable,l.args,{cwd:e,reject:false,timeout:t,forceKillAfterDelay:1e3});n+=`${c.stdout??""}
|
|
2
2
|
`,s+=`${c.stderr??""}
|
|
3
3
|
`,i=!!(typeof c=="object"&&c!==null&&"timedOut"in c&&c.timedOut);let f=c.exitCode,x=i||(typeof f=="number"?f!==0:!!c.failed);if(o=i?124:typeof f=="number"?f:x?127:0,o!==0&&l.executable==="uv"&&(s+="\nMissing admitted lock tool `uv`. Install uv and retry; Workspai does not fall back to an unlocked pip freeze."),o!==0){d=typeof c.message=="string"?c.message:"",u=typeof c.shortMessage=="string"?c.shortMessage:"";break}}let g=ht({stdout:n,stderr:s,message:d,shortMessage:u});return {exitCode:o,stdout:g.stdout,stderr:g.stderr,timedOut:i}}async function Jt(e,r){let t=[];for(let n of r){let s=n.args[0]==="-m"&&n.args[1]==="venv"&&n.args[2],o=p.isAbsolute(n.executable)?p.resolve(n.executable):n.executable.includes("/")||n.executable.includes("\\")?p.resolve(e,n.executable):null;if(!!!(o&&t.some(d=>{let u=p.relative(d,o);return u!==""&&!u.startsWith("..")&&!p.isAbsolute(u)}))){let d=await ne(n.executable,e);if(!d.valid){let u=p.basename(n.executable);return {valid:false,reason:u==="uv"||u==="uv.exe"?"Missing admitted lock tool `uv`. Install uv and retry; no environment was changed.":d.reason||`Required executable is unavailable: ${n.executable}`}}}s&&t.push(p.resolve(e,n.args[2]));}return {valid:true}}function qt(e){let r=e.match(/Ran (\d+) tests?/i);if(!r)return null;let t=Number(e.match(/skipped\s*=\s*(\d+)/i)?.[1]??0),n=Number(e.match(/failures\s*=\s*(\d+)/i)?.[1]??0),s=Number(e.match(/errors\s*=\s*(\d+)/i)?.[1]??0);return {ran:Number(r[1]),skipped:t,failed:n+s}}function dt(e,r){let t=Number.parseInt(process.env[e]??"",10);return Number.isFinite(t)&&t>0?t:r}function Ce(e){return new Promise(r=>setTimeout(r,e))}async function lt(e){let r=process.argv[1];if(e.useRapidkitWrapper&&!r)return {exitCode:1,stdout:"",stderr:"Workspai entrypoint is unavailable for startup verification.",healthStatus:{healthy:false,reason:"Workspai entrypoint is unavailable."}};let t=e.useRapidkitWrapper&&r?execa(process.execPath,[r,"start"],{cwd:e.projectPath,reject:false,timeout:e.timeoutMs,env:{...process.env,RAPIDKIT_WORKSPACE_RUN_CHILD:"1"}}):e.argv?execa(e.argv.executable,e.argv.args,{cwd:e.projectPath,reject:false,timeout:e.timeoutMs}):null;if(!t)return {exitCode:127,stdout:"",stderr:"Refusing to execute a lifecycle start command through a shell.",healthStatus:{healthy:false,reason:"Lifecycle start commands run as argv, not a shell."}};let n=Promise.resolve(t).then(l=>({kind:"exit",result:l}),l=>({kind:"error",error:l})),s=dt("WORKSPAI_WORKSPACE_RUN_STARTUP_GRACE_MS",2e3),o=await Promise.race([n,Ce(s).then(()=>({kind:"alive"}))]);if(o.kind==="error"){let l=typeof o.error=="object"&&o.error!==null&&"timedOut"in o.error&&!!o.error.timedOut;return {exitCode:l?124:1,stdout:"",stderr:o.error instanceof Error?o.error.message:String(o.error),timedOut:l,healthStatus:{healthy:false,reason:"The start command failed before readiness."}}}if(o.kind==="exit"){let l=Number(o.result.exitCode??0);return {exitCode:l,stdout:String(o.result.stdout??""),stderr:String(o.result.stderr??""),healthStatus:{healthy:l===0,reason:l===0?"The start command completed successfully.":`The start command exited with code ${l} before readiness.`}}}let i=fe(e.runtime,e.framework)?.healthCheck,d=i?{healthy:false,reason:"The configured health check has not passed yet."}:{healthy:true,reason:`The service remained alive for ${s}ms (bounded startup smoke).`};if(i){let l=dt("WORKSPAI_WORKSPACE_RUN_STARTUP_HEALTH_TIMEOUT_MS",15e3),c=Date.now()+l;for(;Date.now()<c;){let f=await ot(i,e.projectPath);if(d={healthy:f.healthy,reason:f.reason},f.healthy)break;if((await Promise.race([n,Ce(350).then(()=>({kind:"alive"}))])).kind!=="alive"){d={healthy:false,reason:"The service exited before its configured health check passed."};break}}}try{t.kill?.("SIGTERM",{forceKillAfterDelay:1e3});}catch{try{t.kill?.();}catch{}}let u=await Promise.race([n,Ce(2e3).then(()=>({kind:"alive"}))]),g=u.kind==="exit"?u.result:void 0;return {exitCode:d.healthy?0:1,stdout:String(g?.stdout??""),stderr:String(g?.stderr??""),healthStatus:d}}async function je(e,r,t,n=false){let s=process.argv[1];if(!s)return {exitCode:1,stdout:"",stderr:"RapidKit entrypoint is unavailable for nested workspace-run execution."};let o=false,i,d;try{let u=execa(process.execPath,[s,...e],{cwd:r,reject:false,detached:process.platform!=="win32",env:{...process.env,RAPIDKIT_WORKSPACE_RUN_CHILD:"1"}});t&&t>0&&(d=setTimeout(()=>{o=true;let l=u.pid;if(!l){u.kill("SIGTERM");return}if(process.platform==="win32"){execa("taskkill",["/pid",String(l),"/T","/F"],{reject:false});return}try{process.kill(-l,"SIGTERM");}catch{u.kill("SIGTERM");}i=setTimeout(()=>{try{process.kill(-l,"SIGKILL");}catch{}},1e3),i.unref();},t),d.unref()),n&&(u.stdout?.on("data",l=>process.stdout.write(l)),u.stderr?.on("data",l=>process.stderr.write(l)));let g=await u;return {exitCode:o?124:Number(g.exitCode??1),stdout:g.stdout,stderr:o?`${g.stderr??""}${g.stderr?`
|
|
4
4
|
`:""}Stage timed out after ${t}ms`:g.stderr,shortMessage:g.shortMessage,message:g.message}}catch(u){let g=o||typeof u=="object"&&u!==null&&"timedOut"in u&&!!u.timedOut;return {exitCode:g?124:1,stdout:typeof u=="object"&&u!==null&&"stdout"in u?String(u.stdout??""):"",stderr:g?`Stage timed out after ${t}ms`:typeof u=="object"&&u!==null&&"stderr"in u?String(u.stderr??""):u instanceof Error?u.message:String(u)}}finally{d&&clearTimeout(d),i&&clearTimeout(i);}}function yt(e){return e==="node"||e==="go"||e==="java"||e==="python"||e==="dotnet"||e==="rust"||e==="php"}function Xt(){return process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"}function ye(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):e==null?"":String(e)}function ht(e){let r=ye(e.stdout),t=ye(e.stderr);if(r.trim()||t.trim())return {stdout:r,stderr:t};let n=ye(e.message).trim(),s=ye(e.shortMessage).trim();return {stdout:r,stderr:n||s}}function Yt(e,r=8){if(e.length<=r)return e.join(`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {f,e}from'./chunk-XF65LQ6M.js';import {a as a$1,b as b$2}from'./chunk-X7FYEKLI.js';import {c,d as d$2}from'./chunk-N4B2M44I.js';import {a,b}from'./chunk-SVO2GGTV.js';import {j,i}from'./chunk-O3TVVQ6X.js';import {d}from'./chunk-ROOPODG6.js';import {a as a$2,h as h$1}from'./chunk-BLEIUQL6.js';import {b as b$1}from'./chunk-VN2MKTQO.js';import {t}from'./chunk-VQZ5PI5J.js';import {q as q$1,p as p$1}from'./chunk-ODK4LCEL.js';import p from'chalk';import d$1 from'fs';import h from'path';var H=p$1.readiness;function U(n){return n.vulnerableDependencies>0?`${n.vulnerableDependencies} known dependency vulnerability finding(s) reported`:`${n.blockingFindings} blocking dependency/security finding(s) reported`}var q=q$1.readiness;function B(n){let t=A(n,"workspace.contract.json");if(!d$1.existsSync(t))return [];try{let e=JSON.parse(d$1.readFileSync(t,"utf-8"));return (Array.isArray(e.projects)?e.projects:[]).map(i=>{let c=m(i),o=typeof c.externalPath=="string"?c.externalPath.trim():"",s=typeof c.relativePath=="string"?c.relativePath.trim():"",r=o||s;return r?d(n,s||r,o?{absolutePath:o}:{}):""}).filter(Boolean)}catch{return []}}function Q(n,t){let e=h.resolve(n);if(!b(e))return e;let a=A(t,"workspace.contract.json");if(d$1.existsSync(a))try{let o=JSON.parse(d$1.readFileSync(a,"utf-8")),s=Array.isArray(o.projects)?o.projects:[];for(let r of s){let f=m(r),y=typeof f.externalPath=="string"?f.externalPath.trim():"",g=typeof f.relativePath=="string"?f.relativePath.trim():"";if(y||g)return d(t,g||y,y?{absolutePath:y}:{})}}catch{}let i=T(t),c=Array.isArray(i.payload?.projects)?i.payload.projects:[];for(let o of c){let s=m(o),r=typeof s.path=="string"?s.path.trim():"";if(r)return h.resolve(r)}return e}function _(n){let t=j(n);return i(t,n)}function J(n,t){if(!d$1.existsSync(n))return null;let e=d$1.readdirSync(n).filter(a=>a.endsWith(".json")&&t.some(i=>i.test(a))).map(a=>h.join(n,a));return e.length===0?null:(e.sort((a,i)=>d$1.statSync(i).mtimeMs-d$1.statSync(a).mtimeMs),e[0])}function m(n){return n&&typeof n=="object"&&!Array.isArray(n)?n:{}}function M(n){for(let t of n)if(d$1.existsSync(t))return t;return null}function A(n,...t$1){let e=t(n,...t$1);return M(e)??e[0]}function E(n,t){let e=a$2(n,`.workspai/reports/${t}`);return M([e,h.join(n,".rapidkit","reports",t)])??e}async function X(n){let{readWorkspaceRegistrySummary:t,resolveWorkspaceRegisteredProjects:e}=await import('./workspace-registry-summary-M4WMFDQ4.js'),a=await t(n);return a?a.projectCount:(await e(n)).summary.projectCount}function Y(n,t,e){let a=A(n,"toolchain.lock");if(!d$1.existsSync(a))return {gate:"env",status:"fail",summary:"toolchain.lock is missing",details:["Run workspai bootstrap to pin runtime versions and generate a reproducible toolchain."],evidencePath:a};try{let i=JSON.parse(d$1.readFileSync(a,"utf-8")),c=m(i.runtime),o=["python","node","go","java","dotnet","rust","php"],s=o.filter(l=>{let u=m(c[l]);return typeof u.version=="string"&&u.version.trim().length>0});if(s.length===0)return {gate:"env",status:"fail",summary:"No runtime versions are pinned in toolchain.lock",details:["Pin at least one runtime version via workspai setup <runtime> and re-run bootstrap."],evidencePath:a};let r=[...new Set((Array.isArray(t)?t:[t]).filter(l=>l!=="unknown"))],f=r.filter(l=>o.includes(l)),y=r.filter(l=>!o.includes(l)),g=f.filter(l=>{let u=m(c[l]);return typeof u.version!="string"||u.version.trim().length===0});return g.length>0?{gate:"env",status:"fail",summary:`${e?.hasRegisteredProjects?"Project runtime":"Workspace"}${g.length===1?"":"s"} (${g.join(", ")}) ${g.length===1?"is":"are"} not pinned in toolchain.lock`,details:g.map(u=>`Run workspai setup ${u} and workspai bootstrap to lock ${u} for this workspace.`),evidencePath:a}:y.length>0?{gate:"env",status:"warn",summary:`${e?.hasRegisteredProjects?"Project runtime":"Workspace"}${y.length===1?"":"s"} (${y.join(", ")}) cannot be verified by toolchain.lock`,details:[`Pinned Workspai runtimes (${s.join(", ")}) do not prove the ${y.join(", ")} compiler or runtime toolchain.`,"Declare and verify this runtime or toolchain through the project command contract or organization CI policy."],evidencePath:a}:{gate:"env",status:"pass",summary:`Pinned runtimes: ${s.join(", ")}`,details:[],evidencePath:a}}catch{return {gate:"env",status:"fail",summary:"toolchain.lock is invalid JSON",details:["Regenerate lockfile with workspai bootstrap."],evidencePath:a}}}function T(n){let t=E(n,"doctor-last-run.json");if(!d$1.existsSync(t))return {payload:null,path:t};try{let e=JSON.parse(d$1.readFileSync(t,"utf-8"));return c(e,"workspace")?(d$2(e),{payload:e,path:t}):{payload:null,path:t}}catch{return {payload:null,path:t}}}function Z(n){let t=T(n);if(!t.payload)return {gate:{gate:"doctor",status:"fail",summary:"Doctor evidence is missing",details:["Run workspai doctor workspace --json before release readiness checks."],evidencePath:t.path},payload:null};let e=a$1(t.payload);if(e.hasSystemErrors)return {gate:{gate:"doctor",status:"fail",summary:"Doctor reported system errors",details:["Resolve system-level doctor errors before proceeding."],evidencePath:t.path},payload:t.payload};if(e.blockingFindings>0)return {gate:{gate:"doctor",status:"fail",summary:`Doctor reported ${e.blockingFindings} blocking finding(s)`,details:["Resolve the canonical Doctor findings and regenerate fresh Doctor evidence."],evidencePath:t.path},payload:t.payload};let a=[...e.advisoryFindings>0?[`${e.advisoryFindings} advisory finding(s)`]:[],...e.unknownFindings>0?[`${e.unknownFindings} unknown finding(s)`]:[],...e.contradictionCount>0?[`${e.contradictionCount} evidence contradiction(s)`]:[],...e.missingDiagnosisProjects>0?[`${e.missingDiagnosisProjects} project(s) without canonical diagnosis`]:[],...e.staleEvidence?["stale Doctor evidence"]:[],...e.unknownFreshness?["unknown Doctor evidence freshness"]:[],...e.minimumDiagnosisCompleteness<100?[`diagnosis completeness ${e.minimumDiagnosisCompleteness}%`]:[]];return a.length>0?{gate:{gate:"doctor",status:"warn",summary:"Doctor evidence requires attention",details:a,evidencePath:t.path},payload:t.payload}:{gate:{gate:"doctor",status:"pass",summary:"Doctor checks passed without issues",details:[],evidencePath:t.path},payload:t.payload}}function ee(n){let t=E(n,"analyze-last-run.json");if(!d$1.existsSync(t))return {gate:"analyze",status:"fail",summary:"Analyze evidence is missing",details:["Run workspai analyze --json before release readiness checks."],evidencePath:t};try{let e=JSON.parse(d$1.readFileSync(t,"utf-8"));b$1(p$1.analyze,e,t);let a=m(e.summary),i=String(a.verdict??"").toLowerCase(),c=Number(a.score??0),o=m(a.findings),s=Number(o.fail??0);return i==="blocked"||s>0?{gate:"analyze",status:"fail",summary:`Analyze verdict is blocked (score ${c}/100)`,details:["Resolve analyze findings and regenerate analyze-last-run.json."],evidencePath:t}:i==="needs-attention"?{gate:"analyze",status:"warn",summary:`Analyze needs attention (score ${c}/100)`,details:["Review analyze warnings before release."],evidencePath:t}:{gate:"analyze",status:"pass",summary:`Analyze passed (score ${c}/100)`,details:[],evidencePath:t}}catch{return {gate:"analyze",status:"fail",summary:"Analyze evidence is invalid or violates its contract",details:["Re-run workspai analyze --json to regenerate evidence."],evidencePath:t}}}function te(n){try{let t=JSON.parse(d$1.readFileSync(n,"utf-8")),e=String(t.status??"").toLowerCase(),a=m(t.summary),i=Number(a.failedChecks??0);return e==="fail"||i>0?{gate:"verify",status:"fail",summary:"Verify-pack contract reports failed checks",details:["Fix failed verify checks and regenerate verify-pack contract evidence."],evidencePath:n}:e==="pass"?{gate:"verify",status:"pass",summary:"Verify-pack contract passed",details:[],evidencePath:n}:{gate:"verify",status:"warn",summary:"Verify-pack contract status is not explicit",details:["Ensure contract status is pass/fail and keep schema aligned with v1 contract."],evidencePath:n}}catch{return {gate:"verify",status:"fail",summary:"Verify-pack contract is invalid JSON",details:["Regenerate verify-pack contract artifact."],evidencePath:n}}}async function ne(n,t){if(t.skipVerify)return {gate:"verify",status:"pass",summary:"Verify gate skipped (--skip-verify)",details:["Verification was explicitly skipped for this readiness run."]};let e=[a$2(n,".workspai/reports"),h.join(n,".rapidkit","reports")],a=e[0],i=e.map(s=>J(s,[/verify-pack-contract/i,/^verify.*\.json$/i])).find(s=>typeof s=="string")??null;if(i)return te(i);let c=a$2(n,p$1.contractVerify),o=e.map(s=>J(s,[/workspace-contract-verify-last-run/i,/workspace-contract-verify/i])).find(s=>typeof s=="string")??null;if(o)try{let s=JSON.parse(d$1.readFileSync(o,"utf-8")),r=String(s.status??"").toLowerCase();if(r==="passed"||r==="pass")return {gate:"verify",status:"pass",summary:"Workspace contract verification passed (CLI cache)",details:[],evidencePath:o};if(r==="failed"||r==="fail")return {gate:"verify",status:"fail",summary:"Workspace contract verification failed (CLI cache)",details:(Array.isArray(s.violations)?s.violations:[]).slice(0,5),evidencePath:o}}catch{}try{let{verifyWorkspaceContract:s}=await import('./workspace-contract-3QUZDBMM.js'),r=await s({workspacePath:n}),f={schemaVersion:"v1",source:"cli",generatedAt:new Date().toISOString(),status:r.status,contractPath:r.contractPath,projectCount:r.projectCount,checks:r.checks,violations:r.violations};return await h$1(n,p$1.contractVerify,f),r.status==="failed"?{gate:"verify",status:"fail",summary:"Workspace contract verification failed (CLI)",details:r.violations.slice(0,5),evidencePath:c}:{gate:"verify",status:"pass",summary:"Workspace contract verification passed (CLI)",details:[],evidencePath:c}}catch(s){return {gate:"verify",status:"fail",summary:"No verify evidence and workspace contract verification unavailable",details:["Run workspai workspace contract verify --json or export verify-pack contract from CI.",s instanceof Error?s.message:String(s)],evidencePath:h.join(a,"*verify*.json")}}}function ae(n,t){let e=E(t,"doctor-last-run.json");if(!n)return {gate:"dependency",status:"warn",summary:"Dependency risk check skipped (doctor evidence missing)",details:["Run workspai doctor workspace --json to include dependency findings."],evidencePath:e};let a=b$2(n);return a.blockingFindings>0||a.vulnerableDependencies>0?{gate:"dependency",status:"fail",summary:U(a),details:["Resolve the typed dependency/security findings and regenerate focused audit evidence."],evidencePath:e}:a.auditFailed>0?{gate:"dependency",status:"fail",summary:`${a.auditFailed} dependency audit(s) failed`,details:["Repair the audit runner or dependency environment; failed audits are not clean."],evidencePath:e}:a.missingDependencies>0||a.auditUnavailable>0||a.unknownFindings>0||a.advisoryFindings>0?{gate:"dependency",status:"warn",summary:"Dependency evidence is incomplete or requires attention",details:[...a.missingDependencies>0?[`${a.missingDependencies} project(s) have no materialized dependency tree.`]:[],...a.auditUnavailable>0?[`${a.auditUnavailable} audit provider(s) are unavailable or unsupported.`]:[],...a.unknownFindings>0?[`${a.unknownFindings} dependency/security finding(s) remain unknown.`]:[],...a.advisoryFindings>0?[`${a.advisoryFindings} dependency/security advisory finding(s) remain.`]:[]],evidencePath:e}:{gate:"dependency",status:"pass",summary:"No dependency vulnerabilities reported",details:[],evidencePath:e}}function se(n){return n.some(t=>t.status==="fail")?"fail":n.some(t=>t.status==="warn")?"warn":"pass"}async function re(n,t){return h$1(n,H,t)}async function ie(n={}){let t=h.resolve(n.startPath??process.cwd()),e$1=a(t)??t,a$1=await X(e$1)>0,i=a$1&&b(t)?e$1:Q(t,e$1),c=i===e$1?"unknown":_(i),o=a$1?c:"unknown";if(a$1&&i===e$1){let{resolveWorkspaceRegisteredProjects:v}=await import('./workspace-registry-summary-M4WMFDQ4.js'),K=await v(e$1),C=B(e$1);o=(C.length>0?C:K.summary.projects.map(S=>d(e$1,S.relativePath))).map(S=>_(S));}let s=Y(e$1,o,{hasRegisteredProjects:a$1}),r=Z(e$1),f$1=ee(e$1),y=await ne(e$1,{skipVerify:n.skipVerify}),g=ae(r.payload,e$1),l=[s,r.gate,f$1,y,g],u=se(l),k={schemaVersion:q,generatedAt:new Date().toISOString(),workspacePath:e$1,projectPath:i,action:n.action,overallStatus:u,blocking:u==="fail",blockingReasons:l.filter(v=>v.status==="fail").map(v=>`${v.gate}: ${v.summary}`),gates:l};if(n.writeReport!==false){let v=f(k,{commandId:"workspaceReadiness",exitCode:u==="fail"?2:u==="warn"?1:0,generatedAt:k.generatedAt,blockers:k.blockingReasons,runId:e()});k.evidencePath=await re(e$1,v);}return k}function oe(n){return n==="pass"?p.green("PASS"):n==="warn"?p.yellow("WARN"):p.red("FAIL")}function ce(n){return n==="pass"?p.green("PASS"):n==="warn"?p.yellow("WARN"):p.red("FAIL")}async function je(n){let t=await ie({startPath:n.workspace,writeReport:true,skipVerify:n.skipVerify===true});if(n.json)console.log(JSON.stringify(t,null,2));else {console.log(p.bold.cyan(`
|
|
1
|
+
import {f,e}from'./chunk-XF65LQ6M.js';import {a as a$1,b as b$2}from'./chunk-X7FYEKLI.js';import {c,d as d$2}from'./chunk-N4B2M44I.js';import {a,b}from'./chunk-SVO2GGTV.js';import {j,i}from'./chunk-7HV4U2OV.js';import {d}from'./chunk-ROOPODG6.js';import {a as a$2,h as h$1}from'./chunk-BLEIUQL6.js';import {b as b$1}from'./chunk-VN2MKTQO.js';import {t}from'./chunk-VQZ5PI5J.js';import {q as q$1,p as p$1}from'./chunk-ODK4LCEL.js';import p from'chalk';import d$1 from'fs';import h from'path';var H=p$1.readiness;function U(n){return n.vulnerableDependencies>0?`${n.vulnerableDependencies} known dependency vulnerability finding(s) reported`:`${n.blockingFindings} blocking dependency/security finding(s) reported`}var q=q$1.readiness;function B(n){let t=A(n,"workspace.contract.json");if(!d$1.existsSync(t))return [];try{let e=JSON.parse(d$1.readFileSync(t,"utf-8"));return (Array.isArray(e.projects)?e.projects:[]).map(i=>{let c=m(i),o=typeof c.externalPath=="string"?c.externalPath.trim():"",s=typeof c.relativePath=="string"?c.relativePath.trim():"",r=o||s;return r?d(n,s||r,o?{absolutePath:o}:{}):""}).filter(Boolean)}catch{return []}}function Q(n,t){let e=h.resolve(n);if(!b(e))return e;let a=A(t,"workspace.contract.json");if(d$1.existsSync(a))try{let o=JSON.parse(d$1.readFileSync(a,"utf-8")),s=Array.isArray(o.projects)?o.projects:[];for(let r of s){let f=m(r),y=typeof f.externalPath=="string"?f.externalPath.trim():"",g=typeof f.relativePath=="string"?f.relativePath.trim():"";if(y||g)return d(t,g||y,y?{absolutePath:y}:{})}}catch{}let i=T(t),c=Array.isArray(i.payload?.projects)?i.payload.projects:[];for(let o of c){let s=m(o),r=typeof s.path=="string"?s.path.trim():"";if(r)return h.resolve(r)}return e}function _(n){let t=j(n);return i(t,n)}function J(n,t){if(!d$1.existsSync(n))return null;let e=d$1.readdirSync(n).filter(a=>a.endsWith(".json")&&t.some(i=>i.test(a))).map(a=>h.join(n,a));return e.length===0?null:(e.sort((a,i)=>d$1.statSync(i).mtimeMs-d$1.statSync(a).mtimeMs),e[0])}function m(n){return n&&typeof n=="object"&&!Array.isArray(n)?n:{}}function M(n){for(let t of n)if(d$1.existsSync(t))return t;return null}function A(n,...t$1){let e=t(n,...t$1);return M(e)??e[0]}function E(n,t){let e=a$2(n,`.workspai/reports/${t}`);return M([e,h.join(n,".rapidkit","reports",t)])??e}async function X(n){let{readWorkspaceRegistrySummary:t,resolveWorkspaceRegisteredProjects:e}=await import('./workspace-registry-summary-3PXZENLC.js'),a=await t(n);return a?a.projectCount:(await e(n)).summary.projectCount}function Y(n,t,e){let a=A(n,"toolchain.lock");if(!d$1.existsSync(a))return {gate:"env",status:"fail",summary:"toolchain.lock is missing",details:["Run workspai bootstrap to pin runtime versions and generate a reproducible toolchain."],evidencePath:a};try{let i=JSON.parse(d$1.readFileSync(a,"utf-8")),c=m(i.runtime),o=["python","node","go","java","dotnet","rust","php"],s=o.filter(l=>{let u=m(c[l]);return typeof u.version=="string"&&u.version.trim().length>0});if(s.length===0)return {gate:"env",status:"fail",summary:"No runtime versions are pinned in toolchain.lock",details:["Pin at least one runtime version via workspai setup <runtime> and re-run bootstrap."],evidencePath:a};let r=[...new Set((Array.isArray(t)?t:[t]).filter(l=>l!=="unknown"))],f=r.filter(l=>o.includes(l)),y=r.filter(l=>!o.includes(l)),g=f.filter(l=>{let u=m(c[l]);return typeof u.version!="string"||u.version.trim().length===0});return g.length>0?{gate:"env",status:"fail",summary:`${e?.hasRegisteredProjects?"Project runtime":"Workspace"}${g.length===1?"":"s"} (${g.join(", ")}) ${g.length===1?"is":"are"} not pinned in toolchain.lock`,details:g.map(u=>`Run workspai setup ${u} and workspai bootstrap to lock ${u} for this workspace.`),evidencePath:a}:y.length>0?{gate:"env",status:"warn",summary:`${e?.hasRegisteredProjects?"Project runtime":"Workspace"}${y.length===1?"":"s"} (${y.join(", ")}) cannot be verified by toolchain.lock`,details:[`Pinned Workspai runtimes (${s.join(", ")}) do not prove the ${y.join(", ")} compiler or runtime toolchain.`,"Declare and verify this runtime or toolchain through the project command contract or organization CI policy."],evidencePath:a}:{gate:"env",status:"pass",summary:`Pinned runtimes: ${s.join(", ")}`,details:[],evidencePath:a}}catch{return {gate:"env",status:"fail",summary:"toolchain.lock is invalid JSON",details:["Regenerate lockfile with workspai bootstrap."],evidencePath:a}}}function T(n){let t=E(n,"doctor-last-run.json");if(!d$1.existsSync(t))return {payload:null,path:t};try{let e=JSON.parse(d$1.readFileSync(t,"utf-8"));return c(e,"workspace")?(d$2(e),{payload:e,path:t}):{payload:null,path:t}}catch{return {payload:null,path:t}}}function Z(n){let t=T(n);if(!t.payload)return {gate:{gate:"doctor",status:"fail",summary:"Doctor evidence is missing",details:["Run workspai doctor workspace --json before release readiness checks."],evidencePath:t.path},payload:null};let e=a$1(t.payload);if(e.hasSystemErrors)return {gate:{gate:"doctor",status:"fail",summary:"Doctor reported system errors",details:["Resolve system-level doctor errors before proceeding."],evidencePath:t.path},payload:t.payload};if(e.blockingFindings>0)return {gate:{gate:"doctor",status:"fail",summary:`Doctor reported ${e.blockingFindings} blocking finding(s)`,details:["Resolve the canonical Doctor findings and regenerate fresh Doctor evidence."],evidencePath:t.path},payload:t.payload};let a=[...e.advisoryFindings>0?[`${e.advisoryFindings} advisory finding(s)`]:[],...e.unknownFindings>0?[`${e.unknownFindings} unknown finding(s)`]:[],...e.contradictionCount>0?[`${e.contradictionCount} evidence contradiction(s)`]:[],...e.missingDiagnosisProjects>0?[`${e.missingDiagnosisProjects} project(s) without canonical diagnosis`]:[],...e.staleEvidence?["stale Doctor evidence"]:[],...e.unknownFreshness?["unknown Doctor evidence freshness"]:[],...e.minimumDiagnosisCompleteness<100?[`diagnosis completeness ${e.minimumDiagnosisCompleteness}%`]:[]];return a.length>0?{gate:{gate:"doctor",status:"warn",summary:"Doctor evidence requires attention",details:a,evidencePath:t.path},payload:t.payload}:{gate:{gate:"doctor",status:"pass",summary:"Doctor checks passed without issues",details:[],evidencePath:t.path},payload:t.payload}}function ee(n){let t=E(n,"analyze-last-run.json");if(!d$1.existsSync(t))return {gate:"analyze",status:"fail",summary:"Analyze evidence is missing",details:["Run workspai analyze --json before release readiness checks."],evidencePath:t};try{let e=JSON.parse(d$1.readFileSync(t,"utf-8"));b$1(p$1.analyze,e,t);let a=m(e.summary),i=String(a.verdict??"").toLowerCase(),c=Number(a.score??0),o=m(a.findings),s=Number(o.fail??0);return i==="blocked"||s>0?{gate:"analyze",status:"fail",summary:`Analyze verdict is blocked (score ${c}/100)`,details:["Resolve analyze findings and regenerate analyze-last-run.json."],evidencePath:t}:i==="needs-attention"?{gate:"analyze",status:"warn",summary:`Analyze needs attention (score ${c}/100)`,details:["Review analyze warnings before release."],evidencePath:t}:{gate:"analyze",status:"pass",summary:`Analyze passed (score ${c}/100)`,details:[],evidencePath:t}}catch{return {gate:"analyze",status:"fail",summary:"Analyze evidence is invalid or violates its contract",details:["Re-run workspai analyze --json to regenerate evidence."],evidencePath:t}}}function te(n){try{let t=JSON.parse(d$1.readFileSync(n,"utf-8")),e=String(t.status??"").toLowerCase(),a=m(t.summary),i=Number(a.failedChecks??0);return e==="fail"||i>0?{gate:"verify",status:"fail",summary:"Verify-pack contract reports failed checks",details:["Fix failed verify checks and regenerate verify-pack contract evidence."],evidencePath:n}:e==="pass"?{gate:"verify",status:"pass",summary:"Verify-pack contract passed",details:[],evidencePath:n}:{gate:"verify",status:"warn",summary:"Verify-pack contract status is not explicit",details:["Ensure contract status is pass/fail and keep schema aligned with v1 contract."],evidencePath:n}}catch{return {gate:"verify",status:"fail",summary:"Verify-pack contract is invalid JSON",details:["Regenerate verify-pack contract artifact."],evidencePath:n}}}async function ne(n,t){if(t.skipVerify)return {gate:"verify",status:"pass",summary:"Verify gate skipped (--skip-verify)",details:["Verification was explicitly skipped for this readiness run."]};let e=[a$2(n,".workspai/reports"),h.join(n,".rapidkit","reports")],a=e[0],i=e.map(s=>J(s,[/verify-pack-contract/i,/^verify.*\.json$/i])).find(s=>typeof s=="string")??null;if(i)return te(i);let c=a$2(n,p$1.contractVerify),o=e.map(s=>J(s,[/workspace-contract-verify-last-run/i,/workspace-contract-verify/i])).find(s=>typeof s=="string")??null;if(o)try{let s=JSON.parse(d$1.readFileSync(o,"utf-8")),r=String(s.status??"").toLowerCase();if(r==="passed"||r==="pass")return {gate:"verify",status:"pass",summary:"Workspace contract verification passed (CLI cache)",details:[],evidencePath:o};if(r==="failed"||r==="fail")return {gate:"verify",status:"fail",summary:"Workspace contract verification failed (CLI cache)",details:(Array.isArray(s.violations)?s.violations:[]).slice(0,5),evidencePath:o}}catch{}try{let{verifyWorkspaceContract:s}=await import('./workspace-contract-N2BJCAJ7.js'),r=await s({workspacePath:n}),f={schemaVersion:"v1",source:"cli",generatedAt:new Date().toISOString(),status:r.status,contractPath:r.contractPath,projectCount:r.projectCount,checks:r.checks,violations:r.violations};return await h$1(n,p$1.contractVerify,f),r.status==="failed"?{gate:"verify",status:"fail",summary:"Workspace contract verification failed (CLI)",details:r.violations.slice(0,5),evidencePath:c}:{gate:"verify",status:"pass",summary:"Workspace contract verification passed (CLI)",details:[],evidencePath:c}}catch(s){return {gate:"verify",status:"fail",summary:"No verify evidence and workspace contract verification unavailable",details:["Run workspai workspace contract verify --json or export verify-pack contract from CI.",s instanceof Error?s.message:String(s)],evidencePath:h.join(a,"*verify*.json")}}}function ae(n,t){let e=E(t,"doctor-last-run.json");if(!n)return {gate:"dependency",status:"warn",summary:"Dependency risk check skipped (doctor evidence missing)",details:["Run workspai doctor workspace --json to include dependency findings."],evidencePath:e};let a=b$2(n);return a.blockingFindings>0||a.vulnerableDependencies>0?{gate:"dependency",status:"fail",summary:U(a),details:["Resolve the typed dependency/security findings and regenerate focused audit evidence."],evidencePath:e}:a.auditFailed>0?{gate:"dependency",status:"fail",summary:`${a.auditFailed} dependency audit(s) failed`,details:["Repair the audit runner or dependency environment; failed audits are not clean."],evidencePath:e}:a.missingDependencies>0||a.auditUnavailable>0||a.unknownFindings>0||a.advisoryFindings>0?{gate:"dependency",status:"warn",summary:"Dependency evidence is incomplete or requires attention",details:[...a.missingDependencies>0?[`${a.missingDependencies} project(s) have no materialized dependency tree.`]:[],...a.auditUnavailable>0?[`${a.auditUnavailable} audit provider(s) are unavailable or unsupported.`]:[],...a.unknownFindings>0?[`${a.unknownFindings} dependency/security finding(s) remain unknown.`]:[],...a.advisoryFindings>0?[`${a.advisoryFindings} dependency/security advisory finding(s) remain.`]:[]],evidencePath:e}:{gate:"dependency",status:"pass",summary:"No dependency vulnerabilities reported",details:[],evidencePath:e}}function se(n){return n.some(t=>t.status==="fail")?"fail":n.some(t=>t.status==="warn")?"warn":"pass"}async function re(n,t){return h$1(n,H,t)}async function ie(n={}){let t=h.resolve(n.startPath??process.cwd()),e$1=a(t)??t,a$1=await X(e$1)>0,i=a$1&&b(t)?e$1:Q(t,e$1),c=i===e$1?"unknown":_(i),o=a$1?c:"unknown";if(a$1&&i===e$1){let{resolveWorkspaceRegisteredProjects:v}=await import('./workspace-registry-summary-3PXZENLC.js'),K=await v(e$1),C=B(e$1);o=(C.length>0?C:K.summary.projects.map(S=>d(e$1,S.relativePath))).map(S=>_(S));}let s=Y(e$1,o,{hasRegisteredProjects:a$1}),r=Z(e$1),f$1=ee(e$1),y=await ne(e$1,{skipVerify:n.skipVerify}),g=ae(r.payload,e$1),l=[s,r.gate,f$1,y,g],u=se(l),k={schemaVersion:q,generatedAt:new Date().toISOString(),workspacePath:e$1,projectPath:i,action:n.action,overallStatus:u,blocking:u==="fail",blockingReasons:l.filter(v=>v.status==="fail").map(v=>`${v.gate}: ${v.summary}`),gates:l};if(n.writeReport!==false){let v=f(k,{commandId:"workspaceReadiness",exitCode:u==="fail"?2:u==="warn"?1:0,generatedAt:k.generatedAt,blockers:k.blockingReasons,runId:e()});k.evidencePath=await re(e$1,v);}return k}function oe(n){return n==="pass"?p.green("PASS"):n==="warn"?p.yellow("WARN"):p.red("FAIL")}function ce(n){return n==="pass"?p.green("PASS"):n==="warn"?p.yellow("WARN"):p.red("FAIL")}async function je(n){let t=await ie({startPath:n.workspace,writeReport:true,skipVerify:n.skipVerify===true});if(n.json)console.log(JSON.stringify(t,null,2));else {console.log(p.bold.cyan(`
|
|
2
2
|
\u{1F6A6} Workspai Release Readiness
|
|
3
3
|
`)),console.log(p.bold(`Workspace: ${p.cyan(h.basename(t.workspacePath))}`)),console.log(p.gray(`Path: ${t.workspacePath}`)),console.log(`Overall: ${ce(t.overallStatus)}`);for(let e of t.gates){console.log(` - ${e.gate}: ${oe(e.status)} ${e.summary}`);for(let a of e.details)console.log(p.gray(` ${a}`));e.evidencePath&&console.log(p.gray(` evidence: ${e.evidencePath}`));}t.evidencePath&&console.log(p.gray(`
|
|
4
4
|
Evidence saved: ${t.evidencePath}`));}n.strict&&t.overallStatus!=="pass"&&process.exit(1);}export{ie as a,je as b};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {b as b$1}from'./chunk-COICGD62.js';import {b}from'./chunk-HRVHQBTA.js';import {r,f,g}from'./chunk-SEZTSMRR.js';import {d}from'./chunk-IHWS3ALP.js';import {h,g as g$1}from'./chunk-BLEIUQL6.js';import {q,p}from'./chunk-ODK4LCEL.js';import E from'path';import A from'fs-extra';var re=q.agentContext,se=p.agentContext;function ne(e){if(typeof e!="string"||!e.trim()||e==="true")return "generic";let t=e.trim().toLowerCase();return t==="codex"||t==="claude"||t==="cursor"||t==="gemini"||t==="qwen"||t==="kimi"||t==="grok"||t==="copilot"||t==="windsurf"||t==="amazon-q"||t==="orca"?t:"generic"}function G(e){return `npx --yes --package workspai workspai ${e}`.trim()}function x(e){return `npx workspai ${e}`.trim()}async function C(e,t,i){let s=E.join(e,t);if(!await A.pathExists(s))return null;try{let n=await A.readJson(s);return typeof n!="object"||n===null||!("schemaVersion"in n)||n.schemaVersion!==i?null:n}catch{return null}}function m(e){return {id:e.id,scope:e.scope,display:x(e.args),execute:G(e.args),description:e.description,...e.project?{project:e.project}:{},freshness:f({id:`command.${e.id}`,label:`${e.id} command`,scope:"command",value:{display:x(e.args),execute:G(e.args)},...e.project?{project:e.project}:{},freshness:{kind:"derived",category:"structure",generatedAt:e.generatedAt,now:e.now,sourceArtifact:p.model,sourcePath:`safeCommands.${e.id}`,reason:"Safe command surfaces are derived from workspace model command capabilities."}}).freshness}}function L(e,t){return `workspace run ${t} --scope project:${e.name}`}function ae(e){return (e.startsWith("project:")?e.slice(8):e).trim().toLowerCase()}function oe(e){return [e.name,e.path,E.basename(e.path),e.absolutePath].filter(t=>typeof t=="string"&&t.trim().length>0).map(t=>t.trim().toLowerCase())}function ie(e,t,i){let s={generatedAt:e.generatedAt,now:i},n=[m({id:"workspace.model",scope:"workspace",args:"workspace model --json",description:"Read the canonical workspace intelligence model.",...s}),m({id:"workspace.graph.entities",scope:"workspace",args:"workspace graph entities --json",description:"Query proof-backed workspace entities without loading the full graph.",...s}),m({id:"workspace.graph.evidence",scope:"workspace",args:"workspace graph evidence <entity-or-relation> --json",description:"Resolve portable evidence for a graph entity or relation.",...s}),m({id:"workspace.graph.path",scope:"workspace",args:"workspace graph path <from> <to> --json",description:"Find a shortest proof-carrying path between workspace entities.",...s}),m({id:"workspace.doctor",scope:"workspace",args:"doctor workspace --json",description:"Check workspace health before claiming verification.",...s}),m({id:"workspace.pipeline",scope:"workspace",args:"pipeline --json",description:"Run the governed sync, doctor, analyze, readiness, and autopilot loop.",...s}),m({id:"workspace.contract.verify",scope:"workspace",args:"workspace contract verify --json",description:"Verify workspace contract and dependency edges.",...s}),m({id:"workspace.verify",scope:"workspace",args:"workspace verify --json",description:"Evaluate evidence freshness and verification gates before release decisions.",...s})],c=t?[t]:e.projects;for(let a of c)a.commands.fleetStages.includes("test")&&n.push(m({id:`project.${a.name}.test`,scope:"project",project:a.name,args:L(a,"test"),description:`Run tests for ${a.name} through workspace orchestration.`,...s})),a.commands.fleetStages.includes("build")&&n.push(m({id:`project.${a.name}.build`,scope:"project",project:a.name,args:L(a,"build"),description:`Build ${a.name} through workspace orchestration.`,...s}));return n}function ce(e){return e.commands.fleetStages.filter(t=>t==="test"||t==="build").map(t=>`workspace run ${t}`)}function pe(e,t){if(!t?.startsWith("project:"))return;let i=ae(t);if(i)return e.projects.find(s=>oe(s).includes(i))}function de(e,t,i){let s=[...e.validation?.issues??[]];t?.startsWith("project:")&&!i&&s.push({severity:"error",code:"context.scope.project.missing",message:`Requested project scope was not found: ${t}`,target:t});let n=s.filter(a=>a.severity==="error").length,c=s.filter(a=>a.severity==="warning").length;return {status:n>0?"failed":c>0?"warning":"passed",errors:n,warnings:c,issues:s}}async function me(e,t){let i=[],s=[];for(let[n,c]of Object.entries(e.evidence))c&&await g$1(t,c.path)!==null?i.push(`${n}: ${c.path}`):s.push(n);return {available:i.sort(),missing:s.sort()}}function le(e){let t=e.summary.projectCount,i=e.summary.runtimes.length?`${e.summary.runtimes.join(", ")} runtime coverage`:"no runtime coverage",s=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"}, ${i}, and ${s}.`}function ge(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.extendedProjects??0)>0||e.summary.observedProjects>0)&&t.push("Some projects use extended or observed support tiers; command coverage may be partial."),t}async function We(e){let t=e.model??await r({workspacePath:e.workspacePath,includeEvidence:e.includeEvidence===true,observableScanDepth:e.observableScanDepth,now:e.now}),i=ne(e.agent),s=pe(t,e.scope),n=de(t,e.scope,s);if(e.strict===true&&n.status!=="passed"){let r=n.issues.map(g=>`${g.severity}:${g.code}:${g.target}`).join(", ");throw new Error(`Workspace context strict validation failed: ${r}`)}let c=e.now??new Date,a=t.facts??[],K=new Set((s?[s]:t.projects).map(r=>r.name)),R=a.filter(r=>r.project?K.has(r.project):true),H=(s?[s]:t.projects).map(r=>{let g=R.filter(p=>p.project===r.name);return {name:r.name,path:r.path,kind:r.kind,category:r.category,runtime:r.runtime,framework:r.frameworkDisplayName,...r.generator?{generator:r.generator}:{},createCapability:r.createCapability,supportTier:r.supportTier,...r.governance?{governance:r.governance}:{},safeCommands:ce(r),importantFiles:r.importantFiles,facts:g}}),S=await me(t,e.workspacePath),F=E.join(e.workspacePath,p.knowledgeGraph),u=await A.pathExists(F)?await A.readJson(F).catch(()=>null):null,N=false;if(u?.schemaVersion===q.knowledgeGraph)try{b(u,t),N=true;}catch{}let $=le(t),M=ie(t,s,c),b$2=await C(e.workspacePath,p.impact,q.impact),l=await C(e.workspacePath,p.doctor,q.doctor),v=await C(e.workspacePath,p.analyze,q.analyze),k=await C(e.workspacePath,p.readiness,q.readiness),h=await C(e.workspacePath,p.verify,q.verify),w=await C(e.workspacePath,p.explain,q.explain),f$1=await C(e.workspacePath,p.diff,q.diff),B=b$2?.summary?{changed:b$2.summary.changed,risk:b$2.summary.risk,affectedProjects:b$2.summary.affectedProjects,blastRadius:b$2.summary.blastRadius,recommendedCommands:b$2.summary.recommendedCommands}:void 0,U=l?.summary?{verdict:l.summary.verdict,totalIssues:l.summary.totalIssues,advisoryFindings:l.summary.advisoryFindings,blockingFindings:l.summary.blockingFindings,unknownFindings:l.summary.unknownFindings,hasSystemErrors:l.summary.hasSystemErrors,topSignals:(()=>{let r=Array.isArray(l.projects)?l.projects:[],g=[];for(let p of r.slice(0,6)){let te=Array.isArray(p.probes)?p.probes:[];for(let y of te.slice(0,10))(y?.status==="fail"||y?.severity==="error")&&g.push({label:y.label,scope:y.scope,issueClass:y.issueClass,status:y.status,severity:y.severity,recommendation:y.recommendation});}return g.slice(0,8)})()}:void 0,J=v?.summary?{score:v.summary.score,verdict:v.summary.verdict,findingCounts:v.summary.findings,topFindings:(Array.isArray(v.findings)?v.findings:[]).filter(p=>p?.severity==="fail"||p?.severity==="warn").slice(0,8).map(p=>({severity:p.severity,title:p.title,target:p.target,remediation:p.remediation}))}:void 0,X=k?{overallStatus:k.overallStatus,blocking:k.blocking,blockingReasons:k.blockingReasons,evidencePath:k.evidencePath,gates:Array.isArray(k.gates)?k.gates.slice(0,6).map(r=>({gate:r.gate,status:r.status,summary:r.summary})):void 0}:void 0,Q=h?.summary?{verdict:h.summary.verdict,exitCode:h.summary.exitCode,stepsFailed:h.summary.stepsFailed,stepsMissing:h.summary.stepsMissing,blockingReasons:h.blockingReasons,missingEvidence:h.missingEvidence}:void 0,Y=w?{summary:w.summary,blockingReasons:w.blockingReasons,releaseVerdict:w.releaseVerdict,evidenceFreshness:w.evidenceFreshness,sections:Array.isArray(w.sections)?w.sections.slice(0,4).map(r=>({id:r.id,title:r.title,body:r.body})):void 0}:void 0,Z=f$1?.summary?{changed:f$1.summary.changed,addedProjects:f$1.summary.addedProjects,removedProjects:f$1.summary.removedProjects,changedProjects:f$1.summary.changedProjects,workspaceChanges:f$1.summary.workspaceChanges,validationChanges:f$1.summary.validationChanges,gitChangedFiles:f$1.summary.gitChangedFiles}:void 0,ee=M.map(r=>f({id:`context.command.${r.id}`,label:`${r.id} safe command`,scope:"command",value:{display:r.display,execute:r.execute,scope:r.scope},...r.project?{project:r.project}:{},freshness:{kind:"derived",category:"structure",generatedAt:t.generatedAt,now:c,sourceArtifact:p.agentContext,sourcePath:`safeCommands.${r.id}`,reason:"Context safe commands are derived from workspace model command capabilities."}})),I=[...R,...ee],W=g({facts:I,generatedAt:c.toISOString(),now:c}),j=b$1();return {schemaVersion:re,generatedAt:c.toISOString(),agent:i,workspaceSummary:$,modelRef:p.model,knowledgeGraph:{artifact:p.knowledgeGraph,schemaVersion:q.knowledgeGraph,available:N,...typeof u?.quality?.entityCount=="number"?{entityCount:u.quality.entityCount}:{},...typeof u?.quality?.relationCount=="number"?{relationCount:u.quality.relationCount}:{},...typeof u?.quality?.proofCount=="number"?{proofCount:u.quality.proofCount}:{},queryCommands:[x("workspace graph search <query> --limit 12 --json"),x("workspace graph entities [kind] --json"),x("workspace graph evidence <entity-or-relation> --json"),x("workspace graph path <from> <to> --json")]},intelligenceChain:{schemaVersion:j.schemaVersion,contractPath:j.contractPath,currentStep:"context",canonicalReadOrder:[...j.consumers.agents.canonicalReadOrder]},workspace:{name:t.workspace.name,root:`workspace:${t.workspace.name}`,type:t.identity.workspaceType,...t.workspace.profile?{profile:t.workspace.profile}:{}},scope:{requested:e.scope??"workspace",...s?{activeProject:s.name}:{}},projects:H,safeCommands:M,facts:I,factFreshness:W,evidence:S,policies:{mode:t.policies.mode,source:t.policies.source},contracts:{exists:t.contracts.exists,path:t.contracts.workspaceContractPath},validation:n,agentInstructions:[`Read \`${p.agentIndex}\` first, then this context pack and linked evidence reports.`,"Use `workspace graph search <query> --limit 12 --json` for bounded, proof-backed retrieval before loading the full graph.",`Load \`${p.knowledgeGraph}\` only when a complete graph export is explicitly required.`,"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.","Treat `facts[].freshness.verifyBeforeUse` as a hard refresh requirement before using that fact in advice, fixes, or release decisions.","Do not carry extracted facts beyond their freshness contract; re-read or regenerate evidence when the contract says stale, unknown, live, or verify-before-use.","Keep project-scoped advice tied to the active project scope.","Regenerate stale grounding with `npx workspai workspace agent-sync --write --refresh-context`."],unsafeAssumptions:[...ge(t),...W.verifyBeforeUseFacts>0?[`${W.verifyBeforeUseFacts} fact(s) require verification before use; do not treat them as durable workspace structure.`]:[]],humanSummary:[$,`Evidence available: ${S.available.length}. Missing evidence groups: ${S.missing.join(", ")||"none"}.`,s?`Active project scope: ${s.name} (${s.frameworkDisplayName}).`:"Scope: whole workspace."].join(`
|
|
1
|
+
import {b as b$1}from'./chunk-COICGD62.js';import {b}from'./chunk-R7R5FX4B.js';import {r,f,g}from'./chunk-O4TZKLEC.js';import {d}from'./chunk-WU5M6UP7.js';import {h,g as g$1}from'./chunk-BLEIUQL6.js';import {q,p}from'./chunk-ODK4LCEL.js';import E from'path';import A from'fs-extra';var re=q.agentContext,se=p.agentContext;function ne(e){if(typeof e!="string"||!e.trim()||e==="true")return "generic";let t=e.trim().toLowerCase();return t==="codex"||t==="claude"||t==="cursor"||t==="gemini"||t==="qwen"||t==="kimi"||t==="grok"||t==="copilot"||t==="windsurf"||t==="amazon-q"||t==="orca"?t:"generic"}function G(e){return `npx --yes --package workspai workspai ${e}`.trim()}function x(e){return `npx workspai ${e}`.trim()}async function C(e,t,i){let s=E.join(e,t);if(!await A.pathExists(s))return null;try{let n=await A.readJson(s);return typeof n!="object"||n===null||!("schemaVersion"in n)||n.schemaVersion!==i?null:n}catch{return null}}function m(e){return {id:e.id,scope:e.scope,display:x(e.args),execute:G(e.args),description:e.description,...e.project?{project:e.project}:{},freshness:f({id:`command.${e.id}`,label:`${e.id} command`,scope:"command",value:{display:x(e.args),execute:G(e.args)},...e.project?{project:e.project}:{},freshness:{kind:"derived",category:"structure",generatedAt:e.generatedAt,now:e.now,sourceArtifact:p.model,sourcePath:`safeCommands.${e.id}`,reason:"Safe command surfaces are derived from workspace model command capabilities."}}).freshness}}function L(e,t){return `workspace run ${t} --scope project:${e.name}`}function ae(e){return (e.startsWith("project:")?e.slice(8):e).trim().toLowerCase()}function oe(e){return [e.name,e.path,E.basename(e.path),e.absolutePath].filter(t=>typeof t=="string"&&t.trim().length>0).map(t=>t.trim().toLowerCase())}function ie(e,t,i){let s={generatedAt:e.generatedAt,now:i},n=[m({id:"workspace.model",scope:"workspace",args:"workspace model --json",description:"Read the canonical workspace intelligence model.",...s}),m({id:"workspace.graph.entities",scope:"workspace",args:"workspace graph entities --json",description:"Query proof-backed workspace entities without loading the full graph.",...s}),m({id:"workspace.graph.evidence",scope:"workspace",args:"workspace graph evidence <entity-or-relation> --json",description:"Resolve portable evidence for a graph entity or relation.",...s}),m({id:"workspace.graph.path",scope:"workspace",args:"workspace graph path <from> <to> --json",description:"Find a shortest proof-carrying path between workspace entities.",...s}),m({id:"workspace.doctor",scope:"workspace",args:"doctor workspace --json",description:"Check workspace health before claiming verification.",...s}),m({id:"workspace.pipeline",scope:"workspace",args:"pipeline --json",description:"Run the governed sync, doctor, analyze, readiness, and autopilot loop.",...s}),m({id:"workspace.contract.verify",scope:"workspace",args:"workspace contract verify --json",description:"Verify workspace contract and dependency edges.",...s}),m({id:"workspace.verify",scope:"workspace",args:"workspace verify --json",description:"Evaluate evidence freshness and verification gates before release decisions.",...s})],c=t?[t]:e.projects;for(let a of c)a.commands.fleetStages.includes("test")&&n.push(m({id:`project.${a.name}.test`,scope:"project",project:a.name,args:L(a,"test"),description:`Run tests for ${a.name} through workspace orchestration.`,...s})),a.commands.fleetStages.includes("build")&&n.push(m({id:`project.${a.name}.build`,scope:"project",project:a.name,args:L(a,"build"),description:`Build ${a.name} through workspace orchestration.`,...s}));return n}function ce(e){return e.commands.fleetStages.filter(t=>t==="test"||t==="build").map(t=>`workspace run ${t}`)}function pe(e,t){if(!t?.startsWith("project:"))return;let i=ae(t);if(i)return e.projects.find(s=>oe(s).includes(i))}function de(e,t,i){let s=[...e.validation?.issues??[]];t?.startsWith("project:")&&!i&&s.push({severity:"error",code:"context.scope.project.missing",message:`Requested project scope was not found: ${t}`,target:t});let n=s.filter(a=>a.severity==="error").length,c=s.filter(a=>a.severity==="warning").length;return {status:n>0?"failed":c>0?"warning":"passed",errors:n,warnings:c,issues:s}}async function me(e,t){let i=[],s=[];for(let[n,c]of Object.entries(e.evidence))c&&await g$1(t,c.path)!==null?i.push(`${n}: ${c.path}`):s.push(n);return {available:i.sort(),missing:s.sort()}}function le(e){let t=e.summary.projectCount,i=e.summary.runtimes.length?`${e.summary.runtimes.join(", ")} runtime coverage`:"no runtime coverage",s=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"}, ${i}, and ${s}.`}function ge(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.extendedProjects??0)>0||e.summary.observedProjects>0)&&t.push("Some projects use extended or observed support tiers; command coverage may be partial."),t}async function We(e){let t=e.model??await r({workspacePath:e.workspacePath,includeEvidence:e.includeEvidence===true,observableScanDepth:e.observableScanDepth,now:e.now}),i=ne(e.agent),s=pe(t,e.scope),n=de(t,e.scope,s);if(e.strict===true&&n.status!=="passed"){let r=n.issues.map(g=>`${g.severity}:${g.code}:${g.target}`).join(", ");throw new Error(`Workspace context strict validation failed: ${r}`)}let c=e.now??new Date,a=t.facts??[],K=new Set((s?[s]:t.projects).map(r=>r.name)),R=a.filter(r=>r.project?K.has(r.project):true),H=(s?[s]:t.projects).map(r=>{let g=R.filter(p=>p.project===r.name);return {name:r.name,path:r.path,kind:r.kind,category:r.category,runtime:r.runtime,framework:r.frameworkDisplayName,...r.generator?{generator:r.generator}:{},createCapability:r.createCapability,supportTier:r.supportTier,...r.governance?{governance:r.governance}:{},safeCommands:ce(r),importantFiles:r.importantFiles,facts:g}}),S=await me(t,e.workspacePath),F=E.join(e.workspacePath,p.knowledgeGraph),u=await A.pathExists(F)?await A.readJson(F).catch(()=>null):null,N=false;if(u?.schemaVersion===q.knowledgeGraph)try{b(u,t),N=true;}catch{}let $=le(t),M=ie(t,s,c),b$2=await C(e.workspacePath,p.impact,q.impact),l=await C(e.workspacePath,p.doctor,q.doctor),v=await C(e.workspacePath,p.analyze,q.analyze),k=await C(e.workspacePath,p.readiness,q.readiness),h=await C(e.workspacePath,p.verify,q.verify),w=await C(e.workspacePath,p.explain,q.explain),f$1=await C(e.workspacePath,p.diff,q.diff),B=b$2?.summary?{changed:b$2.summary.changed,risk:b$2.summary.risk,affectedProjects:b$2.summary.affectedProjects,blastRadius:b$2.summary.blastRadius,recommendedCommands:b$2.summary.recommendedCommands}:void 0,U=l?.summary?{verdict:l.summary.verdict,totalIssues:l.summary.totalIssues,advisoryFindings:l.summary.advisoryFindings,blockingFindings:l.summary.blockingFindings,unknownFindings:l.summary.unknownFindings,hasSystemErrors:l.summary.hasSystemErrors,topSignals:(()=>{let r=Array.isArray(l.projects)?l.projects:[],g=[];for(let p of r.slice(0,6)){let te=Array.isArray(p.probes)?p.probes:[];for(let y of te.slice(0,10))(y?.status==="fail"||y?.severity==="error")&&g.push({label:y.label,scope:y.scope,issueClass:y.issueClass,status:y.status,severity:y.severity,recommendation:y.recommendation});}return g.slice(0,8)})()}:void 0,J=v?.summary?{score:v.summary.score,verdict:v.summary.verdict,findingCounts:v.summary.findings,topFindings:(Array.isArray(v.findings)?v.findings:[]).filter(p=>p?.severity==="fail"||p?.severity==="warn").slice(0,8).map(p=>({severity:p.severity,title:p.title,target:p.target,remediation:p.remediation}))}:void 0,X=k?{overallStatus:k.overallStatus,blocking:k.blocking,blockingReasons:k.blockingReasons,evidencePath:k.evidencePath,gates:Array.isArray(k.gates)?k.gates.slice(0,6).map(r=>({gate:r.gate,status:r.status,summary:r.summary})):void 0}:void 0,Q=h?.summary?{verdict:h.summary.verdict,exitCode:h.summary.exitCode,stepsFailed:h.summary.stepsFailed,stepsMissing:h.summary.stepsMissing,blockingReasons:h.blockingReasons,missingEvidence:h.missingEvidence}:void 0,Y=w?{summary:w.summary,blockingReasons:w.blockingReasons,releaseVerdict:w.releaseVerdict,evidenceFreshness:w.evidenceFreshness,sections:Array.isArray(w.sections)?w.sections.slice(0,4).map(r=>({id:r.id,title:r.title,body:r.body})):void 0}:void 0,Z=f$1?.summary?{changed:f$1.summary.changed,addedProjects:f$1.summary.addedProjects,removedProjects:f$1.summary.removedProjects,changedProjects:f$1.summary.changedProjects,workspaceChanges:f$1.summary.workspaceChanges,validationChanges:f$1.summary.validationChanges,gitChangedFiles:f$1.summary.gitChangedFiles}:void 0,ee=M.map(r=>f({id:`context.command.${r.id}`,label:`${r.id} safe command`,scope:"command",value:{display:r.display,execute:r.execute,scope:r.scope},...r.project?{project:r.project}:{},freshness:{kind:"derived",category:"structure",generatedAt:t.generatedAt,now:c,sourceArtifact:p.agentContext,sourcePath:`safeCommands.${r.id}`,reason:"Context safe commands are derived from workspace model command capabilities."}})),I=[...R,...ee],W=g({facts:I,generatedAt:c.toISOString(),now:c}),j=b$1();return {schemaVersion:re,generatedAt:c.toISOString(),agent:i,workspaceSummary:$,modelRef:p.model,knowledgeGraph:{artifact:p.knowledgeGraph,schemaVersion:q.knowledgeGraph,available:N,...typeof u?.quality?.entityCount=="number"?{entityCount:u.quality.entityCount}:{},...typeof u?.quality?.relationCount=="number"?{relationCount:u.quality.relationCount}:{},...typeof u?.quality?.proofCount=="number"?{proofCount:u.quality.proofCount}:{},queryCommands:[x("workspace graph search <query> --limit 12 --json"),x("workspace graph entities [kind] --json"),x("workspace graph evidence <entity-or-relation> --json"),x("workspace graph path <from> <to> --json")]},intelligenceChain:{schemaVersion:j.schemaVersion,contractPath:j.contractPath,currentStep:"context",canonicalReadOrder:[...j.consumers.agents.canonicalReadOrder]},workspace:{name:t.workspace.name,root:`workspace:${t.workspace.name}`,type:t.identity.workspaceType,...t.workspace.profile?{profile:t.workspace.profile}:{}},scope:{requested:e.scope??"workspace",...s?{activeProject:s.name}:{}},projects:H,safeCommands:M,facts:I,factFreshness:W,evidence:S,policies:{mode:t.policies.mode,source:t.policies.source},contracts:{exists:t.contracts.exists,path:t.contracts.workspaceContractPath},validation:n,agentInstructions:[`Read \`${p.agentIndex}\` first, then this context pack and linked evidence reports.`,"Use `workspace graph search <query> --limit 12 --json` for bounded, proof-backed retrieval before loading the full graph.",`Load \`${p.knowledgeGraph}\` only when a complete graph export is explicitly required.`,"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.","Treat `facts[].freshness.verifyBeforeUse` as a hard refresh requirement before using that fact in advice, fixes, or release decisions.","Do not carry extracted facts beyond their freshness contract; re-read or regenerate evidence when the contract says stale, unknown, live, or verify-before-use.","Keep project-scoped advice tied to the active project scope.","Regenerate stale grounding with `npx workspai workspace agent-sync --write --refresh-context`."],unsafeAssumptions:[...ge(t),...W.verifyBeforeUseFacts>0?[`${W.verifyBeforeUseFacts} fact(s) require verification before use; do not treat them as durable workspace structure.`]:[]],humanSummary:[$,`Evidence available: ${S.available.length}. Missing evidence groups: ${S.missing.join(", ")||"none"}.`,s?`Active project scope: ${s.name} (${s.frameworkDisplayName}).`:"Scope: whole workspace."].join(`
|
|
2
2
|
`),impactSummary:B,doctorSummary:U,analyzeSummary:J,readinessSummary:X,verifySummary:Q,explainSummary:Y,diffSummary:Z}}async function je(e,t){return h(t,se,d(e))}export{re as a,se as b,We as c,je as d};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {f,e,h as h$1,g}from'./chunk-XF65LQ6M.js';import {a,b}from'./chunk-SVO2GGTV.js';import {b as b$1,c as c$1}from'./chunk-
|
|
1
|
+
import {f,e,h as h$1,g}from'./chunk-XF65LQ6M.js';import {a,b}from'./chunk-SVO2GGTV.js';import {b as b$1,c as c$1}from'./chunk-RQXZF7BZ.js';import {a as a$1}from'./chunk-NMXGSVMD.js';import {p,a as a$2}from'./chunk-WU5M6UP7.js';import {k as k$2,m,l}from'./chunk-7EMG3C3H.js';import {h}from'./chunk-BLEIUQL6.js';import {k,t,u}from'./chunk-VQZ5PI5J.js';import {p as p$1,q}from'./chunk-ODK4LCEL.js';import k$1 from'fs';import c from'path';import s from'chalk';var ee=new Set([".git",".workspai",".rapidkit",".venv","node_modules","dist","build","target","coverage","htmlcov",".next"]);async function E(e){try{return await k$1.promises.access(e,k$1.constants.F_OK),true}catch{return false}}async function F(e){try{let n=JSON.parse(await k$1.promises.readFile(e,"utf-8"));return n&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}async function C(e){try{return await k$1.promises.readFile(e,"utf-8")}catch{return ""}}function re(e){return a(e)}async function oe(e,n){return await ne([...u(e,"project.json"),...u(e,"context.json")])?true:b(e)?false:c.resolve(e)===c.resolve(n)?k$2(e).length>0:k$2(e).length>0}async function ie(e){let n=await a$1(e,{skipDirs:ee,includeHiddenDirs:false,descendIntoMatchedProjects:false,isProjectDir:oe}),o=(await a$2(e)).filter(i=>i.relationship==="adopted"||i.source==="adopted-local").map(i=>c.resolve(i.path)).filter(i=>k$1.existsSync(i)),r=[...new Set([...n.map(i=>c.resolve(i)),...o])];return r.length>0?r:b(e)?[]:k$2(e).length>0?[e]:[]}function ae(e,n){return c.relative(e,n).replace(/\\/g,"/")||"."}async function T(e,n){for(let t of n)if(await E(c.join(e,t)))return true;return false}async function se(e,n,t=4){let o=async(r,i)=>{if(i>t)return false;let l;try{l=await k$1.promises.readdir(r,{withFileTypes:true});}catch{return false}for(let a of l)if(a.isFile()&&n.has(a.name.toLowerCase())||a.isDirectory()&&!a.isSymbolicLink()&&!ee.has(a.name)&&await o(c.join(r,a.name),i+1))return true;return false};return o(e,0)}async function ne(e){for(let n of e)if(await E(n))return true;return false}async function te(e){for(let n of e){let t=await F(n);if(t)return t}return null}async function ce(e,n){if(await T(e,[".env",".env.local"]))return true;let t=n?.contracts&&typeof n.contracts=="object"?n.contracts:null;if(Array.isArray(t?.env)&&t.env.length>0)return true;let o=await F(c.join(e,"package.json")),r={...o?.dependencies??{},...o?.devDependencies??{}};if(Object.keys(r).some(a=>/^(?:dotenv|dotenv-flow|env-cmd)$/iu.test(a)))return true;let i=await C(c.join(e,"pyproject.toml"));if(/\b(?:python-dotenv|pydantic-settings)\b/iu.test(i))return true;let l=[await C(c.join(e,"compose.yaml")),await C(c.join(e,"compose.yml")),await C(c.join(e,"docker-compose.yml")),await C(c.join(e,"docker-compose.yaml"))].join(`
|
|
2
2
|
`);return /^\s*(?:env_file|environment)\s*:/imu.test(l)}async function de(e){return (await g(e)).detected}async function le(e){let n=await F(c.join(e,"package.json")),t=n?.scripts&&typeof n.scripts=="object"?n.scripts:{};return Object.keys(t).sort()}function w(e,n,t,o,r,i,l){return {id:e,severity:n,target:t,title:o,detail:r,remediation:i,...l&&l.length>0?{files:[...l]}:{}}}function pe(e){let n=e.reduce((t,o)=>o.severity==="fail"?t+28:o.severity==="warn"?t+12:t+3,0);return Math.max(0,100-n)}async function ue(e,n,t){let o=await te(u(n,"project.json")),r=m(n,o),i=l(n),l$1=r.runtime==="unknown"?i[0]||"unknown":r.runtime,a=[l$1,...i.filter(G=>G!==l$1)],u$1=r.key==="unknown"&&new Set(a.filter(G=>G!=="unknown")).size>1,b=await b$1(n,o,{runtime:l$1,framework:r.key}),m$1=["backend","service","worker","agent"].includes(b),h=["backend","service","worker"].includes(b),v=m$1&&/^(?:fastapi|django|flask|nestjs|express|fastify|springboot|gofiber|gogin|dotnet-webapi|laravel|rails|phoenix|axum|actix|rocket)$/u.test(r.key),j=ae(e,n),f=j,$=await le(n),P=await ne([...u(n,"project.json"),...u(n,"context.json")]),x=await de(n),R=await T(n,["Dockerfile","dockerfile"]),g=await T(n,[".env.example","env.example","config/env.example"])||await se(n,new Set([".env.example","env.example"])),p=await ce(n,o),d=await c$1({projectPath:n,declaration:t?.governance}),z=d.ci.status==="repository",D=await h$1(n),y=[];return r.key==="unknown"&&y.push(w(u$1?"project.stack.aggregate":"project.stack.unknown",u$1?"info":"fail",f,u$1?"Multi-runtime aggregate boundary detected":"Project stack is unknown",u$1?`Workspai detected multiple runtimes (${a.join(", ")}) and intentionally did not promote one nested framework as the aggregate project identity.`:"Workspai cannot confidently classify this backend project.",u$1?"Adopt independently operated nested projects when they need separate lifecycle, ownership, or release evidence.":"Add .workspai/project.json metadata or import the project with `workspai import`.")),P||y.push(w("project.marker.missing","warn",f,"Workspai marker is missing","The project can be detected by files, but it is not registered with Workspai metadata.","Run `workspai import <path>` from a workspace or create the project through Workspai.")),x||y.push(w("project.tests.missing","warn",f,"Test entrypoint is missing","No common test folder, config, or package test script was found.","Add a test command so `workspai workspace run test --affected` can gate changes.")),m$1&&p&&!g&&y.push(w("project.env.example.missing","info",f,"Environment example is missing","No .env.example or env.example file was found.","Add an env example for onboarding and CI secret documentation.",[".env.example"])),d.ci.status==="unknown"?y.push(w("project.ci.missing","warn",f,"CI governance is not proven","No repository CI surface or canonical external CI declaration was found for this project.","Add repository CI configuration or declare the external CI authority in the workspace contract.",[".github/workflows/ci.yml"])):d.ci.status==="external-observed"&&y.push(w("project.ci.external-observed","info",f,"Continuous integration appears externally managed",`Repository documentation references an external CI control plane (${d.ci.evidence.join(", ")}).`,"Declare the external CI provider in the canonical workspace contract when authoritative release gating depends on it.")),v&&!D&&y.push(w("project.health.missing","info",f,"Health or readiness probe is missing","The project has no obvious health or readiness endpoint to support automated deployment and runtime checks.","Add a simple health endpoint and document it for readiness gates and observability.")),h&&!R&&y.push(w("project.container.missing","info",f,"Container recipe is missing","No Dockerfile was found for this project.","Add a Dockerfile when the service is intended for containerized deployment.",["Dockerfile"])),{name:typeof o?.name=="string"&&o.name.trim()?o.name.trim():c.basename(n),path:n,relativePath:j,runtime:l$1,runtimeCandidates:a,framework:r.key,confidence:r.confidence,supportTier:r.supportTier,hasRapidKitMarker:P,hasTests:x,hasDockerfile:R,hasEnvExample:g,hasCiConfig:z,governance:d,hasHealthEndpoint:D,scripts:$,findings:y,score:pe(y)}}function me(e){return e.name.toLowerCase()}async function fe(e){let n=new Map(e.map(r=>[me(r),r])),t=[];for(let r of e){let i=await F(c.join(r.path,"package.json")),l={...i?.dependencies??{},...i?.devDependencies??{},...i?.peerDependencies??{}};for(let u of Object.keys(l)){let b=u.replace(/^@[^/]+\//,"").toLowerCase(),m=n.get(b);m&&m.relativePath!==r.relativePath&&t.push({from:r.relativePath,to:m.relativePath,kind:"package"});}let a=await C(c.join(r.path,"pyproject.toml"));for(let u of e)u.relativePath!==r.relativePath&&a.includes(u.name)&&t.push({from:r.relativePath,to:u.relativePath,kind:"workspace-reference"});}let o=new Set;return t.filter(r=>{let i=`${r.from}\0${r.to}\0${r.kind}`;return o.has(i)?false:(o.add(i),true)})}function ge(e,n){let t=new Map;for(let o of e)t.set(o.relativePath,{project:o.relativePath,directDependents:0,directDependencies:0});for(let o of n){let r=t.get(o.from),i=t.get(o.to);r&&(r.directDependencies+=1),i&&(i.directDependents+=1);}return Array.from(t.values()).sort((o,r)=>r.directDependents-o.directDependents||r.directDependencies-o.directDependencies)}async function ye(e){let n=await te(t(e,"workspace.json"));return typeof n?.profile=="string"?n.profile:null}function we(e){return {fail:e.filter(n=>n.severity==="fail").length,warn:e.filter(n=>n.severity==="warn").length,info:e.filter(n=>n.severity==="info").length}}function ke(e){if(e.projectCount===0)return e.workspaceDetected?["Add your first project: npx workspai create project <name> --kit <kit>","Import an existing service: npx workspai import <path>"]:["Create a Workspai workspace: npx workspai create workspace my-workspace --profile polyglot","Import an existing service: npx workspai import ../service"];let n=[];return e.findings.some(t=>t.id==="workspace.marker.missing")&&n.push("Initialize workspace metadata with `workspai bootstrap --profile polyglot`."),e.findings.some(t=>t.id==="project.marker.missing")&&n.push("Register detected projects with `workspai import <path>` or recreate them via `workspai create project`."),e.findings.some(t=>t.id==="project.tests.missing")&&n.push("Add test entrypoints, then gate changes with `workspai workspace run test --affected --strict`."),e.findings.some(t=>t.id==="project.ci.missing")&&n.push("Add CI/CD configuration to catch regressions early and make workspace health checks actionable."),e.findings.some(t=>t.id==="project.health.missing")&&n.push("Add a health/readiness endpoint so runtime probes and deployment checks can verify service health."),e.hasCanonicalGraph||n.push("Generate canonical topology with `workspai workspace model --write --include-evidence`."),n.push("Run `workspai autopilot release --mode audit --json` before release."),Array.from(new Set(n))}async function Te(e$1={}){let n=c.resolve(e$1.workspacePath||process.cwd());if(!await E(n))throw new Error(`Workspace path does not exist: ${n}`);let t=re(n)??n,o=k(t),r=await ye(t),i=await ie(t),l;try{l=(await p({workspacePath:t})).contract;}catch{}let a=await Promise.all(i.map(p=>{let d=l?.projects.find(z=>{let D=z.externalPath??z.relativePath;return c.resolve(t,D)===c.resolve(p)});return ue(t,p,d)})),u=await fe(a),b=ge(a,u),m=[];o||m.push(w("workspace.marker.missing","warn",".","Workspace metadata is missing","The directory can be analyzed, but it is not a registered Workspai workspace.","Run `workspai create workspace` or `workspai bootstrap --profile polyglot` in a workspace root.")),a.length===0&&m.push(w("workspace.projects.missing","warn",".","No backend projects detected","Workspai did not find runtime markers or project metadata under this root.","Create a project with `workspai create project` or import one with `workspai import <path>`."));let h$1=[...m,...a.flatMap(p=>p.findings)],v=we(h$1),j={};for(let p of a)for(let d of p.runtimeCandidates)j[d]=(j[d]||0)+1;let f$1=a.length>0?Math.round(a.reduce((p,d)=>p+d.score,0)/a.length):0,$=m.reduce((p,d)=>p+(d.severity==="fail"?20:d.severity==="warn"?8:2),0),P=Math.max(0,f$1-$),x=a.length===0&&v.fail===0&&h$1.length>0&&h$1.every(p=>p.id==="workspace.projects.missing"&&p.severity==="warn"),R=v.fail>0||e$1.strict&&v.warn>0&&!x?"blocked":v.warn>0?"needs-attention":"ready",g={schemaVersion:q.analyze,generatedAt:new Date().toISOString(),workspacePath:t,workspaceDetected:o,profile:r,summary:{statusScope:"source-structure",releaseReadiness:"not-evaluated",score:P,verdict:R,projectCount:a.length,runtimeCount:Object.keys(j).length,findings:v},runtimes:j,projects:a,dependencyGraph:{status:u.length>0?"generated":"empty",edges:u,topImpactedProjects:b.slice(0,5)},findings:h$1,nextActions:ke({findings:h$1,projectCount:a.length,hasCanonicalGraph:await E(c.join(t,p$1.knowledgeGraph)),workspaceDetected:o}),enterpriseControls:{jsonReady:true,ciGateCommand:"workspai analyze --json --strict",releaseGateCommand:"workspai autopilot release --mode enforce --json",evidencePath:p$1.analyze}};if(e$1.output&&(await k$1.promises.mkdir(c.dirname(c.resolve(e$1.output)),{recursive:true}),await k$1.promises.writeFile(c.resolve(e$1.output),`${JSON.stringify(g,null,2)}
|
|
3
3
|
`)),!e$1.output&&o){let p=f(g,{commandId:"workspaceAnalyze",exitCode:g.summary.verdict==="blocked"?2:g.summary.verdict==="needs-attention"?1:0,generatedAt:g.generatedAt,blockers:g.findings.filter(d=>d.severity==="fail").map(d=>d.title).slice(0,12),runId:e()});await h(t,p$1.analyze,p);}return g}function Ne(e){let n=e.summary.verdict==="ready"?s.green:e.summary.verdict==="needs-attention"?s.yellow:s.red;if(console.log(s.bold(`
|
|
4
4
|
Workspai Workspace Analysis
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {a as a$2,D as D$1}from'./chunk-7HV4U2OV.js';import {d}from'./chunk-ROOPODG6.js';import {j,m,i}from'./chunk-7EMG3C3H.js';import {a as a$1}from'./chunk-GR6442P7.js';import {a as a$3,g,f as f$1,h}from'./chunk-BLEIUQL6.js';import {b}from'./chunk-VN2MKTQO.js';import {a}from'./chunk-XWKGZRHN.js';import {a as a$4}from'./chunk-252EKOR6.js';import {l}from'./chunk-OCGZNSOE.js';import {c}from'./chunk-64XWHDZ3.js';import {t as t$1,u,q as q$1}from'./chunk-VQZ5PI5J.js';import {t,p,s,q}from'./chunk-ODK4LCEL.js';import*as f from'path';import f__default from'path';import k from'fs-extra';import Re from'crypto';var Ae="unknown-run";function de(e){let t=c();return !t||t===Ae?e:{...e,runId:t}}async function ue(e,t){await k.ensureDir(f.dirname(e));let r=`${e}.${process.pid}.${Date.now()}.${Re.randomUUID()}.tmp`;try{await k.writeJSON(r,t,{spaces:2}),await k.move(r,e,{overwrite:true});}finally{await k.remove(r).catch(()=>{});}}function le(e){return q$1(e,"imported-projects.json")}async function I(e){let t=(await Promise.all(t$1(e,"imported-projects.json").map(async r=>await k.pathExists(r)?r:null))).find(r=>typeof r=="string");if(!t)return [];try{let r=await k.readJSON(t);if(!r||typeof r!="object"||r.version!==1||!Array.isArray(r.projects))throw new Error("expected a version 1 registry with a projects array");let o=r.projects,n=o.filter(i=>{if(!i||typeof i!="object")return false;let c=i;return typeof c.name=="string"&&typeof c.path=="string"&&typeof c.stack=="string"&&typeof c.confidence=="string"&&typeof c.importedAt=="string"});if(n.length!==o.length)throw new Error("one or more project entries are invalid");return n}catch(r){throw new Error(`Imported-project registry is invalid: ${t}`,{cause:r})}}async function Xe(e,t){if(t.length===0)return;let r=le(e);await a(`${r}.lock`,async()=>{let o=await I(e),n=new Map;for(let c of o)n.set(c.path,c);for(let c of t)n.set(c.path,c);let i=Array.from(n.values()).sort((c,l)=>c.name.localeCompare(l.name)).map(c=>({...c}));await ue(r,{version:1,updatedAt:new Date().toISOString(),projects:i});},{timeoutMs:3e4,staleMs:6e4,purpose:"imported-projects-registry-upsert"});}async function et(e,t){if(t.length===0)return;let r=le(e);await a(`${r}.lock`,async()=>{let o=await I(e),n=new Set(t.map(c=>f.resolve(c))),i=o.filter(c=>!n.has(f.resolve(c.path)));await ue(r,{version:1,updatedAt:new Date().toISOString(),projects:i});},{timeoutMs:3e4,staleMs:6e4,purpose:"imported-projects-registry-remove"});}var ot="workspace-dependency-graph.v1",me=["code-import","package-dep","event-pub-sub","service-dependsOn","shared-resource"],ge=["inferred","contract","manual"];var v=t.workspaceContract,xe=p.contractVerify,G=s.workspaceContract.schemaVersion,_e=q.contractVerify,D=class extends Error{constructor(r){super(`Workspace contract verification failed: ${r.violations.join("; ")}`);this.verification=r;this.name="WorkspaceContractVerificationError";}verification};function Pe(e){return e.replace(/\\/g,"/")}function z(e){let t=Pe(e).trim();return !t||t.startsWith("/")||t.startsWith("~")||/^[a-zA-Z]:\//.test(t)||t.includes("\0")?false:!t.split("/").filter(Boolean).some(r=>r===".."||r===".")}function fe(e,t){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,80)||t}function ye(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}function Ge(e){return [...new Set(e.map(t=>t.trim()).filter(t=>t.length>0))].sort((t,r)=>t.localeCompare(r))}function Oe(e){let t=e.contracts;return !t||typeof t!="object"||Array.isArray(t)?[]:ye(t.env)}function Ce(e){let t=(e||"").toLowerCase();return t.includes("vscode-extension")||t.includes("desktop.electron")||t.startsWith("extension.")||t.startsWith("desktop.")&&!t.includes("tauri")||t.startsWith("agent.")}function he(e){let r=(Array.isArray(e.ports)?e.ports:[]).map(i=>{if(!i||typeof i!="object"||Array.isArray(i))return null;let c=i,l=Number(c.port);if(!Number.isInteger(l)||l<1||l>65535)return null;let m=c.protocol==="https"||c.protocol==="grpc"||c.protocol==="tcp"||c.protocol==="udp"?c.protocol:"http";return {name:typeof c.name=="string"&&c.name.trim()?c.name:"http",port:l,protocol:m}}).filter(i=>i!==null);if(r.length>0)return r;let o=e.frontend&&typeof e.frontend=="object"&&!Array.isArray(e.frontend)?e.frontend:void 0,n=Number(e.port??o?.default_port);return Number.isInteger(n)&&n>=1&&n<=65535?[{name:"http",port:n,protocol:"http"}]:[]}async function Ne(e){let t=f__default.join(e,"Dockerfile");if(!await k.pathExists(t))return [];try{let r=await k.readFile(t,"utf8"),o=new Map;for(let n of r.matchAll(/^\s*EXPOSE\s+(.+)$/gim))for(let i of n[1].split(/\s+/)){let c=i.match(/^(\d{1,5})(?:\/(tcp|udp))?$/i),l=Number(c?.[1]);if(!c||!Number.isInteger(l)||l<1||l>65535)continue;let m=c[2]?.toLowerCase();o.set(l,{name:"http",port:l,protocol:m==="udp"?"udp":"http"});}return [...o.values()].sort((n,i)=>n.port-i.port)}catch{return []}}async function T(e){for(let t of e)if(await k.pathExists(t))return t;return null}async function Ie(e){for(let r of t$1(e,"workspace.json"))try{let o=await k.readJson(r);return {name:typeof o.workspace_name=="string"&&o.workspace_name.trim()||typeof o.name=="string"&&o.name.trim()||f__default.basename(e),profile:typeof o.profile=="string"?o.profile:void 0}}catch{}let t=await a$4(e);return t?.name?.trim()?{name:t.name.trim()}:{name:f__default.basename(e)}}async function De(e){let t=[],r=[e],o=new Set,n=new Set([".git",".workspai",".rapidkit","node_modules",".venv","venv","dist","build","target",".next",".turbo",".cache"]);for(;r.length>0;){let i=r.shift();if(!i||o.has(i))continue;o.add(i);let c=await T(u(i,"project.json")),l=await T(u(i,"context.json"));if(c||l){t.push(c??l??"");continue}let m;try{m=await k.readdir(i,{withFileTypes:true});}catch{continue}for(let d of m)!d.isDirectory()||n.has(d.name)||a$1(d.name)||r.push(f__default.join(i,d.name));}return t.sort()}function Te(e){let t=(e||"").toLowerCase();if(t.includes("fastapi"))return "fastapi";if(t.includes("nestjs"))return "nestjs";if(t.includes("springboot"))return "springboot";if(t.includes("gofiber"))return "fiber";if(t.includes("gogin"))return "gin"}function $e(e,t){let r=(e||"").toLowerCase(),o=(t||"").toLowerCase();return Ce(e)?null:r.includes("fastapi")?8e3:r.includes("nestjs")?3e3:r.includes("springboot")?8080:r.includes("gofiber")?3e3:r.includes("gogin")?8080:r.startsWith("adopted.")?null:o==="node"?3e3:o==="python"?8e3:o==="java"||o==="go"?8080:null}function B(e,t){let r=e;for(;t.has(r)&&r<65535;)r+=1;return r}function U(e,t,r){let o=e!==void 0&&e.source===void 0,n=$e(t.kit,t.runtime),i=e?.ports||[],c=t.ports||[],l=Ce(t.kit),m=t.source==="adopted-local"&&e?.source!==void 0,d=t.source!==void 0&&e?.source!==void 0,p=(l&&c.length===0?[]:m?c.length>0?c:n?[{name:"http",port:B(n,r),protocol:"http"}]:[]:i.length>0?i:c.length>0?c:n?[{name:"http",port:B(n,r),protocol:"http"}]:[]).map(P=>({...P,port:B(P.port,r)}));for(let P of p)r.add(P.port);let g={...t,...e,slug:e?.slug||t.slug,relativePath:o&&e?.relativePath&&z(e.relativePath)?e.relativePath:t.relativePath,source:o&&e?.source||t.source,relationship:o&&e?.relationship||t.relationship,externalPath:o&&e?.externalPath||t.externalPath,runtime:d?t.runtime:e?.runtime||t.runtime,framework:d?t.framework:e?.framework||t.framework,kit:d?t.kit:e?.kit||t.kit,modules:e?.modules?.length?e.modules:t.modules,ports:p,contracts:{owns:e?.contracts?.owns||[],apis:e?.contracts?.apis||[],publishes:e?.contracts?.publishes||[],consumes:e?.contracts?.consumes||[],dependsOn:e?.contracts?.dependsOn||[],env:Ge([...e?.contracts?.env??[],...t.contracts.env??[]])}},h=JSON.stringify(e||null)!==JSON.stringify(g);return {project:g,changed:h}}async function Ee(e){let t=f__default.resolve(e.workspacePath),r=await Ie(t),o=await De(t),n=await I(t),i$1=new Map(n.map(s=>[f__default.resolve(s.path),s])),c=[];for(let s of n){let p=f__default.resolve(s.path),g=await T(u(p,"project.json"))??await T(u(p,"context.json"));!g||o.some(h=>f__default.resolve(h)===f__default.resolve(g))||c.push({projectJsonPath:g,registryEntry:s});}let l=[],m$1=[...o.map(s=>({projectJsonPath:s,registryEntry:i$1.get(f__default.resolve(f__default.dirname(f__default.dirname(s))))})),...c];for(let{projectJsonPath:s,registryEntry:p}of m$1){let g=f__default.dirname(f__default.dirname(s)),h=Pe(f__default.relative(t,g)),P=p!==void 0&&!z(h),C=fe(p?.name||f__default.basename(g),f__default.basename(g)),b=P?`external/${C}`:h||C,w=await k.readJson(s),a=typeof w.kit_name=="string"&&w.kit_name||typeof w.kit=="string"&&w.kit||void 0,E=j(w)?m(g,w):void 0,j$1=E!==void 0&&E.key!=="unknown",S=i({runtime:typeof w.runtime=="string"?w.runtime:void 0,framework:typeof w.framework=="string"?w.framework:void 0,kitName:a}),y=a$2(a),$=j$1?E.runtime:S.runtime!=="unknown"?S.runtime:y?.runtime,K=j$1?E.key:typeof w.framework=="string"&&w.framework||(S.key!=="unknown"?S.key:void 0)||y?.framework||Te(a),We=p?.relationship==="adopted"?"adopted":"imported",Se=j$1?`${We}.${E.key}`:a;l.push({slug:p?.name||b||f__default.basename(g),relativePath:b,source:p?.source??"workspace",relationship:p?.relationship,externalPath:P?g:void 0,runtime:$,framework:K,kit:Se,modules:ye(w.modules),ports:he(w).length>0?he(w):await Ne(g),contracts:{owns:[],apis:[],publishes:[],consumes:[],dependsOn:[],env:Oe(w)}});}let d=new Map;for(let s of l){let p=fe(s.slug,s.relativePath),g=d.get(p);(!g||g.source!=="workspace"&&s.source==="workspace")&&d.set(p,s);}return {schemaVersion:G,kind:"rapidkit.workspace.contract",generatedAt:(e.now??new Date).toISOString(),workspace:r,projects:[...d.values()]}}async function Et(e){let t=f__default.resolve(e.outputPath||a$3(e.workspacePath,v));if(await k.pathExists(t)&&e.force!==true)throw new Error(`Workspace contract already exists: ${t}. Use --force to overwrite.`);let r=await Ee({workspacePath:e.workspacePath,now:e.now}),o=new Set,n={...r,projects:r.projects.map(c=>U(void 0,c,o).project)},i=await be({workspacePath:e.workspacePath,contractPath:t,contract:n});if(e.strict&&i.status==="failed")throw new D(i);return await ve({workspacePath:e.workspacePath,contractPath:t,contract:n,now:e.now}),{contractPath:t,contract:n}}async function vt(e){let t=f__default.resolve(e.workspacePath),r=a$3(t,v),o=await g(t,v)??r,n=await Ee({workspacePath:t,now:e.now}),i=await k.pathExists(o)?await k.readJson(o):null,c=new Map((i?.projects||[]).map(h=>[h.slug,h])),l=new Set,m=[],d=[],s=[];for(let h of n.projects){let P=c.get(h.slug),C=U(P,h,l);P?C.changed&&d.push(h.slug):m.push(h.slug),s.push(C.project),c.delete(h.slug);}for(let h of c.values()){if(h.source)continue;let P=U(h,h,l);s.push(P.project);}let p={schemaVersion:G,kind:"rapidkit.workspace.contract",generatedAt:(e.now??new Date).toISOString(),workspace:{...i?.workspace||{},...n.workspace,name:n.workspace.name||i?.workspace?.name||f__default.basename(t)},projects:s.sort((h,P)=>h.slug.localeCompare(P.slug))},g$1=await be({workspacePath:t,contractPath:r,contract:p});if(e.strict&&g$1.status==="failed")throw new D(g$1);return await ve({workspacePath:t,contractPath:r,contract:p,now:e.now}),{contractPath:r,contract:p,addedProjects:m,updatedProjects:d,verification:g$1}}async function ke(e){return await k.pathExists(e)?{exists:true,contents:await k.readFile(e)}:{exists:false}}async function we(e,t){if(!t.exists){await k.remove(e);return}await k.outputFile(e,t.contents);}async function ve(e){let{buildWorkspaceRegistrySummary:t,WORKSPACE_REGISTRY_SUMMARY_RELATIVE_PATH:r}=await import('./workspace-registry-summary-3PXZENLC.js'),o=await t(e.workspacePath,{now:e.now,contract:e.contract}),n=a$3(e.workspacePath,r),i=c=>{if(!c||typeof c!="object"||Array.isArray(c))return JSON.stringify(c);let{generatedAt:l,...m}=c;return JSON.stringify(m)};if(await k.pathExists(e.contractPath)&&await k.pathExists(n)){let[c,l]=await Promise.all([k.readJson(e.contractPath),k.readJson(n)]);if(i(c)===i(e.contract)&&i(l)===i(o))return}b(v,e.contract),b(r,o),await f$1(e.workspacePath,v,async()=>{let[c,l]=await Promise.all([ke(e.contractPath),ke(n)]);try{if(e.contractPath===a$3(e.workspacePath,v)?await h(e.workspacePath,v,e.contract):(await k.ensureDir(f__default.dirname(e.contractPath)),await k.writeJson(e.contractPath,e.contract,{spaces:2})),process.env.WORKSPAI_TEST_FAIL_WORKSPACE_REGISTRY_PUBLISH==="1")throw new Error("Injected workspace registry summary publication failure.");await h(e.workspacePath,r,o);}catch(m){let s=(await Promise.allSettled([we(e.contractPath,c),we(n,l)])).filter(p=>p.status==="rejected");throw s.length>0?new AggregateError([m,...s.map(p=>p.reason)],"Workspace contract publication failed and rollback was incomplete."):m}});}async function je(e){let t=e.contractPath??(await g(e.workspacePath,v)||a$3(e.workspacePath,v)),r=await k.readJson(t);return {contractPath:t,contract:r}}var Ke={metadata:[".workspai/project.json",".workspai/context.json",".rapidkit/project.json",".rapidkit/context.json"],manifests:["package.json","package-lock.json","pnpm-lock.yaml","yarn.lock","pyproject.toml","poetry.lock","requirements.txt","go.mod","go.sum","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","Gemfile","composer.json"],entrypoints:["src/main.ts","src/index.ts","src/app.ts","src/main.js","src/index.js","main.py","app/main.py","manage.py","main.go","cmd/main.go","Program.cs"],apiSpecifications:["openapi.yaml","openapi.yml","openapi.json","swagger.yaml","swagger.yml","swagger.json"],infrastructure:["Dockerfile","docker-compose.yml","docker-compose.yaml","compose.yml","compose.yaml","k8s","kubernetes","terraform"],documentation:["README.md","ARCHITECTURE.md","CONTRIBUTING.md","docs"]};function Ve(e,t){return d(e,t.relativePath,{...t.externalPath?{absolutePath:t.externalPath}:{}})}async function Me(e){let t={metadata:[],manifests:[],entrypoints:[],apiSpecifications:[],infrastructure:[],documentation:[]};for(let[r,o]of Object.entries(Ke))for(let n of o)await k.pathExists(f__default.join(e,n))&&t[r].push(n);try{let r=await k.readdir(e,{withFileTypes:true});for(let o of r)o.isFile()&&(o.name.endsWith(".csproj")||o.name.endsWith(".sln"))&&t.manifests.push(o.name),o.isFile()&&o.name.endsWith(".tf")&&t.infrastructure.push(o.name);}catch{}for(let r of Object.values(t))r.sort((o,n)=>o.localeCompare(n));return t}function _(e){return !e||typeof e!="object"||Array.isArray(e)?[]:Object.keys(e).sort((t,r)=>t.localeCompare(r))}async function Fe(e){try{let t=await k.readJson(f__default.join(e,"package.json")),r={runtime:_(t.dependencies),development:_(t.devDependencies),peer:_(t.peerDependencies),optional:_(t.optionalDependencies)};return {...typeof t.name=="string"?{name:t.name}:{},...typeof t.version=="string"?{version:t.version}:{},...typeof t.private=="boolean"?{private:t.private}:{},scripts:_(t.scripts),dependencies:r,dependencyCount:new Set(Object.values(r).flat()).size}}catch{return}}async function Le(e){for(let t of [".env.example",".env.sample",".env.template"])try{return (await k.readFile(f__default.join(e,t),"utf8")).split(/\r?\n/).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("#")&&o.includes("=")).map(o=>o.slice(0,o.indexOf("=")).trim()).filter(o=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(o)).sort((o,n)=>o.localeCompare(n))}catch{}return []}function He(e,t){try{let r=D$1(e);if(r.engine!=="unknown")return r;let o=k.pathExistsSync(f__default.join(e,"package.json"))?"npm":k.pathExistsSync(f__default.join(e,"pyproject.toml"))?"python":k.pathExistsSync(f__default.join(e,"requirements.txt"))?"pip":"unknown";return {...r,engine:o,runtime:t.runtime??r.runtime,framework:t.framework??r.framework,frameworkDisplayName:t.framework??r.frameworkDisplayName}}catch{return {schemaVersion:1,scope:"project",projectRoot:null,engine:"unknown",runtime:"unknown",runtimeCandidates:["unknown"],compositeRuntime:false,lifecycleCoverage:"complete",framework:"unknown",frameworkDisplayName:"Unknown",frameworkConfidence:"low",frameworkSupportTier:"observed",runtimeSupportTier:"observed",runtimeDoctorSupport:"observed",moduleSupport:false,fleetStages:[],localOnlyCommands:[],commandMap:{},supportedCommands:[],unsupportedCommands:[],globalCommands:[]}}}function Je(e,t,r){let o=e.projects.map(n=>({id:n.slug,path:n.relativePath,runtime:n.runtime,framework:n.framework}));return {schemaVersion:"workspace-dependency-graph.v1",generatedAt:t,nodes:o,edges:[],stats:{nodeCount:o.length,edgeCount:0,inferredEdges:0,contractEdges:0,manualEdges:0,authoritativeEdges:0,lowConfidenceEdges:0,orphanCount:o.length,connectedNodeCount:0,density:0,edgeCoverageRatio:o.length===0?1:0,evidenceCoverageRatio:1,hotspotCount:0,hasCycle:false},diagnostics:[{code:"graph.enrichment.failed",severity:"warning",message:r,recommendation:"Review project manifests and graph overrides, then rerun workspace contract graph."}]}}async function jt(e){let{contractPath:t,contract:r}=await je(e),o=e.now??new Date,n=o.toISOString(),{buildWorkspaceModel:i,workspaceModelProjectTopology:c}=await import('./workspace-model-LBICKRVI.js'),{hashWorkspaceModel:l}=await import('./workspace-model-hash-ZXYPIGCW.js'),m=await i({workspacePath:e.workspacePath,includeEvidence:false,now:o}),d=c(m)??Je(r,n,"The canonical Workspace Model did not provide a project dependency topology."),s=new Map(d.nodes.map(a=>[a.id,a.operationalProfile])),{buildWorkspaceKnowledgeGraph:p$1}=await import('./workspace-knowledge-graph-4RSZTEFJ.js'),g=await p$1({workspacePath:e.workspacePath,workspace:{name:m.workspace.name,...m.workspace.profile?{profile:m.workspace.profile}:{}},contract:r,projectTopology:d,now:o,projects:m.projects.map(a=>({id:a.name,path:a.path,...a.absolutePath?{absolutePath:a.absolutePath}:{},runtime:a.runtime,runtimeCandidates:a.runtimeCandidates,framework:a.framework,...a.kit?{kit:a.kit}:{}})),source:{kind:"workspace-model",artifact:p.model,hashAlgorithm:"sha256",hash:l(m)}}),h=await Promise.all(r.projects.map(async a=>{let u=Ve(e.workspacePath,a),[E,j,S]=await Promise.all([Me(u),Fe(u),Le(u)]),y=He(u,a);return {id:a.slug,label:a.slug,relativePath:a.relativePath,source:a.source,relationship:a.relationship,externalPath:a.externalPath,runtime:a.runtime??y.runtime,framework:a.framework??y.framework,kit:a.kit,modules:a.modules,ports:a.ports,apis:a.contracts.apis,owns:a.contracts.owns,env:[...new Set([...a.contracts.env,...S])].sort(($,K)=>$.localeCompare(K)),contracts:{owns:[...a.contracts.owns],apis:[...a.contracts.apis],publishes:[...a.contracts.publishes],consumes:[...a.contracts.consumes],dependsOn:[...a.contracts.dependsOn],env:[...a.contracts.env]},capabilities:{engine:y.engine,supportTier:y.frameworkSupportTier,runtimeSupportTier:y.runtimeSupportTier,doctorSupport:y.runtimeDoctorSupport,moduleSupport:y.moduleSupport,fleetStages:[...y.fleetStages],localOnlyCommands:[...y.localOnlyCommands],supportedCommands:[...y.supportedCommands]},files:E,...j?{package:j}:{},...s.get(a.slug)?{operationalProfile:s.get(a.slug)}:{}}})),P=new Set(h.map(a=>a.id)),C=new Map,b=[];for(let a of r.projects){for(let u of a.contracts.dependsOn||[])P.has(u)&&b.push({from:u,to:a.slug,type:"dependency",label:"dependsOn"});for(let u of a.contracts.publishes||[])C.has(u)||C.set(u,new Set),C.get(u)?.add(a.slug);}for(let a of r.projects)for(let u of a.contracts.consumes||[]){let E=C.get(u);if(E)for(let j of E)j!==a.slug&&b.push({from:j,to:a.slug,type:"event",label:u});}let w={schemaVersion:1,kind:"rapidkit.workspace.contract.graph",workspace:r.workspace,generatedAt:n,nodes:h.sort((a,u)=>a.id.localeCompare(u.id)),edges:b.sort((a,u)=>`${a.from}:${a.to}:${a.type}:${a.label}`.localeCompare(`${u.from}:${u.to}:${u.type}:${u.label}`)),dependencyGraph:d,knowledgeGraph:g,semantics:{legacyEdges:"producer-to-consumer",dependencyGraphEdges:"consumer-to-dependency"},summary:{projectCount:h.length,dependencyEdges:b.filter(a=>a.type==="dependency").length,eventEdges:b.filter(a=>a.type==="event").length,portCount:h.reduce((a,u)=>a+u.ports.length,0),apiCount:h.reduce((a,u)=>a+u.apis.length,0),relationshipEdges:d.stats.edgeCount,inferredEdges:d.stats.inferredEdges,authoritativeEdges:d.stats.authoritativeEdges,orphanProjects:d.stats.orphanCount,hotspotProjects:d.stats.hotspotCount,evidenceCoverageRatio:d.stats.evidenceCoverageRatio,edgeCoverageRatio:d.stats.edgeCoverageRatio,connectedProjects:d.stats.connectedNodeCount,lowConfidenceEdges:d.stats.lowConfidenceEdges,hasCycle:d.stats.hasCycle,manifestCount:h.reduce((a,u)=>a+u.files.manifests.length,0),entrypointCount:h.reduce((a,u)=>a+u.files.entrypoints.length,0),diagnostics:d.diagnostics?.length??0,relationshipKinds:Object.fromEntries(me.map(a=>[a,d.edges.filter(u=>u.kind===a).length])),relationshipSources:Object.fromEntries(ge.map(a=>[a,d.edges.filter(u=>u.source===a).length])),entityCount:g.quality.entityCount,knowledgeRelations:g.quality.relationCount,proofCount:g.quality.proofCount,providerCount:g.providers.length,knowledgeUnknowns:g.quality.unknownCount}};return {contractPath:t,graph:w}}async function be(e){let t=e.contract?{contractPath:e.contractPath??a$3(e.workspacePath,v),contract:e.contract}:await je(e),{contractPath:r,contract:o}=t,n=[],i=[];o.kind!=="rapidkit.workspace.contract"&&n.push("Contract kind must be rapidkit.workspace.contract."),o.schemaVersion!==G&&n.push(`Contract schemaVersion must be ${G}.`),o.workspace?.name||n.push("Contract workspace.name is required."),Array.isArray(o.projects)||n.push("Contract projects must be an array.");let c=new Set,l$1=new Map;for(let s of o.projects||[]){if(!s.slug){n.push("Every project must declare slug.");continue}c.has(s.slug)&&n.push(`Duplicate project slug: ${s.slug}.`),c.add(s.slug),s.relativePath?z(s.relativePath)||n.push(`Project ${s.slug} declares unsafe relativePath: ${s.relativePath}.`):n.push(`Project ${s.slug} must declare relativePath.`),s.externalPath&&(s.relationship==="adopted"||s.source==="adopted-local"||s.source==="local-folder"||s.source==="git-url"||n.push(`Project ${s.slug} declares externalPath without imported/adopted provenance.`),f__default.isAbsolute(s.externalPath)||n.push(`Project ${s.slug} declares non-absolute externalPath.`));for(let p of s.ports||[]){(!Number.isInteger(p.port)||p.port<1||p.port>65535)&&n.push(`Project ${s.slug} declares invalid port: ${p.port}.`);let g=l$1.get(p.port);g&&n.push(`Port ${p.port} is claimed by both ${g} and ${s.slug}.`),l$1.set(p.port,s.slug);}for(let p of s.contracts?.apis||[])(!p.name?.trim()||!p.basePath?.startsWith("/"))&&n.push(`Project ${s.slug} declares invalid API contract.`);for(let p of [...s.contracts?.publishes||[],...s.contracts?.consumes||[]])p.trim()||n.push(`Project ${s.slug} declares an empty event contract.`);for(let p of s.contracts?.env||[])/^[A-Z_][A-Z0-9_]*$/.test(p)||n.push(`Project ${s.slug} declares invalid env contract: ${p}.`);for(let p of s.contracts?.dependsOn||[])c.has(p);}for(let s of o.projects||[])for(let p of s.contracts?.dependsOn||[])c.has(p)||n.push(`Project ${s.slug} depends on unknown project: ${p}.`);i.push({id:"schema",status:o.kind==="rapidkit.workspace.contract"&&o.schemaVersion===G?"passed":"failed",message:"Contract schema and kind are valid."}),i.push({id:"projects",status:Array.isArray(o.projects)?"passed":"failed",message:`Contract declares ${Array.isArray(o.projects)?o.projects.length:0} project(s).`}),i.push({id:"ports",status:n.some(s=>s.toLowerCase().includes("port"))?"failed":"passed",message:"Project port declarations are valid and collision-free."}),i.push({id:"dependencies",status:n.some(s=>s.includes("depends on unknown project"))?"failed":"passed",message:"Project dependencies point to known project slugs."}),i.push({id:"contracts",status:n.some(s=>s.includes("unsafe relativePath")||s.includes("invalid API contract")||s.includes("event contract")||s.includes("env contract"))?"failed":"passed",message:"Project path, API, event, and env contracts are valid."});let m=await l(e.workspacePath);if(m.moduleCount>0){for(let s of m.issues)n.push(`${f__default.basename(s.projectRoot)}: ${s.message} (slug=${s.slug})`);i.push({id:"module-paths",status:m.status,message:m.status==="passed"?`All ${m.moduleCount} registered module(s) resolve under canonical paths.`:`${m.issues.length} registered module(s) missing canonical install paths.`});}else e.strict&&i.push({id:"module-paths",status:"passed",message:"No registry-backed modules declared in workspace projects."});return {status:n.length>0?"failed":"passed",contractPath:r,projectCount:Array.isArray(o.projects)?o.projects.length:0,checks:i,violations:n}}async function bt(e){let t=f__default.resolve(e.workspacePath),r={schemaVersion:_e,generatedAt:e.generatedAt??new Date().toISOString(),status:e.result.status,contractPath:e.result.contractPath,projectCount:e.result.projectCount,checks:e.result.checks,violations:e.result.violations};return h(t,xe,de(r))}
|
|
2
|
+
export{I as a,Xe as b,et as c,de as d,ot as e,me as f,v as g,xe as h,G as i,_e as j,D as k,De as l,Ee as m,Et as n,vt as o,je as p,jt as q,be as r,bt as s};
|