workspai 0.43.0 → 0.43.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/README.md +3 -3
  2. package/contracts/extension-cli-compatibility.v1.json +1 -1
  3. package/dist/{artifact-remediation-plan-5GJWPPRS.js → artifact-remediation-plan-244S5K6I.js} +3 -3
  4. package/dist/autopilot-release-45YVOBQO.js +1 -0
  5. package/dist/chunk-3QVTWKUI.js +4 -0
  6. package/dist/{chunk-T6OR6YOI.js → chunk-7UZVOYF5.js} +1 -1
  7. package/dist/{chunk-CVTCPPEF.js → chunk-AMDKXXLP.js} +1 -1
  8. package/dist/{chunk-EWYYLJQY.js → chunk-CDE4Q77U.js} +1 -1
  9. package/dist/{chunk-AFSZHLQT.js → chunk-DOCPUNWS.js} +1 -1
  10. package/dist/{chunk-OJEWQO3Z.js → chunk-EMTQ6OKI.js} +17 -17
  11. package/dist/{chunk-RE773WOX.js → chunk-FDDDQMJ2.js} +5 -5
  12. package/dist/{chunk-5SWNSJGW.js → chunk-FHSMY75W.js} +1 -1
  13. package/dist/chunk-FM7GMFZA.js +2 -0
  14. package/dist/{chunk-54XJNLYC.js → chunk-HV5ZFXAZ.js} +1 -1
  15. package/dist/{chunk-LO4C4VXR.js → chunk-LRW2SAGL.js} +1 -1
  16. package/dist/{chunk-PI5KUXDA.js → chunk-LTWYYP6E.js} +1 -1
  17. package/dist/{chunk-VRDF2J46.js → chunk-ONU457VN.js} +17 -17
  18. package/dist/{chunk-LUP4U6EE.js → chunk-P424XYHP.js} +1 -1
  19. package/dist/{chunk-LPZFK3Y6.js → chunk-PPHTYJ7G.js} +61 -61
  20. package/dist/{chunk-XEJD4KCV.js → chunk-TH5Y3EMA.js} +1 -1
  21. package/dist/chunk-TQEMLBAG.js +1 -0
  22. package/dist/{chunk-3KXW53QI.js → chunk-U6AXYUQY.js} +1 -1
  23. package/dist/{chunk-AAKUNWPR.js → chunk-UQKCCWUL.js} +43 -43
  24. package/dist/{chunk-VZKSNUEE.js → chunk-XNGANEXM.js} +1 -1
  25. package/dist/{create-WRZO4HK2.js → create-42RTNLH2.js} +1 -1
  26. package/dist/demo-kit-DZ7TPG7K.js +149 -0
  27. package/dist/doctor-DK4BON3N.js +1 -0
  28. package/dist/{dotnet-webapi-clean-IPY3MCGQ.js → dotnet-webapi-clean-BYUUHX5Y.js} +20 -20
  29. package/dist/{gofiber-standard-N5N3QGH3.js → gofiber-standard-B6UK5GR7.js} +31 -31
  30. package/dist/{gogin-standard-LAWQTBWL.js → gogin-standard-BXU44VEM.js} +31 -31
  31. package/dist/index.js +222 -185
  32. package/dist/pipeline-HQ57V6OZ.js +5 -0
  33. package/dist/{pythonRapidkitExec-3L3XJBSY.js → pythonRapidkitExec-GCQ3M46E.js} +1 -1
  34. package/dist/{springboot-standard-OZYF7ZM7.js → springboot-standard-PEHDKH2L.js} +27 -27
  35. package/dist/{workspace-PR6VZRBG.js → workspace-DZHWB7BV.js} +1 -1
  36. package/dist/{workspace-agent-sync-KTYF3HQR.js → workspace-agent-sync-5ADIQS7B.js} +1 -1
  37. package/dist/{workspace-context-QUTOP2XV.js → workspace-context-GEXDHA7A.js} +1 -1
  38. package/dist/{workspace-contract-XUGMCUSQ.js → workspace-contract-2TA27LGT.js} +1 -1
  39. package/dist/workspace-explain-D5NNL3NG.js +1 -0
  40. package/dist/{workspace-foundation-KGSV4E6D.js → workspace-foundation-FQWHPQGX.js} +1 -1
  41. package/dist/{workspace-intelligence-QJGVL37U.js → workspace-intelligence-BEM6WGCZ.js} +1 -1
  42. package/dist/{workspace-mcp-serve-AK4MYEHQ.js → workspace-mcp-serve-OMBA5V3C.js} +1 -1
  43. package/dist/{workspace-model-PNXXOGPO.js → workspace-model-F3B75TYT.js} +1 -1
  44. package/dist/workspace-registry-summary-6MFBRWDS.js +1 -0
  45. package/dist/workspace-run-3WJXIQKR.js +1 -0
  46. package/dist/{workspace-verify-WSDUUTR5.js → workspace-verify-OAATQV5T.js} +1 -1
  47. package/dist/{workspace-watch-AGPOJ74Q.js → workspace-watch-HU2OTQ52.js} +1 -1
  48. package/package.json +12 -2
  49. package/templates/kits/fastapi-ddd/.gitignore.j2 +11 -0
  50. package/templates/kits/fastapi-ddd/README.md.j2 +23 -18
  51. package/templates/kits/fastapi-ddd/common/env.example.j2 +2 -2
  52. package/templates/kits/fastapi-ddd/pyproject.toml.j2 +7 -7
  53. package/templates/kits/fastapi-ddd/src/app/config/__init__.py.j2 +1 -1
  54. package/templates/kits/fastapi-ddd/src/cli.py.j2 +6 -9
  55. package/templates/kits/fastapi-ddd/src/main.py.j2 +1 -1
  56. package/templates/kits/fastapi-standard/.gitignore.j2 +11 -0
  57. package/templates/kits/fastapi-standard/README.md.j2 +35 -30
  58. package/templates/kits/fastapi-standard/common/env.example.j2 +2 -2
  59. package/templates/kits/fastapi-standard/pyproject.toml.j2 +7 -7
  60. package/templates/kits/fastapi-standard/src/cli.py.j2 +7 -10
  61. package/templates/kits/fastapi-standard/src/main.py.j2 +1 -1
  62. package/templates/kits/fastapi-standard/src/routing/examples.py.j2 +1 -1
  63. package/templates/kits/fastapi-standard/tests/test_examples.py.j2 +1 -1
  64. package/templates/kits/nestjs-standard/.dockerignore.j2 +11 -0
  65. package/templates/kits/nestjs-standard/.eslintrc.js.j2 +25 -0
  66. package/templates/kits/nestjs-standard/.gitignore.j2 +22 -0
  67. package/templates/kits/nestjs-standard/.node-version.j2 +1 -0
  68. package/templates/kits/nestjs-standard/.nvmrc.j2 +1 -0
  69. package/templates/kits/nestjs-standard/.prettierrc.j2 +7 -0
  70. package/templates/kits/nestjs-standard/README.md.j2 +23 -18
  71. package/templates/kits/nestjs-standard/docs/README.md.j2 +2 -2
  72. package/templates/kits/nestjs-standard/jest.config.ts.j2 +1 -7
  73. package/templates/kits/nestjs-standard/package.json.j2 +1 -1
  74. package/templates/kits/nestjs-standard/src/config/configuration.ts.j2 +4 -4
  75. package/templates/kits/nestjs-standard/src/main.ts.j2 +1 -1
  76. package/templates/kits/nestjs-standard/src/modules/index.ts.j2 +1 -1
  77. package/templates/kits/nestjs-standard/tsconfig.build.json.j2 +1 -1
  78. package/templates/kits/nestjs-standard/tsconfig.json.j2 +1 -1
  79. package/dist/autopilot-release-QYUOVB26.js +0 -1
  80. package/dist/chunk-LYC6AIF2.js +0 -2
  81. package/dist/chunk-WU4ZRRA5.js +0 -4
  82. package/dist/demo-kit-AJ5LIM5G.js +0 -149
  83. package/dist/doctor-MF3M3FS3.js +0 -1
  84. package/dist/pipeline-QCUHFWDY.js +0 -5
  85. package/dist/workspace-explain-JEONEGZZ.js +0 -1
  86. package/dist/workspace-registry-summary-RUJE6RPH.js +0 -1
  87. package/dist/workspace-run-Y7YMUIHX.js +0 -1
@@ -1,2 +0,0 @@
1
- import {n,k as k$1,j}from'./chunk-5SWNSJGW.js';import {a as a$1}from'./chunk-HTYMXMQM.js';import {c}from'./chunk-S5KTATOU.js';import {a}from'./chunk-VZKSNUEE.js';import de from'crypto';import m from'path';import y from'fs-extra';import {spawnSync}from'child_process';function F(e,t){let r=spawnSync("git",t,{cwd:e,encoding:"utf8",stdio:["ignore","pipe","ignore"]});return r.status!==0?{ok:false,stdout:""}:{ok:true,stdout:(r.stdout??"").trim()}}function pe(e){let t=[],r=[],s=[];for(let c of e.split(`
2
- `)){if(!c.trim())continue;let o=c.slice(0,2),i=c.slice(3).trim();if(i){if(o==="??"){r.push(i);continue}o.includes("D")&&s.push(i),t.push(i);}}return {changedFiles:[...new Set(t)].sort(),untrackedFiles:[...new Set(r)].sort(),deletedFiles:[...new Set(s)].sort()}}function L(e,t){let r={available:false,dirty:false,changedFiles:[],untrackedFiles:[],deletedFiles:[]},s=F(e,["rev-parse","--is-inside-work-tree"]);if(!s.ok||s.stdout!=="true")return r;let c=F(e,["rev-parse","--abbrev-ref","HEAD"]),o=F(e,["rev-parse","HEAD"]),i=F(e,["status","--porcelain=v1","--untracked-files=all"]),p=pe(i.stdout),f=p.changedFiles.length>0||p.untrackedFiles.length>0||p.deletedFiles.length>0;return {available:true,branch:c.ok?c.stdout:void 0,commit:o.ok?o.stdout:void 0,ref:t?.ref,dirty:f,changedFiles:p.changedFiles,untrackedFiles:p.untrackedFiles,deletedFiles:p.deletedFiles}}var X="workspace-model-snapshot.v1",V="workspace-model-diff.v1",$=".workspai/reports/workspace-model-snapshot.json",Z=".workspai/reports/workspace-model-diff-last-run.json",le="workspace-impact.v1",fe=".workspai/reports/workspace-impact-last-run.json";function ee(e){let t=e.trim().toLowerCase();return t==="git"||t.startsWith("git:")}function me(e){let t=e.trim();return t.toLowerCase()==="git"?"HEAD":t.toLowerCase().startsWith("git:")&&t.slice(4).trim()||"HEAD"}function _(e){if(Array.isArray(e))return e.map(t=>_(t));if(e&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=_(e[r]);return t}return e}function k(e){return JSON.stringify(_(e))}function ue(e){return e.facts?.map(t=>({...t,freshness:{schemaVersion:t.freshness.schemaVersion,kind:t.freshness.kind,category:t.freshness.category,ttlSeconds:t.freshness.ttlSeconds,verifyBeforeUse:t.freshness.verifyBeforeUse,sourceArtifact:t.freshness.sourceArtifact,sourcePath:t.freshness.sourcePath,inputsHash:t.freshness.inputsHash,reason:t.freshness.reason}}))}function E(e){let{runId:t,...r}=e,s={...r,generatedAt:"<ignored>",graph:e.graph?{...e.graph,generatedAt:"<ignored>"}:void 0,facts:ue(e),factFreshness:e.factFreshness?{schemaVersion:e.factFreshness.schemaVersion,totalFacts:e.factFreshness.totalFacts,liveFacts:e.factFreshness.liveFacts,verifyBeforeUseFacts:e.factFreshness.verifyBeforeUseFacts,byKind:e.factFreshness.byKind,byCategory:e.factFreshness.byCategory}:void 0,validation:e.validation?{...e.validation,issues:e.validation.issues.map(c=>({...c})).sort((c,o)=>{let i=`${c.severity}:${c.code}:${c.target}:${c.message}`,p=`${o.severity}:${o.code}:${o.target}:${o.message}`;return i.localeCompare(p)})}:void 0};return de.createHash("sha256").update(k(s)).digest("hex")}function te(e,t){return m.isAbsolute(t)?t:m.join(e,t)}async function ge(e){let t=await y.readJson(e);if(!t||typeof t!="object"||Array.isArray(t))throw new Error(`Workspace model input is not a JSON object: ${e}`);let r=t;if(r.schemaVersion===X){let s=r;if(!s.model||s.model.schemaVersion!==j)throw new Error(`Invalid workspace model snapshot: ${e}`);return {model:s.model,hash:s.modelHash||E(s.model)}}if(r.schemaVersion===j){let s=r;return {model:s,hash:E(s)}}throw r.schemaVersion===V?new Error(`workspace diff --from received a diff report (${m.basename(e)}). Use a workspace model snapshot or model report as baseline, e.g. ${$}. To analyze an existing diff report, run: npx workspai workspace impact --from ${m.basename(e)} --json`):new Error(`Unsupported workspace model input schema: ${String(r.schemaVersion)}`)}async function ke(e){let t=await y.readJson(e);if(!t||typeof t!="object"||Array.isArray(t))throw new Error(`Workspace diff input is not a JSON object: ${e}`);let r=t;if(r.schemaVersion!==V)return null;let s=r;if(!s.currentModel||s.currentModel.schemaVersion!==j||!s.summary||!Array.isArray(s.changes))throw new Error(`Invalid workspace model diff report: ${e}`);return s}async function Ne(e){let t=e.model??await n({workspacePath:e.workspacePath,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,observableScanDepth:e.observableScanDepth,now:e.now});return {schemaVersion:X,generatedAt:(e.now??new Date).toISOString(),modelHash:E(t),modelRef:k$1,model:t}}async function Be(e,t){let r=m.join(t,$);return await y.ensureDir(m.dirname(r)),await y.writeJson(r,a(e),{spaces:2}),r}function A(e){return {name:e.name,path:e.path,kind:e.kind,runtime:e.runtime,framework:e.framework,generator:e.generator,supportTier:e.supportTier,commands:e.commands,importantFiles:e.importantFiles}}function h(e,t){e.push(t);}function he(e,t){let r=[],s=["name","profile","type"],c=["workspaceType","surfaces","runtimeFamilies","businessCapabilities"];for(let o of s){let i=e.workspace[o],p=t.workspace[o];k(i)!==k(p)&&h(r,{type:"workspace.changed",severity:"info",target:`workspace.${o}`,message:`Workspace metadata field changed: ${String(o)}`,before:i,after:p});}for(let o of c){let i=e.identity[o],p=t.identity[o];k(i)!==k(p)&&h(r,{type:"workspace.changed",severity:"info",target:`identity.${o}`,message:`Workspace identity field changed: ${String(o)}`,before:i,after:p});}return k(e.policies)!==k(t.policies)&&h(r,{type:"workspace.changed",severity:"warning",target:"policies",message:"Workspace policy summary changed.",before:e.policies,after:t.policies}),k(e.evidence)!==k(t.evidence)&&h(r,{type:"workspace.changed",severity:"info",target:"evidence",message:"Workspace evidence summary changed.",before:e.evidence,after:t.evidence}),k(e.discovery)!==k(t.discovery)&&h(r,{type:"workspace.changed",severity:"info",target:"discovery",message:"Workspace discovery settings changed.",before:e.discovery,after:t.discovery}),e.contracts.exists!==t.contracts.exists&&h(r,{type:"workspace.changed",severity:t.contracts.exists?"info":"warning",target:t.contracts.workspaceContractPath,message:"Workspace contract presence changed.",before:e.contracts.exists,after:t.contracts.exists}),r}function we(e,t){let r=e.validation??null,s=t.validation??null;return k(r)===k(s)?[]:[{type:"validation.changed",severity:s?.status==="failed"?"critical":"warning",target:"validation",message:"Workspace model validation changed.",before:r,after:s}]}function ye(e,t){let r=[],s=new Map(e.projects.map(o=>[o.path,o])),c=new Map(t.projects.map(o=>[o.path,o]));for(let[o,i]of c.entries()){let p=s.get(o);if(!p){h(r,{type:"project.added",severity:"info",target:o,message:`Project added: ${i.name}`,after:A(i)});continue}let f=A(p),l=A(i);if(k(f)!==k(l)){let g=p.runtime!==i.runtime||p.framework!==i.framework;h(r,{type:"project.changed",severity:g?"warning":"info",target:o,message:`Project changed: ${i.name}`,before:f,after:l});}}for(let[o,i]of s.entries())c.has(o)||h(r,{type:"project.removed",severity:"warning",target:o,message:`Project removed: ${i.name}`,before:A(i)});return r.sort((o,i)=>`${o.type}:${o.target}`.localeCompare(`${i.type}:${i.target}`))}async function We(e){let t=m.resolve(e.workspacePath),r=ee(e.fromPath),s=r?me(e.fromPath):void 0,c=e.fromPath;if(r){let u=m.join(t,$);if(!await y.pathExists(u))throw new Error("Git-aware workspace diff requires an existing snapshot at .workspai/reports/workspace-model-snapshot.json. Run: npx workspai workspace snapshot --json");c=$;}let o=te(t,c),i=await ge(o),p=e.model??await n({workspacePath:t,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,observableScanDepth:e.observableScanDepth,now:e.now}),f=E(p),l=[...he(i.model,p),...ye(i.model,p),...we(i.model,p)],g;e.includeGitObservation!==false&&(g=e.gitObservation??L(t,{ref:s}),g.available&&Me(l,g,p));let b=l.filter(u=>u.type.startsWith("git.")).length,C=i.hash!==f,W=r?`git:${s??"HEAD"}`:m.relative(t,o).split(m.sep).join("/");return {schemaVersion:V,generatedAt:(e.now??new Date).toISOString(),fromRef:W,toRef:k$1,fromHash:i.hash,toHash:f,summary:{changed:C||b>0,addedProjects:l.filter(u=>u.type==="project.added").length,removedProjects:l.filter(u=>u.type==="project.removed").length,changedProjects:l.filter(u=>u.type==="project.changed").length,workspaceChanges:l.filter(u=>u.type==="workspace.changed").length,validationChanges:l.filter(u=>u.type==="validation.changed").length,gitChangedFiles:b},git:g?.available?Pe(g,s):{available:false,dirty:false,changedFiles:0,untrackedFiles:0,deletedFiles:0},changes:l,currentModel:p}}async function Ke(e,t){let r=m.join(t,Z);return await y.ensureDir(m.dirname(r)),await y.writeJson(r,a(e),{spaces:2}),r}function P(e){return {none:0,low:1,medium:2,high:3,critical:4}[e]}function J(e){return e.reduce((t,r)=>P(r)>P(t)?r:t,"none")}var T=["none","low","medium","high","critical"];function ve(e){let t=Math.max(1,P(e)-1);return T[t]}function be(e){let t=Math.min(T.length-1,P(e)+1);return T[t]}function U(e){return e.join(" ")}function w(e,t,r,s){return {id:e,label:t,scope:s.scope,project:s.project,display:U(["npx","workspai",...r]),execute:U(["npx","--yes","--package","workspai","workspai",...r]),required:s.required!==false}}function Y(e){let t=`project:${e.name}`,r=e.commands.fleetStages;return [w(`project.${e.name}.init`,`Run init for ${e.name}`,["workspace","run","init","--scope",t,"--json"],{scope:"project",project:e.name,required:r.includes("init")}),w(`project.${e.name}.test`,`Run tests for ${e.name}`,["workspace","run","test","--scope",t,"--json"],{scope:"project",project:e.name,required:r.includes("test")}),w(`project.${e.name}.build`,`Run build for ${e.name}`,["workspace","run","build","--scope",t,"--json"],{scope:"project",project:e.name,required:r.includes("build")}),w(`project.${e.name}.start`,`Run start for ${e.name}`,["workspace","run","start","--scope",t,"--json"],{scope:"project",project:e.name,required:r.includes("start")})]}function D(){return [w("workspace.doctor","Run workspace doctor",["doctor","workspace","--json"],{scope:"workspace"}),w("workspace.contract.verify","Verify workspace contract",["workspace","contract","verify","--json"],{scope:"workspace"}),w("workspace.readiness","Run release readiness",["readiness","--json"],{scope:"workspace"}),w("workspace.analyze","Run workspace analyze",["analyze","--json"],{scope:"workspace",required:false}),w("workspace.pipeline","Run governance pipeline",["pipeline","--json"],{scope:"workspace",required:false}),w("workspace.doctor-fix","Verify doctor fix result",["doctor","workspace","--fix","--json"],{scope:"workspace",required:false})]}function je(e,t){let r=t.split(m.sep).join("/");return e.projects.filter(c=>{let o=c.path.split(m.sep).join("/");return r===o||r.startsWith(`${o}/`)}).sort((c,o)=>o.path.length-c.path.length)[0]}function Me(e,t,r){let s=new Set(e.map(o=>o.target)),c=(o,i)=>{let p=i.split(m.sep).join("/"),f=`git:${p}`;if(s.has(f))return;let l=je(r,p),g=l?`${l.name} (${l.path})`:"workspace";h(e,{type:o,severity:o==="git.deleted"?"warning":"info",target:f,message:`Git ${o==="git.untracked"?"untracked":o==="git.deleted"?"deleted":"changed"} file affects ${g}: ${p}`,after:{path:p,project:l?.name,projectPath:l?.path}}),s.add(f);};for(let o of t.changedFiles)c("git.file.changed",o);for(let o of t.untrackedFiles)c("git.untracked",o);for(let o of t.deletedFiles)c("git.deleted",o);}function Pe(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 Ie(e){let t=new Set,r=[];for(let s of e){let c=`${s.scope}:${s.project??""}:${s.display}`;t.has(c)||(t.add(c),r.push(s));}return r}function Ce(e){return e.type==="project.removed"?"high":e.severity==="critical"?"critical":e.severity==="warning"?"high":("medium")}function Re(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 Oe(e){return e.affectedProjects>0||e.projectCount>0||!e.changes.every(r=>r.severity==="critical"?false:r.type.startsWith("git.")||r.type==="validation.changed")?e.risk:P(e.risk)>=P("high")||e.risk==="medium"?"low":e.risk}function Q(e,t){if(!e||e==="workspace")return true;let r=(e.startsWith("project:")?e.slice(8):e).trim().toLowerCase();return [t.name,t.path,m.basename(t.path),t.absolutePath].filter(s=>typeof s=="string"&&s.trim().length>0).map(s=>s.trim().toLowerCase()).includes(r)}function Se(e){if(!e.changed)return {headline:"No workspace model impact detected.",bullets:["The current workspace model matches the provided snapshot/report."],unsafeAssumptions:["Do not claim runtime verification passed unless a report exists."]};let t=e.affectedProjects.map(r=>r.project?.name??r.target);return {headline:`Workspace impact risk: ${e.risk}.`,bullets:[`Affected projects: ${t.length?t.join(", "):"none"}.`,`Workspace-level items: ${e.workspaceImpact.length}.`,"Use the verification plan before recommending apply, rollback, or release actions."],unsafeAssumptions:["Do not infer test/build success from impact alone.","Do not apply fixes without project scope and verification evidence.","Use display commands for users and execute commands for automation."]}}async function qe(e){let t=m.resolve(e.workspacePath),r=ee(e.fromPath),s=e.diff;if(!s&&!r){let n=te(t,e.fromPath);s=await ke(n)??void 0;}s||(s=await We({workspacePath:t,fromPath:e.fromPath,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,includeGitObservation:e.includeGitObservation,gitObservation:e.gitObservation,now:e.now,model:e.model}));let c$1=new Map(s.currentModel.projects.map(n=>[n.path,n])),o=new Map(s.currentModel.projects.map(n=>[n.name,n])),i=s.changes.filter(n=>n.type.startsWith("project.")),p=new Map;for(let n of i){let d=(c$1.get(n.target)??(typeof n.before?.name=="string"?o.get(n.before.name):void 0))?.path??n.target,v=p.get(d)??[];v.push(n),p.set(d,v);}let f=[];for(let[n,a]of p.entries()){let d=c$1.get(n);if(d&&!Q(e.scope,d))continue;let v=J(a.map(Ce)),R=d?.name??(typeof a[0]?.before?.name=="string"?String(a[0].before.name):n);f.push({id:`project:${R}`,scope:"project",target:n,title:`Project impact: ${R}`,summary:a.map(j=>j.message).join(" "),risk:v,reasons:a.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?Y(d):D()});}let l=s.currentModel.graph,g=l?a$1(l):void 0,b=new Set(f.map(n=>n.project?.name).filter(n=>typeof n=="string")),C=new Map;for(let n of f)if(n.project?.name){let a=g?.byId.get(n.project.name);a&&(n.centrality={fanIn:a.fanIn,fanOut:a.fanOut,reach:a.reach,betweenness:a.betweenness,isHotspot:a.isHotspot},a.isHotspot&&(n.risk=be(n.risk),n.reasons=[...n.reasons,`graph.hotspot: critical-path project with ${a.reach} transitive dependent(s); risk escalated.`])),n.origin="direct",n.distance=0,C.set(n.project.name,n.risk);}let W=[],u=0;if(l&&b.size>0){let n=c(l,b);for(let a of n.values()){if(a.distance===0||b.has(a.id))continue;let d=o.get(a.id);if(d&&!Q(e.scope,d))continue;let v=a.path[0],R=a.path[a.path.length-2]??v,j=C.get(v)??"medium",oe=ve(j),M=g?.byId.get(a.id);u=Math.max(u,a.distance),W.push({id:`transitive:${a.id}`,scope:"project",target:d?.path??a.id,title:`Transitive impact: ${a.id}`,summary:`Depends on changed project ${v}${a.via?` via ${a.via}`:""} (distance ${a.distance}).`,risk:oe,reasons:[`graph.dependent: depends on ${R}${a.via?` via ${a.via}`:""} (path ${a.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?Y(d):D(),origin:"transitive",distance:a.distance,path:a.path,via:a.via,...M?{centrality:{fanIn:M.fanIn,fanOut:M.fanOut,reach:M.reach,betweenness:M.betweenness,isHotspot:M.isHotspot}}:{}});}}W.sort((n,a)=>n.target.localeCompare(a.target));let re=g?g.hotspots.flatMap(n=>{let a=g.byId.get(n);return a?[{project:n,fanIn:a.fanIn,fanOut:a.fanOut,reach:a.reach,betweenness:a.betweenness}]:[]}):[],se=s.changes.filter(n=>!n.type.startsWith("project.")),G=s.currentModel.summary?.projectCount??s.currentModel.projects.length,I=se.map(n=>({id:`workspace:${n.target}`,scope:"workspace",target:n.target,title:`Workspace impact: ${n.target}`,summary:n.message,risk:Re(n,{projectCount:G}),reasons:[`${n.type}: ${n.message}`],verification:D()})),N=Ie([...f.flatMap(n=>n.verification),...W.flatMap(n=>n.verification),...I.flatMap(n=>n.verification),...s.summary.changed?D():[]]).filter(n=>n.required),ne=J([...f.map(n=>n.risk),...W.map(n=>n.risk),...I.map(n=>n.risk)]),B=Oe({risk:ne,affectedProjects:f.length,projectCount:G,changes:s.changes}),K={changed:s.summary.changed,risk:B,affectedProjects:f.length,workspaceItems:I.length,recommendedCommands:N.length,blastRadius:{directlyAffected:f.length,transitivelyAffected:W.length,maxDistance:u,graphEdges:l?.edges.length??0}};return {schemaVersion:le,generatedAt:(e.now??new Date).toISOString(),fromRef:s.fromRef,diffRef:Z,workspace:{name:s.currentModel.workspace.name,profile:s.currentModel.workspace.profile,type:s.currentModel.workspace.type},summary:K,affectedProjects:f.sort((n,a)=>n.target.localeCompare(a.target)),transitiveImpact:W,criticalPathHotspots:re,workspaceImpact:I.sort((n,a)=>n.target.localeCompare(a.target)),verificationPlan:N,agentBrief:Se({changed:K.changed,risk:B,affectedProjects:f,workspaceImpact:I}),diff:s}}async function ze(e,t){let r=m.join(t,fe);return await y.ensureDir(m.dirname(r)),await y.writeJson(r,a(e),{spaces:2}),r}export{X as a,V as b,$ as c,Z as d,le as e,fe as f,ee as g,me as h,Ne as i,Be as j,We as k,Ke as l,D as m,qe as n,ze as o};
@@ -1,4 +0,0 @@
1
- import {d,b as b$1,e}from'./chunk-753LOKFZ.js';import {j,q as q$1,n}from'./chunk-T6OR6YOI.js';import {h,i,f,e as e$1}from'./chunk-4KUIFXHM.js';import {d as d$1}from'./chunk-S5KTATOU.js';import {c}from'./chunk-NAAQMSO3.js';import {a}from'./chunk-GZTYAEWX.js';import {e as e$2,g}from'./chunk-LZQNVH7D.js';import {p,l,o}from'./chunk-5XATWNME.js';import _ from'fs';import b from'path';import E from'chalk';import {execa}from'execa';function je(e){return _.existsSync(b.join(e,"bun.lock"))||_.existsSync(b.join(e,"bunfig.toml"))?"bun":_.existsSync(b.join(e,"pnpm-lock.yaml"))?"pnpm":_.existsSync(b.join(e,"yarn.lock"))?"yarn":(_.existsSync(b.join(e,"package-lock.json")),"npm")}function Se(e,t,r=je(e)){return r==="npm"?`npm run ${t}`:`${r} run ${t}`}function Ee(e,t=je(e)){return `${t} install`}var _e={"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:[]}}},Ge={init:{python:["pip install -e .","poetry install","pip install -r requirements.txt"],node:["npm install","pnpm install","yarn install"],go:["go mod download && go mod tidy","go get ./..."],java:["mvn dependency:go-offline","gradle dependencies"],php:["composer install"],rust:["cargo fetch"],dotnet:["dotnet restore"],elixir:["mix deps.get"],ruby:["bundle install"],"jvm-generic":["mvn dependency:go-offline","gradle dependencies"],unknown:[]},test:{python:["pytest","python -m unittest","python -m pytest"],node:["npm test","npm run test"],go:["go test ./...","make test"],java:["mvn test","gradle test"],php:["php artisan test","phpunit","pest"],rust:["cargo test"],dotnet:["dotnet test"],elixir:["mix test"],ruby:["rspec","ruby -m minitest"],"jvm-generic":["mvn test","gradle test"],unknown:[]},build:{python:["python -m build","python setup.py build"],node:["npm run build"],go:["go build -o app .","go build ./..."],java:["mvn package -DskipTests","gradle build -x test"],php:['echo "PHP build: typically no build step"'],rust:["cargo build --release"],dotnet:["dotnet build -c Release"],elixir:["mix compile"],ruby:["gem build *.gemspec"],"jvm-generic":["mvn package -DskipTests","gradle build"],unknown:[]},start:{python:["python app.py","python main.py","uvicorn main:app --reload"],node:["npm start","node index.js","node src/index.js"],go:["./app","go run main.go","go run ./..."],java:["mvn spring-boot:run","gradle bootRun","java -jar target/*.jar"],php:["php -S 0.0.0.0:8000","php artisan serve"],rust:["cargo run --release","./target/release/app"],dotnet:["dotnet run"],elixir:["mix phx.server","iex -S mix"],ruby:["rails server","ruby app.rb","bundle exec puma"],"jvm-generic":["java -jar *.jar","gradle run"],unknown:[]}};function oe(e,t){if(t){let r=t.trim().toLowerCase().replace(/[_.\s]+/g,"-"),n=e$1(t),a=`${e}-${n==="gofiber"?"fiber":n==="gogin"?"gin":n==="dotnet"?"aspnetcore":n!=="unknown"?n:r==="fiber"?"fiber":r==="aspnetcore"||r==="asp-net-core"?"aspnetcore":r}`;return _e[a]}}function Ce(e,t,r){if(t){let n=oe(e,t);if(n&&n.commands[r])return n.commands[r]}if(["init","test","build","start"].includes(r)){let n=Ge[r]?.[e]??[];return n.length>0?n[0]:void 0}}var Be={test:"test",build:"build",start:"start"};function se(e){if(e.stage==="init")return e.runtime==="node"?Ee(e.projectPath):Ce(e.runtime,e.framework,e.stage);if(e.runtime==="node"){let t=Be[e.stage];if(t){let r=n(e.projectPath,t,{framework:e.framework});if(r)return Se(e.projectPath,r.scriptName)}}return Ce(e.runtime,e.framework,e.stage)}function ze(e){let t=h(e).map(r=>r==="python"?"python":r==="node"||r==="bun"?"node":r==="go"?"go":r==="java"?"java":r==="php"?"php":r==="rust"?"rust":r==="dotnet"?"dotnet":r==="elixir"?"elixir":r==="ruby"?"ruby":r==="clojure"||r==="scala"||r==="kotlin"?"jvm-generic":null).filter(r=>r!==null).filter((r,n,o)=>o.indexOf(r)===n);return {primary:t.length>0?t[0]:"unknown",secondary:t.slice(1)}}function Pe(e){return ze(e).primary}function ae(e,t){if(!e)return "unknown";t||(t={setup:["ModuleNotFoundError","npm ERR!","error:","not found"],"test-failure":["FAILED","FAIL","failed"],dependency:["cannot find module","import.*error"],runtime:["Exception","Error:","panic","TypeError"],timeout:["timeout","Timeout","deadline exceeded"],unknown:[]});for(let[r,n]of Object.entries(t))for(let o of n)if(new RegExp(o,"i").test(e))return r;return "unknown"}async function q(e){let t=e.split(/[&|;]\s*/)[0].trim().split(/\s+/)[0];if(["echo","cd","pwd","test","true","false","exit"].includes(t))return {valid:true};try{let n=process.platform==="win32"?"where":"which";if((await execa(n,[t],{reject:false})).exitCode===0)return {valid:true}}catch{}return {valid:false,reason:`Command '${t}' not found or not executable`}}function Fe(e,t,r){if(!t)return e;let n=typeof t=="object"&&!Array.isArray(t)&&("dev"in t||"staging"in t||"prod"in t||"default"in t)&&!Object.keys(t).some(o=>["init","test","build","start"].includes(o))?t:{};return r&&typeof n[r]=="string"?n[r]:typeof n.default=="string"?n.default:e}var Ae={init:"init",test:"test",build:"build",start:"start"};function Ke(e){return e in Ae?Ae[e]:null}function Ve(e,t){let n=j(e)?.contextJson?.commands;if(!n||typeof n!="object"||Array.isArray(n))return;let o=n[t];if(typeof o=="string"&&o.trim().length>0)return o.trim();if(o&&typeof o=="object"&&!Array.isArray(o)){let a=o,c=a.default??a.dev;if(typeof c=="string"&&c.trim().length>0)return c.trim()}}function De(e,t,r=q$1(e)){let n=Ke(t);if(!n)return Ve(e,t)?{supported:true}:{supported:false,reason:`Workspace stage "${t}" is not part of the Workspai fleet contract.`};if(!r.projectRoot)return {supported:false,reason:"No Workspai project metadata was detected for this target."};let o=r.commandMap[n];return !o||o.status!=="supported"?{supported:false,reason:o?.reason??`Command "${n}" is not supported for this project runtime/framework.`}:{supported:true}}var He=new Set(["init","test","build","start"]),Ue=new Set([".git","node_modules",".workspai",".rapidkit",".venv","dist","build","coverage","htmlcov"]);async function I(e){try{return await _.promises.access(e,_.constants.F_OK),true}catch{return false}}async function Je(e){for(let t of e)if(await I(t))return true;return false}async function qe(e,t,r){if(t==="python"){let o=[b.join(e,".workspai","cli.py"),b.join(e,".rapidkit","cli.py")];for(let a of o)if(await I(a))return {valid:true};return {valid:false,reason:"Project-local .workspai/cli.py is missing. Run `workspai init` in this project first."}}let n=r.trim().split(/\s+/)[0];if(n&&["npm","npx","pnpm","yarn"].includes(n)){let o=e$2(n);if((await execa(o.command,[...o.prefixArgs,"--version"],{reject:false,env:g()})).exitCode===0)return {valid:true}}return q(r)}async function ce(e){let t=await _.promises.readFile(e,"utf-8");return JSON.parse(t)}function D(e){return e.replace(/\\/g,"/")}function Ye(e){let t=e?.trim();return t?t.startsWith("project:")?t.slice(8).trim()||null:t:null}async function Qe(e){return a(e,{skipDirs:Ue,includeHiddenDirs:false,descendIntoMatchedProjects:false,isProjectDir:async(t,r)=>await Je([...p(t,"context.json"),...p(t,"project.json")])?true:b.resolve(t)===b.resolve(r)?false:h(t).length>0})}async function Xe(e){for(let t of [b.join(".workspai","project.json"),b.join(".workspai","context.json"),b.join(".rapidkit","project.json"),b.join(".rapidkit","context.json")]){let r=b.join(e,t);if(await I(r))try{let n=await ce(r),o=n.name??n.projectName??n.slug;if(typeof o=="string"&&o.trim())return o.trim()}catch{}}return null}async function Ze(e,t,r){let n=Ye(r);if(!n)return {projects:t,normalizedScope:null};let o=D(n).toLowerCase(),a=[];for(let c of t){let u=D(b.relative(e,c)),p=b.basename(c),m=await Xe(c);[u,p,m].filter(s=>typeof s=="string"&&s.length>0).map(s=>D(s).toLowerCase()).includes(o)&&a.push(c);}if(a.length===0)throw new Error(`Workspace run scope did not match any project: ${r}`);return {projects:a,normalizedScope:n}}async function et(e,t,r){let n=await execa("git",["diff","--name-only",`${r}...HEAD`],{cwd:e,reject:false});if(n.exitCode!==0)return new Set(t);let o=n.stdout.split(/\r?\n/).map(c=>c.trim()).filter(c=>c.length>0).map(c=>D(c));if(o.length===0)return new Set;let a=new Set;for(let c of t){let u=D(b.relative(e,c));if(!u||u===".")continue;let p=`${u}/`;o.some(m=>m===u||m.startsWith(p))&&a.add(c);}return a}async function tt(e,t,r){let n=await c(e,".workspai/workspace.contract.json")??l(e,"workspace.contract.json");if(await I(n))try{let g=await rt(e,t,r,n);if(g.graphStatus!=="missing")return g}catch{return {expanded:r,graphStatus:"invalid",expansionDepth:0}}let o=await c(e,".workspai/workspace-dependency-graph.json")??l(e,"workspace-dependency-graph.json");if(!await I(o))return {expanded:r,graphStatus:"missing",expansionDepth:0};let a;try{a=await ce(o);}catch{return {expanded:r,graphStatus:"invalid",expansionDepth:0}}let c$1=new Set(t.map(g=>b.resolve(g))),u=new Map;if(!a||typeof a!="object"||Array.isArray(a))return {expanded:r,graphStatus:"invalid",expansionDepth:0};let p=Array.isArray(a.projects)?a.projects:[];for(let g of p){if(!g||typeof g!="object"||Array.isArray(g))continue;let s=g,d=typeof s.path=="string"?s.path:"",y=b.resolve(e,d);if(!c$1.has(y))continue;let h=Array.isArray(s.dependsOn)?s.dependsOn.filter(w=>typeof w=="string"):[];for(let w of h){let x=b.resolve(e,w);c$1.has(x)&&(u.has(x)||u.set(x,new Set),u.get(x)?.add(y));}}let m=d$1(u,r);return {expanded:m.reached,graphStatus:"loaded",expansionDepth:m.added}}async function rt(e,t,r,n){let o=await ce(n);if(!o||typeof o!="object"||Array.isArray(o))return {expanded:r,graphStatus:"invalid",expansionDepth:0};let a=o,c=Array.isArray(a.projects)?a.projects:null;if(!c)return {expanded:r,graphStatus:"invalid",expansionDepth:0};let u=new Map,p=new Map;for(let y of t){let h=D(b.relative(e,y));p.set(h,b.resolve(y));}let m=new Map,g=new Map,s=new Map;for(let y of c){if(!y||typeof y!="object"||Array.isArray(y))continue;let h=y,w=typeof h.slug=="string"?h.slug:"",x=typeof h.relativePath=="string"?D(h.relativePath):w,R=p.get(x);!w||!R||u.set(w,R);}for(let y of c){if(!y||typeof y!="object"||Array.isArray(y))continue;let h=y,w=typeof h.slug=="string"?h.slug:"",x=u.get(w);if(!x)continue;let R=h.contracts&&typeof h.contracts=="object"&&!Array.isArray(h.contracts)?h.contracts:{},j=Array.isArray(R.dependsOn)?R.dependsOn.filter(v=>typeof v=="string"):[],N=Array.isArray(R.publishes)?R.publishes.filter(v=>typeof v=="string"):[],T=Array.isArray(R.consumes)?R.consumes.filter(v=>typeof v=="string"):[];for(let v of j){let S=u.get(v);S&&(s.has(S)||s.set(S,new Set),s.get(S)?.add(x));}for(let v of N)m.has(v)||m.set(v,new Set),m.get(v)?.add(x);for(let v of T)g.has(v)||g.set(v,new Set),g.get(v)?.add(x);}for(let[y,h]of m.entries()){let w=g.get(y);if(w)for(let x of h){s.has(x)||s.set(x,new Set);for(let R of w)R!==x&&s.get(x)?.add(R);}}let d=d$1(s,r);return {expanded:d.reached,graphStatus:"loaded",expansionDepth:d.added}}async function nt(e,t){if(typeof t=="boolean")return t;let r=o(e,"policies.yml").find(a=>_.existsSync(a))??l(e,"policies.yml");if(!await I(r))return true;let n="";try{n=await _.promises.readFile(r,"utf-8");}catch{return true}let o$1=n.match(/^[\t ]*rules\.enforce_workspace_run_gates:\s*(true|false)\s*(?:#.*)?$/m);return o$1?o$1[1]==="true":true}function ot(e){let t=process.env.RAPIDKIT_WORKSPACE_RUN_STAGE_TIMEOUT_MS;if(t){let r=Number.parseInt(t,10);if(Number.isFinite(r)&&r>0)return r}return e==="init"?12e4:9e4}async function ie(e,t,r){let n=process.argv[1];if(!n)return {exitCode:1,stdout:"",stderr:"RapidKit entrypoint is unavailable for nested workspace-run execution."};try{let o=await execa(process.execPath,[n,...e],{cwd:t,reject:false,timeout:r,env:{...process.env,RAPIDKIT_WORKSPACE_RUN_CHILD:"1"}});return {exitCode:Number(o.exitCode??1),stdout:o.stdout,stderr:o.stderr}}catch(o){return {exitCode:typeof o=="object"&&o!==null&&"timedOut"in o&&!!o.timedOut?124:1,stdout:typeof o=="object"&&o!==null&&"stdout"in o?String(o.stdout??""):"",stderr:typeof o=="object"&&o!==null&&"stderr"in o?String(o.stderr??""):o instanceof Error?o.message:String(o)}}}function st(e){return e==="node"||e==="go"||e==="java"||e==="python"||e==="dotnet"}function at(){return process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"}async function it(e){let t=process.cwd();try{process.chdir(e);let{handleInitCommand:r}=await import('./index.js');return {exitCode:await r(["init"]),stdout:"",stderr:""}}finally{process.chdir(t);}}async function ct(e){let t=s=>{let d=f(s);return d==="node"||d==="bun"?"node":d==="python"?"python":d==="go"?"go":d==="java"?"java":d==="php"?"php":d==="ruby"?"ruby":d==="rust"?"rust":d==="dotnet"?"dotnet":d==="elixir"?"elixir":d==="clojure"||d==="scala"||d==="kotlin"?"jvm-generic":Pe(e)},r=s=>{if(!s)return;let d=e$1(s);if(new Set(["fastapi","django","flask","nestjs","express","fastify","koa","gofiber","gogin","echo","springboot","laravel","symfony","rails","sinatra","dotnet","actix","axum","rocket","phoenix"]).has(d))return d},n=j(e),o=n?.detection??i(e,n?.projectJson??null),a=n?.contextJson,c=t(o.runtime),u=r(o.key),p={},m=new Set(["init","test","build","start"]);if(a?.commands&&typeof a.commands=="object")for(let[s,d]of Object.entries(a.commands))typeof d=="string"&&m.has(s)&&(p[s]=d);let g;if(a?.commandEnvironments&&typeof a.commandEnvironments=="object"){let s=a.commandEnvironments;g={dev:typeof s.dev=="string"?s.dev:void 0,staging:typeof s.staging=="string"?s.staging:void 0,prod:typeof s.prod=="string"?s.prod:void 0,default:typeof s.default=="string"?s.default:void 0};}return {runtime:c,framework:u,commandOverrides:Object.keys(p).length>0?p:void 0,environmentCommandVariants:g,environment:typeof a?.environment=="string"?a.environment:void 0}}async function ut(e,t,r,n,o,a,c){let u=!o?.[t]&&st(r),p;if(o&&o[t]?p=o[t]:u?p=`rapidkit ${t}`:p=se({projectPath:e,runtime:r,framework:n,stage:t}),!p)return {exitCode:127,command:`<stage not supported for ${r}>`,message:`No stage command found for runtime '${r}' and framework '${n||"unknown"}'`,errorCategory:"runtime"};let m=Fe(p,a,c);if(!m)return {exitCode:127,command:p,message:"Failed to resolve stage command",errorCategory:"runtime"};let g=se({projectPath:e,runtime:r,framework:n,stage:t});if(u){if(g){let f=u?await qe(e,r,g):await q(g);if(!f.valid)return {exitCode:127,command:m,message:f.reason||"Command not available",errorCategory:"setup"}}}else {let f=await q(m);if(!f.valid)return {exitCode:127,command:m,message:f.reason||"Command not available",errorCategory:"setup"}}let s=0,d="",y="",h,w=ot(t),x=Date.now();try{let f=u?t==="init"&&at()?await it(e):await ie([t],e,w):await execa(m,[],{cwd:e,reject:false,shell:true,timeout:w});if(s=Number(f.exitCode??0),d=f.stdout,y=f.stderr,s!==0){let C=`${d}
2
- ${y}`,z=Date.now()-x;h=s===124||ae(C)==="timeout"||s===143&&z>=Math.floor(w*.8)?"timeout":ae(C);}}catch(f){let C=typeof f=="object"&&f!==null&&"timedOut"in f&&!!f.timedOut;return {exitCode:C?124:1,command:m,message:C?`Stage timed out after ${w}ms`:f instanceof Error?f.message:"Command execution failed",errorCategory:C?"timeout":"runtime"}}let R,j=`${d}
3
- ${y}`.split(/\r?\n/).map(f=>f.trim()).filter(Boolean),N=j.slice(0,6).join(`
4
- `),T=Date.now()-x,v=s===124||h==="timeout"||s===143&&T>=Math.floor(w*.8),S=s===0?void 0:v?"timeout":h,W=s===0||!S?void 0:{category:S,exitCode:s,command:m,timedOut:v,timeoutMs:w,...N?{outputExcerpt:N}:{}};return {exitCode:s,command:m,errorCategory:S,healthStatus:R,failureDiagnostic:W,message:v?`Stage timed out after ${w}ms`:s!==0?N?`Stage failed with exit code ${s}: ${j[0]}`:`Stage failed with exit code ${s}`:void 0}}function Ne(e){try{return JSON.parse(e)}catch{return null}}function dt(e){switch(e){case "dotnet":return "Install .NET 8+ SDK, then rerun `npx workspai setup dotnet` or `npx workspai init`.";case "go":return "Install Go 1.21+, then rerun `npx workspai setup go` or `npx workspai init`.";case "java":case "jvm-generic":return "Install Java 21+ and Maven/Gradle, then rerun `npx workspai setup java` or `npx workspai init`.";case "node":return "Install Node.js LTS and npm/pnpm/yarn, then rerun `npx workspai setup node` or `npx workspai init`.";case "python":return "Install Python 3.10+ and pip/Poetry, then rerun `npx workspai setup python` or `npx workspai init`.";default:return null}}async function lt(e){let t=[],r=await ie(["doctor","workspace","--json"],e);if(r.exitCode!==0)t.push({gate:"doctor-workspace",status:"fail",summary:"doctor workspace command failed"});else {let a=Ne(r.stdout)?.healthScore,c=Number(a?.errors??0);Number.isFinite(c)&&c>0?t.push({gate:"doctor-workspace",status:"fail",summary:`doctor workspace reports ${c} error(s)`}):t.push({gate:"doctor-workspace",status:"pass",summary:"doctor workspace passed"});}let n=await ie(["readiness","--json"],e);if(n.exitCode!==0)t.push({gate:"readiness",status:"fail",summary:"readiness command failed"});else {let o=Ne(n.stdout),a=String(o?.overallStatus??"").toLowerCase();a==="fail"?t.push({gate:"readiness",status:"fail",summary:"readiness overall status is fail"}):a==="warn"?t.push({gate:"readiness",status:"warn",summary:"readiness overall status is warn"}):t.push({gate:"readiness",status:"pass",summary:"readiness overall status is pass"});}return t}var pt=new Set(["dev","stop"]);function mt(e){let t=e.trim();return !t||pt.has(t.toLowerCase())?false:He.has(t)?true:/^[a-z][a-z0-9_-]*$/i.test(t)}function Oe(e,t,r){let n=D(b.relative(r,t));return (Array.isArray(e.projects)?e.projects:[]).some(a=>{if(!a||typeof a!="object")return false;let c=a,u=[c.relativePath,c.path].filter(p=>typeof p=="string"&&p.length>0).map(p=>D(p));return c.status==="passed"&&(u.includes(n)||u.some(p=>p.endsWith(`/${n}`)))})}function ft(e,t){return oe(e,t)?.dependencies??[]}function gt(e,t){let r=Math.max(1,Math.min(4,t)),n=Number(e??r);return Number.isFinite(n)?Math.max(1,Math.min(16,Math.trunc(n))):r}async function Yt(e$1){if(!mt(e$1.stage))throw new Error(`Unsupported workspace run stage: ${e$1.stage}`);let t=Date.now(),r=b.resolve(e$1.workspacePath),n=await d(r),o=await Qe(r),{projects:a,normalizedScope:c}=await Ze(r,o,e$1.scope),u=e$1.affected===true,p=e$1.blastRadius===true,m=e$1.since?.trim()||"HEAD~1",g=u?await et(r,a,m):new Set(a),s,d$1="not-applicable",y=0,h="all";if(u&&p){let l=await tt(r,o,g);s=l.expanded,d$1=l.graphStatus,y=l.expansionDepth,h="affected+blast-radius";}else u?(s=g,h="affected"):(s=g,h="all");let w=e$1.stage==="init"?false:await nt(r,e$1.enforceGates),x=w?await lt(r):[{gate:"doctor-workspace",status:"skipped",summary:"workspace run gates disabled"},{gate:"readiness",status:"skipped",summary:"workspace run gates disabled"}],R=x.find(l=>l.status==="fail"),j=a.filter(l=>s.has(l)),N=e$1.continueOnError===true||e$1.stage==="init",T=e$1.parallel===true,v=gt(e$1.maxWorkers,j.length),S=j.length,W=0;e$1.json||console.log(E.gray(`Workspace run (${e$1.stage}) started: ${S} target(s), ${T?`parallel x${v}`:"sequential"}`));let f=new Map;for(let l of o){let k=D(b.relative(r,l)),i=a.includes(l),F=i&&s.has(l);f.set(l,{path:l,relativePath:k,projectName:b.basename(k)||b.basename(l),selected:F,affected:F,status:"skipped",exitCode:null,durationMs:0,reason:F?void 0:i?"not affected":"outside scope",framework:void 0,runtimeDetected:void 0,executionCommand:void 0});}if(R)for(let l of j){let k=f.get(l);k&&(k.status="skipped",k.reason=`blocked by ${R.gate}`);}else {let l=async k=>{let i=f.get(k);if(!i)return;let F=D(b.relative(r,k));e$1.json||console.log(E.gray(`\u23F3 [${W}/${S}] ${e$1.stage} ${F}`)),i.selected=true,i.affected=true;let A=Date.now(),{runtime:P,framework:O,commandOverrides:Te,environmentCommandVariants:$e,environment:Ie}=await ct(k);i.runtimeDetected=P,i.framework=O;let pe=De(k,e$1.stage);if(!pe.supported){i.status="skipped",i.reason=pe.reason??`stage "${e$1.stage}" unsupported for project`,i.durationMs=Date.now()-A,i.exitCode=null,W+=1;return}if(e$1.reusePassed&&n){let $=n.stages[e$1.stage]??n.stages[e$1.stage];if($&&Oe($,k,r)){i.status="passed",i.reason="reused passed result from workspace-run-last.json",i.durationMs=Date.now()-A,i.exitCode=0,W+=1,e$1.json||console.log(E.gray(`\u21BA reused passed cache for ${F}`));return}}let me=ft(P,O);if(me.length>0&&n){let $=me.find(Q=>{let L=n.stages[Q];return !L||!Oe(L,k,r)});if($){i.status="skipped",i.reason=`dependency stage "${$}" not satisfied in workspace-run-last.json`,i.durationMs=Date.now()-A,i.exitCode=null,W+=1;return}}let M=await ut(k,e$1.stage,P,O,Te,$e,Ie);if(i.executionCommand=M.command,i.errorCategory=M.errorCategory,i.healthStatus=M.healthStatus,i.failureDiagnostic=M.failureDiagnostic,i.durationMs=Date.now()-A,i.exitCode=M.exitCode,M.exitCode===0?(i.status="passed",i.reason=void 0):(i.status="failed",i.reason=M.message||"stage command failed",i.errorMessage=M.message),W+=1,!e$1.json){let $=S>0?Math.round(W/S*100):100,Q=i.status==="passed"?E.green("\u2705"):E.red("\u274C");if(console.log(E.gray(`${Q} [${W}/${S}] (${$}%) ${F} ${i.durationMs}ms`)),i.status==="failed"){i.reason&&console.log(E.red(` Reason: ${i.reason}`)),i.executionCommand&&console.log(E.gray(` Command: ${i.executionCommand}`));let L=dt(i.runtimeDetected);L&&i.errorCategory==="setup"&&console.log(E.gray(` Hint: ${L}`));}}};if(T&&j.length>1){let k=0,i=false,F=new Array(v).fill(null).map(async()=>{for(;k<j.length;){if(i&&!N)return;let A=k;k+=1;let P=j[A];await l(P),f.get(P)?.status==="failed"&&(i=true);}});if(await Promise.all(F),!N&&i){let A=false;for(let P of j){let O=f.get(P);if(O){if(O.status==="failed"){A=true;continue}A&&O.status==="skipped"&&(O.reason=O.reason||"stopped after failure");}}}}else for(let k of j){await l(k);let i=f.get(k);if(!N&&i?.status==="failed"){let F=j.slice(j.indexOf(k)+1);for(let A of F){let P=f.get(A);P&&(P.status="skipped",P.reason="stopped after failure");}break}}}let C=[];for(let l of o){let k=f.get(l);k&&C.push(k);}let z=C.filter(l=>l.status==="passed").length,K=C.filter(l=>l.status==="failed").length,ue=C.filter(l=>l.status==="skipped").length,de=e$1.strict===true,We=K>0||de&&x.some(l=>l.status==="fail"||l.status==="warn")?1:0,le={schemaVersion:"1.0",workspacePath:r,stage:e$1.stage,generatedAt:new Date().toISOString(),durationMs:Date.now()-t,options:{affected:u,blastRadius:p,since:u?m:null,parallel:T,maxWorkers:v,continueOnError:N,strict:de,enforceGates:w,scope:c,reusePassed:e$1.reusePassed===true},selection:{mode:h,since:u?m:null,scope:c,graphStatus:d$1,expansionDepth:y},gates:{enforced:w,results:x,blocked:!!R,blockingGate:R?.gate},summary:{projectCount:o.length,selectedCount:j.length,passed:z,failed:K,skipped:ue,exitCode:We},projects:C,enterpriseControls:{jsonReady:true,evidencePath:b$1}},Me=b.join(r,b$1);return await e(r,le),e$1.json||(R&&(console.log(E.red(`\u274C Workspace run blocked by ${R.gate}`)),console.log(E.gray(` ${R.summary}`))),console.log(E.cyan(`Workspace run (${e$1.stage}) => passed: ${z}, failed: ${K}, skipped: ${ue}`)),console.log(E.gray(`Report: ${Me}`))),le}export{Yt as a};
@@ -1,149 +0,0 @@
1
- import {c}from'./chunk-Y45WZR5N.js';import {promises}from'fs';import a from'path';import L from'nunjucks';import e from'chalk';import h from'ora';import {fileURLToPath}from'url';import {execa}from'execa';import W from'crypto';var N=fileURLToPath(import.meta.url),J=a.dirname(N);function M(t=32){let i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",v=W.randomBytes(t),o="";for(let p=0;p<t;p++)o+=i[v[p]%i.length];return o}async function X(t,i){let o=(i.template||"fastapi")==="fastapi",p=o?"FastAPI":"NestJS",d=i.kit_name||(o?"fastapi.standard":"nestjs.standard"),A=d.replace(".","/"),x=h(`Generating ${p} project...`).start();try{let k=a.resolve(J,".."),m;d==="fastapi.ddd"?m="fastapi-ddd":d.startsWith("fastapi")?m="fastapi-standard":m="nestjs-standard";let w=a.join(k,"templates","kits",m),$=L.configure(w,{autoescape:false,trimBlocks:true,lstripBlocks:true});$.addFilter("generate_secret",function(n,r=32){return M(r)});let D={project_name:i.project_name,author:i.author||"Workspai User",description:i.description||(o?"FastAPI service generated with Workspai":"NestJS application generated with Workspai"),app_version:i.app_version||"0.1.0",license:i.license||"MIT",package_manager:i.package_manager||"npm",node_version:i.node_version||"20.0.0",database_type:i.database_type||"postgresql",include_caching:i.include_caching||false,created_at:new Date().toISOString(),workspai_version:c(),rapidkit_version:c()},y;o?y=["src/main.py.j2","src/__init__.py.j2","src/cli.py.j2","src/routing/__init__.py.j2","src/routing/health.py.j2","src/routing/examples.py.j2","src/modules/__init__.py.j2","tests/__init__.py.j2","tests/test_health.py.j2","tests/test_examples.py.j2","README.md.j2","pyproject.toml.j2","Makefile.j2","env.example.j2","rapidkit.j2","rapidkit.cmd.j2"]:y=["src/main.ts.j2","src/app.module.ts.j2","src/app.controller.ts.j2","src/app.service.ts.j2","src/config/configuration.ts.j2","src/config/validation.ts.j2","src/config/index.ts.j2","src/modules/index.ts.j2","src/examples/examples.module.ts.j2","src/examples/examples.controller.ts.j2","src/examples/examples.service.ts.j2","src/examples/dto/create-note.dto.ts.j2","test/app.controller.spec.ts.j2","test/examples.controller.spec.ts.j2","test/app.e2e-spec.ts.j2","test/jest-e2e.json.j2","package.json.j2","tsconfig.json.j2","tsconfig.build.json.j2","nest-cli.json.j2","jest.config.ts.j2","eslint.config.cjs.j2","env.example.j2","docker-compose.yml.j2","Dockerfile.j2","README.md.j2","rapidkit.j2","rapidkit.cmd.j2"];for(let n of y){let r=a.join(w,n);try{await promises.access(r);}catch{continue}let j=await promises.readFile(r,"utf-8"),g;try{g=$.renderString(j,D);}catch(P){throw console.error(`Failed to render template: ${n}`),P}let c=n==="env.example.j2"?".env.example":n.replace(/\.j2$/,""),_=a.join(t,c);await promises.mkdir(a.dirname(_),{recursive:true}),await promises.writeFile(_,g),(c.endsWith(".workspai/rapidkit")||c.endsWith(".workspai/cli.py")||c.endsWith(".workspai/activate")||c.endsWith(".rapidkit/rapidkit")||c.endsWith(".rapidkit/cli.py")||c.endsWith(".rapidkit/activate")||c==="rapidkit")&&await promises.chmod(_,493);}if(o){let n=a.join(w,".rapidkit","context.json"),r=a.join(t,".workspai","context.json");try{await promises.mkdir(a.join(t,".workspai"),{recursive:true}),await promises.copyFile(n,r);}catch{await promises.mkdir(a.join(t,".workspai"),{recursive:true});let g=i.engine||"pip";await promises.writeFile(r,JSON.stringify({engine:g,created_by:"workspai-cli-fallback",legacyCreatedBy:"rapidkit-npm-fallback"},null,2));}}let S=a.join(t,".workspai");await promises.mkdir(S,{recursive:true});let F=a.join(S,"project.json"),E={kit_name:d,profile:A,created_at:new Date().toISOString(),created_by:"workspai-cli-fallback",workspai_version:c(),rapidkit_version:c(),runtime:o?"python":"node"},R=JSON.stringify(E,null,2);await promises.writeFile(F,R,"utf-8");let f=a.join(t,"rapidkit");await promises.access(f).then(()=>true).catch(()=>false)||(await promises.writeFile(f,`#!/usr/bin/env bash
2
- set -euo pipefail
3
- SCRIPT_DIR="$(cd "$(dirname "\${BASH_SOURCE[0]}")" && pwd)"
4
- cd "$SCRIPT_DIR"
5
- RAPIDKIT_LOCAL_LAUNCHER_BYPASS=1 npx workspai "$@"
6
- `),await promises.chmod(f,493));let I=a.join(t,"rapidkit.cmd");await promises.access(I).then(()=>true).catch(()=>false)||await promises.writeFile(I,`@echo off
7
- set RAPIDKIT_LOCAL_LAUNCHER_BYPASS=1
8
- npx workspai %*
9
- `);let C=o?`# Python
10
- __pycache__/
11
- *.py[cod]
12
- *$py.class
13
- *.so
14
- .Python
15
- build/
16
- develop-eggs/
17
- dist/
18
- downloads/
19
- eggs/
20
- .eggs/
21
- lib/
22
- lib64/
23
- parts/
24
- sdist/
25
- var/
26
- wheels/
27
- *.egg-info/
28
- .installed.cfg
29
- *.egg
30
-
31
- # Virtual environments
32
- .venv/
33
- venv/
34
- ENV/
35
- env/
36
-
37
- # IDEs
38
- .vscode/
39
- .idea/
40
- *.swp
41
- *.swo
42
- *~
43
-
44
- # OS
45
- .DS_Store
46
- Thumbs.db
47
-
48
- # Project specific
49
- .env
50
- .env.local
51
- `:`# Node artifacts
52
- node_modules/
53
- dist/
54
- .tmp/
55
- .env
56
- .env.*
57
- !.env.example
58
-
59
- # Logs
60
- logs/
61
- *.log
62
- npm-debug.log*
63
- yarn-debug.log*
64
- yarn-error.log*
65
- pnpm-debug.log*
66
-
67
- # OS
68
- .DS_Store
69
- Thumbs.db
70
-
71
- # IDEs
72
- .idea/
73
- .vscode/
74
-
75
- # Coverage
76
- coverage/
77
- `;if(await promises.writeFile(a.join(t,".gitignore"),C),x.succeed(`${p} project generated!`),!i.skipGit){let n=h("Initializing git repository...").start();try{await execa("git",["init"],{cwd:t}),await execa("git",["add","."],{cwd:t}),await execa("git",["commit","-m",`Initial commit: ${p} project via Workspai`],{cwd:t}),n.succeed("Git repository initialized");}catch{n.warn("Could not initialize git repository");}}if(!o&&!i.skipInstall){let n=i.package_manager||"npm",r=h(`Installing dependencies with ${n}...`).start();try{await execa(n,n==="yarn"?["install"]:n==="pnpm"?["install"]:["install"],{cwd:t}),r.succeed("Dependencies installed");}catch{r.warn(`Could not install dependencies. Run '${n} install' manually.`);}}let b=a.basename(t);console.log(`
78
- ${e.yellow("\u26A0\uFE0F Limited offline mode:")} This project was created using basic templates.
79
- ${e.gray("For full kit features, install Python 3.10+ and rapidkit-core:")}
80
- ${e.cyan(" sudo apt install python3 python3-pip python3-venv")}
81
- ${e.cyan(" pip install rapidkit-core")}
82
- `),console.log(o?`
83
- ${e.green("\u2728 FastAPI project created successfully!")}
84
-
85
- ${e.bold("\u{1F4C2} Project structure:")}
86
- ${t}/
87
- \u251C\u2500\u2500 .workspai/ # Workspai metadata
88
- \u251C\u2500\u2500 src/
89
- \u2502 \u251C\u2500\u2500 main.py # FastAPI application
90
- \u2502 \u251C\u2500\u2500 cli.py # CLI commands
91
- \u2502 \u251C\u2500\u2500 routing/ # API routes
92
- \u2502 \u2514\u2500\u2500 modules/ # Module system
93
- \u251C\u2500\u2500 tests/ # Test suite
94
- \u251C\u2500\u2500 pyproject.toml # Poetry configuration
95
- \u2514\u2500\u2500 README.md
96
-
97
- ${e.bold("\u{1F680} Get started:")}
98
- ${e.cyan(`cd ${b}`)}
99
- ${e.cyan("npx workspai init")} ${e.gray("# Install dependencies")}
100
- ${e.cyan("npx workspai dev")} ${e.gray("# Start dev server")}
101
-
102
- ${e.bold("\u{1F4DA} Available commands:")}
103
- npx workspai init # Install dependencies (poetry install)
104
- npx workspai dev # Start dev server with hot reload
105
- npx workspai start # Start production server
106
- npx workspai test # Run tests
107
- npx workspai lint # Lint code
108
- npx workspai format # Format code
109
-
110
- ${e.gray("Alternative: make dev, npx workspai dev, poetry run dev")}
111
- ${e.gray("\u{1F4A1} Tip: Install globally (npm i -g workspai) to use without npx")}
112
- `:`
113
- ${e.green("\u2728 NestJS project created successfully!")}
114
-
115
- ${e.bold("\u{1F4C2} Project structure:")}
116
- ${t}/
117
- \u251C\u2500\u2500 .workspai/ # Workspai metadata
118
- \u251C\u2500\u2500 src/
119
- \u2502 \u251C\u2500\u2500 main.ts # Application entry point
120
- \u2502 \u251C\u2500\u2500 app.module.ts # Root module
121
- \u2502 \u251C\u2500\u2500 config/ # Configuration
122
- \u2502 \u2514\u2500\u2500 examples/ # Example module
123
- \u251C\u2500\u2500 test/ # Test files
124
- \u251C\u2500\u2500 package.json # Dependencies
125
- \u2514\u2500\u2500 README.md
126
-
127
- ${e.bold("\u{1F680} Get started:")}
128
- ${e.cyan(`cd ${b}`)}
129
- ${e.cyan("npx workspai init")} ${e.gray("# Install dependencies")}
130
- ${e.cyan("cp .env.example .env")}
131
- ${e.cyan("npx workspai dev")} ${e.gray("# Start dev server")}
132
-
133
- ${e.bold("\u{1F4DA} Available commands:")}
134
- npx workspai init # Install dependencies
135
- npx workspai dev # Start dev server with hot reload
136
- npx workspai start # Start production server
137
- npx workspai build # Build for production
138
- npx workspai test # Run tests
139
- npx workspai lint # Lint code
140
- npx workspai format # Format code
141
-
142
- ${e.bold("\u{1F310} API endpoints:")}
143
- http://localhost:8000/health # Health check
144
- http://localhost:8000/docs # Swagger docs
145
- http://localhost:8000/examples/notes # Example API
146
-
147
- ${e.gray("Alternative: npm run start:dev, npx workspai dev")}
148
- ${e.gray("\u{1F4A1} Tip: Install globally (npm i -g workspai) to use without npx")}
149
- `);}catch(k){throw x.fail(`Failed to generate ${p} project`),k}}export{X as generateDemoKit};
@@ -1 +0,0 @@
1
- export{b as computeDoctorGateExitCode,a as resolveDoctorPolicyProfile,c as runDoctor}from'./chunk-AAKUNWPR.js';
@@ -1,5 +0,0 @@
1
- import {a as a$2}from'./chunk-OL64GWQC.js';import {c as c$2}from'./chunk-PI5KUXDA.js';import {c}from'./chunk-AAKUNWPR.js';import {b}from'./chunk-VRDF2J46.js';import {a as a$3}from'./chunk-LO4C4VXR.js';import {f,e}from'./chunk-T3GJ7YVG.js';import {a}from'./chunk-22DT744Z.js';import {c as c$1,a as a$1,d}from'./chunk-NAAQMSO3.js';import c$3 from'chalk';import p from'path';function W(s){return s===0?"pass":s===2?"warn":"fail"}function F(s){return s.some(r=>r.status==="fail")?"blocked":s.some(r=>r.status==="warn")?"needs-attention":"ready"}function j(s,r){if(r)return 3;let t=s.some(i=>i.status==="fail"),n=s.some(i=>i.status==="warn");return t?1:n?2:0}async function G(s){let r=await b(s,true),t=false;try{let{syncWorkspaceContract:n}=await import('./workspace-contract-XUGMCUSQ.js');await n({workspacePath:s}),t=true;}catch{t=false;}return {sync:r,contractSynced:t}}async function I(s={}){let r=p.resolve(s.workspacePath??process.cwd()),t=a(r);if(!t)throw new Error("No Workspai workspace found in current directory or parents");let n=[],i=[],l=false,d$1,m,g,f$1=Date.now();try{let{sync:e,contractSynced:a}=await G(t),o=e.workspaceFound&&(e.added.length>0||e.skipped>=0)||e.workspaceFound?"pass":"warn";n.push({name:"sync",status:o,durationMs:Date.now()-f$1,summary:e.workspaceFound?`registry sync complete (${e.added.length} added, ${e.skipped} existing)${a?", contract synced":""}`:"workspace not registered in global registry; contract sync attempted"}),e.workspaceFound||i.push("workspace registry entry missing \u2014 run workspai create workspace or register manually");}catch(e){l=true,n.push({name:"sync",status:"fail",durationMs:Date.now()-f$1,summary:`sync failed: ${e instanceof Error?e.message:String(e)}`}),i.push("workspace sync stage failed");}let y=Date.now();try{let e=await c({workspace:true,json:true,quiet:true,strict:s.strict===true,ci:s.strict!==true}),a=W(e),o=await c$1(t,".workspai/reports/doctor-last-run.json")??a$1(t,".workspai/reports/doctor-last-run.json");n.push({name:"doctor",status:a,durationMs:Date.now()-y,summary:a==="pass"?"doctor workspace passed":a==="warn"?"doctor workspace reported warnings":"doctor workspace did not pass",exitCode:e,evidencePath:o}),a==="fail"?i.push("doctor workspace gate failed"):a==="warn"&&i.push("doctor workspace reported warnings");}catch(e){l=true,n.push({name:"doctor",status:"fail",durationMs:Date.now()-y,summary:`doctor failed: ${e instanceof Error?e.message:String(e)}`}),i.push("doctor workspace stage failed");}if(s.skipAnalyze)n.push({name:"analyze",status:"skipped",durationMs:0,summary:"analyze stage skipped"});else {let e=Date.now();try{let a=await a$2({workspacePath:t,json:true,strict:s.strict===true});d$1=p.isAbsolute(a.enterpriseControls.evidencePath)?a.enterpriseControls.evidencePath:p.join(t,a.enterpriseControls.evidencePath);let o=a.summary.verdict==="blocked"?"fail":a.summary.verdict==="needs-attention"?"warn":"pass";n.push({name:"analyze",status:o,durationMs:Date.now()-e,summary:`analyze verdict: ${a.summary.verdict} (score ${a.summary.score}/100)`,evidencePath:d$1}),o==="fail"?i.push("analyze reported blocked verdict"):o==="warn"&&i.push("analyze reported needs-attention verdict");}catch(a){l=true,n.push({name:"analyze",status:"fail",durationMs:Date.now()-e,summary:`analyze failed: ${a instanceof Error?a.message:String(a)}`}),i.push("analyze stage failed");}}let w=Date.now();try{let e=await a$3({startPath:t,writeReport:true,skipVerify:s.skipVerify===true});m=e.evidencePath;let a=e.overallStatus==="pass"?"pass":e.overallStatus==="warn"?"warn":"fail";n.push({name:"readiness",status:a,durationMs:Date.now()-w,summary:`readiness overall: ${e.overallStatus}`,evidencePath:e.evidencePath}),a==="fail"?i.push(...e.blockingReasons.map(o=>`readiness: ${o}`)):a==="warn"&&i.push(...e.gates.filter(o=>o.status==="warn").map(o=>`readiness warn: ${o.gate}: ${o.summary}`));}catch(e){l=true,n.push({name:"readiness",status:"fail",durationMs:Date.now()-w,summary:`readiness failed: ${e instanceof Error?e.message:String(e)}`}),i.push("readiness stage failed");}if(s.skipAutopilot)n.push({name:"autopilot",status:"skipped",durationMs:0,summary:"autopilot stage skipped"});else {let e=Date.now(),a=s.autopilotMode??"audit";try{let o=await c$2({workspacePath:t,mode:a,json:true,skipPipelineStages:true});g=o.artifacts.reportPath;let k=o.summary.verdict==="approved"?"pass":o.summary.verdict==="partial"?"warn":"fail";n.push({name:"autopilot",status:k,durationMs:Date.now()-e,summary:`autopilot ${a}: ${o.summary.verdict}`,exitCode:o.summary.exitCode,evidencePath:g}),k!=="pass"&&i.push(...o.blockingReasons.slice(0,5));}catch(o){l=true,n.push({name:"autopilot",status:"fail",durationMs:Date.now()-e,summary:`autopilot failed: ${o instanceof Error?o.message:String(o)}`}),i.push("autopilot release stage failed");}}let z=F(n),h=j(n,l),M=p.join(t,".workspai","reports","pipeline-last-run.json"),u={schemaVersion:"rapidkit-pipeline-v1",generatedAt:new Date().toISOString(),workspacePath:t,summary:{verdict:z,exitCode:h,stagesPassed:n.filter(e=>e.status==="pass").length,stagesWarn:n.filter(e=>e.status==="warn").length,stagesFailed:n.filter(e=>e.status==="fail").length},stages:n,blockingReasons:[...new Set(i)],artifacts:{reportPath:M,analyzeEvidencePath:d$1,readinessEvidencePath:m,autopilotEvidencePath:g}};if(s.writeReport!==false){let e$1=f(u,{commandId:"workspacePipeline",exitCode:h,generatedAt:u.generatedAt,blockers:u.blockingReasons,runId:e()});await d(t,".workspai/reports/pipeline-last-run.json",e$1);}if(s.writeReport!==false&&s.noAgentSync!==true&&process.env.RAPIDKIT_NO_AGENT_SYNC!=="1"&&s.agentSync!==false)try{let{syncWorkspaceAgentGrounding:e}=await import('./workspace-agent-sync-KTYF3HQR.js'),a=await e({workspacePath:t,write:true,refreshContext:true,strict:false});u.agentGrounding={indexPath:a.indexPath,writtenFiles:a.writtenFiles,blockers:a.blockers};}catch{}return u}async function H(s){let r;try{r=await I(s);}catch(t){let n=t instanceof Error?t.message:String(t);s.json?console.log(JSON.stringify({schemaVersion:"rapidkit-pipeline-error-v1",ok:false,error:{message:n}},null,2)):console.log(c$3.red(`Pipeline failed: ${n}`)),process.exit(1);}if(s.json)console.log(JSON.stringify(r,null,2));else {console.log(c$3.bold.cyan(`
2
- \u{1F517} Workspai Governance Pipeline
3
- `)),console.log(c$3.bold(`Workspace: ${c$3.cyan(p.basename(r.workspacePath))}`)),console.log(c$3.gray(`Path: ${r.workspacePath}`)),console.log(c$3.white(`Verdict: ${r.summary.verdict} Exit: ${r.summary.exitCode} (${r.summary.stagesPassed} pass / ${r.summary.stagesWarn} warn / ${r.summary.stagesFailed} fail)`));for(let t of r.stages){let n=t.status==="pass"?c$3.green("PASS"):t.status==="warn"?c$3.yellow("WARN"):t.status==="skipped"?c$3.gray("SKIP"):c$3.red("FAIL");console.log(` - ${t.name}: ${n} ${t.summary}`);}if(r.blockingReasons.length>0){console.log(c$3.bold(`
4
- Blocking reasons:`));for(let t of r.blockingReasons.slice(0,8))console.log(c$3.gray(` \u2022 ${t}`));}console.log(c$3.gray(`
5
- Evidence: ${r.artifacts.reportPath}`)),r.agentGrounding?.writtenFiles.length&&console.log(c$3.gray(`Agent grounding: ${r.agentGrounding.writtenFiles.length} file(s) synced (INDEX + AGENTS.md + Copilot/Cursor/Claude hooks)`));}r.summary.exitCode!==0&&process.exit(r.summary.exitCode);}export{I as runPipeline,H as runPipelineCommand};
@@ -1 +0,0 @@
1
- export{b as buildWorkspaceExplain,a as resolveWorkspaceExplainArtifactPath,c as writeWorkspaceExplainReport}from'./chunk-54XJNLYC.js';export{d as WORKSPACE_MODEL_DIFF_REPORT_PATH}from'./chunk-LYC6AIF2.js';export{c as WORKSPACE_EXPLAIN_REPORT_PATH,e as WORKSPACE_TRACE_REPORT_PATH,d as WORKSPACE_WHY_REPORT_PATH}from'./chunk-DNAY5ALC.js';
@@ -1 +0,0 @@
1
- import {a}from'./chunk-A5FBGRJA.js';import {b,j}from'./chunk-VZKSNUEE.js';import {c,d as d$1}from'./chunk-NAAQMSO3.js';import {p,r}from'./chunk-LZQNVH7D.js';import {o}from'./chunk-5XATWNME.js';import n from'path';import c$1 from'fs-extra';var k=".workspai/workspace-registry.v1.json",w="workspace-registry.v1";function d(r){return {slug:r.slug,relativePath:r.relativePath,framework:r.framework,kit:r.kit,source:r.source}}async function C(r){let t=o(r,"workspace.json").find(e=>c$1.pathExistsSync(e));if(!t)return {exists:false,legacyProjectCount:0};try{let e=await c$1.readJson(t),o=Array.isArray(e.projects)?e.projects.length:0,s=typeof e.workspace_name=="string"&&e.workspace_name.trim()||typeof e.name=="string"&&e.name.trim()||n.basename(r);return {exists:true,manifestPath:t,workspaceName:s,profile:typeof e.profile=="string"?e.profile:void 0,legacyProjectCount:o}}catch{return {exists:true,manifestPath:t,legacyProjectCount:0,workspaceName:n.basename(r)}}}async function A(r$1){let t=a(r$1);for(let e of r())if(await c$1.pathExists(e))try{let s=((await c$1.readJson(e)).workspaces||[]).find(a$1=>a(a$1.path)===t);if(s)return Array.isArray(s.projects)?s.projects.length:0}catch{continue}return 0}async function x(r){let t=n.resolve(r),e=await c(t,b),o=await C(t),s=await A(t),a=!!e,i=[];if(a)try{let{contract:S}=await j({workspacePath:t});i=S.projects||[];}catch{i=[];}let W={contract:{exists:a,projectCount:i.length,path:b},globalRegistry:{exists:s>0,projectCount:s,path:n.join(p(),"workspaces.json")},legacyWorkspaceJson:{exists:o.exists,projectCount:o.legacyProjectCount,path:o.manifestPath?n.relative(t,o.manifestPath):void 0}},p$1="none",m=[],g=0;return a?(p$1="workspace.contract.json",m=i.map(d),g=m.length):s>0?(p$1="global-registry",g=s):o.legacyProjectCount>0&&(p$1="legacy-workspace.json",g=o.legacyProjectCount),{contractExists:a,summary:{schemaVersion:w,kind:"rapidkit.workspace.registry",workspacePath:t,workspaceName:o.workspaceName||n.basename(t),profile:o.profile,projectCount:g,authority:p$1,contractPath:b,projects:m,sources:W}}}async function $(r){let t=await c(r,k);if(!t)return null;try{let e=await c$1.readJson(t);return e?.schemaVersion!==w?null:e}catch{return null}}async function G(r,t){let o={...(await x(r)).summary,generatedAt:(t?.now??new Date).toISOString(),registrySummaryPath:k};return await d$1(r,k,o),o}function J(r,t=""){return r.projectCount>0?r.authority==="workspace.contract.json"?`${r.projectCount} project(s) registered in workspace contract${t}.`:r.authority==="global-registry"?`${r.projectCount} project(s) registered in global workspace registry${t}.`:`${r.projectCount} project(s) registered in legacy workspace manifest${t}.`:`Workspace state exists, but no projects are registered yet${t}.`}export{k as WORKSPACE_REGISTRY_SUMMARY_RELATIVE_PATH,w as WORKSPACE_REGISTRY_SUMMARY_SCHEMA_VERSION,J as formatWorkspaceRegistrySyncSummary,G as publishWorkspaceRegistrySummary,$ as readWorkspaceRegistrySummary,x as resolveWorkspaceRegisteredProjects};
@@ -1 +0,0 @@
1
- export{a as runWorkspaceStage}from'./chunk-WU4ZRRA5.js';export{a as WORKSPACE_RUN_LAST_REPORT_FILENAME}from'./chunk-753LOKFZ.js';