workspai 0.43.1 → 0.44.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.
Files changed (134) hide show
  1. package/README.md +23 -10
  2. package/contracts/agent-customization-pack.v1.json +1 -1
  3. package/contracts/autopilot-release.v1.json +204 -0
  4. package/contracts/cli-operation-result.v1.json +119 -0
  5. package/contracts/command-capabilities.v1.json +138 -0
  6. package/contracts/compatibility-matrix.v1.json +37 -0
  7. package/contracts/create-planner-capabilities.v1.json +156 -65
  8. package/contracts/doctor-project-scan.v2.json +60 -0
  9. package/contracts/doctor-remediation-plan.v1.json +19 -4
  10. package/contracts/doctor-remediation-plan.v2.json +7 -0
  11. package/contracts/doctor-workspace-cache.v2.json +82 -0
  12. package/contracts/extension-cli-compatibility.v1.json +47 -3
  13. package/contracts/infra-plan.v1.json +189 -0
  14. package/contracts/private-product-manifest.v1.json +155 -0
  15. package/contracts/product-factory-plan.v1.json +200 -0
  16. package/contracts/project-archive.v1.json +40 -0
  17. package/contracts/project-entry-capability.v1.json +127 -0
  18. package/contracts/published-contract-catalog.v1.json +334 -0
  19. package/contracts/runtime-command-surface.v1.json +239 -10
  20. package/contracts/version.v1.json +48 -0
  21. package/contracts/workspace-archive-capabilities.v1.json +90 -0
  22. package/contracts/workspace-archive-manifest.v1.json +107 -0
  23. package/contracts/workspace-archive-operation-result.v1.json +565 -0
  24. package/contracts/workspace-intelligence/agent-customization-pack-report.v1.json +98 -0
  25. package/contracts/workspace-intelligence/agent-hooks.v1.json +38 -0
  26. package/contracts/workspace-intelligence/agent-reports-index.v1.json +56 -0
  27. package/contracts/workspace-intelligence/mcp-design.v1.json +42 -0
  28. package/contracts/workspace-intelligence/workspace-context.v1.json +12 -0
  29. package/contracts/workspace-intelligence/workspace-explain.v1.json +1 -0
  30. package/contracts/workspace-intelligence-architecture.v1.json +723 -0
  31. package/contracts/workspace-intelligence-chain.v1.json +1194 -0
  32. package/contracts/workspace-list.v1.json +56 -0
  33. package/contracts/workspace-model-cache.v1.json +55 -0
  34. package/contracts/workspace-snapshot.v1.json +58 -0
  35. package/contracts/workspace-snapshot.v2.json +97 -0
  36. package/contracts/workspace-sync.v1.json +30 -0
  37. package/contracts/workspace-watch-event.v1.json +112 -0
  38. package/dist/analyze-6OCBM4ID.js +1 -0
  39. package/dist/{artifact-remediation-plan-244S5K6I.js → artifact-remediation-plan-Z7OCSME3.js} +2 -2
  40. package/dist/autopilot-release-LI2WJCEW.js +1 -0
  41. package/dist/{chunk-LZQNVH7D.js → chunk-2K3GYCPS.js} +1 -1
  42. package/dist/chunk-2QN6BMM7.js +2 -0
  43. package/dist/chunk-2QOWRBQD.js +1 -0
  44. package/dist/chunk-5AKYMAIL.js +1 -0
  45. package/dist/{chunk-FDDDQMJ2.js → chunk-5PVEQ6CZ.js} +1 -1
  46. package/dist/{chunk-DOCPUNWS.js → chunk-7EIMPQR3.js} +1 -1
  47. package/dist/{chunk-U6AXYUQY.js → chunk-7IHLTPZ6.js} +1 -1
  48. package/dist/chunk-7RIWU5TZ.js +1 -0
  49. package/dist/chunk-B66A4TVP.js +1 -0
  50. package/dist/chunk-CL6TGI4Q.js +8 -0
  51. package/dist/chunk-FWJV7CCI.js +2 -0
  52. package/dist/chunk-J4AICQFB.js +1 -0
  53. package/dist/chunk-JICOD2GI.js +1 -0
  54. package/dist/{chunk-EMTQ6OKI.js → chunk-JP25YL3J.js} +1 -1
  55. package/dist/chunk-L2Q7B2OJ.js +1 -0
  56. package/dist/chunk-L3E6IRUQ.js +8 -0
  57. package/dist/chunk-LG6RFLPZ.js +1 -0
  58. package/dist/chunk-LGP6WXS2.js +4 -0
  59. package/dist/{chunk-ONU457VN.js → chunk-M4VITK6X.js} +52 -50
  60. package/dist/chunk-NTXO7BMH.js +4 -0
  61. package/dist/{chunk-PPHTYJ7G.js → chunk-OW4UNG27.js} +36 -37
  62. package/dist/chunk-P4SWTY5X.js +33 -0
  63. package/dist/chunk-TRMDODFM.js +13 -0
  64. package/dist/chunk-UNF72FTB.js +1 -0
  65. package/dist/chunk-V5JN4TDX.js +2 -0
  66. package/dist/chunk-VA5MRHKM.js +2 -0
  67. package/dist/chunk-XIVFLY6G.js +1 -0
  68. package/dist/chunk-YUX4YFGL.js +78 -0
  69. package/dist/{create-42RTNLH2.js → create-DFAWAS5C.js} +1 -1
  70. package/dist/doctor-PVSWDBJL.js +1 -0
  71. package/dist/index.d.ts +250 -24
  72. package/dist/index.js +194 -195
  73. package/dist/pipeline-ND734AJM.js +5 -0
  74. package/dist/{platform-capabilities-XAVU4HSM.js → platform-capabilities-YICBF4FA.js} +1 -1
  75. package/dist/{pythonRapidkitExec-GCQ3M46E.js → pythonRapidkitExec-UJYIB6FL.js} +1 -1
  76. package/dist/{workspace-DZHWB7BV.js → workspace-FQT3QIRS.js} +1 -1
  77. package/dist/workspace-agent-sync-ZYCPXTU3.js +1 -0
  78. package/dist/workspace-archive-EEGLHZDW.js +10 -0
  79. package/dist/workspace-context-WAGGJCDL.js +1 -0
  80. package/dist/{workspace-contract-2TA27LGT.js → workspace-contract-SEI4SNSG.js} +1 -1
  81. package/dist/workspace-explain-MVGGRCDN.js +1 -0
  82. package/dist/workspace-explain-contract-KT757JGQ.js +1 -0
  83. package/dist/{workspace-feedback-R6H4UFZB.js → workspace-feedback-RCB25NFO.js} +1 -1
  84. package/dist/{workspace-foundation-FQWHPQGX.js → workspace-foundation-KXDL6P6X.js} +1 -1
  85. package/dist/{workspace-history-CGCK2DJI.js → workspace-history-M4QQBIPB.js} +1 -1
  86. package/dist/workspace-intelligence-QOGD2TZS.js +1 -0
  87. package/dist/workspace-mcp-serve-CEFKEMYG.js +3 -0
  88. package/dist/{workspace-model-F3B75TYT.js → workspace-model-GMSRBICO.js} +1 -1
  89. package/dist/workspace-registry-summary-S52SEJAG.js +1 -0
  90. package/dist/workspace-run-VC4OUPRF.js +1 -0
  91. package/dist/{workspace-verify-OAATQV5T.js → workspace-verify-NP4GMFSV.js} +1 -1
  92. package/dist/workspace-watch-IIBH3Y25.js +1 -0
  93. package/docs/AI_FEATURES.md +67 -34
  94. package/docs/README.md +2 -1
  95. package/docs/commands-reference.md +26 -14
  96. package/docs/contracts/ARTIFACT_CATALOG.md +60 -36
  97. package/docs/contracts/README.md +3 -2
  98. package/docs/create-planner-capabilities.md +36 -18
  99. package/docs/workspace-operations.md +25 -0
  100. package/package.json +26 -14
  101. package/scripts/enterprise-package-smoke.mjs +40 -8
  102. package/scripts/prepack-enterprise.mjs +8 -0
  103. package/dist/analyze-5BU4QIPK.js +0 -1
  104. package/dist/autopilot-release-45YVOBQO.js +0 -1
  105. package/dist/chunk-3QVTWKUI.js +0 -4
  106. package/dist/chunk-753LOKFZ.js +0 -2
  107. package/dist/chunk-AMDKXXLP.js +0 -1
  108. package/dist/chunk-AQ4XZZC6.js +0 -1
  109. package/dist/chunk-CDE4Q77U.js +0 -2
  110. package/dist/chunk-DNAY5ALC.js +0 -1
  111. package/dist/chunk-FHSMY75W.js +0 -1
  112. package/dist/chunk-FM7GMFZA.js +0 -2
  113. package/dist/chunk-HV5ZFXAZ.js +0 -13
  114. package/dist/chunk-LRW2SAGL.js +0 -4
  115. package/dist/chunk-LTWYYP6E.js +0 -7
  116. package/dist/chunk-NAAQMSO3.js +0 -1
  117. package/dist/chunk-NFUXULIF.js +0 -1
  118. package/dist/chunk-OL64GWQC.js +0 -9
  119. package/dist/chunk-SI3AQKIP.js +0 -1
  120. package/dist/chunk-TH5Y3EMA.js +0 -33
  121. package/dist/chunk-UQKCCWUL.js +0 -78
  122. package/dist/chunk-XNGANEXM.js +0 -2
  123. package/dist/doctor-DK4BON3N.js +0 -1
  124. package/dist/pipeline-HQ57V6OZ.js +0 -5
  125. package/dist/workspace-agent-sync-5ADIQS7B.js +0 -1
  126. package/dist/workspace-archive-GCZNI44O.js +0 -3
  127. package/dist/workspace-context-GEXDHA7A.js +0 -1
  128. package/dist/workspace-explain-D5NNL3NG.js +0 -1
  129. package/dist/workspace-explain-contract-DNS2YEL7.js +0 -1
  130. package/dist/workspace-intelligence-BEM6WGCZ.js +0 -1
  131. package/dist/workspace-mcp-serve-OMBA5V3C.js +0 -3
  132. package/dist/workspace-registry-summary-6MFBRWDS.js +0 -1
  133. package/dist/workspace-run-3WJXIQKR.js +0 -1
  134. package/dist/workspace-watch-HU2OTQ52.js +0 -1
@@ -1,6 +1,8 @@
1
- import {c as c$1}from'./chunk-NFUXULIF.js';import {a}from'./chunk-A5FBGRJA.js';import {a as a$3}from'./chunk-GZTYAEWX.js';import {c}from'./chunk-Y45WZR5N.js';import {a as a$2}from'./chunk-TQEMLBAG.js';import {p,r}from'./chunk-LZQNVH7D.js';import {p as p$1,o}from'./chunk-5XATWNME.js';import {promises}from'fs';import n from'path';import a$1 from'chalk';import N from'ora';import {execa}from'execa';async function H(e){try{let t=await execa("git",["rev-parse","--show-toplevel"],{cwd:e,env:a$2()});return t.stdout.trim()?n.resolve(e,t.stdout.trim()):null}catch{return null}}async function J(e,t,r){if(await H(e)){t.warn("Git initialization skipped because target is already inside a git worktree");return}t.start("Initializing git repository...");try{await execa("git",["init"],{cwd:e,env:a$2()}),await execa("git",["add","."],{cwd:e,env:a$2()}),await execa("git",["commit","-m",r],{cwd:e,env:a$2()}),t.succeed("Git repository initialized");}catch{t.warn("Could not initialize git repository");}}function q(e){let t=a(e.path),r=Array.isArray(e.projects)?e.projects:[],i=[],o=new Set;for(let l of r){if(!l||typeof l.name!="string"||typeof l.path!="string")continue;let c=a(l.path);o.has(c)||(o.add(c),i.push({name:l.name,path:c}));}return {name:e.name,path:t,mode:e.mode,projects:i}}function z(e){let t=[],r=new Set;for(let i of e.workspaces||[]){if(!i||typeof i.name!="string"||typeof i.path!="string")continue;let o=q(i);r.has(o.path)||(r.add(o.path),t.push(o));}return {workspaces:t}}async function U(e){try{let t=await promises.readFile(e,"utf8"),r=JSON.parse(t);if(r&&Array.isArray(r.workspaces))return z(r)}catch{}return {workspaces:[]}}async function F(){let e={workspaces:[]},t=new Set;for(let r$1 of r()){let i=await U(r$1);for(let o of i.workspaces)t.has(o.path)||(t.add(o.path),e.workspaces.push(o));}return e}async function K(e,t){try{let r=a(e),i=p(),o=n.join(i,"workspaces.json");await promises.mkdir(i,{recursive:true});let l={name:t,path:r,mode:"full",projects:[]};for(let c=0;c<3;c+=1){let s=await F();if(s.workspaces.some(u=>u.path===r)||(s.workspaces.push(l),await promises.writeFile(o,JSON.stringify(s,null,2)),(await U(o)).workspaces.some(u=>u.path===r)))return}console.warn(a$1.gray("Note: Could not register workspace in shared registry"));}catch{console.warn(a$1.gray("Note: Could not register workspace in shared registry"));}}async function ye(e,t=false){let r=a(e),i={workspacePath:r,workspaceFound:false,added:[],skipped:0};try{let o=p(),l=n.join(o,"workspaces.json"),c=await F();if(c.workspaces.length===0)return t||console.log("\u26A0\uFE0F Workspace registry not found"),i;let s=c.workspaces.find(f=>f.path===r);if(!s)return t||console.log("\u26A0\uFE0F Workspace not registered in registry"),i;Array.isArray(s.projects)||(s.projects=[]);let p$2=0,u=0,k=[],m=[e],y=new Set;for(;m.length>0;){let f=m.shift();if(!f||y.has(f))continue;y.add(f);let $=await promises.readdir(f,{withFileTypes:true});for(let h of $){if(!h.isDirectory()||h.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(h.name))continue;let _=n.join(f,h.name),g=a(_);try{let w=false;for(let j of [...p$1(g,"context.json"),...p$1(g,"project.json")])try{await promises.access(j),w=true;break}catch{}if(w){let j=n.basename(g);s.projects.some(S=>S.path===g||S.name===j)?u++:(s.projects.push({name:j,path:g}),p$2++,k.push(g),t||console.log(`\u2714 Added: ${n.relative(e,g)}`));continue}}catch{}m.push(_);}}return p$2>0?(await promises.writeFile(l,JSON.stringify(c,null,2)),t||console.log(`
2
- \u2705 Synced ${p$2} project(s) to registry`)):t||console.log(`
3
- \u2705 All projects already registered (${u} found)`),{workspacePath:r,workspaceFound:true,added:k,skipped:u}}catch(o){return t||console.error("\u274C Failed to sync projects:",o.message),i}}async function $e(e,t,r){try{let i=a(e),o=a(r),l=p(),c=n.join(l,"workspaces.json"),s=await F();if(s.workspaces.length===0)return;let p$1=s.workspaces.find(m=>m.path===i);if(!p$1)return;Array.isArray(p$1.projects)||(p$1.projects=[]);let u=p$1.projects.findIndex(m=>m.path===o||m.name===t),k={name:t,path:o};if(u>=0){let m=p$1.projects[u];(m.name!==k.name||m.path!==k.path)&&(p$1.projects[u]=k,await promises.writeFile(c,JSON.stringify(s,null,2)));}else p$1.projects.push({name:t,path:o}),await promises.writeFile(c,JSON.stringify(s,null,2));}catch{}}async function je(e,t){let r=N("Creating Workspai workspace...").start();try{await promises.mkdir(e,{recursive:true}),await promises.mkdir(n.join(e,".workspai"),{recursive:true});let i={workspace_name:t.name,author:t.author,rapidkit_version:c(),created_at:new Date().toISOString(),type:"workspace"};await promises.writeFile(n.join(e,".workspai","config.json"),JSON.stringify(i,null,2));let{syncWorkspaceFoundationFiles:o}=await import('./create-42RTNLH2.js');await o(e,{workspaceName:t.name,installMethod:"venv",writeMarker:true,writeGitignore:false,onlyIfMissing:true});let{publishWorkspaceRegistrySummary:l}=await import('./workspace-registry-summary-6MFBRWDS.js');await l(e);let c$1=Q();await promises.writeFile(n.join(e,"rapidkit"),c$1),await promises.chmod(n.join(e,"rapidkit"),493);let s=X();await promises.writeFile(n.join(e,"rapidkit.cmd"),s);let p=Z(t.name);await promises.writeFile(n.join(e,"README.md"),p),await promises.writeFile(n.join(e,".gitignore"),`# Workspai workspace
1
+ import {c as c$2}from'./chunk-2QOWRBQD.js';import {a}from'./chunk-A5FBGRJA.js';import {a as a$2}from'./chunk-GZTYAEWX.js';import {c as c$1}from'./chunk-Y45WZR5N.js';import {a as a$1}from'./chunk-TQEMLBAG.js';import {p as p$1,r,q as q$1}from'./chunk-2K3GYCPS.js';import {p,o}from'./chunk-5XATWNME.js';import {promises}from'fs';import {randomUUID}from'crypto';import c from'path';import s from'chalk';import ee from'fs-extra';import E from'ora';import {execa}from'execa';async function te(e){try{let r=await execa("git",["rev-parse","--show-toplevel"],{cwd:e,env:a$1()});return r.stdout.trim()?c.resolve(e,r.stdout.trim()):null}catch{return null}}async function V(e,r,t){if(await te(e)){r.warn("Git initialization skipped because target is already inside a git worktree");return}r.start("Initializing git repository...");try{await execa("git",["init"],{cwd:e,env:a$1()}),await execa("git",["add","."],{cwd:e,env:a$1()}),await execa("git",["commit","-m",t],{cwd:e,env:a$1()}),r.succeed("Git repository initialized");}catch{r.warn("Could not initialize git repository");}}function Y(e){let r=a(e.path),t=Array.isArray(e.projects)?e.projects:[],o=[],a$1=new Set;for(let p of t){if(!p||typeof p.name!="string"||typeof p.path!="string")continue;let n=a(p.path);a$1.has(n)||(a$1.add(n),o.push({name:p.name,path:n}));}return {name:e.name,path:r,mode:e.mode,projects:o}}function F(e){let r=[],t=new Set;for(let o of e.workspaces||[]){if(!o||typeof o.name!="string"||typeof o.path!="string")continue;let a=Y(o);t.has(a.path)||(t.add(a.path),r.push(a));}return {workspaces:r}}async function re(e){try{let r=await promises.readFile(e,"utf8"),t=JSON.parse(r);if(t&&Array.isArray(t.workspaces))return F(t)}catch{}return {workspaces:[]}}async function O(){let e={workspaces:[]},r$1=new Set;for(let t of r()){let o=await re(t);for(let a of o.workspaces)r$1.has(a.path)||(r$1.add(a.path),e.workspaces.push(a));}return e}function ae(e){let r=e?.code;return process.platform==="win32"&&(r==="EPERM"||r==="EINVAL"||r==="ENOSYS")}async function H(e){try{await e.sync();}catch(r){if(!ae(r))throw r}}async function M(e,r){let t=c.dirname(e);await promises.mkdir(t,{recursive:true});let o=`${c.basename(e)}.`,a=Date.now();for(let i of await promises.readdir(t)){if(!i.startsWith(o)||!i.endsWith(".tmp"))continue;let l=c.join(t,i),m=await promises.stat(l).catch(()=>null);m&&a-m.mtimeMs>3e4&&await promises.rm(l,{force:true}).catch(()=>{});}let p=await promises.readFile(e,"utf8").catch(()=>null);if(p!==null){let i=false;try{let l=JSON.parse(p);i=Array.isArray(l.workspaces);}catch{i=false;}if(!i){let l=`${e}.corrupt-${Date.now()}`;await promises.copyFile(e,l);}}let n=`${e}.${process.pid}.${randomUUID()}.tmp`;try{await promises.writeFile(n,`${JSON.stringify(F(r),null,2)}
2
+ `);let i=await promises.open(n,"r");try{await H(i);}finally{await i.close();}try{await promises.rename(n,e);}catch(l){let m=l.code;if(m!=="EEXIST"&&m!=="EPERM")throw l;await ee.move(n,e,{overwrite:true});}}finally{await promises.rm(n,{force:true}).catch(()=>{});}}async function oe(e){let r=p$1(),t=c.join(r,"workspaces.json.lock");await promises.mkdir(r,{recursive:true});let o=Date.now(),a;for(;!a;)try{a=await promises.open(t,"wx"),await a.writeFile(`${JSON.stringify({pid:process.pid,createdAt:new Date().toISOString()})}
3
+ `),await H(a);}catch(p){if(p.code!=="EEXIST")throw p;let n=await promises.stat(t).catch(()=>null);if(n&&Date.now()-n.mtimeMs>3e4){let i=await promises.readFile(t,"utf8").then(f=>JSON.parse(f)).catch(()=>null),l=Number(i?.pid),m=false;if(Number.isInteger(l)&&l>0)try{process.kill(l,0),m=true;}catch(f){m=f.code==="EPERM";}if(!m){await promises.rm(t,{force:true}).catch(()=>{});continue}}if(Date.now()-o>1e4)throw new Error(`Timed out waiting for workspace registry lock: ${t}`);await new Promise(i=>setTimeout(i,25));}try{return await e()}finally{await a.close().catch(()=>{}),await promises.rm(t,{force:true}).catch(()=>{});}}async function P(e){return oe(async()=>{let r=await O();await e(r);let t=F(r),o=c.join(p$1(),"workspaces.json"),a=c.join(q$1(),"workspaces.json");return await M(o,t),await M(a,t),t})}async function q(e,r){try{let t=a(e);await P(o=>{let a=o.workspaces.find(p=>p.path===t);if(a){a.name=r,a.mode=a.mode||"full",a.projects=Array.isArray(a.projects)?a.projects:[];return}o.workspaces.push({name:r,path:t,mode:"full",projects:[]});});}catch{console.warn(s.gray("Note: Could not register workspace in shared registry"));}}async function Ce(e,r=false){let t=a(e),o={workspacePath:t,workspaceFound:false,added:[],skipped:0};try{let a$1=await O(),p$1=a$1.workspaces.find(u=>u.path===t);if(!p$1){if(await q(t,c.basename(c.resolve(e))),a$1=await O(),p$1=a$1.workspaces.find(u=>u.path===t),!p$1)return r||console.log("\u26A0\uFE0F Workspace could not be registered in registry"),o;r||console.log("\u2714 Registered workspace in shared registry");}Array.isArray(p$1.projects)||(p$1.projects=[]);let n=0,i=0,l=[],m=[],f=[e],g=new Set;for(;f.length>0;){let u=f.shift();if(!u||g.has(u))continue;g.add(u);let y=await promises.readdir(u,{withFileTypes:true});for(let h of y){if(!h.isDirectory()||h.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(h.name))continue;let j=c.join(u,h.name),w=a(j);try{let k=false;for(let $ of [...p(w,"context.json"),...p(w,"project.json")])try{await promises.access($),k=true;break}catch{}if(k){let $=c.basename(w),b=p$1.projects.some(W=>W.path===w);m.push({name:$,path:w}),b?i++:(p$1.projects.push({name:$,path:w}),n++,l.push(w),r||console.log(`\u2714 Added: ${c.relative(e,w)}`));continue}}catch{}f.push(j);}}return await P(u=>{let y=u.workspaces.find(w=>w.path===t);if(!y)return;let h=`${t}${c.sep}`,j=(y.projects||[]).filter(w=>w.path!==t&&!w.path.startsWith(h));y.projects=Y({...y,projects:[...j,...m]}).projects;}),n>0?r||console.log(`
4
+ \u2705 Synced ${n} project(s) to registry`):r||console.log(`
5
+ \u2705 All projects already registered (${i} found)`),{workspacePath:t,workspaceFound:true,added:l,skipped:i}}catch(a){return r||console.error("\u274C Failed to sync projects:",a.message),o}}async function Pe(e,r,t){try{let o=a(e),a$1=a(t);await P(p=>{let n=p.workspaces.find(m=>m.path===o);if(!n)return;n.projects=Array.isArray(n.projects)?n.projects:[];let i=n.projects.findIndex(m=>m.path===a$1||m.name===r),l={name:r,path:a$1};i>=0?n.projects[i]=l:n.projects.push(l);});}catch{}}async function We(e,r){let t=E("Creating Workspai workspace...").start();try{await promises.mkdir(e,{recursive:true}),await promises.mkdir(c.join(e,".workspai"),{recursive:true});let o={workspace_name:r.name,author:r.author,rapidkit_version:c$1(),created_at:new Date().toISOString(),type:"workspace"};await promises.writeFile(c.join(e,".workspai","config.json"),JSON.stringify(o,null,2));let{syncWorkspaceFoundationFiles:a}=await import('./create-DFAWAS5C.js');await a(e,{workspaceName:r.name,installMethod:"venv",writeMarker:true,writeGitignore:false,onlyIfMissing:true});let p=ie();await promises.writeFile(c.join(e,"rapidkit"),p),await promises.chmod(c.join(e,"rapidkit"),493);let n=se();await promises.writeFile(c.join(e,"rapidkit.cmd"),n);let i=ne(r.name);await promises.writeFile(c.join(e,"README.md"),i),await promises.writeFile(c.join(e,".gitignore"),`# Workspai workspace
4
6
  .env
5
7
  .env.*
6
8
  !.env.example
@@ -15,10 +17,10 @@ Thumbs.db
15
17
 
16
18
  # Logs
17
19
  *.log
18
- `),await promises.writeFile(n.join(e,".workspai-workspace"),JSON.stringify({signature:"WORKSPAI_WORKSPACE",createdBy:"workspai-cli",version:c(),createdAt:new Date().toISOString(),name:t.name},null,2)),await ee(e),r.succeed("Workspace created!"),t.skipGit||await J(e,N(),"Initial commit: Workspai workspace"),await K(e,t.name),console.log(`
19
- ${a$1.green("\u2728 Workspai workspace created successfully!")}
20
+ `),await promises.writeFile(c.join(e,".workspai-workspace"),JSON.stringify({signature:"WORKSPAI_WORKSPACE",createdBy:"workspai-cli",version:c$1(),createdAt:new Date().toISOString(),name:r.name},null,2)),await ce(e),t.succeed("Workspace created!"),r.skipGit||await V(e,E(),"Initial commit: Workspai workspace"),await q(e,r.name);let{publishWorkspaceRegistrySummary:m}=await import('./workspace-registry-summary-S52SEJAG.js');await m(e),console.log(`
21
+ ${s.green("\u2728 Workspai workspace created successfully!")}
20
22
 
21
- ${a$1.bold("\u{1F4C2} Workspace structure:")}
23
+ ${s.bold("\u{1F4C2} Workspace structure:")}
22
24
  ${e}/
23
25
  \u251C\u2500\u2500 rapidkit # Local CLI wrapper
24
26
  \u251C\u2500\u2500 rapidkit.cmd # Windows local CLI wrapper
@@ -30,29 +32,29 @@ ${e}/
30
32
  \u2502 \u2514\u2500\u2500 config.json # Workspai workspace config
31
33
  \u2514\u2500\u2500 README.md
32
34
 
33
- ${a$1.bold("\u{1F680} Get started:")}
34
- ${a$1.cyan(`cd ${t.name}`)}
35
- ${a$1.cyan("npx workspai create project fastapi.standard my-api --yes")}
36
- ${a$1.cyan("cd my-api")}
37
- ${a$1.cyan("npx workspai init")}
38
- ${a$1.cyan("npx workspai dev")}
35
+ ${s.bold("\u{1F680} Get started:")}
36
+ ${s.cyan(`cd ${r.name}`)}
37
+ ${s.cyan("npx workspai create project fastapi.standard my-api --yes")}
38
+ ${s.cyan("cd my-api")}
39
+ ${s.cyan("npx workspai init")}
40
+ ${s.cyan("npx workspai dev")}
39
41
 
40
- ${a$1.bold("\u{1F4E6} Available templates:")}
42
+ ${s.bold("\u{1F4E6} Available templates:")}
41
43
  fastapi - FastAPI + Python
42
44
  nestjs - NestJS + TypeScript
43
45
  springboot - Spring Boot + Java
44
46
  gofiber - Go Fiber
45
47
  gogin - Go Gin
46
48
 
47
- ${a$1.bold("\u{1F4DA} Commands:")}
49
+ ${s.bold("\u{1F4DA} Commands:")}
48
50
  npx workspai create project <kit> <name> Create a new project
49
51
  npx workspai init Install dependencies
50
52
  npx workspai dev Start dev server
51
53
  npx workspai help Show all commands
52
54
 
53
- ${a$1.gray("Alternative: npx workspai dev, make dev")}
54
- ${a$1.gray("\u{1F4A1} Tip: Install globally (npm i -g workspai) to use without npx")}
55
- `);}catch(i){throw r.fail("Failed to create workspace"),i}}function Q(){return `#!/usr/bin/env bash
55
+ ${s.gray("Alternative: npx workspai dev, make dev")}
56
+ ${s.gray("\u{1F4A1} Tip: Install globally (npm i -g workspai) to use without npx")}
57
+ `);}catch(o){throw t.fail("Failed to create workspace"),o}}function ie(){return `#!/usr/bin/env bash
56
58
  #
57
59
  # Workspai CLI - local workspace commands
58
60
  # This script provides legacy ./rapidkit commands within the workspace
@@ -426,7 +428,7 @@ main() {
426
428
  print_help
427
429
  ;;
428
430
  version|-v|--version)
429
- echo "Workspai CLI (legacy ./rapidkit launcher) v${c()}"
431
+ echo "Workspai CLI (legacy ./rapidkit launcher) v${c$1()}"
430
432
  ;;
431
433
  *)
432
434
  echo -e "\${RED}\u274C Unknown command: $cmd\${NC}"
@@ -438,7 +440,7 @@ main() {
438
440
  }
439
441
 
440
442
  main "$@"
441
- `}function X(){return `@echo off
443
+ `}function se(){return `@echo off
442
444
  setlocal enabledelayedexpansion
443
445
 
444
446
  set "SCRIPT_DIR=%~dp0"
@@ -458,7 +460,7 @@ if %ERRORLEVEL%==0 (
458
460
  echo [Workspai] No sh/bash found. Falling back to npx workspai.
459
461
  npx workspai %*
460
462
  exit /b %ERRORLEVEL%
461
- `}function Z(e){return `# ${e}
463
+ `}function ne(e){return `# ${e}
462
464
 
463
465
  Workspai workspace for building API projects.
464
466
 
@@ -504,7 +506,7 @@ npx workspai dev # Start dev server
504
506
 
505
507
  - [Workspai Documentation](https://workspai.dev)
506
508
  - [GitHub Repository](https://github.com/rapidkitlabs/workspai)
507
- `}async function ee(e){let{fileURLToPath:t}=await import('url'),r=t(import.meta.url),i=n.dirname(r),o=n.resolve(i,".."),l=n.join(o,"templates","kits"),c=n.join(e,".workspai","templates"),{default:s}=await import('fs-extra');await s.copy(l,c);let p=n.join(o,"templates","generator.js"),u=n.join(e,".workspai","generator.js");await s.copy(p,u);}async function ve(e,t){let r=t.template==="fastapi",i=r?"FastAPI":"NestJS",o=N(`Creating ${i} project...`).start();try{let{fileURLToPath:l}=await import('url'),c$1=l(import.meta.url),s=n.dirname(c$1),p=n.resolve(s,".."),u=r?"fastapi-standard":"nestjs-standard",k=n.join(p,"templates","kits",u);await promises.mkdir(e,{recursive:true});let m={project_name:r?t.name.replace(/-/g,"_").toLowerCase():t.name.replace(/_/g,"-").toLowerCase(),author:t.author,description:t.description||`${i} application generated with Workspai`,app_version:"0.1.0",license:"MIT",package_manager:t.package_manager||"npm",created_at:new Date().toISOString(),rapidkit_version:c()};await V(k,e,m);let y=r?`# Python
509
+ `}async function ce(e){let{fileURLToPath:r}=await import('url'),t=r(import.meta.url),o=c.dirname(t),a=c.resolve(o,".."),p=c.join(a,"templates","kits"),n=c.join(e,".workspai","templates"),{default:i}=await import('fs-extra');await i.copy(p,n);let l=c.join(a,"templates","generator.js"),m=c.join(e,".workspai","generator.js");await i.copy(l,m);}async function Ne(e,r){let t=r.template==="fastapi",o=t?"FastAPI":"NestJS",a=E(`Creating ${o} project...`).start();try{let{fileURLToPath:p}=await import('url'),n=p(import.meta.url),i=c.dirname(n),l=c.resolve(i,".."),m=t?"fastapi-standard":"nestjs-standard",f=c.join(l,"templates","kits",m);await promises.mkdir(e,{recursive:true});let g={project_name:t?r.name.replace(/-/g,"_").toLowerCase():r.name.replace(/_/g,"-").toLowerCase(),author:r.author,description:r.description||`${o} application generated with Workspai`,app_version:"0.1.0",license:"MIT",package_manager:r.package_manager||"npm",created_at:new Date().toISOString(),rapidkit_version:c$1()};await K(f,e,g);let u=t?`# Python
508
510
  __pycache__/
509
511
  *.py[cod]
510
512
  *$py.class
@@ -572,10 +574,10 @@ Thumbs.db
572
574
 
573
575
  # Coverage
574
576
  coverage/
575
- `;if(await promises.writeFile(n.join(e,".gitignore"),y),o.succeed(`${i} project created!`),t.skipGit||await J(e,N(),`Initial commit: ${i} project via Workspai`),!t.skipInstall&&!r){let $=t.package_manager||"npm",h=N(`Installing dependencies with ${$}...`).start();try{await execa($,["install"],{cwd:e}),h.succeed("Dependencies installed");}catch{h.warn(`Could not install dependencies. Run '${$} install' manually.`);}}let f=n.basename(e);console.log(r?`
576
- ${a$1.green("\u2728 FastAPI project created successfully!")}
577
+ `;if(await promises.writeFile(c.join(e,".gitignore"),u),a.succeed(`${o} project created!`),r.skipGit||await V(e,E(),`Initial commit: ${o} project via Workspai`),!r.skipInstall&&!t){let h=r.package_manager||"npm",j=E(`Installing dependencies with ${h}...`).start();try{await execa(h,["install"],{cwd:e}),j.succeed("Dependencies installed");}catch{j.warn(`Could not install dependencies. Run '${h} install' manually.`);}}let y=c.basename(e);console.log(t?`
578
+ ${s.green("\u2728 FastAPI project created successfully!")}
577
579
 
578
- ${a$1.bold("\u{1F4C2} Project structure:")}
580
+ ${s.bold("\u{1F4C2} Project structure:")}
579
581
  ${e}/
580
582
  \u251C\u2500\u2500 .workspai/ # Project metadata
581
583
  \u251C\u2500\u2500 src/
@@ -587,12 +589,12 @@ ${e}/
587
589
  \u251C\u2500\u2500 pyproject.toml # Poetry configuration
588
590
  \u2514\u2500\u2500 README.md
589
591
 
590
- ${a$1.bold("\u{1F680} Get started:")}
591
- ${a$1.cyan(`cd ${f}`)}
592
- ${a$1.cyan("npx workspai init")} ${a$1.gray("# Install dependencies")}
593
- ${a$1.cyan("npx workspai dev")} ${a$1.gray("# Start dev server")}
592
+ ${s.bold("\u{1F680} Get started:")}
593
+ ${s.cyan(`cd ${y}`)}
594
+ ${s.cyan("npx workspai init")} ${s.gray("# Install dependencies")}
595
+ ${s.cyan("npx workspai dev")} ${s.gray("# Start dev server")}
594
596
 
595
- ${a$1.bold("\u{1F4DA} Available commands:")}
597
+ ${s.bold("\u{1F4DA} Available commands:")}
596
598
  npx workspai init # Install dependencies (poetry install)
597
599
  npx workspai dev # Start dev server with hot reload
598
600
  npx workspai start # Start production server
@@ -600,12 +602,12 @@ ${a$1.bold("\u{1F4DA} Available commands:")}
600
602
  npx workspai lint # Lint code
601
603
  npx workspai format # Format code
602
604
 
603
- ${a$1.gray("Alternative: make dev, npx workspai dev, poetry run dev")}
604
- ${a$1.gray("\u{1F4A1} Tip: Install globally (npm i -g workspai) to use without npx")}
605
+ ${s.gray("Alternative: make dev, npx workspai dev, poetry run dev")}
606
+ ${s.gray("\u{1F4A1} Tip: Install globally (npm i -g workspai) to use without npx")}
605
607
  `:`
606
- ${a$1.green("\u2728 NestJS project created successfully!")}
608
+ ${s.green("\u2728 NestJS project created successfully!")}
607
609
 
608
- ${a$1.bold("\u{1F4C2} Project structure:")}
610
+ ${s.bold("\u{1F4C2} Project structure:")}
609
611
  ${e}/
610
612
  \u251C\u2500\u2500 .workspai/ # Project metadata
611
613
  \u251C\u2500\u2500 src/
@@ -617,13 +619,13 @@ ${e}/
617
619
  \u251C\u2500\u2500 package.json # Dependencies
618
620
  \u2514\u2500\u2500 README.md
619
621
 
620
- ${a$1.bold("\u{1F680} Get started:")}
621
- ${a$1.cyan(`cd ${f}`)}
622
- ${t.skipInstall?a$1.cyan("npx workspai init")+a$1.gray(" # npm install")+`
623
- `:""}${a$1.cyan("cp .env.example .env")}
624
- ${a$1.cyan("npx workspai dev")} ${a$1.gray("# Start dev server")}
622
+ ${s.bold("\u{1F680} Get started:")}
623
+ ${s.cyan(`cd ${y}`)}
624
+ ${r.skipInstall?s.cyan("npx workspai init")+s.gray(" # npm install")+`
625
+ `:""}${s.cyan("cp .env.example .env")}
626
+ ${s.cyan("npx workspai dev")} ${s.gray("# Start dev server")}
625
627
 
626
- ${a$1.bold("\u{1F4DA} Available commands:")}
628
+ ${s.bold("\u{1F4DA} Available commands:")}
627
629
  npx workspai init # Install dependencies
628
630
  npx workspai dev # Start dev server with hot reload
629
631
  npx workspai start # Start production server
@@ -632,22 +634,22 @@ ${a$1.bold("\u{1F4DA} Available commands:")}
632
634
  npx workspai lint # Lint code
633
635
  npx workspai format # Format code
634
636
 
635
- ${a$1.bold("\u{1F310} API endpoints:")}
637
+ ${s.bold("\u{1F310} API endpoints:")}
636
638
  http://localhost:8000/health # Health check
637
639
  http://localhost:8000/docs # Swagger docs
638
640
  http://localhost:8000/examples/notes # Example API
639
641
 
640
- ${a$1.gray("\u{1F4A1} Tip: Install globally (npm i -g workspai) to use without npx")}
641
- `);}catch(l){throw o.fail(`Failed to create ${i} project`),l}}async function V(e,t,r){let i=await promises.readdir(e,{withFileTypes:true});for(let o of i){let l=n.join(e,o.name),c=o.name.replace(/\.j2$/,""),s=n.join(t,c);if(o.isDirectory())await promises.mkdir(s,{recursive:true}),await V(l,s,r);else {let p=await promises.readFile(l,"utf-8");o.name.endsWith(".j2")&&(p=te(p,r)),await promises.writeFile(s,p),(c==="rapidkit"||c==="activate"||c.endsWith(".py")&&(s.includes(".workspai")||s.includes(".rapidkit")))&&await promises.chmod(s,493);}}}function te(e,t){let r=e;for(let[i,o]of Object.entries(t)){let l=new RegExp(`\\{\\{\\s*${i}\\s*\\}\\}`,"g");r=r.replace(l,String(o));let c=new RegExp(`\\{\\{\\s*${i}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\}\\}`,"g");r=r.replace(c,(u,k,m)=>String(o).replace(new RegExp(k,"g"),m));let s=new RegExp(`\\{\\{\\s*${i}\\s*\\|\\s*lower\\s*\\}\\}`,"g");r=r.replace(s,String(o).toLowerCase());let p=new RegExp(`\\{\\{\\s*${i}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\|\\s*lower\\s*\\}\\}`,"g");r=r.replace(p,(u,k,m)=>String(o).replace(new RegExp(k,"g"),m).toLowerCase());}return r}async function _e(e={}){let t=p(),r=n.join(t,"workspaces.json"),i=await F();if(i.workspaces.length===0){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:r,workspaces:[],summary:{total:0,missing:0,registryExists:false}},null,2));return}console.log(a$1.yellow(`
642
+ ${s.gray("\u{1F4A1} Tip: Install globally (npm i -g workspai) to use without npx")}
643
+ `);}catch(p){throw a.fail(`Failed to create ${o} project`),p}}async function K(e,r,t){let o=await promises.readdir(e,{withFileTypes:true});for(let a of o){let p=c.join(e,a.name),n=a.name.replace(/\.j2$/,""),i=c.join(r,n);if(a.isDirectory())await promises.mkdir(i,{recursive:true}),await K(p,i,t);else {let l=await promises.readFile(p,"utf-8");a.name.endsWith(".j2")&&(l=pe(l,t)),await promises.writeFile(i,l),(n==="rapidkit"||n==="activate"||n.endsWith(".py")&&(i.includes(".workspai")||i.includes(".rapidkit")))&&await promises.chmod(i,493);}}}function pe(e,r){let t=e;for(let[o,a]of Object.entries(r)){let p=new RegExp(`\\{\\{\\s*${o}\\s*\\}\\}`,"g");t=t.replace(p,String(a));let n=new RegExp(`\\{\\{\\s*${o}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\}\\}`,"g");t=t.replace(n,(m,f,g)=>String(a).replace(new RegExp(f,"g"),g));let i=new RegExp(`\\{\\{\\s*${o}\\s*\\|\\s*lower\\s*\\}\\}`,"g");t=t.replace(i,String(a).toLowerCase());let l=new RegExp(`\\{\\{\\s*${o}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\|\\s*lower\\s*\\}\\}`,"g");t=t.replace(l,(m,f,g)=>String(a).replace(new RegExp(f,"g"),g).toLowerCase());}return t}async function Ie(e={}){let r=p$1(),t=c.join(r,"workspaces.json"),o=await O();if(o.workspaces.length===0){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:t,workspaces:[],summary:{total:0,missing:0,registryExists:false}},null,2));return}console.log(s.yellow(`
642
644
  \u26A0\uFE0F No workspaces registered yet.
643
- `)),console.log(a$1.gray(`Create a workspace with: npx workspai <workspace-name>
644
- `));return}try{let o=i;if(!o||typeof o!="object"||!Array.isArray(o.workspaces)){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:r,workspaces:[],summary:{total:0,missing:0,registryExists:true,registryValid:false},error:{code:"workspace.registry.invalid",message:"Workspace registry is invalid."}},null,2));return}console.log(a$1.yellow(`
645
+ `)),console.log(s.gray(`Create a workspace with: npx workspai <workspace-name>
646
+ `));return}try{let a=o;if(!a||typeof a!="object"||!Array.isArray(a.workspaces)){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:t,workspaces:[],summary:{total:0,missing:0,registryExists:true,registryValid:false},error:{code:"workspace.registry.invalid",message:"Workspace registry is invalid."}},null,2));return}console.log(s.yellow(`
645
647
  \u26A0\uFE0F Workspace registry is invalid; resetting to empty state.
646
- `)),await promises.writeFile(r,JSON.stringify({workspaces:[]},null,2));return}let l=z(o),c=[],s=0;for(let m of l.workspaces)await promises.stat(m.path).catch(()=>null)?c.push(m):s+=1;let p={workspaces:c},u=JSON.stringify(o),k=JSON.stringify(p);if(!e.json&&u!==k&&await promises.writeFile(r,JSON.stringify(p,null,2)),!p.workspaces||p.workspaces.length===0){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:r,workspaces:[],summary:{total:0,missing:s,registryExists:true,registryValid:true,cleanupApplied:false}},null,2));return}console.log(a$1.yellow(`
648
+ `)),await P(g=>{g.workspaces=[];});return}let p=F(a),n=[],i=0;for(let g of p.workspaces)await promises.stat(g.path).catch(()=>null)?n.push(g):i+=1;let l={workspaces:n},m=JSON.stringify(a),f=JSON.stringify(l);if(!e.json&&m!==f){let g=new Set(n.map(u=>u.path));await P(u=>{u.workspaces=u.workspaces.filter(y=>g.has(y.path));});}if(!l.workspaces||l.workspaces.length===0){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:t,workspaces:[],summary:{total:0,missing:i,registryExists:true,registryValid:true,cleanupApplied:false}},null,2));return}console.log(s.yellow(`
647
649
  \u26A0\uFE0F No workspaces registered yet.
648
- `)),s>0&&console.log(a$1.gray(`Cleaned ${s} stale workspace entr${s===1?"y":"ies"}.
649
- `));return}if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:r,workspaces:p.workspaces,summary:{total:p.workspaces.length,missing:s,registryExists:true,registryValid:true,cleanupApplied:false}},null,2));return}console.log(a$1.bold(`
650
+ `)),i>0&&console.log(s.gray(`Cleaned ${i} stale workspace entr${i===1?"y":"ies"}.
651
+ `));return}if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:t,workspaces:l.workspaces,summary:{total:l.workspaces.length,missing:i,registryExists:true,registryValid:true,cleanupApplied:false}},null,2));return}console.log(s.bold(`
650
652
  \u{1F4E6} Registered Workspai Workspaces:
651
- `));for(let m of p.workspaces)console.log(a$1.cyan(` ${m.name}`)),console.log(a$1.gray(` Path: ${m.path}`)),console.log(a$1.gray(` Projects: ${m.projects?.length||0}`)),console.log();s>0&&console.log(a$1.gray(`Cleaned ${s} stale workspace entr${s===1?"y":"ies"}.`)),console.log(a$1.gray(`Total: ${p.workspaces.length} workspace(s)
652
- `));}catch(o){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:r,workspaces:[],summary:{total:0,missing:0,registryExists:true,registryValid:false},error:{code:"workspace.registry.read_failed",message:o.message}},null,2));return}console.error(a$1.red(`
653
- \u274C Failed to read workspace registry`)),console.error(a$1.gray(String(o)));}}async function re(e){try{let t=await promises.readFile(e,"utf8");return JSON.parse(t)}catch{return null}}async function D(e){for(let t of e){let r=await re(t);if(r!==null)return r}return null}function oe(e){return c$1(e)}async function ae(e){return a$3(e,{skipDirs:new Set(["node_modules","dist","build","target","coverage","htmlcov"]),includeHiddenDirs:false,descendIntoMatchedProjects:true})}async function L(e){try{return (await promises.readdir(e,{withFileTypes:true})).filter(r=>r.isFile()&&r.name.toLowerCase().endsWith(".json")).map(r=>r.name).sort((r,i)=>r.localeCompare(i))}catch{return []}}async function xe(e,t){let r=t?.includePaths===true,i=t?.includeDoctorEvidence!==false,o$1=t?.includeBlueprint!==false,l=n.resolve(e),c=await D(o(l,"workspace.json")),s=typeof c?.workspace_name=="string"&&c.workspace_name.trim()||n.basename(l),p=typeof c?.profile=="string"?c.profile:void 0,u=typeof c?.rapidkit_version=="string"?c.rapidkit_version:void 0,k=await ae(l),m=[];for(let g of k){let w=await D(p$1(g,"project.json")),j=n.relative(l,g)||".",O=n.dirname(p$1(g,n.join("reports","placeholder"))[0]),S=n.dirname(p$1(g,n.join("reports","placeholder"))[1]),W={name:n.basename(g),relative_path:j,runtime:typeof w?.runtime=="string"?w.runtime:void 0,kit_name:typeof w?.kit_name=="string"?w.kit_name:void 0,modules:Array.isArray(w?.modules)?w.modules.filter(x=>typeof x=="string"):void 0};if(r&&(W.absolute_path=g),i){let x=await D([n.join(O,"doctor-last-run.json"),n.join(S,"doctor-last-run.json")]);oe(x)&&(W.doctor_report=x);}let A=[...await L(O),...await L(S)].filter((x,M,Y)=>Y.indexOf(x)===M);A.length>0&&(W.reports=A),m.push(W);}let y=o(l,"reports"),f=[...await L(y[0]),...await L(y[1])].filter((g,w,j)=>j.indexOf(g)===w),$=await D(o(l,"workspace.contract.json")),h={schema_version:"1.1",generated_at:new Date().toISOString(),generated_by:"workspai",workspace:{name:s,relative_root:".",profile:p,rapidkit_version:u,...r?{absolute_root:l}:{}},summary:{project_count:m.length,doctor_evidence_included:i,contract_included:!!$},reports:{workspace:f},projects:m,...$?{contract:$}:{}};o$1&&(h.blueprint={schema_version:"rapidkit.workspace-blueprint.v1",purpose:"portable-reproducibility",workspace:{name:s,profile:p},projects:m.map(g=>({name:g.name,relative_path:g.relative_path,runtime:g.runtime,kit_name:g.kit_name,modules:g.modules??[],recreate_commands:[...g.kit_name?[`npx workspai create project ${g.kit_name} ${g.name} --yes --skip-install`]:[],`cd ${g.relative_path}`,"npx workspai init","npx workspai test"]})),recommended_commands:["npx workspai workspace contract verify --strict","npx workspai doctor workspace","npx workspai workspace run init --json","npx workspai workspace run test --strict --json","npx workspai readiness --strict --json"]});let _=t?.outputPath?n.resolve(t.outputPath):n.join(y[0],"share-bundle.json");return await promises.mkdir(n.dirname(_),{recursive:true}),await promises.writeFile(_,JSON.stringify(h,null,2),"utf8"),_}export{K as a,ye as b,$e as c,je as d,ve as e,_e as f,xe as g};
653
+ `));for(let g of l.workspaces)console.log(s.cyan(` ${g.name}`)),console.log(s.gray(` Path: ${g.path}`)),console.log(s.gray(` Projects: ${g.projects?.length||0}`)),console.log();i>0&&console.log(s.gray(`Cleaned ${i} stale workspace entr${i===1?"y":"ies"}.`)),console.log(s.gray(`Total: ${l.workspaces.length} workspace(s)
654
+ `));}catch(a){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:t,workspaces:[],summary:{total:0,missing:0,registryExists:true,registryValid:false},error:{code:"workspace.registry.read_failed",message:a.message}},null,2));return}console.error(s.red(`
655
+ \u274C Failed to read workspace registry`)),console.error(s.gray(String(a)));}}async function le(e){try{let r=await promises.readFile(e,"utf8");return JSON.parse(r)}catch{return null}}async function A(e){for(let r of e){let t=await le(r);if(t!==null)return t}return null}function de(e){return c$2(e)}async function me(e){return a$2(e,{skipDirs:new Set(["node_modules","dist","build","target","coverage","htmlcov"]),includeHiddenDirs:false,descendIntoMatchedProjects:true})}async function L(e){try{return (await promises.readdir(e,{withFileTypes:true})).filter(t=>t.isFile()&&t.name.toLowerCase().endsWith(".json")).map(t=>t.name).sort((t,o)=>t.localeCompare(o))}catch{return []}}async function De(e,r){let t=r?.includePaths===true,o$1=r?.includeDoctorEvidence!==false,a=r?.includeBlueprint!==false,p$1=c.resolve(e),n=await A(o(p$1,"workspace.json")),i=typeof n?.workspace_name=="string"&&n.workspace_name.trim()||c.basename(p$1),l=typeof n?.profile=="string"?n.profile:void 0,m=typeof n?.rapidkit_version=="string"?n.rapidkit_version:void 0,f=await me(p$1),g=[];for(let k of f){let $=await A(p(k,"project.json")),b=c.relative(p$1,k)||".",W=c.dirname(p(k,c.join("reports","placeholder"))[0]),B=c.dirname(p(k,c.join("reports","placeholder"))[1]),N={name:c.basename(k),relative_path:b,runtime:typeof $?.runtime=="string"?$.runtime:void 0,kit_name:typeof $?.kit_name=="string"?$.kit_name:void 0,modules:Array.isArray($?.modules)?$.modules.filter(_=>typeof _=="string"):void 0};if(t&&(N.absolute_path=k),o$1){let _=await A([c.join(W,"doctor-last-run.json"),c.join(B,"doctor-last-run.json")]);de(_)&&(N.doctor_report=_);}let T=[...await L(W),...await L(B)].filter((_,X,Q)=>Q.indexOf(_)===X);T.length>0&&(N.reports=T),g.push(N);}let u=o(p$1,"reports"),y=[...await L(u[0]),...await L(u[1])].filter((k,$,b)=>b.indexOf(k)===$),h=await A(o(p$1,"workspace.contract.json")),j={schema_version:"1.1",generated_at:new Date().toISOString(),generated_by:"workspai",workspace:{name:i,relative_root:".",profile:l,rapidkit_version:m,...t?{absolute_root:p$1}:{}},summary:{project_count:g.length,doctor_evidence_included:o$1,contract_included:!!h},reports:{workspace:y},projects:g,...h?{contract:h}:{}};a&&(j.blueprint={schema_version:"rapidkit.workspace-blueprint.v1",purpose:"portable-reproducibility",workspace:{name:i,profile:l},projects:g.map(k=>({name:k.name,relative_path:k.relative_path,runtime:k.runtime,kit_name:k.kit_name,modules:k.modules??[],recreate_commands:[...k.kit_name?[`npx workspai create project ${k.kit_name} ${k.name} --yes --skip-install`]:[],`cd ${k.relative_path}`,"npx workspai init","npx workspai test"]})),recommended_commands:["npx workspai workspace contract verify --strict","npx workspai doctor workspace","npx workspai workspace run init --json","npx workspai workspace run test --strict --json","npx workspai readiness --strict --json"]});let w=r?.outputPath?c.resolve(r.outputPath):c.join(u[0],"share-bundle.json");return await promises.mkdir(c.dirname(w),{recursive:true}),await promises.writeFile(w,JSON.stringify(j,null,2),"utf8"),w}export{q as a,Ce as b,Pe as c,We as d,Ne as e,Ie as f,De as g};
@@ -0,0 +1,4 @@
1
+ import {d,b as b$1,e}from'./chunk-B66A4TVP.js';import {j,q as q$1,n}from'./chunk-7UZVOYF5.js';import {h,i,f as f$1,e as e$1}from'./chunk-4KUIFXHM.js';import {d as d$1}from'./chunk-S5KTATOU.js';import {f}from'./chunk-FWJV7CCI.js';import {a}from'./chunk-GZTYAEWX.js';import {a as a$1}from'./chunk-TQEMLBAG.js';import {e as e$2,g}from'./chunk-2K3GYCPS.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 Se(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 Ee(e,t,r=Se(e)){return r==="npm"?`npm run ${t}`:`${r} run ${t}`}function Ce(e,t=Se(e)){return `${t} install`}var Ge={"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:[]}}},Be={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 se(e,t){if(t){let r=t.trim().toLowerCase().replace(/[_.\s]+/g,"-"),n=e$1(t),s=`${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 Ge[s]}}function Pe(e,t,r){if(t){let n=se(e,t);if(n&&n.commands[r])return n.commands[r]}if(["init","test","build","start"].includes(r)){let n=Be[r]?.[e]??[];return n.length>0?n[0]:void 0}}var ze={test:"test",build:"build",start:"start"};function ae(e){if(e.stage==="init")return e.runtime==="node"?Ce(e.projectPath):Pe(e.runtime,e.framework,e.stage);if(e.runtime==="node"){let t=ze[e.stage];if(t){let r=n(e.projectPath,t,{framework:e.framework});if(r)return Ee(e.projectPath,r.scriptName)}}return Pe(e.runtime,e.framework,e.stage)}function Ke(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 Fe(e){return Ke(e).primary}function ie(e,t){if(!e)return "unknown";t||(t={setup:["ModuleNotFoundError","No module named","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 Ae(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 Ne={init:"init",test:"test",build:"build",start:"start"};function Ve(e){return e in Ne?Ne[e]:null}function He(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 s=o,c=s.default??s.dev;if(typeof c=="string"&&c.trim().length>0)return c.trim()}}function Oe(e,t,r=q$1(e)){let n=Ve(t);if(!n)return He(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];if(!o||o.status!=="supported"){let s=r.runtimeSupportTier==="observed"||r.frameworkSupportTier==="observed";return {supported:false,reason:o?.reason??`Command "${n}" is not supported for this project runtime/framework.`,shouldFail:!s}}return {supported:true}}var Ue=new Set(["init","test","build","start"]),Je=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 qe(e){for(let t of e)if(await I(t))return true;return false}async function Ye(e,t,r){if(t==="python"){let o=[b.join(e,".workspai","cli.py"),b.join(e,".rapidkit","cli.py")];for(let s of o)if(await I(s))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 ue(e){let t=await _.promises.readFile(e,"utf-8");return JSON.parse(t)}function N(e){return e.replace(/\\/g,"/")}function Qe(e){let t=e?.trim();return t?t.startsWith("project:")?t.slice(8).trim()||null:t:null}async function Xe(e){return a(e,{skipDirs:Je,includeHiddenDirs:false,descendIntoMatchedProjects:false,isProjectDir:async(t,r)=>await qe([...p(t,"context.json"),...p(t,"project.json")])?true:b.resolve(t)===b.resolve(r)?false:h(t).length>0})}async function Ze(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 ue(r),o=n.name??n.projectName??n.slug;if(typeof o=="string"&&o.trim())return o.trim()}catch{}}return null}async function et(e,t,r){let n=Qe(r);if(!n)return {projects:t,normalizedScope:null};let o=N(n).toLowerCase(),s=[];for(let c of t){let u=N(b.relative(e,c)),p=b.basename(c),m=await Ze(c);[u,p,m].filter(a=>typeof a=="string"&&a.length>0).map(a=>N(a).toLowerCase()).includes(o)&&s.push(c);}if(s.length===0)throw new Error(`Workspace run scope did not match any project: ${r}`);return {projects:s,normalizedScope:n}}async function tt(e,t,r){let n=await execa("git",["diff","--name-only",`${r}...HEAD`],{cwd:e,reject:false,env:a$1()});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=>N(c));if(o.length===0)return new Set;let s=new Set;for(let c of t){let u=N(b.relative(e,c));if(!u||u===".")continue;let p=`${u}/`;o.some(m=>m===u||m.startsWith(p))&&s.add(c);}return s}async function rt(e,t,r){let n=await f(e,".workspai/workspace.contract.json")??l(e,"workspace.contract.json");if(await I(n))try{let g=await nt(e,t,r,n);if(g.graphStatus!=="missing")return g}catch{return {expanded:r,graphStatus:"invalid",expansionDepth:0}}let o=await f(e,".workspai/workspace-dependency-graph.json")??l(e,"workspace-dependency-graph.json");if(!await I(o))return {expanded:r,graphStatus:"missing",expansionDepth:0};let s;try{s=await ue(o);}catch{return {expanded:r,graphStatus:"invalid",expansionDepth:0}}let c=new Set(t.map(g=>b.resolve(g))),u=new Map;if(!s||typeof s!="object"||Array.isArray(s))return {expanded:r,graphStatus:"invalid",expansionDepth:0};let p=Array.isArray(s.projects)?s.projects:[];for(let g of p){if(!g||typeof g!="object"||Array.isArray(g))continue;let a=g,d=typeof a.path=="string"?a.path:"",y=b.resolve(e,d);if(!c.has(y))continue;let h=Array.isArray(a.dependsOn)?a.dependsOn.filter(w=>typeof w=="string"):[];for(let w of h){let x=b.resolve(e,w);c.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 nt(e,t,r,n){let o=await ue(n);if(!o||typeof o!="object"||Array.isArray(o))return {expanded:r,graphStatus:"invalid",expansionDepth:0};let s=o,c=Array.isArray(s.projects)?s.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=N(b.relative(e,y));p.set(h,b.resolve(y));}let m=new Map,g=new Map,a=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"?N(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"):[],O=Array.isArray(R.publishes)?R.publishes.filter(v=>typeof v=="string"):[],W=Array.isArray(R.consumes)?R.consumes.filter(v=>typeof v=="string"):[];for(let v of j){let S=u.get(v);S&&(a.has(S)||a.set(S,new Set),a.get(S)?.add(x));}for(let v of O)m.has(v)||m.set(v,new Set),m.get(v)?.add(x);for(let v of W)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){a.has(x)||a.set(x,new Set);for(let R of w)R!==x&&a.get(x)?.add(R);}}let d=d$1(a,r);return {expanded:d.reached,graphStatus:"loaded",expansionDepth:d.added}}async function ot(e,t){if(typeof t=="boolean")return t;let r=o(e,"policies.yml").find(s=>_.existsSync(s))??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 st(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 ce(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 at(e){return e==="node"||e==="go"||e==="java"||e==="python"||e==="dotnet"}function it(){return process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"}async function ct(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 ut(e){let t=a=>{let d=f$1(a);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":Fe(e)},r=a=>{if(!a)return;let d=e$1(a);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),s=n?.contextJson,c=t(o.runtime),u=r(o.key),p={},m=new Set(["init","test","build","start"]);if(s?.commands&&typeof s.commands=="object")for(let[a,d]of Object.entries(s.commands))typeof d=="string"&&m.has(a)&&(p[a]=d);let g;if(s?.commandEnvironments&&typeof s.commandEnvironments=="object"){let a=s.commandEnvironments;g={dev:typeof a.dev=="string"?a.dev:void 0,staging:typeof a.staging=="string"?a.staging:void 0,prod:typeof a.prod=="string"?a.prod:void 0,default:typeof a.default=="string"?a.default:void 0};}return {runtime:c,framework:u,commandOverrides:Object.keys(p).length>0?p:void 0,environmentCommandVariants:g,environment:typeof s?.environment=="string"?s.environment:void 0}}async function dt(e,t,r,n,o,s,c){let u=!o?.[t]&&at(r),p;if(o&&o[t]?p=o[t]:u?p=`rapidkit ${t}`:p=ae({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=Ae(p,s,c);if(!m)return {exitCode:127,command:p,message:"Failed to resolve stage command",errorCategory:"runtime"};let g=ae({projectPath:e,runtime:r,framework:n,stage:t});if(u){if(g){let f=u?await Ye(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 a=0,d="",y="",h,w=st(t),x=Date.now();try{let f=u?t==="init"&&it()?await ct(e):await ce([t],e,w):await execa(m,[],{cwd:e,reject:false,shell:true,timeout:w});if(a=Number(f.exitCode??0),d=f.stdout,y=f.stderr,a!==0){let C=`${d}
2
+ ${y}`,z=Date.now()-x;h=a===124||ie(C)==="timeout"||a===143&&z>=Math.floor(w*.8)?"timeout":ie(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),O=j.slice(0,6).join(`
4
+ `),W=Date.now()-x,v=a===124||h==="timeout"||a===143&&W>=Math.floor(w*.8),S=a===0?void 0:v?"timeout":h,T=a===0||!S?void 0:{category:S,exitCode:a,command:m,timedOut:v,timeoutMs:w,...O?{outputExcerpt:O}:{}};return {exitCode:a,command:m,errorCategory:S,healthStatus:R,failureDiagnostic:T,message:v?`Stage timed out after ${w}ms`:a!==0?O?`Stage failed with exit code ${a}: ${j[0]}`:`Stage failed with exit code ${a}`:void 0}}function De(e){try{return JSON.parse(e)}catch{return null}}function lt(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 pt(e){let t=[],r=await ce(["doctor","workspace","--json"],e);if(r.exitCode!==0)t.push({gate:"doctor-workspace",status:"fail",summary:"doctor workspace command failed"});else {let s=De(r.stdout)?.healthScore,c=Number(s?.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 ce(["readiness","--json"],e);if(n.exitCode!==0)t.push({gate:"readiness",status:"fail",summary:"readiness command failed"});else {let o=De(n.stdout),s=String(o?.overallStatus??"").toLowerCase();s==="fail"?t.push({gate:"readiness",status:"fail",summary:"readiness overall status is fail"}):s==="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 mt=new Set(["dev","stop"]);function ft(e){let t=e.trim();return !t||mt.has(t.toLowerCase())?false:Ue.has(t)?true:/^[a-z][a-z0-9_-]*$/i.test(t)}function Te(e,t,r){let n=N(b.relative(r,t));return (Array.isArray(e.projects)?e.projects:[]).some(s=>{if(!s||typeof s!="object")return false;let c=s,u=[c.relativePath,c.path].filter(p=>typeof p=="string"&&p.length>0).map(p=>N(p));return c.status==="passed"&&(u.includes(n)||u.some(p=>p.endsWith(`/${n}`)))})}function gt(e,t){return se(e,t)?.dependencies??[]}function yt(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 Xt(e$1){if(!ft(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 Xe(r),{projects:s,normalizedScope:c}=await et(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 tt(r,s,m):new Set(s),a,d$1="not-applicable",y=0,h="all";if(u&&p){let l=await rt(r,o,g);a=l.expanded,d$1=l.graphStatus,y=l.expansionDepth,h="affected+blast-radius";}else u?(a=g,h="affected"):(a=g,h="all");let w=e$1.stage==="init"?false:await ot(r,e$1.enforceGates),x=w?await pt(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=s.filter(l=>a.has(l)),O=e$1.continueOnError===true||e$1.stage==="init",W=e$1.parallel===true,v=yt(e$1.maxWorkers,j.length),S=j.length,T=0;e$1.json||console.log(E.gray(`Workspace run (${e$1.stage}) started: ${S} target(s), ${W?`parallel x${v}`:"sequential"}`));let f=new Map;for(let l of o){let k=N(b.relative(r,l)),i=s.includes(l),F=i&&a.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=N(b.relative(r,k));e$1.json||console.log(E.gray(`\u23F3 [${T}/${S}] ${e$1.stage} ${F}`)),i.selected=true,i.affected=true;let A=Date.now(),{runtime:P,framework:D,commandOverrides:$e,environmentCommandVariants:Ie,environment:Le}=await ut(k);i.runtimeDetected=P,i.framework=D;let Q=Oe(k,e$1.stage);if(!Q.supported){i.status=Q.shouldFail===false?"skipped":"failed",i.reason=Q.reason??`stage "${e$1.stage}" unsupported for project`,i.durationMs=Date.now()-A,i.exitCode=i.status==="failed"?127:null,i.status==="failed"&&(i.errorCategory="setup",i.errorMessage=i.reason),T+=1;return}if(e$1.reusePassed&&n){let $=n.stages[e$1.stage]??n.stages[e$1.stage];if($&&Te($,k,r)){i.status="passed",i.reason="reused passed result from workspace-run-last.json",i.durationMs=Date.now()-A,i.exitCode=0,T+=1,e$1.json||console.log(E.gray(`\u21BA reused passed cache for ${F}`));return}}let me=gt(P,D);if(me.length>0&&n){let $=me.find(X=>{let L=n.stages[X];return !L||!Te(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,T+=1;return}}let M=await dt(k,e$1.stage,P,D,$e,Ie,Le);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),T+=1,!e$1.json){let $=S>0?Math.round(T/S*100):100,X=i.status==="passed"?E.green("\u2705"):E.red("\u274C");if(console.log(E.gray(`${X} [${T}/${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=lt(i.runtimeDetected);L&&i.errorCategory==="setup"&&console.log(E.gray(` Hint: ${L}`));}}};if(W&&j.length>1){let k=0,i=false,F=new Array(v).fill(null).map(async()=>{for(;k<j.length;){if(i&&!O)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),!O&&i){let A=false;for(let P of j){let D=f.get(P);if(D){if(D.status==="failed"){A=true;continue}A&&D.status==="skipped"&&(D.reason=D.reason||"stopped after failure");}}}}else for(let k of j){await l(k);let i=f.get(k);if(!O&&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,de=C.filter(l=>l.status==="skipped").length,le=e$1.strict===true,Me=K>0||le&&x.some(l=>l.status==="fail"||l.status==="warn")?1:0,pe={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:W,maxWorkers:v,continueOnError:O,strict:le,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:de,exitCode:Me},projects:C,enterpriseControls:{jsonReady:true,evidencePath:b$1}},We=b.join(r,b$1);return await e(r,pe),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: ${de}`)),console.log(E.gray(`Report: ${We}`))),pe}export{Xt as a};