workspai 0.43.0 → 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 (173) hide show
  1. package/README.md +26 -13
  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-5GJWPPRS.js → artifact-remediation-plan-Z7OCSME3.js} +3 -3
  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-RE773WOX.js → chunk-5PVEQ6CZ.js} +5 -5
  46. package/dist/{chunk-AFSZHLQT.js → chunk-7EIMPQR3.js} +1 -1
  47. package/dist/{chunk-3KXW53QI.js → chunk-7IHLTPZ6.js} +1 -1
  48. package/dist/chunk-7RIWU5TZ.js +1 -0
  49. package/dist/{chunk-T6OR6YOI.js → chunk-7UZVOYF5.js} +1 -1
  50. package/dist/chunk-B66A4TVP.js +1 -0
  51. package/dist/chunk-CL6TGI4Q.js +8 -0
  52. package/dist/chunk-FWJV7CCI.js +2 -0
  53. package/dist/chunk-J4AICQFB.js +1 -0
  54. package/dist/chunk-JICOD2GI.js +1 -0
  55. package/dist/{chunk-OJEWQO3Z.js → chunk-JP25YL3J.js} +17 -17
  56. package/dist/chunk-L2Q7B2OJ.js +1 -0
  57. package/dist/chunk-L3E6IRUQ.js +8 -0
  58. package/dist/chunk-LG6RFLPZ.js +1 -0
  59. package/dist/chunk-LGP6WXS2.js +4 -0
  60. package/dist/{chunk-VRDF2J46.js → chunk-M4VITK6X.js} +52 -50
  61. package/dist/chunk-NTXO7BMH.js +4 -0
  62. package/dist/{chunk-LPZFK3Y6.js → chunk-OW4UNG27.js} +65 -66
  63. package/dist/{chunk-LUP4U6EE.js → chunk-P424XYHP.js} +1 -1
  64. package/dist/chunk-P4SWTY5X.js +33 -0
  65. package/dist/chunk-TQEMLBAG.js +1 -0
  66. package/dist/chunk-TRMDODFM.js +13 -0
  67. package/dist/chunk-UNF72FTB.js +1 -0
  68. package/dist/chunk-V5JN4TDX.js +2 -0
  69. package/dist/chunk-VA5MRHKM.js +2 -0
  70. package/dist/chunk-XIVFLY6G.js +1 -0
  71. package/dist/chunk-YUX4YFGL.js +78 -0
  72. package/dist/{create-WRZO4HK2.js → create-DFAWAS5C.js} +1 -1
  73. package/dist/demo-kit-DZ7TPG7K.js +149 -0
  74. package/dist/doctor-PVSWDBJL.js +1 -0
  75. package/dist/{dotnet-webapi-clean-IPY3MCGQ.js → dotnet-webapi-clean-BYUUHX5Y.js} +20 -20
  76. package/dist/{gofiber-standard-N5N3QGH3.js → gofiber-standard-B6UK5GR7.js} +31 -31
  77. package/dist/{gogin-standard-LAWQTBWL.js → gogin-standard-BXU44VEM.js} +31 -31
  78. package/dist/index.d.ts +250 -24
  79. package/dist/index.js +218 -182
  80. package/dist/pipeline-ND734AJM.js +5 -0
  81. package/dist/{platform-capabilities-XAVU4HSM.js → platform-capabilities-YICBF4FA.js} +1 -1
  82. package/dist/{pythonRapidkitExec-3L3XJBSY.js → pythonRapidkitExec-UJYIB6FL.js} +1 -1
  83. package/dist/{springboot-standard-OZYF7ZM7.js → springboot-standard-PEHDKH2L.js} +27 -27
  84. package/dist/{workspace-PR6VZRBG.js → workspace-FQT3QIRS.js} +1 -1
  85. package/dist/workspace-agent-sync-ZYCPXTU3.js +1 -0
  86. package/dist/workspace-archive-EEGLHZDW.js +10 -0
  87. package/dist/workspace-context-WAGGJCDL.js +1 -0
  88. package/dist/{workspace-contract-XUGMCUSQ.js → workspace-contract-SEI4SNSG.js} +1 -1
  89. package/dist/workspace-explain-MVGGRCDN.js +1 -0
  90. package/dist/workspace-explain-contract-KT757JGQ.js +1 -0
  91. package/dist/{workspace-feedback-R6H4UFZB.js → workspace-feedback-RCB25NFO.js} +1 -1
  92. package/dist/{workspace-foundation-KGSV4E6D.js → workspace-foundation-KXDL6P6X.js} +1 -1
  93. package/dist/{workspace-history-CGCK2DJI.js → workspace-history-M4QQBIPB.js} +1 -1
  94. package/dist/workspace-intelligence-QOGD2TZS.js +1 -0
  95. package/dist/workspace-mcp-serve-CEFKEMYG.js +3 -0
  96. package/dist/{workspace-model-PNXXOGPO.js → workspace-model-GMSRBICO.js} +1 -1
  97. package/dist/workspace-registry-summary-S52SEJAG.js +1 -0
  98. package/dist/workspace-run-VC4OUPRF.js +1 -0
  99. package/dist/{workspace-verify-WSDUUTR5.js → workspace-verify-NP4GMFSV.js} +1 -1
  100. package/dist/workspace-watch-IIBH3Y25.js +1 -0
  101. package/docs/AI_FEATURES.md +67 -34
  102. package/docs/README.md +2 -1
  103. package/docs/commands-reference.md +26 -14
  104. package/docs/contracts/ARTIFACT_CATALOG.md +60 -36
  105. package/docs/contracts/README.md +3 -2
  106. package/docs/create-planner-capabilities.md +36 -18
  107. package/docs/workspace-operations.md +25 -0
  108. package/package.json +35 -13
  109. package/scripts/enterprise-package-smoke.mjs +40 -8
  110. package/scripts/prepack-enterprise.mjs +8 -0
  111. package/templates/kits/fastapi-ddd/.gitignore.j2 +11 -0
  112. package/templates/kits/fastapi-ddd/README.md.j2 +23 -18
  113. package/templates/kits/fastapi-ddd/common/env.example.j2 +2 -2
  114. package/templates/kits/fastapi-ddd/pyproject.toml.j2 +7 -7
  115. package/templates/kits/fastapi-ddd/src/app/config/__init__.py.j2 +1 -1
  116. package/templates/kits/fastapi-ddd/src/cli.py.j2 +6 -9
  117. package/templates/kits/fastapi-ddd/src/main.py.j2 +1 -1
  118. package/templates/kits/fastapi-standard/.gitignore.j2 +11 -0
  119. package/templates/kits/fastapi-standard/README.md.j2 +35 -30
  120. package/templates/kits/fastapi-standard/common/env.example.j2 +2 -2
  121. package/templates/kits/fastapi-standard/pyproject.toml.j2 +7 -7
  122. package/templates/kits/fastapi-standard/src/cli.py.j2 +7 -10
  123. package/templates/kits/fastapi-standard/src/main.py.j2 +1 -1
  124. package/templates/kits/fastapi-standard/src/routing/examples.py.j2 +1 -1
  125. package/templates/kits/fastapi-standard/tests/test_examples.py.j2 +1 -1
  126. package/templates/kits/nestjs-standard/.dockerignore.j2 +11 -0
  127. package/templates/kits/nestjs-standard/.eslintrc.js.j2 +25 -0
  128. package/templates/kits/nestjs-standard/.gitignore.j2 +22 -0
  129. package/templates/kits/nestjs-standard/.node-version.j2 +1 -0
  130. package/templates/kits/nestjs-standard/.nvmrc.j2 +1 -0
  131. package/templates/kits/nestjs-standard/.prettierrc.j2 +7 -0
  132. package/templates/kits/nestjs-standard/README.md.j2 +23 -18
  133. package/templates/kits/nestjs-standard/docs/README.md.j2 +2 -2
  134. package/templates/kits/nestjs-standard/jest.config.ts.j2 +1 -7
  135. package/templates/kits/nestjs-standard/package.json.j2 +1 -1
  136. package/templates/kits/nestjs-standard/src/config/configuration.ts.j2 +4 -4
  137. package/templates/kits/nestjs-standard/src/main.ts.j2 +1 -1
  138. package/templates/kits/nestjs-standard/src/modules/index.ts.j2 +1 -1
  139. package/templates/kits/nestjs-standard/tsconfig.build.json.j2 +1 -1
  140. package/templates/kits/nestjs-standard/tsconfig.json.j2 +1 -1
  141. package/dist/analyze-5BU4QIPK.js +0 -1
  142. package/dist/autopilot-release-QYUOVB26.js +0 -1
  143. package/dist/chunk-54XJNLYC.js +0 -13
  144. package/dist/chunk-5SWNSJGW.js +0 -1
  145. package/dist/chunk-753LOKFZ.js +0 -2
  146. package/dist/chunk-AAKUNWPR.js +0 -78
  147. package/dist/chunk-AQ4XZZC6.js +0 -1
  148. package/dist/chunk-CVTCPPEF.js +0 -1
  149. package/dist/chunk-DNAY5ALC.js +0 -1
  150. package/dist/chunk-EWYYLJQY.js +0 -2
  151. package/dist/chunk-LO4C4VXR.js +0 -4
  152. package/dist/chunk-LYC6AIF2.js +0 -2
  153. package/dist/chunk-NAAQMSO3.js +0 -1
  154. package/dist/chunk-NFUXULIF.js +0 -1
  155. package/dist/chunk-OL64GWQC.js +0 -9
  156. package/dist/chunk-PI5KUXDA.js +0 -7
  157. package/dist/chunk-SI3AQKIP.js +0 -1
  158. package/dist/chunk-VZKSNUEE.js +0 -2
  159. package/dist/chunk-WU4ZRRA5.js +0 -4
  160. package/dist/chunk-XEJD4KCV.js +0 -33
  161. package/dist/demo-kit-AJ5LIM5G.js +0 -149
  162. package/dist/doctor-MF3M3FS3.js +0 -1
  163. package/dist/pipeline-QCUHFWDY.js +0 -5
  164. package/dist/workspace-agent-sync-KTYF3HQR.js +0 -1
  165. package/dist/workspace-archive-GCZNI44O.js +0 -3
  166. package/dist/workspace-context-QUTOP2XV.js +0 -1
  167. package/dist/workspace-explain-JEONEGZZ.js +0 -1
  168. package/dist/workspace-explain-contract-DNS2YEL7.js +0 -1
  169. package/dist/workspace-intelligence-QJGVL37U.js +0 -1
  170. package/dist/workspace-mcp-serve-AK4MYEHQ.js +0 -3
  171. package/dist/workspace-registry-summary-RUJE6RPH.js +0 -1
  172. package/dist/workspace-run-Y7YMUIHX.js +0 -1
  173. package/dist/workspace-watch-AGPOJ74Q.js +0 -1
package/dist/index.js CHANGED
@@ -1,90 +1,90 @@
1
1
  #!/usr/bin/env node
2
- import {a as a$d}from'./chunk-ICGWHIMK.js';import {b as b$5,a as a$3}from'./chunk-LO4C4VXR.js';import {a as a$b}from'./chunk-3ZK2GU7C.js';import {b as b$6,d as d$3,a as a$2,c as c$2,f as f$6,e as e$4}from'./chunk-T3GJ7YVG.js';import {a as a$5}from'./chunk-22DT744Z.js';import {a as a$c}from'./chunk-2E6WGUN6.js';import {b as b$a,a as a$f,k as k$2}from'./chunk-XEJD4KCV.js';import {a as a$h}from'./chunk-EWYYLJQY.js';import {c as c$7,a as a$i}from'./chunk-CVTCPPEF.js';import {e as e$3}from'./chunk-LYC6AIF2.js';import {a as a$g}from'./chunk-SI3AQKIP.js';import {b as b$1,c as c$1,d,i,g as g$1,h as h$1,f as f$2,a as a$6}from'./chunk-AFSZHLQT.js';import {a,b as b$3}from'./chunk-JHC6SCJC.js';import {a as a$8}from'./chunk-A5FBGRJA.js';import {a as a$e}from'./chunk-AQ4XZZC6.js';import {f as f$4,g as g$3,h as h$3,i as i$5,j as j$1,c as c$8,a as a$j}from'./chunk-5SWNSJGW.js';import {m,d as d$4,e as e$1,f as f$3,g as g$2,h as h$2,i as i$2,q,j,s as s$1,k,c as c$4,l as l$1,r as r$1,t,n as n$2,p as p$1,a as a$l,o as o$3}from'./chunk-T6OR6YOI.js';export{l as PROJECT_COMMANDS_CORE_FALLBACK}from'./chunk-T6OR6YOI.js';import {i as i$3}from'./chunk-4KUIFXHM.js';import {f as f$7}from'./chunk-VZKSNUEE.js';import {c as c$5}from'./chunk-NAAQMSO3.js';import {h,a as a$1,m as m$1,l as l$2,n as n$1,k as k$3,o as o$2,i as i$7}from'./chunk-RE773WOX.js';import {b as b$4,d as d$1,a as a$4,e as e$2}from'./chunk-LUP4U6EE.js';import {b as b$8,d as d$6}from'./chunk-GSWPGELT.js';import {a as a$9}from'./chunk-GZTYAEWX.js';import {c,b as b$2,a as a$a}from'./chunk-Y45WZR5N.js';import {f,d as d$2,b as b$7}from'./chunk-7YHK5NM3.js';import {c as c$9}from'./chunk-RO73VVHW.js';import {f as f$1,e,d as d$5,i as i$4,a as a$7,g as g$4}from'./chunk-OJEWQO3Z.js';import {b,n,o as o$1,c as c$6,i as i$6,h as h$4,p as p$2,l as l$3,e as e$6,g as g$5}from'./chunk-LZQNVH7D.js';import {c as c$a}from'./chunk-2FIX2MDC.js';import {c as c$3,b as b$9,a as a$k}from'./chunk-XZGVNGRB.js';import {g,i as i$1,p,o,r,l,k as k$1,f as f$5,q as q$1,e as e$5,j as j$2}from'./chunk-5XATWNME.js';import {Command,Option}from'commander';import s from'chalk';import v from'path';import {fileURLToPath}from'url';import {spawn,spawnSync}from'child_process';import Yl from'vm';import*as E from'fs-extra';import E__default from'fs-extra';import P,{promises,createWriteStream}from'fs';import Rr,{tmpdir}from'os';import {execa}from'execa';import Dr,{createVerify,createHash,createHmac}from'crypto';import Hi from'http';import qi from'https';function La(){return i$6()}function Ja(t,e){return t==="py"?["-3",...e]:e}function Ka(t){return typeof t=="object"&&t!==null}async function Ga(t,e,o,r=c$a()){try{let n=await execa(t,e,{cwd:o,timeout:r,reject:false,stdio:"pipe"});return {ok:n.exitCode===0,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr}}catch(n){return {ok:false,exitCode:void 0,stdout:"",stderr:n instanceof Error?n.message:String(n)}}}async function Ua(t,e){let o=["-m","rapidkit",...t],r=La();for(let n of r){let i=await Ga(n,Ja(n,o),e?.cwd,e?.timeoutMs);if(!i.ok)continue;let a=(i.stdout??"").trim();try{let l=JSON.parse(a);return Ka(l)?{ok:true,command:n,exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr,data:l}:{ok:false,command:n,exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr}}catch{return {ok:false,command:n,exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr}}}return {ok:false}}async function $s(t,e){let o=await Ua(["project","detect","--path",t,"--json"],e);return !o.ok||!o.data||o.data.schema_version!==1?{ok:false,command:o.command,exitCode:o.exitCode,stdout:o.stdout,stderr:o.stderr}:o}var Ms=new Set(["create"]),br=new Set(["--yes","-y","--skip-git","--skip-install","--debug","--dry-run","--no-update-check","--create-workspace","--no-workspace"]),Va=new Set(["pip","poetry","venv","pipx","python"]);function Os(t){return typeof t=="string"&&Va.has(t)}function Sr(t,e){return !t||Ms.has(t)?false:a$7.has(t)?true:e?.has(t)??false}function xr(t,e=null){let o=t[0];return !o||o.startsWith("-")||Ms.has(o)||o==="init"?false:Sr(o,e)?true:t.filter(n=>!n.startsWith("-")&&!br.has(n)).length<=1?false:t.length>1}var Rt=v.join(Rr.homedir(),".workspairc.json"),Ba=v.join(Rr.homedir(),".rapidkitrc.json"),Ha=v.join(Rr.homedir(),".rapidkit","config.json");function Cr(t){try{if(!P.existsSync(t))return {};let e=P.readFileSync(t,"utf-8"),o=JSON.parse(e);return !o||typeof o!="object"||Array.isArray(o)?{}:o}catch{return {}}}function Ns(t){if(process.platform!=="win32")try{P.chmodSync(t,384);}catch{}}function Et(){let t=Cr(Rt),e=Cr(Ba),o=Cr(Ha);return P.existsSync(Rt)&&Ns(Rt),{...e,...t,openaiApiKey:t.openaiApiKey??e.openaiApiKey??o.openaiApiKey,aiEnabled:t.aiEnabled??e.aiEnabled??o.aiEnabled,telemetry:t.telemetry??e.telemetry??o.telemetry}}function $o(t){let o={...Et(),...t};P.writeFileSync(Rt,JSON.stringify(o,null,2),{encoding:"utf-8",mode:384}),Ns(Rt);}function Yt(){return process.env.OPENAI_API_KEY||Et().openaiApiKey||null}function Er(){return Et().aiEnabled!==false}function _r(){return Rt}function Ws(t){let e=t.command("config").description("Configure Workspai settings");e.command("set-api-key").description("Set OpenAI API key for AI features").option("--key <key>","API key (or enter interactively)").action(async o=>{let r=o.key;r?r.startsWith("sk-")||(console.log(s.red(`
2
+ import {f as f$3,c as c$3,b as b$c,a as a$m}from'./chunk-7RIWU5TZ.js';import {a as a$f}from'./chunk-ICGWHIMK.js';import {c as c$2,e as e$1,b as b$5,d as d$6,a as a$n}from'./chunk-LGP6WXS2.js';import {a as a$d}from'./chunk-3ZK2GU7C.js';import {b as b$6,d as d$4,a as a$2,c as c$4,f as f$9,e as e$5}from'./chunk-T3GJ7YVG.js';import {a as a$5}from'./chunk-22DT744Z.js';import {a as a$e}from'./chunk-2E6WGUN6.js';import {b as b$b,a as a$h,l as l$3}from'./chunk-P4SWTY5X.js';import {c as c$9,a as a$l}from'./chunk-V5JN4TDX.js';import {c as c$a,a as a$j}from'./chunk-UNF72FTB.js';import {f as f$8}from'./chunk-VA5MRHKM.js';import {a as a$i}from'./chunk-L2Q7B2OJ.js';import {b as b$1,c as c$1,d,i,g,h as h$1,f as f$2,a as a$6}from'./chunk-7EIMPQR3.js';import {a,b as b$3}from'./chunk-JHC6SCJC.js';import {a as a$8}from'./chunk-A5FBGRJA.js';import {a as a$g}from'./chunk-J4AICQFB.js';import {f as f$5,g as g$2,h as h$3,i as i$5,j as j$1,c as c$b,a as a$k}from'./chunk-JICOD2GI.js';import {m,d as d$5,e as e$2,f as f$4,g as g$1,h as h$2,i as i$2,q,j,s as s$1,k,c as c$6,l as l$1,r as r$1,t,n as n$2,p as p$1,a as a$p,o as o$3}from'./chunk-7UZVOYF5.js';export{l as PROJECT_COMMANDS_CORE_FALLBACK}from'./chunk-7UZVOYF5.js';import {i as i$3}from'./chunk-4KUIFXHM.js';import {f as f$a}from'./chunk-2QN6BMM7.js';import {f as f$6}from'./chunk-FWJV7CCI.js';import {a as a$4}from'./chunk-LG6RFLPZ.js';import {h,a as a$1,m as m$1,l as l$2,n as n$1,k as k$2,o as o$2,i as i$7}from'./chunk-5PVEQ6CZ.js';import {b as b$4,d as d$1,a as a$3,e as e$3}from'./chunk-P424XYHP.js';import {b as b$8,d as d$8}from'./chunk-GSWPGELT.js';import {a as a$a}from'./chunk-GZTYAEWX.js';import {d as d$2,e as e$4,a as a$c,c as c$8,b as b$a}from'./chunk-5AKYMAIL.js';import {c,b as b$2,a as a$b}from'./chunk-Y45WZR5N.js';import {f,d as d$3,b as b$7}from'./chunk-7YHK5NM3.js';import {a as a$9}from'./chunk-TQEMLBAG.js';import {c as c$c}from'./chunk-RO73VVHW.js';import {f as f$1,e,d as d$7,i as i$4,a as a$7,g as g$4}from'./chunk-JP25YL3J.js';import {b,n,o as o$1,c as c$7,i as i$6,h as h$4,p as p$2,l as l$4,e as e$7,g as g$5}from'./chunk-2K3GYCPS.js';import {c as c$d}from'./chunk-2FIX2MDC.js';import {c as c$5,b as b$9,a as a$o}from'./chunk-XZGVNGRB.js';import {i as i$1,p,o,r,l,q as q$1,k as k$1,f as f$7,g as g$3,e as e$6,j as j$2}from'./chunk-5XATWNME.js';import {Command,Option}from'commander';import s from'chalk';import C from'path';import {fileURLToPath}from'url';import {spawn,spawnSync}from'child_process';import Np from'vm';import*as R from'fs-extra';import R__default from'fs-extra';import S,{existsSync,promises,createWriteStream}from'fs';import Br,{tmpdir}from'os';import {execa}from'execa';import ut,{createVerify,createHash,createHmac}from'crypto';import Sa from'http';import xa from'https';function wc(){return i$6()}function kc(t,e){return t==="py"?["-3",...e]:e}function vc(t){return typeof t=="object"&&t!==null}async function Pc(t,e,o,r=c$d()){try{let n=await execa(t,e,{cwd:o,timeout:r,reject:false,stdio:"pipe"});return {ok:n.exitCode===0,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr}}catch(n){return {ok:false,exitCode:void 0,stdout:"",stderr:n instanceof Error?n.message:String(n)}}}async function bc(t,e){let o=["-m","rapidkit",...t],r=wc();for(let n of r){let i=await Pc(n,kc(n,o),e?.cwd,e?.timeoutMs);if(!i.ok)continue;let a=(i.stdout??"").trim();try{let c=JSON.parse(a);return vc(c)?{ok:true,command:n,exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr,data:c}:{ok:false,command:n,exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr}}catch{return {ok:false,command:n,exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr}}}return {ok:false}}async function Zs(t,e){let o=await bc(["project","detect","--path",t,"--json"],e);return !o.ok||!o.data||o.data.schema_version!==1?{ok:false,command:o.command,exitCode:o.exitCode,stdout:o.stdout,stderr:o.stderr}:o}var ei=new Set(["create"]),Kr=new Set(["--yes","-y","--skip-git","--skip-install","--debug","--dry-run","--no-update-check","--create-workspace","--no-workspace"]),jc=new Set(["pip","poetry","venv","pipx","python"]);function ti(t){return typeof t=="string"&&jc.has(t)}function Vr(t,e){return !t||ei.has(t)?false:a$7.has(t)?true:e?.has(t)??false}function Gr(t,e=null){let o=t[0];return !o||o.startsWith("-")||ei.has(o)||o==="init"?false:Vr(o,e)?true:t.filter(n=>!n.startsWith("-")&&!Kr.has(n)).length<=1?false:t.length>1}var Ot=C.join(Br.homedir(),".workspairc.json"),Cc=C.join(Br.homedir(),".rapidkitrc.json"),Sc=C.join(Br.homedir(),".rapidkit","config.json");function Ur(t){try{if(!S.existsSync(t))return {};let e=S.readFileSync(t,"utf-8"),o=JSON.parse(e);return !o||typeof o!="object"||Array.isArray(o)?{}:o}catch{return {}}}function oi(t){if(process.platform!=="win32")try{S.chmodSync(t,384);}catch{}}function Nt(){let t=Ur(Ot),e=Ur(Cc),o=Ur(Sc);return S.existsSync(Ot)&&oi(Ot),{...e,...t,openaiApiKey:t.openaiApiKey??e.openaiApiKey??o.openaiApiKey,aiEnabled:t.aiEnabled??e.aiEnabled??o.aiEnabled,telemetry:t.telemetry??e.telemetry??o.telemetry}}function Ho(t){let o={...Nt(),...t};S.writeFileSync(Ot,JSON.stringify(o,null,2),{encoding:"utf-8",mode:384}),oi(Ot);}function io(){return process.env.OPENAI_API_KEY||Nt().openaiApiKey||null}function qr(){return Nt().aiEnabled!==false}function zr(){return Ot}function ri(t){let e=t.command("config").description("Configure Workspai settings");e.command("set-api-key").description("Set OpenAI API key for AI features").option("--key <key>","API key (or enter interactively)").action(async o=>{let r=o.key;r?r.startsWith("sk-")||(console.log(s.red(`
3
3
  \u274C Invalid API key format (should start with sk-)
4
- `)),process.exit(1)):r=(await b$3([{type:"password",name:"apiKey",message:"Enter your OpenAI API key:",validate:i=>i?i.startsWith("sk-")?i.length<20?"API key seems too short":true:"Invalid API key format (should start with sk-)":"API key is required"}])).apiKey,$o({openaiApiKey:r}),console.log(s.green(`
4
+ `)),process.exit(1)):r=(await b$3([{type:"password",name:"apiKey",message:"Enter your OpenAI API key:",validate:i=>i?i.startsWith("sk-")?i.length<20?"API key seems too short":true:"Invalid API key format (should start with sk-)":"API key is required"}])).apiKey,Ho({openaiApiKey:r}),console.log(s.green(`
5
5
  \u2705 OpenAI API key saved successfully!
6
- `)),console.log(s.gray(`Stored in: ${_r()}`)),console.log(s.cyan(`
6
+ `)),console.log(s.gray(`Stored in: ${zr()}`)),console.log(s.cyan(`
7
7
  \u{1F389} You can now use AI features:`)),console.log(s.white(' workspai ai recommend "I need user authentication"')),console.log(s.gray(`
8
8
  \u{1F4A1} To generate module embeddings (one-time):`)),console.log(s.white(" cd packages/cli")),console.log(s.white(` npx tsx src/ai/generate-embeddings.ts
9
- `));}),e.command("show").description("Show current configuration").action(()=>{let o=Et();if(console.log(s.bold(`
9
+ `));}),e.command("show").description("Show current configuration").action(()=>{let o=Nt();if(console.log(s.bold(`
10
10
  \u2699\uFE0F Workspai Configuration
11
11
  `)),o.openaiApiKey){let r=o.openaiApiKey.substring(0,8)+"..."+o.openaiApiKey.slice(-4);console.log(s.cyan("OpenAI API Key:"),s.white(r));}else console.log(s.cyan("OpenAI API Key:"),s.red("Not set")),console.log(s.gray(" Set with: workspai config set-api-key"));console.log(s.cyan("AI Features:"),o.aiEnabled!==false?s.green("Enabled"):s.red("Disabled")),console.log(s.gray(`
12
- \u{1F4C1} Config file: ${_r()}
13
- `));}),e.command("remove-api-key").description("Remove stored OpenAI API key").action(async()=>{if(!Et().openaiApiKey){console.log(s.yellow(`
12
+ \u{1F4C1} Config file: ${zr()}
13
+ `));}),e.command("remove-api-key").description("Remove stored OpenAI API key").option("--yes","Remove without an interactive confirmation prompt").action(async o=>{if(!Nt().openaiApiKey){console.log(s.yellow(`
14
14
  \u26A0\uFE0F No API key is currently stored
15
- `));return}(await b$3([{type:"confirm",name:"confirm",message:"Are you sure you want to remove your OpenAI API key?",default:false}])).confirm?($o({openaiApiKey:void 0}),console.log(s.green(`
15
+ `));return}let n=o.yes===true||process.argv.includes("--yes");!n&&(!process.stdin.isTTY||!process.stdout.isTTY)&&(console.error(s.red("Cannot confirm API key removal in a non-interactive session. Use --yes.")),process.exit(1)),(n?{confirm:true}:await b$3([{type:"confirm",name:"confirm",message:"Are you sure you want to remove your OpenAI API key?",default:false}])).confirm?(Ho({openaiApiKey:void 0}),console.log(s.green(`
16
16
  \u2705 API key removed successfully
17
17
  `))):console.log(s.gray(`
18
18
  Cancelled
19
19
  `));}),e.command("ai <action>").description("Enable or disable AI features (enable|disable)").action(o=>{o!=="enable"&&o!=="disable"&&(console.log(s.red(`
20
20
  \u274C Invalid action: ${o}`)),console.log(s.gray(`Use: workspai config ai enable|disable
21
- `)),process.exit(1));let r=o==="enable";$o({aiEnabled:r}),console.log(s.green(`
21
+ `)),process.exit(1));let r=o==="enable";Ho({aiEnabled:r}),console.log(s.green(`
22
22
  \u2705 AI features ${r?"enabled":"disabled"}
23
- `));});}var Qt=null,Mo=false,Ar=null;async function qa(){return Ar||(Ar=(await import('openai')).default),Ar}function Ds(){Mo=true;}function Ts(t){let o=new Array(1536),r=0;for(let i=0;i<t.length;i++)r=(r<<5)-r+t.charCodeAt(i),r=r&r;for(let i=0;i<1536;i++)r=r*1664525+1013904223&4294967295,o[i]=r/4294967295*2-1;let n=Math.sqrt(o.reduce((i,a)=>i+a*a,0));return o.map(i=>i/n)}async function Oo(t){if(!t.trim()){Qt=null;return}let e=await qa();Qt=new e({apiKey:t});}function Fs(){if(!Qt)throw new Error("OpenAI client not initialized. Call initOpenAI() first with your API key.");return Qt}async function Ir(t){return Mo?Ts(t):(await Fs().embeddings.create({model:"text-embedding-3-small",input:t,encoding_format:"float"})).data[0].embedding}async function Ls(t){return Mo?t.map(Ts):(await Fs().embeddings.create({model:"text-embedding-3-small",input:t,encoding_format:"float"})).data.map(r=>r.embedding)}function Js(){return Qt!==null}function _t(){return Mo}function $r(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"):[]}function za(t){return !t||typeof t!="object"?{}:t}var Or=[{id:"authentication-core",name:"Authentication Core",category:"auth",description:"Complete authentication system with password hashing, JWT tokens, OAuth 2.0, and secure session management",longDescription:"Production-ready authentication with bcrypt password hashing, JWT access/refresh tokens, OAuth 2.0 providers (Google, GitHub, etc), rate limiting, and security best practices.",keywords:["auth","login","password","jwt","oauth","token","authentication","security","signin","signup"],framework:"both",dependencies:[],useCases:["User login and logout","Password reset flow","OAuth social login (Google, GitHub)","JWT authentication","Secure session management","Token refresh","Rate limiting"]},{id:"users-core",name:"Users Core",category:"auth",description:"User management system with profiles, roles, permissions, and user CRUD operations",longDescription:"Complete user management with user profiles, role-based access control (RBAC), permissions, user search, soft delete, and audit trails.",keywords:["user","profile","role","permission","rbac","management","admin","accounts"],framework:"both",dependencies:["authentication-core"],useCases:["User registration","User profile management","Role management (admin, user, etc)","Permission system","User administration dashboard","Soft delete users"]},{id:"session-management",name:"Session Management",category:"auth",description:"Secure session handling with Redis storage, session rotation, and device tracking",longDescription:"Advanced session management with Redis-backed storage, automatic session rotation, device fingerprinting, IP tracking, and session revocation.",keywords:["session","redis","cookie","storage","device","tracking"],framework:"both",dependencies:["authentication-core","redis-cache"],useCases:["User session management","Remember me functionality","Device tracking","Session security","Logout from all devices","Session expiration"]},{id:"db-postgres",name:"PostgreSQL",category:"database",description:"PostgreSQL integration with async SQLAlchemy, migrations, connection pooling, and query optimization",longDescription:"Production-ready PostgreSQL with async SQLAlchemy 2.0, Alembic migrations, connection pooling, query optimization, JSON support, and full-text search.",keywords:["postgres","postgresql","database","sql","sqlalchemy","migration","orm","relational"],framework:"both",dependencies:[],useCases:["Relational database","Complex SQL queries","Database transactions","Data integrity","Production-grade database","ACID compliance"]},{id:"db-mongodb",name:"MongoDB",category:"database",description:"MongoDB integration with Motor async driver, schema validation, and aggregation pipelines",longDescription:"Async MongoDB with Motor driver, Pydantic schema validation, aggregation pipelines, indexes, and Atlas integration.",keywords:["mongodb","mongo","nosql","document","database","motor"],framework:"both",dependencies:[],useCases:["Document storage","Flexible schema","Real-time data","JSON documents","Unstructured data","Analytics"]},{id:"stripe-payment",name:"Stripe Payment",category:"payment",description:"Stripe integration with payment intents, subscriptions, webhooks, and customer portal",longDescription:"Complete Stripe integration with Payment Intents API, subscription management, automatic webhooks, customer portal, refunds, and SCA compliance.",keywords:["stripe","payment","subscription","billing","checkout","webhook","credit card"],framework:"both",dependencies:[],useCases:["Accept credit card payments","Subscription billing","One-time payments","Checkout flow","Payment webhooks","Refunds and disputes"]},{id:"email",name:"Email",category:"communication",description:"Email sending with templates, SMTP/SendGrid/AWS SES support, and queue management",longDescription:"Production email system with Jinja2 templates, multiple providers (SMTP, SendGrid, AWS SES), queue management, retry logic, and bounce handling.",keywords:["email","mail","smtp","sendgrid","ses","template","notification"],framework:"both",dependencies:[],useCases:["Welcome emails","Password reset emails","Notifications","Marketing emails","Transactional emails","Email templates"]},{id:"sms",name:"SMS",category:"communication",description:"SMS sending with Twilio, verification codes, and delivery tracking",longDescription:"SMS integration with Twilio, verification codes, two-factor authentication, delivery tracking, and international support.",keywords:["sms","twilio","text","message","2fa","verification","otp"],framework:"both",dependencies:[],useCases:["2FA verification codes","SMS notifications","Phone verification","OTP generation","SMS alerts"]},{id:"redis-cache",name:"Redis Cache",category:"infrastructure",description:"Redis caching with decorators, TTL management, and cache invalidation patterns",longDescription:"Redis integration with async client, caching decorators, TTL management, cache invalidation, pub/sub, and rate limiting.",keywords:["redis","cache","memory","performance","speed","pubsub"],framework:"both",dependencies:[],useCases:["API response caching","Session storage","Rate limiting","Real-time features","Performance optimization","Pub/sub messaging"]},{id:"celery",name:"Celery",category:"infrastructure",description:"Background task processing with Celery, periodic tasks, and monitoring",longDescription:"Celery task queue with Redis/RabbitMQ backend, periodic tasks (cron), task monitoring, retry logic, and failure handling.",keywords:["celery","task","background","queue","async","worker","job","cron"],framework:"fastapi",dependencies:["redis-cache"],useCases:["Background email sending","Data processing","Report generation","Scheduled tasks","Long-running jobs"]},{id:"storage",name:"Storage",category:"infrastructure",description:"File storage with S3, local filesystem, and image processing",longDescription:"Unified storage interface for AWS S3, local files, image resizing, format conversion, CDN integration, and presigned URLs.",keywords:["storage","s3","file","upload","image","cdn","aws"],framework:"both",dependencies:[],useCases:["File uploads","Image storage","Document management","Profile pictures","Media files","CDN integration"]}],rt=null,Mr=0,Ya=300*1e3;function Qa(t){let e=za(t),o=e.slug||e.name||e.id||e.module_id||"",r=$r(e.keywords??e.tags);return {id:o,name:e.display_name||e.name||"",category:Xa(e.category||"infrastructure"),description:e.description||e.summary||"",longDescription:e.long_description||e.description||"",keywords:r.map(n=>n.toLowerCase()),framework:Za(e.framework),dependencies:$r(e.dependencies),useCases:$r(e.use_cases??e.useCases)}}function Xa(t){return {auth:"auth",authentication:"auth",database:"database",payment:"payment",billing:"payment",communication:"communication",infrastructure:"infrastructure",security:"security",analytics:"analytics"}[t.toLowerCase()]||"infrastructure"}function Za(t){if(!t)return "both";if(typeof t=="string"){if(t.toLowerCase().includes("fastapi"))return "fastapi";if(t.toLowerCase().includes("nest"))return "nestjs"}return "both"}async function ec(){try{let t=await g$4(["modules","list","--json-schema","1"],{cwd:process.cwd()});if(t.exitCode!==0)throw new Error(t.stderr.trim()||"Python Core modules command failed");let e=t.stdout.match(/\{[\s\S]*\}/),o=e?e[0]:t.stdout,r=JSON.parse(o),n=[];return Array.isArray(r)?n=r:r.modules&&Array.isArray(r.modules)?n=r.modules:r.data&&Array.isArray(r.data)&&(n=r.data),n.map(Qa).filter(i=>i.id&&i.name)}catch(t){return console.warn("\u26A0\uFE0F Failed to fetch modules from Python Core:",t.message),console.warn(" Using fallback module catalog (11 modules)"),Or}}async function No(){let t=Date.now();return _t()?(rt=Or,Mr=t,rt):(rt&&t-Mr<Ya||(rt=await ec(),Mr=t,rt.length===0&&(console.warn("\u26A0\uFE0F No modules found, using fallback catalog"),rt=Or)),rt)}var oc=fileURLToPath(import.meta.url),Gs=v.dirname(oc),At=null,Us=new Map;function rc(t){return [t.name,t.description,t.longDescription,...t.keywords,...t.useCases].filter(Boolean).join(" ")}async function nc(t){let e=Us.get(t.id);if(e)return e;let o=await Ir(rc(t));return Us.set(t.id,o),o}function sc(){if(At)return At;let t=[v.join(Gs,"../../data/modules-embeddings.json"),v.join(Gs,"../data/modules-embeddings.json"),v.join(process.cwd(),"data/modules-embeddings.json")],e=null;for(let n of t)if(P.existsSync(n)){e=n;break}if(!e)throw new Error("embeddings file not found");let o=P.readFileSync(e,"utf-8"),r=JSON.parse(o);if(Array.isArray(r)?At={model:"mock-or-text-embedding-3-small",dimension:r[0]?.embedding?.length||1536,generated_at:new Date().toISOString(),modules:r}:At=r,!At)throw new Error("failed to load embeddings data");return At}function Vs(t,e){if(t.length!==e.length)throw new Error("Vectors must have the same length");let o=0,r=0,n=0;for(let a=0;a<t.length;a++)o+=t[a]*e[a],r+=t[a]*t[a],n+=e[a]*e[a];let i=Math.sqrt(r)*Math.sqrt(n);return i===0?0:o/i}function Bs(t,e){let o=e.toLowerCase(),r=t.keywords.filter(n=>o.includes(n)||n.includes(o));return r.length>0?`Matches: ${r.slice(0,3).join(", ")}`:`Relevant for: ${t.useCases[0]}`}async function Hs(t,e=5){let o=await No(),r=await Ir(t);if(_t()){let a=await Promise.all(o.map(async l=>{let c=await nc(l);return {module:l,score:Vs(r,c),reason:Bs(l,t)}}));return a.sort((l,c)=>c.score-l.score),a.slice(0,e)}let i=sc().modules.map(a=>{let l=o.find(d=>d.id===a.id);if(!l)return null;let c=Vs(r,a.embedding);return {module:l,score:c,reason:Bs(l,t)}}).filter(a=>a!==null);return i.sort((a,l)=>l.score-a.score),i.slice(0,e)}var ac=fileURLToPath(import.meta.url),qs=v.dirname(ac);function zs(t){return t instanceof Error?t.message:String(t)}function cc(){return [v.join(qs,"../../data/modules-embeddings.json"),v.join(qs,"../data/modules-embeddings.json"),v.join(process.cwd(),"data/modules-embeddings.json")]}function Ys(){let t=cc();for(let e of t)if(P.existsSync(e))try{let o=JSON.parse(P.readFileSync(e,"utf-8")),r=Array.isArray(o)?o:o.modules||[];return {exists:true,path:e,moduleCount:r.length,generatedAt:o.generated_at||null}}catch{continue}return {exists:false,path:null,moduleCount:0,generatedAt:null}}async function Do(t=true,e){try{if(!Js()&&!_t())return console.log(s.red(`
23
+ `));});}var ao=null,Bo=false,Yr=null;async function xc(){return Yr||(Yr=(await import('openai')).default),Yr}function ni(){Bo=true;}function si(t){let o=new Array(1536),r=0;for(let i=0;i<t.length;i++)r=(r<<5)-r+t.charCodeAt(i),r=r&r;for(let i=0;i<1536;i++)r=r*1664525+1013904223&4294967295,o[i]=r/4294967295*2-1;let n=Math.sqrt(o.reduce((i,a)=>i+a*a,0));return o.map(i=>i/n)}async function qo(t){if(!t.trim()){ao=null;return}let e=await xc();ao=new e({apiKey:t});}function ii(){if(!ao)throw new Error("OpenAI client not initialized. Call initOpenAI() first with your API key.");return ao}async function Qr(t){return Bo?si(t):(await ii().embeddings.create({model:"text-embedding-3-small",input:t,encoding_format:"float"})).data[0].embedding}async function ai(t){return Bo?t.map(si):(await ii().embeddings.create({model:"text-embedding-3-small",input:t,encoding_format:"float"})).data.map(r=>r.embedding)}function ci(){return ao!==null}function Mt(){return Bo}function Xr(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"):[]}function Ec(t){return !t||typeof t!="object"?{}:t}var en=[{id:"authentication-core",name:"Authentication Core",category:"auth",description:"Complete authentication system with password hashing, JWT tokens, OAuth 2.0, and secure session management",longDescription:"Production-ready authentication with bcrypt password hashing, JWT access/refresh tokens, OAuth 2.0 providers (Google, GitHub, etc), rate limiting, and security best practices.",keywords:["auth","login","password","jwt","oauth","token","authentication","security","signin","signup"],framework:"both",dependencies:[],useCases:["User login and logout","Password reset flow","OAuth social login (Google, GitHub)","JWT authentication","Secure session management","Token refresh","Rate limiting"]},{id:"users-core",name:"Users Core",category:"auth",description:"User management system with profiles, roles, permissions, and user CRUD operations",longDescription:"Complete user management with user profiles, role-based access control (RBAC), permissions, user search, soft delete, and audit trails.",keywords:["user","profile","role","permission","rbac","management","admin","accounts"],framework:"both",dependencies:["authentication-core"],useCases:["User registration","User profile management","Role management (admin, user, etc)","Permission system","User administration dashboard","Soft delete users"]},{id:"session-management",name:"Session Management",category:"auth",description:"Secure session handling with Redis storage, session rotation, and device tracking",longDescription:"Advanced session management with Redis-backed storage, automatic session rotation, device fingerprinting, IP tracking, and session revocation.",keywords:["session","redis","cookie","storage","device","tracking"],framework:"both",dependencies:["authentication-core","redis-cache"],useCases:["User session management","Remember me functionality","Device tracking","Session security","Logout from all devices","Session expiration"]},{id:"db-postgres",name:"PostgreSQL",category:"database",description:"PostgreSQL integration with async SQLAlchemy, migrations, connection pooling, and query optimization",longDescription:"Production-ready PostgreSQL with async SQLAlchemy 2.0, Alembic migrations, connection pooling, query optimization, JSON support, and full-text search.",keywords:["postgres","postgresql","database","sql","sqlalchemy","migration","orm","relational"],framework:"both",dependencies:[],useCases:["Relational database","Complex SQL queries","Database transactions","Data integrity","Production-grade database","ACID compliance"]},{id:"db-mongodb",name:"MongoDB",category:"database",description:"MongoDB integration with Motor async driver, schema validation, and aggregation pipelines",longDescription:"Async MongoDB with Motor driver, Pydantic schema validation, aggregation pipelines, indexes, and Atlas integration.",keywords:["mongodb","mongo","nosql","document","database","motor"],framework:"both",dependencies:[],useCases:["Document storage","Flexible schema","Real-time data","JSON documents","Unstructured data","Analytics"]},{id:"stripe-payment",name:"Stripe Payment",category:"payment",description:"Stripe integration with payment intents, subscriptions, webhooks, and customer portal",longDescription:"Complete Stripe integration with Payment Intents API, subscription management, automatic webhooks, customer portal, refunds, and SCA compliance.",keywords:["stripe","payment","subscription","billing","checkout","webhook","credit card"],framework:"both",dependencies:[],useCases:["Accept credit card payments","Subscription billing","One-time payments","Checkout flow","Payment webhooks","Refunds and disputes"]},{id:"email",name:"Email",category:"communication",description:"Email sending with templates, SMTP/SendGrid/AWS SES support, and queue management",longDescription:"Production email system with Jinja2 templates, multiple providers (SMTP, SendGrid, AWS SES), queue management, retry logic, and bounce handling.",keywords:["email","mail","smtp","sendgrid","ses","template","notification"],framework:"both",dependencies:[],useCases:["Welcome emails","Password reset emails","Notifications","Marketing emails","Transactional emails","Email templates"]},{id:"sms",name:"SMS",category:"communication",description:"SMS sending with Twilio, verification codes, and delivery tracking",longDescription:"SMS integration with Twilio, verification codes, two-factor authentication, delivery tracking, and international support.",keywords:["sms","twilio","text","message","2fa","verification","otp"],framework:"both",dependencies:[],useCases:["2FA verification codes","SMS notifications","Phone verification","OTP generation","SMS alerts"]},{id:"redis-cache",name:"Redis Cache",category:"infrastructure",description:"Redis caching with decorators, TTL management, and cache invalidation patterns",longDescription:"Redis integration with async client, caching decorators, TTL management, cache invalidation, pub/sub, and rate limiting.",keywords:["redis","cache","memory","performance","speed","pubsub"],framework:"both",dependencies:[],useCases:["API response caching","Session storage","Rate limiting","Real-time features","Performance optimization","Pub/sub messaging"]},{id:"celery",name:"Celery",category:"infrastructure",description:"Background task processing with Celery, periodic tasks, and monitoring",longDescription:"Celery task queue with Redis/RabbitMQ backend, periodic tasks (cron), task monitoring, retry logic, and failure handling.",keywords:["celery","task","background","queue","async","worker","job","cron"],framework:"fastapi",dependencies:["redis-cache"],useCases:["Background email sending","Data processing","Report generation","Scheduled tasks","Long-running jobs"]},{id:"storage",name:"Storage",category:"infrastructure",description:"File storage with S3, local filesystem, and image processing",longDescription:"Unified storage interface for AWS S3, local files, image resizing, format conversion, CDN integration, and presigned URLs.",keywords:["storage","s3","file","upload","image","cdn","aws"],framework:"both",dependencies:[],useCases:["File uploads","Image storage","Document management","Profile pictures","Media files","CDN integration"]}],pt=null,Zr=0,Rc=300*1e3;function _c(t){let e=Ec(t),o=e.slug||e.name||e.id||e.module_id||"",r=Xr(e.keywords??e.tags);return {id:o,name:e.display_name||e.name||"",category:Ac(e.category||"infrastructure"),description:e.description||e.summary||"",longDescription:e.long_description||e.description||"",keywords:r.map(n=>n.toLowerCase()),framework:Ic(e.framework),dependencies:Xr(e.dependencies),useCases:Xr(e.use_cases??e.useCases)}}function Ac(t){return {auth:"auth",authentication:"auth",database:"database",payment:"payment",billing:"payment",communication:"communication",infrastructure:"infrastructure",security:"security",analytics:"analytics"}[t.toLowerCase()]||"infrastructure"}function Ic(t){if(!t)return "both";if(typeof t=="string"){if(t.toLowerCase().includes("fastapi"))return "fastapi";if(t.toLowerCase().includes("nest"))return "nestjs"}return "both"}async function $c(){try{let t=await g$4(["modules","list","--json-schema","1"],{cwd:process.cwd()});if(t.exitCode!==0)throw new Error(t.stderr.trim()||"Python Core modules command failed");let e=t.stdout.match(/\{[\s\S]*\}/),o=e?e[0]:t.stdout,r=JSON.parse(o),n=[];return Array.isArray(r)?n=r:r.modules&&Array.isArray(r.modules)?n=r.modules:r.data&&Array.isArray(r.data)&&(n=r.data),n.map(_c).filter(i=>i.id&&i.name)}catch(t){return console.warn("\u26A0\uFE0F Failed to fetch modules from Python Core:",t.message),console.warn(" Using fallback module catalog (11 modules)"),en}}async function zo(){let t=Date.now();return Mt()?(pt=en,Zr=t,pt):(pt&&t-Zr<Rc||(pt=await $c(),Zr=t,pt.length===0&&(console.warn("\u26A0\uFE0F No modules found, using fallback catalog"),pt=en)),pt)}var Nc=fileURLToPath(import.meta.url),pi=C.dirname(Nc),Tt=null,di=new Map;function Mc(t){return [t.name,t.description,t.longDescription,...t.keywords,...t.useCases].filter(Boolean).join(" ")}async function Tc(t){let e=di.get(t.id);if(e)return e;let o=await Qr(Mc(t));return di.set(t.id,o),o}function Wc(){if(Tt)return Tt;let t=[C.join(pi,"../../data/modules-embeddings.json"),C.join(pi,"../data/modules-embeddings.json"),C.join(process.cwd(),"data/modules-embeddings.json")],e=null;for(let n of t)if(S.existsSync(n)){e=n;break}if(!e)throw new Error("embeddings file not found");let o=S.readFileSync(e,"utf-8"),r=JSON.parse(o);if(Array.isArray(r)?Tt={model:"mock-or-text-embedding-3-small",dimension:r[0]?.embedding?.length||1536,generated_at:new Date().toISOString(),modules:r}:Tt=r,!Tt)throw new Error("failed to load embeddings data");return Tt}function ui(t,e){if(t.length!==e.length)throw new Error("Vectors must have the same length");let o=0,r=0,n=0;for(let a=0;a<t.length;a++)o+=t[a]*e[a],r+=t[a]*t[a],n+=e[a]*e[a];let i=Math.sqrt(r)*Math.sqrt(n);return i===0?0:o/i}function mi(t,e){let o=e.toLowerCase(),r=t.keywords.filter(n=>o.includes(n)||n.includes(o));return r.length>0?`Matches: ${r.slice(0,3).join(", ")}`:`Relevant for: ${t.useCases[0]}`}async function fi(t,e=5){let o=await zo(),r=await Qr(t);if(Mt()){let a=await Promise.all(o.map(async c=>{let l=await Tc(c);return {module:c,score:ui(r,l),reason:mi(c,t)}}));return a.sort((c,l)=>l.score-c.score),a.slice(0,e)}let i=Wc().modules.map(a=>{let c=o.find(p=>p.id===a.id);if(!c)return null;let l=ui(r,a.embedding);return {module:c,score:l,reason:mi(c,t)}}).filter(a=>a!==null);return i.sort((a,c)=>c.score-a.score),i.slice(0,e)}var Lc=fileURLToPath(import.meta.url),gi=C.dirname(Lc);function hi(t){return t instanceof Error?t.message:String(t)}function Fc(){return [C.join(gi,"../../data/modules-embeddings.json"),C.join(gi,"../data/modules-embeddings.json"),C.join(process.cwd(),"data/modules-embeddings.json")]}function yi(){let t=Fc();for(let e of t)if(S.existsSync(e))try{let o=JSON.parse(S.readFileSync(e,"utf-8")),r=Array.isArray(o)?o:o.modules||[];return {exists:true,path:e,moduleCount:r.length,generatedAt:o.generated_at||null}}catch{continue}return {exists:false,path:null,moduleCount:0,generatedAt:null}}async function Qo(t=true,e){try{if(!ci()&&!Mt())return console.log(s.red(`
24
24
  \u274C OpenAI not initialized`)),console.log(s.yellow("Please set your API key:")),console.log(s.white(" workspai config set-api-key")),console.log(s.gray(` OR set: export OPENAI_API_KEY="sk-..."
25
25
  `)),false;console.log(s.blue(`
26
26
  \u{1F916} Generating AI embeddings for Workspai modules...
27
- `)),console.log(s.gray("\u{1F4E1} Fetching modules from Workspai..."));let o=await No();console.log(s.green(`\u2713 Found ${o.length} modules
27
+ `)),console.log(s.gray("\u{1F4E1} Fetching modules from Workspai..."));let o=await zo();console.log(s.green(`\u2713 Found ${o.length} modules
28
28
  `));let r=o.length*50/1e6*.02;if(console.log(s.cyan(`\u{1F4B0} Estimated cost: ~$${r.toFixed(3)}`)),console.log(s.gray(` (Based on ${o.length} modules at $0.02/1M tokens)
29
29
  `)),t){let{confirm:a}=await b$3([{type:"confirm",name:"confirm",message:"Generate embeddings now?",default:true}]);if(!a)return console.log(s.yellow(`
30
30
  \u26A0\uFE0F Embeddings generation cancelled
31
- `)),false}let n=o.map(a=>`${a.name}. ${a.description}. ${a.longDescription}. Keywords: ${a.keywords.join(", ")}. Use cases: ${a.useCases.join(", ")}.`),i=b$7(`Generating embeddings for ${o.length} modules...`,{component:"ai",phase:"embeddings.generate"});try{let a=await Ls(n);i.succeed(`Generated embeddings for ${o.length} modules`);let l={model:"text-embedding-3-small",dimension:a[0].length,generated_at:new Date().toISOString(),modules:o.map((m,p)=>({id:m.id,name:m.name,embedding:a[p]}))},c=e||v.join(process.cwd(),"data","modules-embeddings.json"),d=v.dirname(c);return P.existsSync(d)||P.mkdirSync(d,{recursive:true}),P.writeFileSync(c,JSON.stringify(l,null,2)),console.log(s.green(`
32
- \u2705 Embeddings generated successfully!`)),console.log(s.gray(`\u{1F4C1} Saved to: ${c}`)),console.log(s.gray(`\u{1F4CA} Size: ${o.length} modules, ${a[0].length} dimensions
33
- `)),true}catch(a){i.fail("Failed to generate embeddings");let l=zs(a);return l.includes("429")?(console.log(s.red(`
31
+ `)),false}let n=o.map(a=>`${a.name}. ${a.description}. ${a.longDescription}. Keywords: ${a.keywords.join(", ")}. Use cases: ${a.useCases.join(", ")}.`),i=b$7(`Generating embeddings for ${o.length} modules...`,{component:"ai",phase:"embeddings.generate"});try{let a=await ai(n);i.succeed(`Generated embeddings for ${o.length} modules`);let c={model:"text-embedding-3-small",dimension:a[0].length,generated_at:new Date().toISOString(),modules:o.map((f,d)=>({id:f.id,name:f.name,embedding:a[d]}))},l=e||C.join(process.cwd(),"data","modules-embeddings.json"),p=C.dirname(l);return S.existsSync(p)||S.mkdirSync(p,{recursive:true}),S.writeFileSync(l,JSON.stringify(c,null,2)),console.log(s.green(`
32
+ \u2705 Embeddings generated successfully!`)),console.log(s.gray(`\u{1F4C1} Saved to: ${l}`)),console.log(s.gray(`\u{1F4CA} Size: ${o.length} modules, ${a[0].length} dimensions
33
+ `)),true}catch(a){i.fail("Failed to generate embeddings");let c=hi(a);return c.includes("429")?(console.log(s.red(`
34
34
  \u274C OpenAI API quota exceeded`)),console.log(s.yellow(`Please check your billing: https://platform.openai.com/account/billing
35
- `))):l.includes("401")?(console.log(s.red(`
35
+ `))):c.includes("401")?(console.log(s.red(`
36
36
  \u274C Invalid API key`)),console.log(s.yellow("Please set a valid API key:")),console.log(s.white(` workspai config set-api-key
37
37
  `))):console.log(s.red(`
38
- \u274C Error: ${l}
38
+ \u274C Error: ${c}
39
39
  `)),false}}catch(o){return console.log(s.red(`
40
- \u274C Failed to generate embeddings: ${zs(o)}
41
- `)),false}}async function Qs(t=true){if(Ys().exists)return true;if(console.log(s.yellow(`
40
+ \u274C Failed to generate embeddings: ${hi(o)}
41
+ `)),false}}async function wi(t=true){if(yi().exists)return true;if(console.log(s.yellow(`
42
42
  \u26A0\uFE0F Module embeddings not found`)),console.log(s.gray(`AI recommendations require embeddings to be generated.
43
43
  `)),!t)return console.log(s.red("\u274C Cannot generate embeddings in non-interactive mode")),console.log(s.white(`Run: workspai ai generate-embeddings
44
- `)),false;let{action:o}=await b$3([{type:"list",name:"action",message:"What would you like to do?",choices:[{name:"\u{1F680} Generate embeddings now (OpenAI key for production, or mock mode for testing)",value:"generate"},{name:"\u{1F4DD} Show me how to generate them manually",value:"manual"},{name:"\u274C Cancel",value:"cancel"}]}]);return o==="generate"?await Do(true):(o==="manual"&&(console.log(s.cyan(`
44
+ `)),false;let{action:o}=await b$3([{type:"list",name:"action",message:"What would you like to do?",choices:[{name:"\u{1F680} Generate embeddings now (OpenAI key for production, or mock mode for testing)",value:"generate"},{name:"\u{1F4DD} Show me how to generate them manually",value:"manual"},{name:"\u274C Cancel",value:"cancel"}]}]);return o==="generate"?await Qo(true):(o==="manual"&&(console.log(s.cyan(`
45
45
  \u{1F4DD} To generate embeddings manually:
46
46
  `)),console.log(s.white("1. Get OpenAI API key from: https://platform.openai.com/api-keys")),console.log(s.white("2. Set the API key:")),console.log(s.gray(" workspai config set-api-key")),console.log(s.gray(` OR: export OPENAI_API_KEY="sk-..."
47
47
  `)),console.log(s.white("3. Generate embeddings:")),console.log(s.gray(` workspai ai generate-embeddings
48
48
  `)),console.log(s.cyan(`\u{1F4B0} Cost: ~$0.50 one-time
49
- `))),false)}async function Xs(){let t=Ys();return t.exists?(console.log(s.blue(`
49
+ `))),false)}async function ki(){let t=yi();return t.exists?(console.log(s.blue(`
50
50
  \u{1F504} Updating embeddings...`)),console.log(s.gray(`Current: ${t.moduleCount} modules`)),console.log(s.gray(`Generated: ${t.generatedAt||"unknown"}
51
- `)),t.path?await Do(true,t.path):false):(console.log(s.yellow(`
51
+ `)),t.path?await Qo(true,t.path):false):(console.log(s.yellow(`
52
52
  \u26A0\uFE0F No existing embeddings found`)),console.log(s.gray(`Use: workspai ai generate-embeddings
53
- `)),false)}function Nr(t){if(t&&typeof t=="object"){let e=t;return {message:typeof e.message=="string"?e.message:String(t),code:typeof e.code=="string"?e.code:void 0}}return {message:String(t)}}function Zs(t,e=0){console.log(JSON.stringify(t,null,2)),e!==0&&process.exit(e);}function ei(t){let e=t.command("ai").description("AI-powered features");e.command("recommend").description("Get AI-powered module recommendations").argument("[query]",'What do you want to build? (e.g., "user authentication with email")').option("-n, --number <count>","Number of recommendations","5").option("--json","Output as JSON").action(async(o,r)=>{try{Er()||(r.json&&Zs({ok:false,error:{code:"AI_DISABLED",message:"AI features are disabled",remediation:"workspai config ai enable"}},1),console.log(s.yellow(`
53
+ `)),false)}function tn(t){if(t&&typeof t=="object"){let e=t;return {message:typeof e.message=="string"?e.message:String(t),code:typeof e.code=="string"?e.code:void 0}}return {message:String(t)}}function vi(t,e=0){console.log(JSON.stringify(t,null,2)),e!==0&&process.exit(e);}function Pi(t){let e=t.command("ai").description("AI-powered features");e.command("recommend").description("Get AI-powered module recommendations").argument("[query]",'What do you want to build? (e.g., "user authentication with email")').option("-n, --number <count>","Number of recommendations","5").option("--json","Output as JSON").action(async(o,r)=>{try{qr()||(r.json&&vi({ok:false,error:{code:"AI_DISABLED",message:"AI features are disabled",remediation:"workspai config ai enable"}},1),console.log(s.yellow(`
54
54
  \u26A0\uFE0F AI features are disabled`)),console.log(s.gray(`Enable with: workspai config ai enable
55
- `)),process.exit(1));let n=Yt();n?await Oo(n):(r.json||(console.log(s.yellow(`
55
+ `)),process.exit(1));let n=io();n?await qo(n):(r.json||(console.log(s.yellow(`
56
56
  \u26A0\uFE0F OpenAI API key not configured - using MOCK MODE for testing
57
57
  `)),console.log(s.gray("\u{1F4DD} Note: Mock embeddings provide approximate results for testing.")),console.log(s.gray(` For production, configure your OpenAI API key:
58
58
  `)),console.log(s.white(" 1. Get your key from: https://platform.openai.com/api-keys")),console.log(s.white(" 2. Configure it: workspai config set-api-key")),console.log(s.gray(` OR set: export OPENAI_API_KEY="sk-proj-..."
59
- `))),Ds());let i=o;i||(i=(await b$3([{type:"input",name:"query",message:"\u{1F916} What do you want to build?",validate:u=>u.length===0?"Please enter a description":u.length<3?"Please be more specific (at least 3 characters)":true}])).query),r.json||console.log(s.blue(`
59
+ `))),ni());let i=o;i||(i=(await b$3([{type:"input",name:"query",message:"\u{1F916} What do you want to build?",validate:w=>w.length===0?"Please enter a description":w.length<3?"Please be more specific (at least 3 characters)":true}])).query),r.json||console.log(s.blue(`
60
60
  \u{1F916} Analyzing your request...
61
- `)),!n||await Qs(!r.json)||(r.json&&Zs({ok:false,query:i,error:{code:"EMBEDDINGS_MISSING",message:"Module embeddings are not available",remediation:"workspai ai generate-embeddings"}},1),console.log(s.yellow(`
61
+ `)),!n||await wi(!r.json)||(r.json&&vi({ok:false,query:i,error:{code:"EMBEDDINGS_MISSING",message:"Module embeddings are not available",remediation:"workspai ai generate-embeddings"}},1),console.log(s.yellow(`
62
62
  \u26A0\uFE0F Cannot proceed without embeddings
63
- `)),process.exit(1));let l=parseInt(r.number,10),c=await Hs(i,l);if(c.length===0||c[0].score<.3)if(console.log(s.yellow(`
63
+ `)),process.exit(1));let c=parseInt(r.number,10),l=await fi(i,c);if(l.length===0||l[0].score<.3)if(console.log(s.yellow(`
64
64
  \u26A0\uFE0F No matching modules found in RapidKit Core registry.
65
65
  `)),console.log(s.cyan(`\u{1F4A1} Options:
66
66
  `)),console.log(s.white("1. Create custom module:")),console.log(s.gray(" npx workspai modules scaffold <name> --category <category>")),console.log(s.gray(` Example: npx workspai modules scaffold blockchain-integration --category integrations
67
67
  `)),console.log(s.white("2. Search with different keywords")),console.log(s.gray(` Try more general terms (e.g., "storage" instead of "blockchain")
68
68
  `)),console.log(s.white("3. Request feature:")),console.log(s.gray(` https://github.com/rapidkitlabs/workspai/issues
69
- `)),c.length>0)console.log(s.yellow(`\u26A0\uFE0F Low confidence matches found:
70
- `));else return;if(r.json){console.log(JSON.stringify({query:i,recommendations:c},null,2));return}console.log(s.green.bold(`\u{1F4E6} Recommended Modules:
71
- `)),c.forEach((p,u)=>{let f=(p.score*100).toFixed(1),g=p.score>.8?" \u2B50":"";console.log(s.bold(`${u+1}. ${p.module.name}${g}`)),console.log(s.gray(` ${p.module.description}`)),console.log(s.cyan(` Match: ${f}%`)+s.gray(` - ${p.reason}`)),console.log(s.yellow(` Category: ${p.module.category}`)),p.module.dependencies.length>0&&console.log(s.magenta(` Requires: ${p.module.dependencies.join(", ")}`)),console.log();});let d=c.slice(0,3).map(p=>p.module.id);console.log(s.cyan("\u{1F4A1} Quick install (top 3):")),console.log(s.white(` npx workspai add module ${d.join(" ")}
72
- `));let{shouldInstall:m}=await b$3([{type:"confirm",name:"shouldInstall",message:"Would you like to install these modules now?",default:false}]);if(m){let{selectedModules:p}=await b$3([{type:"checkbox",name:"selectedModules",message:"Select modules to install:",choices:c.map(f=>({name:`${f.module.name} - ${f.module.description}`,value:f.module.id,checked:f.score>.7}))}]),u=p;if(u.length>0){console.log(s.blue(`
73
- \u{1F4E6} Installing ${u.length} modules...
74
- `)),console.log(s.gray(`Command: npx workspai add module ${u.join(" ")}`));let g=q(process.cwd()).commandMap.add;if(!g||g.status!=="supported"){console.log(s.red(`
75
- \u274C RapidKit Core modules are not available for this project.`)),console.log(s.gray(` ${g?.reason??"Module commands require RapidKit Core module-enabled project metadata."}
76
- `));return}let h=await f$1(["add","module",...u],{cwd:process.cwd()});console.log(h===0?s.green(`
69
+ `)),l.length>0)console.log(s.yellow(`\u26A0\uFE0F Low confidence matches found:
70
+ `));else return;if(r.json){console.log(JSON.stringify({query:i,recommendations:l},null,2));return}console.log(s.green.bold(`\u{1F4E6} Recommended Modules:
71
+ `)),l.forEach((d,w)=>{let h=(d.score*100).toFixed(1),k=d.score>.8?" \u2B50":"";console.log(s.bold(`${w+1}. ${d.module.name}${k}`)),console.log(s.gray(` ${d.module.description}`)),console.log(s.cyan(` Match: ${h}%`)+s.gray(` - ${d.reason}`)),console.log(s.yellow(` Category: ${d.module.category}`)),d.module.dependencies.length>0&&console.log(s.magenta(` Requires: ${d.module.dependencies.join(", ")}`)),console.log();});let p=l.slice(0,3).map(d=>d.module.id);console.log(s.cyan("\u{1F4A1} Quick install (top 3):")),console.log(s.white(` npx workspai add module ${p.join(" ")}
72
+ `));let{shouldInstall:f}=await b$3([{type:"confirm",name:"shouldInstall",message:"Would you like to install these modules now?",default:false}]);if(f){let{selectedModules:d}=await b$3([{type:"checkbox",name:"selectedModules",message:"Select modules to install:",choices:l.map(h=>({name:`${h.module.name} - ${h.module.description}`,value:h.module.id,checked:h.score>.7}))}]),w=d;if(w.length>0){console.log(s.blue(`
73
+ \u{1F4E6} Installing ${w.length} modules...
74
+ `)),console.log(s.gray(`Command: npx workspai add module ${w.join(" ")}`));let k=q(process.cwd()).commandMap.add;if(!k||k.status!=="supported"){console.log(s.red(`
75
+ \u274C RapidKit Core modules are not available for this project.`)),console.log(s.gray(` ${k?.reason??"Module commands require RapidKit Core module-enabled project metadata."}
76
+ `));return}let j=await f$1(["add","module",...w],{cwd:process.cwd()});console.log(j===0?s.green(`
77
77
  \u2705 Selected modules installed successfully
78
78
  `):s.red(`
79
- \u274C Module installation failed (exit code: ${h})
79
+ \u274C Module installation failed (exit code: ${j})
80
80
  `));}else console.log(s.gray(`
81
81
  No modules selected
82
- `));}}catch(n){let i=Nr(n);f.error(`
82
+ `));}}catch(n){let i=tn(n);f.error(`
83
83
  \u274C Error:`,i.message),i.code==="invalid_api_key"?(console.log(s.yellow(`
84
84
  \u{1F4A1} Your API key may be invalid or expired`)),console.log(s.cyan(` Update it: workspai config set-api-key
85
85
  `))):i.message.includes("embeddings file not found")&&(console.log(s.yellow(`
86
86
  \u{1F4A1} Module embeddings not generated yet`)),console.log(s.cyan(" Generate them (one-time):")),console.log(s.white(" cd packages/cli")),console.log(s.white(' export OPENAI_API_KEY="sk-proj-..."')),console.log(s.white(` npx tsx src/ai/generate-embeddings.ts
87
- `))),process.exit(1);}}),e.command("info").description("Show AI features information").action(()=>{let o=Yt(),r=Er();console.log(s.bold(`
87
+ `))),process.exit(1);}}),e.command("info").description("Show AI features information").action(()=>{let o=io(),r=qr();console.log(s.bold(`
88
88
  \u{1F916} Workspai AI Features
89
89
  `)),console.log(s.cyan("Status:"),r?s.green("Enabled"):s.red("Disabled")),console.log(s.cyan("API Key:"),o?s.green("Configured \u2713"):s.red("Not configured \u2717")),console.log(s.bold(`
90
90
  \u{1F4E6} Available Features:
@@ -92,90 +92,90 @@ No modules selected
92
92
  \u{1F4B0} Pricing:
93
93
  `)),console.log(s.white("\u2022 Per query: ~$0.0002")+s.gray(" (practically free)")),console.log(s.white("\u2022 100 queries: ~$0.02")+s.gray(" (2 cents)")),console.log(s.white("\u2022 1000 queries: ~$0.20")+s.gray(" (20 cents)")),console.log(s.bold(`
94
94
  \u{1F680} Getting Started:
95
- `)),o?(console.log(s.green("\u2713 You're all set!")),console.log(s.white(' Try: workspai ai recommend "user authentication"'))):(console.log(s.white("1. Get OpenAI API key: https://platform.openai.com/api-keys")),console.log(s.white("2. Configure: workspai config set-api-key")),console.log(s.white('3. Try: workspai ai recommend "user authentication"'))),console.log();}),e.command("generate-embeddings").description("Generate AI embeddings for all modules (one-time setup)").option("--force","Force regeneration even if embeddings exist").action(async()=>{try{let o=Yt();o||(console.log(s.red(`
95
+ `)),o?(console.log(s.green("\u2713 You're all set!")),console.log(s.white(' Try: workspai ai recommend "user authentication"'))):(console.log(s.white("1. Get OpenAI API key: https://platform.openai.com/api-keys")),console.log(s.white("2. Configure: workspai config set-api-key")),console.log(s.white('3. Try: workspai ai recommend "user authentication"'))),console.log();}),e.command("generate-embeddings").description("Generate AI embeddings for all modules (one-time setup)").option("--force","Force regeneration even if embeddings exist").action(async()=>{try{let o=io();o||(console.log(s.red(`
96
96
  \u274C OpenAI API key not configured
97
97
  `)),console.log(s.cyan(`To generate embeddings, you need an OpenAI API key:
98
98
  `)),console.log(s.white("1. Get your key from: https://platform.openai.com/api-keys")),console.log(s.white("2. Configure it: workspai config set-api-key")),console.log(s.gray(`
99
99
  OR set environment variable:`)),console.log(s.white(` export OPENAI_API_KEY="sk-proj-..."
100
- `)),process.exit(1)),Oo(o);let r=await Do(true);r&&(console.log(s.green("\u2705 Ready to use AI recommendations!")),console.log(s.cyan(`Try: workspai ai recommend "authentication"
101
- `))),process.exit(r?0:1);}catch(o){let r=Nr(o);f.error("Failed to generate embeddings:",r.message),process.exit(1);}}),e.command("update-embeddings").description("Update existing embeddings with latest modules").action(async()=>{try{let o=Yt();o||(console.log(s.red(`
100
+ `)),process.exit(1)),qo(o);let r=await Qo(true);r&&(console.log(s.green("\u2705 Ready to use AI recommendations!")),console.log(s.cyan(`Try: workspai ai recommend "authentication"
101
+ `))),process.exit(r?0:1);}catch(o){let r=tn(o);f.error("Failed to generate embeddings:",r.message),process.exit(1);}}),e.command("update-embeddings").description("Update existing embeddings with latest modules").action(async()=>{try{let o=io();o||(console.log(s.red(`
102
102
  \u274C OpenAI API key not configured
103
103
  `)),console.log(s.white(`Set your API key: workspai config set-api-key
104
- `)),process.exit(1)),Oo(o);let r=await Xs();process.exit(r?0:1);}catch(o){let r=Nr(o);f.error("Failed to update embeddings:",r.message),process.exit(1);}});}var dc="rapidkit.product-factory-plan.v1",pc="rapidkit.private-product-manifest.v1";function Zt(t,e=""){return typeof t=="string"&&t.trim()?t.trim():e}function Wr(t){return typeof t=="string"&&t.trim()?t.trim():null}function uc(t,e){return typeof t=="number"&&Number.isFinite(t)?t:e}function ti(t){return Array.isArray(t)?[...new Set(t.filter(e=>typeof e=="string").map(e=>e.trim()).filter(Boolean))]:[]}function ri(t){if(!/^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/.test(t))throw new Error(`Invalid product slug "${t}". Use lowercase letters, numbers, and hyphens.`)}function mc(t,e,o){let r=Zt(t.slug);if(!r)throw new Error(`Backlog product at index ${e} is missing slug.`);ri(r);let n=ti(t.modules),i=ti(t.moduleGaps);return {rank:uc(t.rank,e+1),slug:r,title:Zt(t.title,r),category:Zt(t.category,"Uncategorized"),tier:Zt(t.tier,"pro"),summary:Zt(t.summary),modules:n,moduleGaps:i,recommendedKit:o,workspaceProfile:"enterprise",readiness:{status:i.length>0?"blocked-by-module-gaps":"ready-for-private-manifest",blockingGaps:i}}}function fc(t){if(!t||typeof t!="object"||Array.isArray(t))throw new Error("Backlog must be a JSON object.");return t}async function gc(t){let e=v.resolve(process.cwd(),t),o=fc(await E__default.readJson(e));if(!Array.isArray(o.products))throw new Error("Backlog must contain a products array.");return {absolutePath:e,payload:o}}function hc(t,e){let o=[...t];if(e.tier){let r=e.tier.toLowerCase();o=o.filter(n=>n.tier.toLowerCase()===r);}if(e.category){let r=e.category.toLowerCase();o=o.filter(n=>n.category.toLowerCase()===r);}if(e.limit){let r=Number.parseInt(e.limit,10);if(!Number.isInteger(r)||r<1)throw new Error("--limit must be a positive integer.");o=o.slice(0,r);}return o}async function ni(t){let e=t.kit?.trim()||"fastapi.standard",{absolutePath:o,payload:r}=await gc(t.backlogPath),n=r.products,i=n.map((m,p)=>mc(m,p,e)),a=hc(i,t),l=new Set(a.flatMap(m=>m.modules)),c=a.flatMap(m=>m.moduleGaps),d=a.filter(m=>m.readiness.status==="ready-for-private-manifest").length;return {schemaVersion:dc,generatedAt:(t.now??new Date).toISOString(),source:{backlogPath:o,backlogSchemaVersion:Wr(r.schemaVersion),purpose:Wr(r.purpose),publicationRule:Wr(r.publicationRule)},defaults:{kit:e,workspaceProfile:"enterprise",projectSlug:"api"},stats:{totalProducts:n.length,plannedProducts:a.length,readyProducts:d,blockedProducts:a.length-d,uniqueModules:l.size,knownModuleGaps:c.length},products:a}}function $t(t){return JSON.stringify(t,null,2)}function yc(t){return `sha256:${Dr.createHash("sha256").update($t(t)).digest("hex")}`}async function wc(t){let e=await ni({backlogPath:t.backlogPath,kit:t.kit,now:t.now}),o=e.products.find(i=>i.slug===t.slug);if(!o)throw new Error(`Product "${t.slug}" was not found in backlog.`);let r=t.outputRoot||"../workspai-examples-pro",n={schemaVersion:pc,generatedAt:e.generatedAt,product:{rank:o.rank,slug:o.slug,title:o.title,category:o.category,tier:o.tier,summary:o.summary},workspace:{name:o.slug,profile:"enterprise",outputHint:v.join(r,o.slug)},projects:[{slug:"api",kit:o.recommendedKit,runtime:"python",framework:"fastapi",modules:o.modules,moduleGaps:o.moduleGaps}],factory:{sourceBacklogPath:e.source.backlogPath,manifestChecksum:"",requiredCommands:[`npx workspai create workspace ${o.slug} --yes --profile enterprise`,`npx workspai create project ${o.recommendedKit} api --yes --skip-install`,"npx workspai init","npx workspai workspace run test --strict --json","npx workspai readiness --strict --json"],releaseEvidencePath:`.workspai/product-factory/${o.slug}/release-evidence.json`}};return {...n,factory:{...n.factory,manifestChecksum:yc({...n,factory:{...n.factory,manifestChecksum:""}})}}}async function oi(t,e,o=false){let r=v.resolve(process.cwd(),t);if(!o&&await E__default.pathExists(r))throw new Error(`Refusing to overwrite existing file: ${r}. Use --force.`);await E__default.ensureDir(v.dirname(r)),await E__default.writeFile(r,`${$t(e)}
105
- `,"utf-8");}function kc(t,e){let o=v.join(".workspai","product-factory","manifests",`${e}.manifest.json`);return t?t.endsWith(".json")?t:v.join(t,`${e}.manifest.json`):o}function vc(t,e){console.log(s.bold(`
104
+ `)),process.exit(1)),qo(o);let r=await ki();process.exit(r?0:1);}catch(o){let r=tn(o);f.error("Failed to update embeddings:",r.message),process.exit(1);}});}var Kc="rapidkit.product-factory-plan.v1",Vc="rapidkit.private-product-manifest.v1";function bi(t){let e=process.argv;for(let o=0;o<e.length;o+=1){let r=e[o];if(r===t){let n=e[o+1];return n&&!n.startsWith("-")?n:void 0}if(r.startsWith(`${t}=`))return r.slice(t.length+1)}}function lo(t,e=""){return typeof t=="string"&&t.trim()?t.trim():e}function on(t){return typeof t=="string"&&t.trim()?t.trim():null}function Gc(t,e){return typeof t=="number"&&Number.isFinite(t)?t:e}function ji(t){return Array.isArray(t)?[...new Set(t.filter(e=>typeof e=="string").map(e=>e.trim()).filter(Boolean))]:[]}function Si(t){if(!/^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/.test(t))throw new Error(`Invalid product slug "${t}". Use lowercase letters, numbers, and hyphens.`)}function Uc(t,e,o){let r=lo(t.slug);if(!r)throw new Error(`Backlog product at index ${e} is missing slug.`);Si(r);let n=ji(t.modules),i=ji(t.moduleGaps);return {rank:Gc(t.rank,e+1),slug:r,title:lo(t.title,r),category:lo(t.category,"Uncategorized"),tier:lo(t.tier,"pro"),summary:lo(t.summary),modules:n,moduleGaps:i,recommendedKit:o,workspaceProfile:"enterprise",readiness:{status:i.length>0?"blocked-by-module-gaps":"ready-for-private-manifest",blockingGaps:i}}}function Hc(t){if(!t||typeof t!="object"||Array.isArray(t))throw new Error("Backlog must be a JSON object.");return t}async function Bc(t){let e=C.resolve(process.cwd(),t),o=Hc(await R__default.readJson(e));if(!Array.isArray(o.products))throw new Error("Backlog must contain a products array.");return {absolutePath:e,payload:o}}function qc(t,e){let o=[...t];if(e.tier){let r=e.tier.toLowerCase();o=o.filter(n=>n.tier.toLowerCase()===r);}if(e.category){let r=e.category.toLowerCase();o=o.filter(n=>n.category.toLowerCase()===r);}if(e.limit){let r=Number.parseInt(e.limit,10);if(!Number.isInteger(r)||r<1)throw new Error("--limit must be a positive integer.");o=o.slice(0,r);}return o}async function xi(t){let e=t.kit?.trim()||"fastapi.standard",{absolutePath:o,payload:r}=await Bc(t.backlogPath),n=r.products,i=n.map((f,d)=>Uc(f,d,e)),a=qc(i,t),c=new Set(a.flatMap(f=>f.modules)),l=a.flatMap(f=>f.moduleGaps),p=a.filter(f=>f.readiness.status==="ready-for-private-manifest").length;return {schemaVersion:Kc,generatedAt:(t.now??new Date).toISOString(),source:{backlogPath:o,backlogSchemaVersion:on(r.schemaVersion),purpose:on(r.purpose),publicationRule:on(r.publicationRule)},defaults:{kit:e,workspaceProfile:"enterprise",projectSlug:"api"},stats:{totalProducts:n.length,plannedProducts:a.length,readyProducts:p,blockedProducts:a.length-p,uniqueModules:c.size,knownModuleGaps:l.length},products:a}}function Dt(t){return JSON.stringify(t,null,2)}function zc(t){return `sha256:${ut.createHash("sha256").update(Dt(t)).digest("hex")}`}function Yc(t){return t.replace(/\\/g,"/")}async function Qc(t){let e=await xi({backlogPath:t.backlogPath,kit:t.kit,now:t.now}),o=e.products.find(i=>i.slug===t.slug);if(!o)throw new Error(`Product "${t.slug}" was not found in backlog.`);let r=t.outputRoot||"../workspai-examples-pro",n={schemaVersion:Vc,generatedAt:e.generatedAt,product:{rank:o.rank,slug:o.slug,title:o.title,category:o.category,tier:o.tier,summary:o.summary},workspace:{name:o.slug,profile:"enterprise",outputHint:Yc(C.join(r,o.slug))},projects:[{slug:"api",kit:o.recommendedKit,runtime:"python",framework:"fastapi",modules:o.modules,moduleGaps:o.moduleGaps}],factory:{sourceBacklogPath:e.source.backlogPath,manifestChecksum:"",requiredCommands:[`npx workspai create workspace ${o.slug} --yes --profile enterprise`,`npx workspai create project ${o.recommendedKit} api --yes --skip-install`,"npx workspai init","npx workspai workspace run test --strict --json","npx workspai readiness --strict --json"],releaseEvidencePath:`.workspai/product-factory/${o.slug}/release-evidence.json`}};return {...n,factory:{...n.factory,manifestChecksum:zc({...n,factory:{...n.factory,manifestChecksum:""}})}}}async function Ci(t,e,o=false){let r=C.resolve(process.cwd(),t);if(!o&&await R__default.pathExists(r))throw new Error(`Refusing to overwrite existing file: ${r}. Use --force.`);await R__default.ensureDir(C.dirname(r)),await R__default.writeFile(r,`${Dt(e)}
105
+ `,"utf-8");}function Xc(t,e){let o=C.join(".workspai","product-factory","manifests",`${e}.manifest.json`);return t?t.endsWith(".json")?t:C.join(t,`${e}.manifest.json`):o}function Zc(t,e){console.log(s.bold(`
106
106
  Workspai Product Factory Plan
107
107
  `)),console.log(s.cyan("Products:"),s.white(String(t.stats.plannedProducts))),console.log(s.cyan("Ready:"),s.green(String(t.stats.readyProducts))),console.log(s.cyan("Blocked:"),s.yellow(String(t.stats.blockedProducts))),console.log(s.cyan("Unique modules:"),s.white(String(t.stats.uniqueModules))),console.log(s.cyan("Known gaps:"),s.yellow(String(t.stats.knownModuleGaps))),e&&console.log(s.gray(`
108
- Wrote plan: ${v.resolve(process.cwd(),e)}`)),console.log(s.gray(`
108
+ Wrote plan: ${C.resolve(process.cwd(),e)}`)),console.log(s.gray(`
109
109
  Next: npx workspai product manifest create <slug> --from-backlog <file>
110
- `));}function Pc(t,e){console.log(s.bold(`
110
+ `));}function el(t,e){console.log(s.bold(`
111
111
  Workspai Private Product Manifest
112
112
  `)),console.log(s.cyan("Product:"),s.white(t.product.slug)),console.log(s.cyan("Kit:"),s.white(t.projects[0].kit)),console.log(s.cyan("Modules:"),s.white(String(t.projects[0].modules.length))),console.log(s.cyan("Module gaps:"),s.yellow(String(t.projects[0].moduleGaps.length))),console.log(s.cyan("Checksum:"),s.white(t.factory.manifestChecksum)),console.log(s.gray(`
113
- Wrote manifest: ${v.resolve(process.cwd(),e)}
114
- `));}function si(t){let e=t.command("product",{hidden:true}).description("Product Factory commands for private workspace product manifests");e.command("plan <backlog>").description("Build a deterministic Product Factory plan from a workspace backlog JSON").option("--output <file>","Write plan JSON to file").option("--kit <kit>","Default API kit for generated product manifests","fastapi.standard").option("--tier <tier>","Filter products by tier").option("--category <category>","Filter products by category").option("--limit <count>","Limit planned products").option("--json","Print JSON to stdout").action(async(o,r)=>{try{let n=await ni({backlogPath:o,kit:r.kit,tier:r.tier,category:r.category,limit:r.limit});r.output&&await oi(r.output,n,true),r.json?console.log($t(n)):vc(n,r.output);}catch(n){let i=n instanceof Error?n.message:String(n);r.json?console.log($t({ok:false,error:{message:i}})):console.error(s.red(`Product plan failed: ${i}`)),process.exit(1);}}),e.command("manifest").description("Create or inspect private product manifests").command("create <slug>").description("Create a private product manifest from a backlog product slug").requiredOption("--from-backlog <file>","Source workspace backlog JSON").option("--output <fileOrDir>","Manifest output file or directory").option("--kit <kit>","API kit for the generated workspace product","fastapi.standard").option("--workspace-output <dir>","Suggested root for generated product workspaces").option("--json","Print JSON to stdout").option("--force","Overwrite existing manifest file").action(async(o,r)=>{try{ri(o);let n=await wc({backlogPath:r.fromBacklog,slug:o,kit:r.kit,outputRoot:r.workspaceOutput}),i=kc(r.output,o);await oi(i,n,r.force===true),r.json?console.log($t(n)):Pc(n,i);}catch(n){let i=n instanceof Error?n.message:String(n);r.json?console.log($t({ok:false,error:{message:i}})):console.error(s.red(`Product manifest create failed: ${i}`)),process.exit(1);}});}var ai="rapidkit-workspace-snapshot-v1",ci="rapidkit-project-archive-v1",st="workspai-archive.json",Tr="rapidkit-archive.json",bc=[".workspai/workspace.json",".workspai-workspace","workspai.config.json","workspai.config.js","workspai.config.cjs","workspai.config.mjs",".rapidkit/workspace.json",".rapidkit-workspace","rapidkit.config.json","rapidkit.config.js","rapidkit.config.cjs","rapidkit.config.mjs","package.json"],Sc=new Set([".git","node_modules",".venv","dist","build","target","coverage","htmlcov",".next"]),eo={requireReasonForDestructiveOps:false,requireSafetySnapshotForDestructiveOps:true,allowPermanentDelete:true};function Mt(t=new Date){return t.toISOString().replace(/[:.]/g,"-")}function Fr(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");if(!e)throw new Error("Snapshot name must contain at least one letter or number.");return e.slice(0,120)}async function xc(t){try{let e=await E__default.readJson(t);return e&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}function Cc(t,e){if(!t)return e;let o=t.trim().toLowerCase();return ["true","yes","1","on"].includes(o)?true:["false","no","0","off"].includes(o)?false:e}async function jc(t){let e=o(t,"policies.yml").find(o=>E__default.pathExistsSync(o))??l(t,"policies.yml");if(!await E__default.pathExists(e))return {...eo};try{let o=await E__default.readFile(e,"utf-8"),r=(n,i)=>{let a=o.match(new RegExp(`^\\s*${n}:\\s*([^#\\n]+)`,"m"));return Cc(a?.[1],i)};return {requireReasonForDestructiveOps:r("require_reason_for_destructive_ops",eo.requireReasonForDestructiveOps),requireSafetySnapshotForDestructiveOps:r("require_safety_snapshot_for_destructive_ops",eo.requireSafetySnapshotForDestructiveOps),allowPermanentDelete:r("allow_permanent_delete",eo.allowPermanentDelete)}}catch{return {...eo}}}function Rc(t){return l(t,"audit","events.jsonl")}async function qe(t,e){let o={schema:"rapidkit-workspace-audit-event-v1",id:Dr.randomUUID(),timestamp:new Date().toISOString(),workspacePath:t,...e},r=Rc(t);return await E__default.ensureDir(v.dirname(r)),await E__default.appendFile(r,`${JSON.stringify(o)}
115
- `,"utf-8"),o}async function Fo(t,e,o){let r=await jc(t);if(r.requireReasonForDestructiveOps&&!o.reason?.trim())throw new Error(`${e} requires --reason by workspace policy.`);if(r.requireSafetySnapshotForDestructiveOps&&o.safetySnapshot===false)throw new Error(`${e} requires a safety snapshot by workspace policy.`);if(o.permanent&&!r.allowPermanentDelete)throw new Error("Permanent project delete is disabled by workspace policy.");return r}function Lr(t=process.cwd()){let e=v.resolve(t),o=v.resolve(Rr.tmpdir());for(;;){if(e!==o&&f$5(e))return e;let r=v.dirname(e);if(r===e)return null;e=r;}}function it(t){let e=t?v.resolve(t):Lr(process.cwd());if(!e)throw new Error("Not inside a Workspai workspace. Run from workspace root or pass --workspace.");if(!f$5(e))throw new Error(`Workspace path is not a Workspai workspace: ${e}`);return e}async function Ec(t){let e=await xc(o(t,"workspace.json").find(r=>E__default.pathExistsSync(r))??l(t,"workspace.json")),o$1=e?.workspace_name??e?.name;return typeof o$1=="string"&&o$1.trim()?o$1.trim():v.basename(t)}function Lo(t){return l(t,"snapshots")}function to(t){return l(t,"archive","projects")}function Jr(t){return v.join(t,"files")}function _c(t){return v.join(Rr.tmpdir(),`rapidkit-workspace-snapshot-${process.pid}-${t}-${Dr.randomBytes(4).toString("hex")}`)}function Kr(t,e){let o=v.relative(t,e);if(!o)return true;let r=o.split(v.sep);return (r[0]===".workspai"||r[0]===".rapidkit")&&["snapshots","archive","audit"].includes(r[1]||"")?false:!r.some(n=>Sc.has(n))}async function Ac(t){return (await a$9(t,{descendIntoMatchedProjects:false})).map(o=>({name:v.basename(o),relativePath:v.relative(t,o)}))}async function Ic(t,e){let o=[],r$1=new Set;for(let n of bc){let i=v.join(t,n);if(!await E__default.pathExists(i))continue;let a=r(n);if(r$1.has(a))continue;let l=v.join(e,a);await E__default.copy(i,l,{filter:c=>Kr(t,c)}),o.push(a),r$1.add(a);}return o}async function li(t){let e=[];async function o(r){let n=[];try{n=await E__default.readdir(r,{withFileTypes:true});}catch{return}for(let i of n){let a=v.join(r,i.name);i.isDirectory()?i.name===".rapidkit"?e.push(a):await o(a):i.isFile()&&i.name===".rapidkit-workspace"&&e.push(a);}}await o(t),e.sort((r,n)=>n.length-r.length);for(let r$1 of e){let n=v.join(v.dirname(r$1),v.basename(r(v.basename(r$1))));await E__default.copy(r$1,n,{overwrite:false,errorOnExist:false}),await E__default.remove(r$1);}}async function $c(t,e){await E__default.writeJson(v.join(t,"snapshot.json"),e,{spaces:2});}async function Gr(t){let e=v.join(t,"snapshot.json"),o=await E__default.readJson(e);if(!o||typeof o!="object"||o.schema!==ai)throw new Error(`Invalid Workspai workspace snapshot manifest: ${e}`);return o}async function Mc(t){let e=0,o=0,r=[t];for(;r.length>0;){let n=r.shift();if(!n)continue;let i=[];try{i=await E__default.readdir(n,{withFileTypes:true});}catch{continue}for(let a of i){let l=v.join(n,a.name);if(a.isDirectory()){r.push(l);continue}if(a.isFile())try{let c=await E__default.stat(l);e+=1,o+=c.size;}catch{}}}return {files:e,bytes:o}}async function Ot(t={}){let e=it(t.workspacePath),o=t.name?t.name:`snapshot-${Mt()}`,r=Fr(o),n=v.join(Lo(e),r),i=_c(r);if(await E__default.pathExists(n))throw new Error(`Snapshot already exists: ${r}`);let a=Jr(i);try{await E__default.ensureDir(a);let l=t.includeProjects?"full":"metadata",c=l==="full"?["."]:await Ic(e,a);l==="full"&&(await E__default.copy(e,a,{filter:m=>Kr(e,m)}),await li(a));let d={schema:ai,name:r,mode:l,reason:t.reason,createdAt:new Date().toISOString(),workspaceName:await Ec(e),workspacePath:e,copiedPaths:c,projects:await Ac(e)};return await $c(i,d),await E__default.ensureDir(v.dirname(n)),await E__default.move(i,n,{overwrite:false}),await qe(e,{action:"snapshot.create",target:r,status:"succeeded",reason:t.reason,details:{mode:l,copiedPaths:c,snapshotPath:n,projectCount:d.projects.length}}),{manifest:d,snapshotPath:n}}catch(l){throw await E__default.remove(i),await qe(e,{action:"snapshot.create",target:r,status:"failed",reason:t.reason,details:{error:l instanceof Error?l.message:String(l)}}),l}}async function di(t){let e=it(t.workspacePath),o=v.join(Lo(e),Fr(t.name));if(!await E__default.pathExists(o))throw new Error(`Snapshot not found: ${t.name}`);let r=await Gr(o),n=Jr(o),i=await Mc(n);return {manifest:r,snapshotPath:o,filesRoot:n,estimatedFileCount:i.files,estimatedBytes:i.bytes}}async function pi(t={}){let e=it(t.workspacePath),o=Lo(e);if(!await E__default.pathExists(o))return [];let r=await E__default.readdir(o,{withFileTypes:true}),n=[];for(let i of r){if(!i.isDirectory())continue;let a=v.join(o,i.name);try{n.push({...await Gr(a),snapshotPath:a});}catch{}}return n.sort((i,a)=>a.createdAt.localeCompare(i.createdAt))}async function ui(t){let e=it(t.workspacePath),o=v.join(Lo(e),Fr(t.name));if(!await E__default.pathExists(o))throw new Error(`Snapshot not found: ${t.name}`);let r$1=await Gr(o),n=Jr(o),i=r$1.mode==="full"?["."]:Array.from(new Set(r$1.copiedPaths.map(c=>{let d=r(c);return d.startsWith(".workspai/")?".workspai":d})));if(t.dryRun)return await qe(e,{action:"snapshot.restore",target:r$1.name,status:"planned",reason:t.reason,details:{restoredPaths:i}}),{workspacePath:e,snapshotPath:o,restoredPaths:i,dryRun:true};if(!t.force)throw new Error("Restore is destructive. Re-run with --force after reviewing --dry-run output.");await Fo(e,"snapshot.restore",{reason:t.reason,safetySnapshot:t.safetySnapshot});let a;if(t.safetySnapshot!==false&&(a=(await Ot({workspacePath:e,name:`pre-restore-${r$1.name}-${Mt()}`,reason:`Automatic safety snapshot before restoring ${r$1.name}`,includeProjects:false})).snapshotPath),r$1.mode==="full")await E__default.copy(n,e,{overwrite:true,errorOnExist:false,filter:c=>Kr(n,c)}),await li(e);else {let c=new Set;for(let d of r$1.copiedPaths){let m=r(d);c.has(m)||(await E__default.copy(v.join(n,d),v.join(e,m),{overwrite:true,errorOnExist:false}),c.add(m));}}let l={workspacePath:e,snapshotPath:o,restoredPaths:i,dryRun:false,safetySnapshotPath:a};return await qe(e,{action:"snapshot.restore",target:r$1.name,status:"succeeded",reason:t.reason,details:{restoredPaths:i,safetySnapshotPath:a}}),l}function mi(t){let e=t.trim();if(!e)throw new Error("Project name/path is required.");return e}async function fi(t,e){let o=mi(e),r=v.isAbsolute(o)?v.resolve(o):v.resolve(t,o);if(r.startsWith(`${v.resolve(t)}${v.sep}`)&&await E__default.pathExists(r))return r;let i=(await a$9(t,{descendIntoMatchedProjects:false})).filter(a=>{let l=v.relative(t,a);return v.basename(a)===o||l===o});if(i.length===0)throw new Error(`Project not found in workspace: ${e}`);if(i.length>1)throw new Error(`Project reference is ambiguous: ${e}`);return i[0]}async function Ur(t){try{let{syncWorkspaceProjects:e}=await import('./workspace-PR6VZRBG.js');await e(t,true);}catch{}}function Oc(t,e){let o=Dr.randomBytes(4).toString("hex");return v.join(to(t),`${e}-${Mt()}-${o}`)}async function gi(t){let e=[st,Tr].map(r=>v.join(t,r)).find(r=>E__default.existsSync(r))??v.join(t,st),o=await E__default.readJson(e);if(!o||typeof o!="object"||o.schema!==ci)throw new Error(`Invalid Workspai archive manifest: ${e}`);return o}async function Vr(t={}){let e=it(t.workspacePath),o=to(e);if(!await E__default.pathExists(o))return [];let r=await E__default.readdir(o,{withFileTypes:true}),n=[];for(let i of r){if(!i.isDirectory())continue;let a=v.join(o,i.name),l=[st,Tr].map(c=>v.join(a,c)).find(c=>E__default.existsSync(c))??v.join(a,st);try{n.push({...await gi(a),archivePath:a,manifestPath:l});}catch{}}return n.sort((i,a)=>a.archivedAt.localeCompare(i.archivedAt))}async function Nc(t,e){let o=mi(e),r=v.isAbsolute(o)?v.resolve(o):v.resolve(to(t),o);if(r.startsWith(`${v.resolve(to(t))}${v.sep}`)&&(await E__default.pathExists(v.join(r,st))||await E__default.pathExists(v.join(r,Tr))))return r;let i=(await Vr({workspacePath:t})).filter(a=>v.basename(a.archivePath)===o||a.projectName===o||v.relative(to(t),a.archivePath)===o);if(i.length===0)throw new Error(`Archived project not found: ${e}`);if(i.length>1)throw new Error(`Archive reference is ambiguous: ${e}`);return i[0].archivePath}async function Br(t){let e=it(t.workspacePath),o=await fi(e,t.project),r=v.basename(o),n=Oc(e,r),i=v.join(n,st);if(t.dryRun)return await qe(e,{action:"project.archive",target:r,status:"planned",reason:t.reason,details:{projectPath:o,archivePath:n}}),{workspacePath:e,projectName:r,projectPath:o,action:"archive",archivePath:n,manifestPath:i,dryRun:true};await Fo(e,"project.archive",{reason:t.reason,safetySnapshot:true});let a=await Ot({workspacePath:e,name:`pre-archive-${r}-${Mt()}`,reason:t.reason||`Automatic safety snapshot before archiving ${r}`,includeProjects:false});await E__default.ensureDir(v.dirname(n)),await E__default.move(o,n,{overwrite:false});let l={schema:ci,projectName:r,originalPath:o,archivedPath:n,reason:t.reason,archivedAt:new Date().toISOString(),safetySnapshotPath:a.snapshotPath};return await E__default.writeJson(i,l,{spaces:2}),await c$3(e,[o]),await Ur(e),await qe(e,{action:"project.archive",target:r,status:"succeeded",reason:t.reason,details:{projectPath:o,archivePath:n,manifestPath:i,safetySnapshotPath:a.snapshotPath}}),{workspacePath:e,projectName:r,projectPath:o,action:"archive",archivePath:n,manifestPath:i,safetySnapshotPath:a.snapshotPath,dryRun:false}}async function hi(t){if(!t.permanent)return Br(t);let e=it(t.workspacePath),o=await fi(e,t.project),r=v.basename(o);if(t.confirm!==r)throw new Error(`Permanent delete requires --confirm ${r}`);if(t.dryRun)return await qe(e,{action:"project.delete",target:r,status:"planned",reason:t.reason,details:{projectPath:o,permanent:true}}),{workspacePath:e,projectName:r,projectPath:o,action:"delete",dryRun:true};await Fo(e,"project.delete",{reason:t.reason,permanent:true,safetySnapshot:true});let n=await Ot({workspacePath:e,name:`pre-delete-${r}-${Mt()}`,reason:t.reason||`Automatic safety snapshot before deleting ${r}`,includeProjects:false});return await E__default.remove(o),await c$3(e,[o]),await Ur(e),await qe(e,{action:"project.delete",target:r,status:"succeeded",reason:t.reason,details:{projectPath:o,permanent:true,safetySnapshotPath:n.snapshotPath}}),{workspacePath:e,projectName:r,projectPath:o,action:"delete",safetySnapshotPath:n.snapshotPath,dryRun:false}}async function yi(t){let e=it(t.workspacePath),o=await Nc(e,t.archive),r=await gi(o),n=t.targetName?.trim()||r.projectName,i=v.join(e,n);if(!i.startsWith(`${v.resolve(e)}${v.sep}`))throw new Error(`Archive restore target escapes workspace: ${n}`);if(await E__default.pathExists(i)&&!t.force)throw new Error(`Project path already exists. Re-run with --force to overwrite: ${i}`);if(t.dryRun)return await qe(e,{action:"project.restore",target:n,status:"planned",reason:t.reason,details:{archivePath:o,projectPath:i}}),{workspacePath:e,projectName:n,projectPath:i,action:"restore",archivePath:o,manifestPath:v.join(o,st),dryRun:true};await Fo(e,"project.restore",{reason:t.reason,safetySnapshot:true});let a=await Ot({workspacePath:e,name:`pre-restore-project-${n}-${Mt()}`,reason:t.reason||`Automatic safety snapshot before restoring ${n}`,includeProjects:false});return await E__default.move(o,i,{overwrite:t.force===true}),await Ur(e),await qe(e,{action:"project.restore",target:n,status:"succeeded",reason:t.reason,details:{archivePath:o,projectPath:i,safetySnapshotPath:a.snapshotPath}}),{workspacePath:e,projectName:n,projectPath:i,action:"restore",archivePath:o,manifestPath:v.join(i,st),safetySnapshotPath:a.snapshotPath,dryRun:false}}var Dc="rapidkit.infra-stack.v1",ki="rapidkit.infra-plan.v1",Nt=".workspai/infra/docker-compose.yml",Wt=".workspai/reports/infra-plan.json",zr=".workspai/infra/.env.example";function Tc(){let t=v.dirname(fileURLToPath(import.meta.url)),e=[v.join(t,"../../contracts/infra-stack.v1.json"),v.join(t,"../contracts/infra-stack.v1.json")];for(let o of e)if(P.existsSync(o))return o;throw new Error(`Infra stack contract not found. Expected contracts/infra-stack.v1.json beside the rapidkit package root. Checked: ${e.join(", ")}`)}var qr=null;function ft(t){if(qr)return qr;let e=Tc(),o=P.readFileSync(e,"utf-8"),r=JSON.parse(o);if(r.schemaVersion!==Dc)throw new Error(`Unsupported infra stack schema: ${r.schemaVersion}`);return Fc(r),(qr=r),r}function Fc(t){let e=new Set(Object.keys(t.services));for(let[o,r]of Object.entries(t.moduleMappings)){if(!Array.isArray(r))throw new Error(`Invalid moduleMappings entry for ${o}`);for(let n of r)if(!e.has(n))throw new Error(`moduleMappings/${o} references unknown service '${n}'`)}for(let[o,r]of Object.entries(t.envVarMappings)){if(!Array.isArray(r))throw new Error(`Invalid envVarMappings entry for ${o}`);for(let n of r)if(!e.has(n))throw new Error(`envVarMappings/${o} references unknown service '${n}'`)}}function vi(t,e){let o=e.startsWith("free/")?e:`free/${e}`;return t.moduleMappings[o]||[]}function Dt(t,e){return t.envVarMappings[e.toUpperCase()]||[]}function Pi(t,e){let o={};for(let r of e){let n=t.services[r];n&&Object.assign(o,n.connectionEnv);}return o}async function Lc(t){let e=v.join(t,"registry.json");if(!await E__default.pathExists(e))return [];try{let r=(await E__default.readJson(e)).installed_modules||[];return [...new Set(r.map(n=>typeof n.slug=="string"?n.slug.trim():"").filter(Boolean))]}catch{return []}}async function Jc(t){let e=v.join(t,".env.example");if(!await E__default.pathExists(e))return [];try{let o=await E__default.readFile(e,"utf-8"),r=[];for(let n of o.split(`
116
- `)){let i=n.trim();if(!i||i.startsWith("#"))continue;let a=i.match(/^([A-Z0-9_]+)=/);a?.[1]&&r.push(a[1]);}return r}catch{return []}}async function Kc(t){let e=o(t,"infra","overrides.json").find(o=>E__default.pathExistsSync(o));if(!e)return [];try{let o=await E__default.readJson(e);return Array.isArray(o.services)?[...new Set(o.services.filter(r=>typeof r=="string"&&r.trim().length>0))]:[]}catch{return []}}async function Gc(t){let e=await c$5(t,".workspai/workspace.contract.json");if(!e)return [];try{let o=await E__default.readJson(e),r=[];for(let n of o.projects||[]){let i=typeof n.slug=="string"?n.slug:"unknown";for(let a of n.contracts?.env||[])typeof a=="string"&&a.trim()&&r.push({project:i,env:a.trim().toUpperCase()});}return r}catch{return []}}function Jo(t,e,o,r){t.add(o),e.push(r);}async function bi(t){let e=v.resolve(t.workspacePath),o=t.contract||ft(),r=new Set,n=[],i=new Set,a=new Set,l=new Set,c=await f$7(e);for(let d of c){let m=v.dirname(v.dirname(d)),p=v.basename(m);for(let u of await Lc(m)){i.add(u);for(let f of vi(o,u))Jo(r,n,f,{kind:"module",value:u,project:p});}for(let u of await Jc(m)){a.add(u);for(let f of Dt(o,u))Jo(r,n,f,{kind:"env-var",value:u,project:p});}}for(let d of await Gc(e)){a.add(d.env);for(let m of Dt(o,d.env))Jo(r,n,m,{kind:"contract-env",value:d.env,project:d.project});}for(let d of await Kc(e))l.add(d),Jo(r,n,d,{kind:"override",value:d});return {modules:[...i].sort(),envVars:[...a].sort(),overrides:[...l].sort(),sources:n,serviceIds:[...r].sort()}}function Uc(t){let e=t.trim();if(!e||e.startsWith("#"))return null;let o=e.indexOf("=");if(o<=0)return null;let r=e.slice(0,o).trim();if(!/^[A-Z0-9_]+$/.test(r))return null;let n=e.slice(o+1).trim();(n.startsWith('"')&&n.endsWith('"')||n.startsWith("'")&&n.endsWith("'"))&&(n=n.slice(1,-1));let i=n.match(/^\$\{[A-Z0-9_]+:-([^}]+)\}$/),a=(i?i[1]:n).trim();return a?{key:r,value:a}:null}async function Vc(t){if(!await E__default.pathExists(t))return {};try{let e=await E__default.readFile(t,"utf-8"),o={};for(let r of e.split(`
117
- `)){let n=Uc(r);n&&(o[n.key]=n.value);}return o}catch{return {}}}async function xi(t){let e={},o=await f$7(t.workspacePath);for(let r of o){let n=v.dirname(v.dirname(r)),i=await Vc(v.join(n,".env.example"));for(let[a,l]of Object.entries(i))Dt(t.contract,a).length>0&&(e[a]=l);}return e}function Ci(t,e){return t.filter(o=>Dt(e,o).length>0).sort()}function ji(t){let e=t.RAPIDKIT_DB_POSTGRES_URL||t.DATABASE_URL;if(e?.startsWith("postgresql://"))try{let o=new URL(e),r=o.pathname.replace(/^\//,"");return {POSTGRES_USER:decodeURIComponent(o.username||"postgres"),POSTGRES_PASSWORD:decodeURIComponent(o.password||"postgres"),POSTGRES_DB:r||"postgres"}}catch{return}}function Ri(t){let e=t.POSTGRES_USER||"postgres",o=t.POSTGRES_DB||"postgres";return ["CMD-SHELL",`pg_isready -U ${e} -d ${o}`]}function Bc(t){return /[:#{}[\],&*!|>'"%@`]/.test(t)||t.includes(`
118
- `)?JSON.stringify(t):t}function Ei(t,e){return Object.entries(t).map(([o,r])=>`${e}${o}: ${Bc(r)}`).join(`
119
- `)}function Hc(t,e){let o=t.test.map(r=>JSON.stringify(r)).join(", ");return [`${e}healthcheck:`,`${e} test: [${o}]`,`${e} interval: ${t.interval}`,`${e} timeout: ${t.timeout}`,`${e} retries: ${t.retries}`].join(`
120
- `)}function _i(t){let e=["# Generated by Workspai infra plan \u2014 do not edit manually.",`# Workspace: ${t.workspaceName}`,`# Generated at: ${t.plan.generatedAt}`,"name: workspai-infra"],o=new Set;if(t.plan.services.length===0)return e.push("services: {}"),e.push(""),e.join(`
121
- `);e.push("services:");for(let r of t.plan.services){let n=t.contract.services[r.id];if(n){if(e.push(` ${r.id}:`),e.push(` image: ${n.image}`),e.push(` container_name: workspai-${r.id}`),n.command?.length){let i=n.command.map(a=>JSON.stringify(a)).join(", ");e.push(` command: [${i}]`);}if(n.env&&Object.keys(n.env).length>0){e.push(" environment:");let i={...n.env,...t.plan.serviceEnvOverrides?.[r.id]||{}};e.push(Ei(i," "));}else t.plan.serviceEnvOverrides?.[r.id]&&(e.push(" environment:"),e.push(Ei(t.plan.serviceEnvOverrides[r.id]," ")));if(n.ports.length>0){e.push(" ports:");for(let i of n.ports)e.push(` - "${i.host}:${i.container}"`);}if(n.volumes?.length){e.push(" volumes:");for(let i of n.volumes){e.push(` - ${i}`);let a=i.split(":")[0];a&&!a.startsWith("/")&&o.add(a);}}if(n.healthcheck){let i=t.plan.serviceEnvOverrides?.[r.id];if(r.id==="postgres"&&i){let a=Ri(i).map(l=>JSON.stringify(l)).join(", ");e.push(" healthcheck:"),e.push(` test: [${a}]`),e.push(` interval: ${n.healthcheck.interval}`),e.push(` timeout: ${n.healthcheck.timeout}`),e.push(` retries: ${n.healthcheck.retries}`);}else e.push(Hc(n.healthcheck," "));}e.push(" restart: unless-stopped");}}if(o.size>0){e.push("volumes:");for(let r of [...o].sort())e.push(` ${r}:`),e.push(" driver: local");}return e.push(""),e.join(`
122
- `)}function qc(t,e,o){return t.kind==="override"?t.value===e:t.kind==="module"?o.moduleMappings[t.value]?.includes(e)??false:o.envVarMappings[t.value.toUpperCase()]?.includes(e)??false}function zc(t){let e=new Map,o=[];for(let r of t)for(let n of r.ports){let i=e.get(n.host);i&&i!==r.id?o.push(`Port collision on host ${n.host} between services '${i}' and '${r.id}'`):e.set(n.host,r.id);}return o}async function Yc(t){let e=o(t,"workspace.json").find(o=>E__default.pathExistsSync(o));if(e)try{let o=await E__default.readJson(e);return o.workspace_name||o.name}catch{return}}async function Qr(t){let e=v.resolve(t.workspacePath),o=ft(),r=await bi({workspacePath:e,contract:o}),n=r.serviceIds.map(u=>{let f=o.services[u];return f?{id:u,displayName:f.displayName,category:f.category,image:f.image,ports:f.ports,sources:r.sources.filter(g=>qc(g,u,o))}:null}).filter(u=>u!==null),i=zc(n);n.length===0&&i.push("No infrastructure services detected. Install modules with infra dependencies or add .workspai/infra/overrides.json");for(let u of r.overrides)o.services[u]||i.push(`Override references unknown service '${u}'`);let a=await c$5(e,".workspai/workspace.contract.json")?".workspai/workspace.contract.json":void 0,l=Pi(o,r.serviceIds),c=await xi({workspacePath:e,contract:o}),d={...l,...c};c.RAPIDKIT_DB_POSTGRES_URL&&(d.DATABASE_URL=c.RAPIDKIT_DB_POSTGRES_URL);let m={},p=ji(d);return p&&r.serviceIds.includes("postgres")&&(m.postgres=p),{schemaVersion:ki,generatedAt:(t.now||(()=>new Date))().toISOString(),workspacePath:e,workspaceName:await Yc(e),contractPath:a,strategy:"sidecar",composePath:Nt,envExamplePath:zr,services:n,connectionEnv:d,serviceEnvOverrides:Object.keys(m).length>0?m:void 0,sources:{modules:r.modules,envVars:r.envVars,overrides:r.overrides},warnings:i}}async function Xr(t){let e=v.resolve(t.workspacePath),o=v.join(e,Nt),r=v.join(e,Wt),n=v.join(e,zr),i=ft(),a=_i({plan:t.plan,contract:i,workspaceName:t.plan.workspaceName||v.basename(e)}),l=["# Generated by: npx workspai infra plan","# Copy values into project .env files as needed.",...Object.entries(t.plan.connectionEnv).map(([c,d])=>`${c}=${d}`),""].join(`
123
- `);return t.dryRun?{composePath:o,planPath:r,envExamplePath:n}:(await E__default.ensureDir(v.dirname(o)),await E__default.ensureDir(v.dirname(r)),await E__default.writeFile(o,a,"utf-8"),await E__default.writeFile(r,`${JSON.stringify(t.plan,null,2)}
124
- `,"utf-8"),await E__default.writeFile(n,l,"utf-8"),{composePath:o,planPath:r,envExamplePath:n})}function Qc(t){return v.resolve(t).split(v.sep).join("/")}async function Ii(){if((await execa("docker",["compose","version"],{reject:false,timeout:5e3})).exitCode===0)return {command:"docker",prefixArgs:["compose"]};if((await execa("docker-compose",["version"],{reject:false,timeout:5e3})).exitCode===0)return {command:"docker-compose",prefixArgs:[]};throw new Error("Docker Compose is not available. Install Docker Desktop or the docker-compose plugin, then verify with: docker compose version")}async function Xc(){if((await execa("docker",["version"],{reject:false,timeout:5e3})).exitCode!==0)throw new Error("Docker is not available in PATH. Install Docker and ensure the daemon is running before using rapidkit infra.");await Ii();}function $i(t){let e=t.toLowerCase();return e.includes("no space left on device")?"Docker failed because the disk is full. Free space with: docker system prune -f (or docker system prune -a --volumes -f).":e.includes("address already in use")||e.includes("bind")?"Docker failed to bind a host port. Stop the conflicting service or adjust ports in contracts/infra-stack.v1.json via .workspai/infra/overrides.json.":e.includes("cannot connect to the docker daemon")?"Docker daemon is not running. Start Docker Desktop or the docker service, then retry.":null}async function Mi(t){await Xc();let e=await Ii(),o=Qc(t.composePath),r=await execa(e.command,[...e.prefixArgs,"-f",o,...t.args],{cwd:t.workspacePath,reject:false});return {exitCode:r.exitCode??1,stdout:r.stdout,stderr:r.stderr}}function Go(t){let e=t?v.resolve(t):Lr(process.cwd());if(!e)throw new Error("Not inside a Workspai workspace. Run from workspace root or pass --workspace.");return a$8(e)}function Zc(t){return v.join(t,Nt)}async function Zr(t){let e=v.join(t,Wt);if(!await E__default.pathExists(e))throw new Error(`Infra plan not found at ${Wt}. Run: npx workspai infra plan`);return await E__default.readJson(e)}async function en(t){let e=Zc(t.workspacePath);if(!await E__default.pathExists(e))throw new Error(`Compose file not found at ${Nt}. Run: npx workspai infra plan`);return Mi({composePath:e,workspacePath:t.workspacePath,args:t.args})}function el(t,e={}){if(console.log(s.bold(`
113
+ Wrote manifest: ${C.resolve(process.cwd(),e)}
114
+ `));}function Ei(t){let e=t.command("product",{hidden:true}).description("Product Factory commands for private workspace product manifests");e.command("plan <backlog>").description("Build a deterministic Product Factory plan from a workspace backlog JSON").option("--output <file>","Write plan JSON to file").option("--kit <kit>","Default API kit for generated product manifests","fastapi.standard").option("--tier <tier>","Filter products by tier").option("--category <category>","Filter products by category").option("--limit <count>","Limit planned products").option("--json","Print JSON to stdout").action(async(o,r)=>{try{let n=r.output||bi("--output"),i=await xi({backlogPath:o,kit:r.kit,tier:r.tier,category:r.category,limit:r.limit});a$4(i,"contracts/product-factory-plan.v1.json","Product Factory plan"),n&&await Ci(n,i,true),r.json?console.log(Dt(i)):Zc(i,n);}catch(n){let i=n instanceof Error?n.message:String(n);r.json?console.log(Dt({ok:false,error:{message:i}})):console.error(s.red(`Product plan failed: ${i}`)),process.exit(1);}}),e.command("manifest").description("Create or inspect private product manifests").command("create <slug>").description("Create a private product manifest from a backlog product slug").requiredOption("--from-backlog <file>","Source workspace backlog JSON").option("--output <fileOrDir>","Manifest output file or directory").option("--kit <kit>","API kit for the generated workspace product","fastapi.standard").option("--workspace-output <dir>","Suggested root for generated product workspaces").option("--json","Print JSON to stdout").option("--force","Overwrite existing manifest file").action(async(o,r)=>{try{let n=r.output||bi("--output");Si(o);let i=await Qc({backlogPath:r.fromBacklog,slug:o,kit:r.kit,outputRoot:r.workspaceOutput});a$4(i,"contracts/private-product-manifest.v1.json","Private product manifest");let a=Xc(n,o);await Ci(a,i,r.force===true),r.json?console.log(Dt(i)):el(i,a);}catch(n){let i=n instanceof Error?n.message:String(n);r.json?console.log(Dt({ok:false,error:{message:i}})):console.error(s.red(`Product manifest create failed: ${i}`)),process.exit(1);}});}var Ai="rapidkit-workspace-snapshot-v1",uo="rapidkit-workspace-snapshot-v2",tl=Ai,Ii="rapidkit-project-archive-v1",Ze="workspai-archive.json",Zo="rapidkit-archive.json",ol=[".workspai/workspace.json",".workspai-workspace","workspai.config.json","workspai.config.js","workspai.config.cjs","workspai.config.mjs",".rapidkit/workspace.json",".rapidkit-workspace","rapidkit.config.json","rapidkit.config.js","rapidkit.config.cjs","rapidkit.config.mjs","package.json"],rl=new Set([".git","node_modules",".venv","dist","build","target","coverage","htmlcov",".next"]),po={requireReasonForDestructiveOps:false,requireSafetySnapshotForDestructiveOps:true,allowPermanentDelete:true};function Ft(t=new Date){return t.toISOString().replace(/[:.]/g,"-")}function er(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");if(!e)throw new Error("Snapshot name must contain at least one letter or number.");return e.slice(0,120)}async function nl(t){try{let e=await R__default.readJson(t);return e&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}function sl(t,e){if(!t)return e;let o=t.trim().toLowerCase();return ["true","yes","1","on"].includes(o)?true:["false","no","0","off"].includes(o)?false:e}async function il(t){let e=o(t,"policies.yml").find(o=>existsSync(o))??l(t,"policies.yml");if(!await R__default.pathExists(e))return {...po};try{let o=await R__default.readFile(e,"utf-8"),r=(n,i)=>{let a=o.match(new RegExp(`^\\s*${n}:\\s*([^#\\n]+)`,"m"));return sl(a?.[1],i)};return {requireReasonForDestructiveOps:r("require_reason_for_destructive_ops",po.requireReasonForDestructiveOps),requireSafetySnapshotForDestructiveOps:r("require_safety_snapshot_for_destructive_ops",po.requireSafetySnapshotForDestructiveOps),allowPermanentDelete:r("allow_permanent_delete",po.allowPermanentDelete)}}catch{return {...po}}}function al(t){return l(t,"audit","events.jsonl")}async function We(t,e){let o={schema:"rapidkit-workspace-audit-event-v1",id:ut.randomUUID(),timestamp:new Date().toISOString(),workspacePath:t,...e},r=al(t);return await R__default.ensureDir(C.dirname(r)),await R__default.appendFile(r,`${JSON.stringify(o)}
115
+ `,"utf-8"),o}async function tr(t,e,o){let r=await il(t);if(r.requireReasonForDestructiveOps&&!o.reason?.trim())throw new Error(`${e} requires --reason by workspace policy.`);if(r.requireSafetySnapshotForDestructiveOps&&o.safetySnapshot===false)throw new Error(`${e} requires a safety snapshot by workspace policy.`);if(o.permanent&&!r.allowPermanentDelete)throw new Error("Permanent project delete is disabled by workspace policy.");return r}function rn(t=process.cwd()){let e=C.resolve(t),o=C.resolve(Br.tmpdir());for(;;){if(e!==o&&f$7(e))return e;let r=C.dirname(e);if(r===e)return null;e=r;}}function mt(t){let e=t?C.resolve(t):rn(process.cwd());if(!e)throw new Error("Not inside a Workspai workspace. Run from workspace root or pass --workspace.");if(!f$7(e))throw new Error(`Workspace path is not a Workspai workspace: ${e}`);return e}async function $i(t){let e=await nl(o(t,"workspace.json").find(r=>existsSync(r))??l(t,"workspace.json")),o$1=e?.workspace_name??e?.name;return typeof o$1=="string"&&o$1.trim()?o$1.trim():C.basename(t)}function Jt(t){return l(t,"snapshots")}function mo(t){return l(t,"archive","projects")}function Lt(t){return C.join(t,"files")}function cl(t){return C.join(Br.tmpdir(),`rapidkit-workspace-snapshot-${process.pid}-${t}-${ut.randomBytes(4).toString("hex")}`)}function ll(t,e){return C.join(Jt(t),`.tmp-${process.pid}-${e}-${ut.randomBytes(4).toString("hex")}`)}function or(t,e){let o=C.relative(t,e);if(!o)return true;let r=o.split(C.sep);return (r[0]===".workspai"||r[0]===".rapidkit")&&["snapshots","archive","audit"].includes(r[1]||"")?false:!r.some(n=>rl.has(n))}async function pl(t){return (await a$a(t,{descendIntoMatchedProjects:false})).map(o=>({name:C.basename(o),relativePath:C.relative(t,o)}))}async function dl(t,e){let o=[],r$1=new Set;for(let n of ol){let i=C.join(t,n);if(!await R__default.pathExists(i))continue;let a=r(n);if(r$1.has(a))continue;let c=C.join(e,a);await R__default.copy(i,c,{filter:l=>or(t,l)}),o.push(a),r$1.add(a);}return o}async function Oi(t){let e=[];async function o(r){let n=[];try{n=await R__default.readdir(r,{withFileTypes:true});}catch{return}for(let i of n){let a=C.join(r,i.name);i.isDirectory()?i.name===".rapidkit"?e.push(a):await o(a):i.isFile()&&i.name===".rapidkit-workspace"&&e.push(a);}}await o(t),e.sort((r,n)=>n.length-r.length);for(let r$1 of e){let n=C.join(C.dirname(r$1),C.basename(r(C.basename(r$1))));await R__default.copy(r$1,n,{overwrite:false,errorOnExist:false}),await R__default.remove(r$1);}}async function Ni(t,e){let o=e.schema===uo?"contracts/workspace-snapshot.v2.json":"contracts/workspace-snapshot.v1.json";a$4(e,o,"Workspace snapshot manifest"),await R__default.writeJson(C.join(t,"snapshot.json"),e,{spaces:2});}async function nn(t){let e=C.join(t,"snapshot.json"),o=await R__default.readJson(e);if(!o||typeof o!="object"||![Ai,uo].includes(o.schema))throw new Error(`Invalid Workspai workspace snapshot manifest: ${e}`);let r=o,n=r.schema===uo?"contracts/workspace-snapshot.v2.json":"contracts/workspace-snapshot.v1.json";if(a$4(r,n,"Workspace snapshot manifest"),r.mode==="project"&&(r.schema!==uo||r.recoveryScope?.kind!=="project"||!r.recoveryScope.relativePath))throw new Error(`Invalid project recovery snapshot manifest: ${e}`);return r}async function ul(t){let e=0,o=0,r=[t];for(;r.length>0;){let n=r.shift();if(!n)continue;let i=[];try{i=await R__default.readdir(n,{withFileTypes:true});}catch{continue}for(let a of i){let c=C.join(n,a.name);if(a.isDirectory()){r.push(c);continue}if(a.isFile())try{let l=await R__default.stat(c);e+=1,o+=l.size;}catch{}}}return {files:e,bytes:o}}async function rr(t={}){let e=mt(t.workspacePath),o=t.name?t.name:`snapshot-${Ft()}`,r=er(o),n=C.join(Jt(e),r),i=cl(r);if(await R__default.pathExists(n))throw new Error(`Snapshot already exists: ${r}`);let a=Lt(i);try{await R__default.ensureDir(a);let c=t.includeProjects?"full":"metadata",l=c==="full"?["."]:await dl(e,a);c==="full"&&(await R__default.copy(e,a,{filter:f=>or(e,f)}),await Oi(a));let p={schema:tl,name:r,mode:c,reason:t.reason,createdAt:new Date().toISOString(),workspaceName:await $i(e),workspacePath:e,copiedPaths:l,projects:await pl(e)};return await Ni(i,p),await R__default.ensureDir(C.dirname(n)),await R__default.move(i,n,{overwrite:false}),await We(e,{action:"snapshot.create",target:r,status:"succeeded",reason:t.reason,details:{mode:c,copiedPaths:l,snapshotPath:n,projectCount:p.projects.length}}),{manifest:p,snapshotPath:n}}catch(c){throw await R__default.remove(i),await We(e,{action:"snapshot.create",target:r,status:"failed",reason:t.reason,details:{error:c instanceof Error?c.message:String(c)}}),c}}async function nr(t){let e=C.resolve(t.workspacePath),o=C.resolve(t.projectPath),r=C.relative(e,o);if(!r||r.startsWith("..")||C.isAbsolute(r)||r.split(C.sep).some(f=>f===".workspai"||f===".rapidkit"))throw new Error(`Project recovery path must be a project inside the workspace: ${o}`);let n=C.basename(o),i=er(`${t.namePrefix}-${n}-${Ft()}-${ut.randomBytes(3).toString("hex")}`),a=C.join(Jt(e),i),c=ll(e,i),l=C.join(Lt(c),r),p=false;try{await R__default.ensureDir(C.dirname(l)),t.moveSource?(await R__default.move(o,l,{overwrite:false}),p=true):await R__default.copy(o,l,{overwrite:false,errorOnExist:true,filter:d=>or(o,d)});let f={schema:uo,name:i,mode:"project",reason:t.reason,createdAt:new Date().toISOString(),workspaceName:await $i(e),workspacePath:e,copiedPaths:[r],projects:[{name:n,relativePath:r}],recoveryScope:{kind:"project",projectName:n,relativePath:r}};return await Ni(c,f),await R__default.move(c,a,{overwrite:false}),await We(e,{action:"snapshot.create",target:i,status:"succeeded",reason:t.reason,details:{mode:"project",copiedPaths:[r],snapshotPath:a,projectCount:1}}),{manifest:f,snapshotPath:a}}catch(f){if(p&&!await R__default.pathExists(o)){let d=await R__default.pathExists(l)?l:C.join(Lt(a),r);await R__default.pathExists(d)&&(await R__default.ensureDir(C.dirname(o)),await R__default.move(d,o,{overwrite:false}));}throw await R__default.remove(c),await R__default.remove(a),await We(e,{action:"snapshot.create",target:i,status:"failed",reason:t.reason,details:{mode:"project",error:f instanceof Error?f.message:String(f)}}),f}}async function Mi(t){let e=mt(t.workspacePath),o=C.join(Jt(e),er(t.name));if(!await R__default.pathExists(o))throw new Error(`Snapshot not found: ${t.name}`);let r=await nn(o),n=Lt(o),i=await ul(n);return {manifest:r,snapshotPath:o,filesRoot:n,estimatedFileCount:i.files,estimatedBytes:i.bytes}}async function Ti(t={}){let e=mt(t.workspacePath),o=Jt(e);if(!await R__default.pathExists(o))return [];let r=await R__default.readdir(o,{withFileTypes:true}),n=[];for(let i of r){if(!i.isDirectory())continue;let a=C.join(o,i.name);try{n.push({...await nn(a),snapshotPath:a});}catch{}}return n.sort((i,a)=>a.createdAt.localeCompare(i.createdAt))}var ml=[".workspai/snapshots",".workspai/archive",".workspai/audit",".rapidkit/snapshots",".rapidkit/archive",".rapidkit/audit"];async function fl(t){let e=C.dirname(t.workspacePath),o=C.basename(t.workspacePath),r=`${Ft()}-${ut.randomBytes(4).toString("hex")}`,n=C.join(e,`.${o}.restore-staging-${r}`),i=C.join(e,`.${o}.pre-restore-${r}`),a=C.join(e,`.${o}.restore-failed-${r}`),c=[],l=false,p=false;try{await R__default.copy(t.filesRoot,n,{overwrite:false,errorOnExist:true,filter:f=>or(t.filesRoot,f)}),await Oi(n),await R__default.rename(t.workspacePath,i),l=true,await R__default.rename(n,t.workspacePath),p=true;for(let f of ml){let d=C.join(i,f);if(!await R__default.pathExists(d))continue;let w=C.join(t.workspacePath,f);if(await R__default.pathExists(w))throw new Error(`Full restore operational path collision: ${f}`);await R__default.ensureDir(C.dirname(w)),await R__default.rename(d,w),c.push(f);}return i}catch(f){for(let d of [...c].reverse()){let w=C.join(t.workspacePath,d),h=C.join(i,d);await R__default.pathExists(w)&&(await R__default.ensureDir(C.dirname(h)),await R__default.rename(w,h));}throw p&&await R__default.pathExists(t.workspacePath)&&await R__default.rename(t.workspacePath,a),l&&await R__default.pathExists(i)&&await R__default.rename(i,t.workspacePath),await R__default.remove(a),await R__default.remove(n),new Error(`Atomic full restore failed for ${t.snapshotName}: ${f instanceof Error?f.message:String(f)}`)}}async function Wi(t,e){let o=t.manifest.recoveryScope?.relativePath;if(!o)return;let r=C.join(Lt(t.snapshotPath),o),n=C.join(e,o);await R__default.pathExists(r)&&!await R__default.pathExists(n)&&(await R__default.ensureDir(C.dirname(n)),await R__default.move(r,n,{overwrite:false})),await R__default.remove(t.snapshotPath);}async function Di(t){let e=mt(t.workspacePath),o=C.join(Jt(e),er(t.name));if(!await R__default.pathExists(o))throw new Error(`Snapshot not found: ${t.name}`);let r$1=await nn(o),n=Lt(o),i=r$1.mode==="full"?["."]:Array.from(new Set(r$1.copiedPaths.map(l=>{let p=r(l);return p.startsWith(".workspai/")?".workspai":p})));if(t.dryRun)return await We(e,{action:"snapshot.restore",target:r$1.name,status:"planned",reason:t.reason,details:{restoredPaths:i}}),{workspacePath:e,snapshotPath:o,restoredPaths:i,dryRun:true};if(!t.force)throw new Error("Restore is destructive. Re-run with --force after reviewing --dry-run output.");await tr(e,"snapshot.restore",{reason:t.reason,safetySnapshot:t.safetySnapshot});let a;if(r$1.mode==="full")a=await fl({workspacePath:e,filesRoot:n,snapshotName:r$1.name});else if(r$1.mode==="project"){let l=r$1.recoveryScope?.relativePath;if(!l)throw new Error(`Project recovery snapshot is missing recoveryScope: ${r$1.name}`);let p=C.join(n,l),f=C.join(e,l),d=await R__default.pathExists(f),w,h=C.join(C.dirname(f),`.${C.basename(f)}.pre-restore-${process.pid}-${ut.randomBytes(4).toString("hex")}`),k=false;d&&t.safetySnapshot!==false?(w=await nr({workspacePath:e,projectPath:f,namePrefix:`pre-restore-${r$1.name}`,reason:`Automatic project recovery snapshot before restoring ${r$1.name}`,moveSource:true}),a=w.snapshotPath):d&&(await R__default.rename(f,h),k=true);let j=C.join(C.dirname(f),`.${C.basename(f)}.restore-${process.pid}-${ut.randomBytes(4).toString("hex")}`);try{await R__default.copy(p,j,{overwrite:false,errorOnExist:true}),await R__default.rename(j,f),k&&await R__default.remove(h);}catch(_){throw await R__default.remove(j),k&&await R__default.pathExists(h)&&(await R__default.remove(f),await R__default.rename(h,f)),w&&await Wi(w,e),_}}else t.safetySnapshot!==false&&(a=(await rr({workspacePath:e,name:`pre-restore-${r$1.name}-${Ft()}`,reason:`Automatic safety snapshot before restoring ${r$1.name}`,includeProjects:false})).snapshotPath);if(r$1.mode==="metadata"){let l=new Set;for(let p of r$1.copiedPaths){let f=r(p);l.has(f)||(await R__default.copy(C.join(n,p),C.join(e,f),{overwrite:true,errorOnExist:false}),l.add(f));}}let c={workspacePath:e,snapshotPath:o,restoredPaths:i,dryRun:false,safetySnapshotPath:a};return await We(e,{action:"snapshot.restore",target:r$1.name,status:"succeeded",reason:t.reason,details:{restoredPaths:i,safetySnapshotPath:a}}),c}function Li(t){let e=t.trim();if(!e)throw new Error("Project name/path is required.");return e}async function Fi(t,e){let o=Li(e),r=C.isAbsolute(o)?C.resolve(o):C.resolve(t,o);if(r.startsWith(`${C.resolve(t)}${C.sep}`)&&await R__default.pathExists(r))return r;let i=(await a$a(t,{descendIntoMatchedProjects:false})).filter(a=>{let c=C.relative(t,a);return C.basename(a)===o||c===o});if(i.length===0)throw new Error(`Project not found in workspace: ${e}`);if(i.length>1)throw new Error(`Project reference is ambiguous: ${e}`);return i[0]}async function sn(t){try{let{syncWorkspaceProjects:e}=await import('./workspace-FQT3QIRS.js');await e(t,true);}catch{}}function gl(t,e){let o=ut.randomBytes(4).toString("hex");return C.join(mo(t),`${e}-${Ft()}-${o}`)}async function Ji(t){let e=Ki(t),o=await R__default.readJson(e);if(!o||typeof o!="object"||o.schema!==Ii)throw new Error(`Invalid Workspai archive manifest: ${e}`);return a$4(o,"contracts/project-archive.v1.json","Project archive manifest"),o}function Ki(t){return [Ze,Zo].map(e=>C.join(t,e)).find(e=>R__default.existsSync(e))??C.join(t,Ze)}async function an(t={}){let e=mt(t.workspacePath),o=mo(e);if(!await R__default.pathExists(o))return [];let r=await R__default.readdir(o,{withFileTypes:true}),n=[];for(let i of r){if(!i.isDirectory())continue;let a=C.join(o,i.name),c=[Ze,Zo].map(l=>C.join(a,l)).find(l=>R__default.existsSync(l))??C.join(a,Ze);try{n.push({...await Ji(a),archivePath:a,manifestPath:c});}catch{}}return n.sort((i,a)=>a.archivedAt.localeCompare(i.archivedAt))}async function hl(t,e){let o=Li(e),r=C.isAbsolute(o)?C.resolve(o):C.resolve(mo(t),o);if(r.startsWith(`${C.resolve(mo(t))}${C.sep}`)&&(await R__default.pathExists(C.join(r,Ze))||await R__default.pathExists(C.join(r,Zo))))return r;let i=(await an({workspacePath:t})).filter(a=>C.basename(a.archivePath)===o||a.projectName===o||C.relative(mo(t),a.archivePath)===o);if(i.length===0)throw new Error(`Archived project not found: ${e}`);if(i.length>1)throw new Error(`Archive reference is ambiguous: ${e}`);return i[0].archivePath}async function cn(t){let e=mt(t.workspacePath),o=await Fi(e,t.project),r=C.basename(o),n=gl(e,r),i=C.join(n,Ze),a=`${n}.tmp-${process.pid}`,c=C.join(a,Ze);for(let d of [Ze,Zo])if(await R__default.pathExists(C.join(o,d)))throw new Error(`Project contains reserved archive manifest path and cannot be archived safely: ${d}`);if(t.dryRun)return await We(e,{action:"project.archive",target:r,status:"planned",reason:t.reason,details:{projectPath:o,archivePath:n}}),{workspacePath:e,projectName:r,projectPath:o,action:"archive",archivePath:n,manifestPath:i,dryRun:true};await tr(e,"project.archive",{reason:t.reason,safetySnapshot:true});let l=await nr({workspacePath:e,projectPath:o,namePrefix:"pre-archive",reason:t.reason||`Automatic safety snapshot before archiving ${r}`,moveSource:false}),p={schema:Ii,projectName:r,originalPath:o,archivedPath:n,reason:t.reason,archivedAt:new Date().toISOString(),safetySnapshotPath:l.snapshotPath};a$4(p,"contracts/project-archive.v1.json","Project archive manifest");let f=false;try{await R__default.ensureDir(C.dirname(n)),await R__default.move(o,a,{overwrite:false}),f=true,await R__default.writeJson(c,p,{spaces:2}),await R__default.rename(a,n);}catch(d){if(f&&!await R__default.pathExists(o)){let w=await R__default.pathExists(a)?a:n;await R__default.pathExists(w)&&(await R__default.remove(C.join(w,Ze)),await R__default.move(w,o,{overwrite:false}));}throw await R__default.remove(a),d}return await c$5(e,[o]),await sn(e),await We(e,{action:"project.archive",target:r,status:"succeeded",reason:t.reason,details:{projectPath:o,archivePath:n,manifestPath:i,safetySnapshotPath:l.snapshotPath}}),{workspacePath:e,projectName:r,projectPath:o,action:"archive",archivePath:n,manifestPath:i,safetySnapshotPath:l.snapshotPath,dryRun:false}}async function Vi(t){if(!t.permanent)return cn(t);let e=mt(t.workspacePath),o=await Fi(e,t.project),r=C.basename(o);if(t.confirm!==r)throw new Error(`Permanent delete requires --confirm ${r}`);if(t.dryRun)return await We(e,{action:"project.delete",target:r,status:"planned",reason:t.reason,details:{projectPath:o,permanent:true}}),{workspacePath:e,projectName:r,projectPath:o,action:"delete",dryRun:true};await tr(e,"project.delete",{reason:t.reason,permanent:true,safetySnapshot:true});let n=await nr({workspacePath:e,projectPath:o,namePrefix:"pre-delete",reason:t.reason||`Automatic safety snapshot before deleting ${r}`,moveSource:true});return await c$5(e,[o]),await sn(e),await We(e,{action:"project.delete",target:r,status:"succeeded",reason:t.reason,details:{projectPath:o,permanent:true,safetySnapshotPath:n.snapshotPath}}),{workspacePath:e,projectName:r,projectPath:o,action:"delete",safetySnapshotPath:n.snapshotPath,dryRun:false}}async function Gi(t){let e=mt(t.workspacePath),o=await hl(e,t.archive),r=await Ji(o),n=t.targetName?.trim()||r.projectName,i=C.join(e,n);if(!i.startsWith(`${C.resolve(e)}${C.sep}`))throw new Error(`Archive restore target escapes workspace: ${n}`);if(await R__default.pathExists(i)&&!t.force)throw new Error(`Project path already exists. Re-run with --force to overwrite: ${i}`);if(t.dryRun)return await We(e,{action:"project.restore",target:n,status:"planned",reason:t.reason,details:{archivePath:o,projectPath:i}}),{workspacePath:e,projectName:n,projectPath:i,action:"restore",archivePath:o,manifestPath:C.join(o,Ze),dryRun:true};await tr(e,"project.restore",{reason:t.reason,safetySnapshot:true});let a=await R__default.pathExists(i),c=a?await nr({workspacePath:e,projectPath:i,namePrefix:"pre-restore-project",reason:t.reason||`Automatic safety snapshot before restoring ${n}`,moveSource:true}):await rr({workspacePath:e,name:`pre-restore-project-${n}-${Ft()}`,reason:t.reason||`Automatic safety snapshot before restoring ${n}`,includeProjects:false}),l$1=Ki(o),p=l(e,"audit","restores",`${C.basename(o)}.json`);try{await R__default.move(o,i,{overwrite:false}),await R__default.ensureDir(C.dirname(p)),await R__default.move(C.join(i,C.basename(l$1)),p,{overwrite:false});}catch(f){throw await R__default.pathExists(i)&&(await R__default.pathExists(p)&&await R__default.move(p,C.join(i,C.basename(l$1)),{overwrite:false}),await R__default.pathExists(o)||await R__default.move(i,o,{overwrite:false})),a&&await Wi(c,e),f}return await sn(e),await We(e,{action:"project.restore",target:n,status:"succeeded",reason:t.reason,details:{archivePath:o,projectPath:i,restoreReceiptPath:p,safetySnapshotPath:c.snapshotPath}}),{workspacePath:e,projectName:n,projectPath:i,action:"restore",archivePath:o,manifestPath:p,safetySnapshotPath:c.snapshotPath,dryRun:false}}var wl="rapidkit.infra-stack.v1",Hi="rapidkit.infra-plan.v1",Kt=".workspai/infra/docker-compose.yml",Vt=".workspai/reports/infra-plan.json",dn=".workspai/infra/.env.example";function kl(){let t=C.dirname(fileURLToPath(import.meta.url)),e=[C.join(t,"../../contracts/infra-stack.v1.json"),C.join(t,"../contracts/infra-stack.v1.json")];for(let o of e)if(S.existsSync(o))return o;throw new Error(`Infra stack contract not found. Expected contracts/infra-stack.v1.json beside the rapidkit package root. Checked: ${e.join(", ")}`)}var pn=null;function jt(t){if(pn)return pn;let e=kl(),o=S.readFileSync(e,"utf-8"),r=JSON.parse(o);if(r.schemaVersion!==wl)throw new Error(`Unsupported infra stack schema: ${r.schemaVersion}`);return vl(r),(pn=r),r}function vl(t){let e=new Set(Object.keys(t.services));for(let[o,r]of Object.entries(t.moduleMappings)){if(!Array.isArray(r))throw new Error(`Invalid moduleMappings entry for ${o}`);for(let n of r)if(!e.has(n))throw new Error(`moduleMappings/${o} references unknown service '${n}'`)}for(let[o,r]of Object.entries(t.envVarMappings)){if(!Array.isArray(r))throw new Error(`Invalid envVarMappings entry for ${o}`);for(let n of r)if(!e.has(n))throw new Error(`envVarMappings/${o} references unknown service '${n}'`)}}function Bi(t,e){let o=e.startsWith("free/")?e:`free/${e}`;return t.moduleMappings[o]||[]}function Gt(t,e){return t.envVarMappings[e.toUpperCase()]||[]}function qi(t,e){let o={};for(let r of e){let n=t.services[r];n&&Object.assign(o,n.connectionEnv);}return o}async function bl(t){let e=C.join(t,"registry.json");if(!await R__default.pathExists(e))return [];try{let r=(await R__default.readJson(e)).installed_modules||[];return [...new Set(r.map(n=>typeof n.slug=="string"?n.slug.trim():"").filter(Boolean))]}catch{return []}}async function jl(t){let e=C.join(t,".env.example");if(!await R__default.pathExists(e))return [];try{let o=await R__default.readFile(e,"utf-8"),r=[];for(let n of o.split(`
116
+ `)){let i=n.trim();if(!i||i.startsWith("#"))continue;let a=i.match(/^([A-Z0-9_]+)=/);a?.[1]&&r.push(a[1]);}return r}catch{return []}}async function Cl(t){let e=o(t,"infra","overrides.json").find(o=>existsSync(o));if(!e)return [];try{let o=await R__default.readJson(e);return Array.isArray(o.services)?[...new Set(o.services.filter(r=>typeof r=="string"&&r.trim().length>0))]:[]}catch{return []}}async function Sl(t){let e=await f$6(t,".workspai/workspace.contract.json");if(!e)return [];try{let o=await R__default.readJson(e),r=[];for(let n of o.projects||[]){let i=typeof n.slug=="string"?n.slug:"unknown";for(let a of n.contracts?.env||[])typeof a=="string"&&a.trim()&&r.push({project:i,env:a.trim().toUpperCase()});}return r}catch{return []}}function sr(t,e,o,r){t.add(o),e.push(r);}async function zi(t){let e=C.resolve(t.workspacePath),o=t.contract||jt(),r=new Set,n=[],i=new Set,a=new Set,c=new Set,l=await f$a(e);for(let p of l){let f=C.dirname(C.dirname(p)),d=C.basename(f);for(let w of await bl(f)){i.add(w);for(let h of Bi(o,w))sr(r,n,h,{kind:"module",value:w,project:d});}for(let w of await jl(f)){a.add(w);for(let h of Gt(o,w))sr(r,n,h,{kind:"env-var",value:w,project:d});}}for(let p of await Sl(e)){a.add(p.env);for(let f of Gt(o,p.env))sr(r,n,f,{kind:"contract-env",value:p.env,project:p.project});}for(let p of await Cl(e))c.add(p),sr(r,n,p,{kind:"override",value:p});return {modules:[...i].sort(),envVars:[...a].sort(),overrides:[...c].sort(),sources:n,serviceIds:[...r].sort()}}function xl(t){let e=t.trim();if(!e||e.startsWith("#"))return null;let o=e.indexOf("=");if(o<=0)return null;let r=e.slice(0,o).trim();if(!/^[A-Z0-9_]+$/.test(r))return null;let n=e.slice(o+1).trim();(n.startsWith('"')&&n.endsWith('"')||n.startsWith("'")&&n.endsWith("'"))&&(n=n.slice(1,-1));let i=n.match(/^\$\{[A-Z0-9_]+:-([^}]+)\}$/),a=(i?i[1]:n).trim();return a?{key:r,value:a}:null}async function El(t){if(!await R__default.pathExists(t))return {};try{let e=await R__default.readFile(t,"utf-8"),o={};for(let r of e.split(`
117
+ `)){let n=xl(r);n&&(o[n.key]=n.value);}return o}catch{return {}}}async function Qi(t){let e={},o=await f$a(t.workspacePath);for(let r of o){let n=C.dirname(C.dirname(r)),i=await El(C.join(n,".env.example"));for(let[a,c]of Object.entries(i))Gt(t.contract,a).length>0&&(e[a]=c);}return e}function Xi(t,e){return t.filter(o=>Gt(e,o).length>0).sort()}function Zi(t){let e=t.RAPIDKIT_DB_POSTGRES_URL||t.DATABASE_URL;if(e?.startsWith("postgresql://"))try{let o=new URL(e),r=o.pathname.replace(/^\//,"");return {POSTGRES_USER:decodeURIComponent(o.username||"postgres"),POSTGRES_PASSWORD:decodeURIComponent(o.password||"postgres"),POSTGRES_DB:r||"postgres"}}catch{return}}function ea(t){let e=t.POSTGRES_USER||"postgres",o=t.POSTGRES_DB||"postgres";return ["CMD-SHELL",`pg_isready -U ${e} -d ${o}`]}function Rl(t){return /[:#{}[\],&*!|>'"%@`]/.test(t)||t.includes(`
118
+ `)?JSON.stringify(t):t}function ta(t,e){return Object.entries(t).map(([o,r])=>`${e}${o}: ${Rl(r)}`).join(`
119
+ `)}function _l(t,e){let o=t.test.map(r=>JSON.stringify(r)).join(", ");return [`${e}healthcheck:`,`${e} test: [${o}]`,`${e} interval: ${t.interval}`,`${e} timeout: ${t.timeout}`,`${e} retries: ${t.retries}`].join(`
120
+ `)}function oa(t){let e=["# Generated by Workspai infra plan \u2014 do not edit manually.",`# Workspace: ${t.workspaceName}`,`# Generated at: ${t.plan.generatedAt}`,"name: workspai-infra"],o=new Set;if(t.plan.services.length===0)return e.push("services: {}"),e.push(""),e.join(`
121
+ `);e.push("services:");for(let r of t.plan.services){let n=t.contract.services[r.id];if(n){if(e.push(` ${r.id}:`),e.push(` image: ${n.image}`),e.push(` container_name: workspai-${r.id}`),n.command?.length){let i=n.command.map(a=>JSON.stringify(a)).join(", ");e.push(` command: [${i}]`);}if(n.env&&Object.keys(n.env).length>0){e.push(" environment:");let i={...n.env,...t.plan.serviceEnvOverrides?.[r.id]||{}};e.push(ta(i," "));}else t.plan.serviceEnvOverrides?.[r.id]&&(e.push(" environment:"),e.push(ta(t.plan.serviceEnvOverrides[r.id]," ")));if(n.ports.length>0){e.push(" ports:");for(let i of n.ports)e.push(` - "${i.host}:${i.container}"`);}if(n.volumes?.length){e.push(" volumes:");for(let i of n.volumes){e.push(` - ${i}`);let a=i.split(":")[0];a&&!a.startsWith("/")&&o.add(a);}}if(n.healthcheck){let i=t.plan.serviceEnvOverrides?.[r.id];if(r.id==="postgres"&&i){let a=ea(i).map(c=>JSON.stringify(c)).join(", ");e.push(" healthcheck:"),e.push(` test: [${a}]`),e.push(` interval: ${n.healthcheck.interval}`),e.push(` timeout: ${n.healthcheck.timeout}`),e.push(` retries: ${n.healthcheck.retries}`);}else e.push(_l(n.healthcheck," "));}e.push(" restart: unless-stopped");}}if(o.size>0){e.push("volumes:");for(let r of [...o].sort())e.push(` ${r}:`),e.push(" driver: local");}return e.push(""),e.join(`
122
+ `)}function Il(t,e,o){return t.kind==="override"?t.value===e:t.kind==="module"?o.moduleMappings[t.value]?.includes(e)??false:o.envVarMappings[t.value.toUpperCase()]?.includes(e)??false}function $l(t){let e=new Map,o=[];for(let r of t)for(let n of r.ports){let i=e.get(n.host);i&&i!==r.id?o.push(`Port collision on host ${n.host} between services '${i}' and '${r.id}'`):e.set(n.host,r.id);}return o}async function Ol(t){let e=o(t,"workspace.json").find(o=>existsSync(o));if(e)try{let o=await R__default.readJson(e);return o.workspace_name||o.name}catch{return}}async function mn(t){let e=C.resolve(t.workspacePath),o=jt(),r=await zi({workspacePath:e,contract:o}),n=r.serviceIds.map(w=>{let h=o.services[w];return h?{id:w,displayName:h.displayName,category:h.category,image:h.image,ports:h.ports,sources:r.sources.filter(k=>Il(k,w,o))}:null}).filter(w=>w!==null),i=$l(n);n.length===0&&i.push("No infrastructure services detected. Install modules with infra dependencies or add .workspai/infra/overrides.json");for(let w of r.overrides)o.services[w]||i.push(`Override references unknown service '${w}'`);let a=await f$6(e,".workspai/workspace.contract.json")?".workspai/workspace.contract.json":void 0,c=qi(o,r.serviceIds),l=await Qi({workspacePath:e,contract:o}),p={...c,...l};l.RAPIDKIT_DB_POSTGRES_URL&&(p.DATABASE_URL=l.RAPIDKIT_DB_POSTGRES_URL);let f={},d=Zi(p);return d&&r.serviceIds.includes("postgres")&&(f.postgres=d),{schemaVersion:Hi,generatedAt:(t.now||(()=>new Date))().toISOString(),workspacePath:e,workspaceName:await Ol(e),contractPath:a,strategy:"sidecar",composePath:Kt,envExamplePath:dn,services:n,connectionEnv:p,serviceEnvOverrides:Object.keys(f).length>0?f:void 0,sources:{modules:r.modules,envVars:r.envVars,overrides:r.overrides},warnings:i}}async function fn(t){let e=C.resolve(t.workspacePath),o=C.join(e,Kt),r=C.join(e,Vt),n=C.join(e,dn),i=jt();a$4(t.plan,"contracts/infra-plan.v1.json","Workspai infrastructure plan");let a=oa({plan:t.plan,contract:i,workspaceName:t.plan.workspaceName||C.basename(e)}),c=["# Generated by: npx workspai infra plan","# Copy values into project .env files as needed.",...Object.entries(t.plan.connectionEnv).map(([l,p])=>`${l}=${p}`),""].join(`
123
+ `);return t.dryRun?{composePath:o,planPath:r,envExamplePath:n}:(await R__default.ensureDir(C.dirname(o)),await R__default.ensureDir(C.dirname(r)),await R__default.writeFile(o,a,"utf-8"),await R__default.writeFile(r,`${JSON.stringify(t.plan,null,2)}
124
+ `,"utf-8"),await R__default.writeFile(n,c,"utf-8"),{composePath:o,planPath:r,envExamplePath:n})}function Nl(t){return C.resolve(t).split(C.sep).join("/")}async function na(){if((await execa("docker",["compose","version"],{reject:false,timeout:5e3})).exitCode===0)return {command:"docker",prefixArgs:["compose"]};if((await execa("docker-compose",["version"],{reject:false,timeout:5e3})).exitCode===0)return {command:"docker-compose",prefixArgs:[]};throw new Error("Docker Compose is not available. Install Docker Desktop or the docker-compose plugin, then verify with: docker compose version")}async function Ml(){if((await execa("docker",["version"],{reject:false,timeout:5e3})).exitCode!==0)throw new Error("Docker is not available in PATH. Install Docker and ensure the daemon is running before using rapidkit infra.");await na();}function sa(t){let e=t.toLowerCase();return e.includes("no space left on device")?"Docker failed because the disk is full. Free space with: docker system prune -f (or docker system prune -a --volumes -f).":e.includes("address already in use")||e.includes("bind")?"Docker failed to bind a host port. Stop the conflicting service or adjust ports in contracts/infra-stack.v1.json via .workspai/infra/overrides.json.":e.includes("cannot connect to the docker daemon")?"Docker daemon is not running. Start Docker Desktop or the docker service, then retry.":null}async function ia(t){await Ml();let e=await na(),o=Nl(t.composePath),r=await execa(e.command,[...e.prefixArgs,"-f",o,...t.args],{cwd:t.workspacePath,reject:false});return {exitCode:r.exitCode??1,stdout:r.stdout,stderr:r.stderr}}function ar(t){let e=t?C.resolve(t):rn(process.cwd());if(!e)throw new Error("Not inside a Workspai workspace. Run from workspace root or pass --workspace.");return a$8(e)}function Tl(t){return C.join(t,Kt)}async function gn(t){let e=C.join(t,Vt);if(!await R__default.pathExists(e))throw new Error(`Infra plan not found at ${Vt}. Run: npx workspai infra plan`);let o=await R__default.readJson(e);return a$4(o,"contracts/infra-plan.v1.json",`Infra plan ${e}`),o}async function hn(t){let e=Tl(t.workspacePath);if(!await R__default.pathExists(e))throw new Error(`Compose file not found at ${Kt}. Run: npx workspai infra plan`);return ia({composePath:e,workspacePath:t.workspacePath,args:t.args})}function Wl(t,e={}){if(console.log(s.bold(`
125
125
  Workspai infra plan
126
- `)),console.log(s.gray(`Workspace: ${t.workspacePath}`)),t.workspaceName&&console.log(s.gray(`Name: ${t.workspaceName}`)),console.log(s.gray(`Strategy: ${t.strategy} (sidecar compose)`)),console.log(s.gray(`Compose: ${t.composePath}`)),console.log(s.gray(`Plan report: ${Wt}`)),console.log(s.gray(`Env example: ${t.envExamplePath}`)),console.log(""),t.services.length===0)console.log(s.yellow("No infrastructure services detected."));else {console.log(s.bold("Services:"));for(let o of t.services){let r=o.ports.map(n=>`${n.host}:${n.container}`).join(", ");console.log(s.cyan(` ${o.id}`),s.gray(`(${o.displayName})`),r?s.white(`ports ${r}`):"");}}if(t.sources.modules.length>0&&(console.log(""),console.log(s.bold("Detected from modules:")),console.log(s.gray(` ${t.sources.modules.join(", ")}`))),t.sources.envVars.length>0){let o=ft(),r=Ci(t.sources.envVars,o);console.log(s.bold("Detected from env vars (infra-mapped):")),r.length>0?console.log(s.gray(` ${r.join(", ")}`)):console.log(s.gray(" none"));let n=t.sources.envVars.length-r.length;if(n>0&&!e.verbose)console.log(s.gray(` (${n} other project env vars scanned \u2014 use --verbose to list all)`));else if(e.verbose){let i=t.sources.envVars.filter(a=>!r.includes(a));i.length>0&&console.log(s.gray(` Other scanned env vars: ${i.join(", ")}`));}}if(t.sources.overrides.length>0&&(console.log(s.bold("Overrides:")),console.log(s.gray(` ${t.sources.overrides.join(", ")}`))),Object.keys(t.connectionEnv).length>0){console.log(""),console.log(s.bold("Connection env (preview):"));for(let[o,r]of Object.entries(t.connectionEnv))console.log(s.gray(` ${o}=${r}`));}if(t.warnings.length>0){console.log(""),console.log(s.yellow("Warnings:"));for(let o of t.warnings)console.log(s.yellow(` - ${o}`));}console.log("");}function Oi(t){let e=t.command("infra").description("Plan and manage workspace infrastructure (Docker sidecar stack)");e.command("plan").description("Discover infra needs and generate compose plan artifacts").option("--workspace <path>","Workspace root path").option("--json","Print plan as JSON").option("--dry-run","Compute plan without writing artifacts").option("--verbose","Show all scanned project env vars").action(async o=>{try{let r=Go(o.workspace),n=await Qr({workspacePath:r}),i=await Xr({workspacePath:r,plan:n,dryRun:o.dryRun});if(o.json){console.log(JSON.stringify({...n,artifacts:o.dryRun?{composePath:i.composePath,planPath:i.planPath,envExamplePath:i.envExamplePath,dryRun:true}:{composePath:i.composePath,planPath:i.planPath,envExamplePath:i.envExamplePath}},null,2));return}el(n,{verbose:o.verbose}),o.dryRun?console.log(s.yellow(`Dry run \u2014 no files written.
126
+ `)),console.log(s.gray(`Workspace: ${t.workspacePath}`)),t.workspaceName&&console.log(s.gray(`Name: ${t.workspaceName}`)),console.log(s.gray(`Strategy: ${t.strategy} (sidecar compose)`)),console.log(s.gray(`Compose: ${t.composePath}`)),console.log(s.gray(`Plan report: ${Vt}`)),console.log(s.gray(`Env example: ${t.envExamplePath}`)),console.log(""),t.services.length===0)console.log(s.yellow("No infrastructure services detected."));else {console.log(s.bold("Services:"));for(let o of t.services){let r=o.ports.map(n=>`${n.host}:${n.container}`).join(", ");console.log(s.cyan(` ${o.id}`),s.gray(`(${o.displayName})`),r?s.white(`ports ${r}`):"");}}if(t.sources.modules.length>0&&(console.log(""),console.log(s.bold("Detected from modules:")),console.log(s.gray(` ${t.sources.modules.join(", ")}`))),t.sources.envVars.length>0){let o=jt(),r=Xi(t.sources.envVars,o);console.log(s.bold("Detected from env vars (infra-mapped):")),r.length>0?console.log(s.gray(` ${r.join(", ")}`)):console.log(s.gray(" none"));let n=t.sources.envVars.length-r.length;if(n>0&&!e.verbose)console.log(s.gray(` (${n} other project env vars scanned \u2014 use --verbose to list all)`));else if(e.verbose){let i=t.sources.envVars.filter(a=>!r.includes(a));i.length>0&&console.log(s.gray(` Other scanned env vars: ${i.join(", ")}`));}}if(t.sources.overrides.length>0&&(console.log(s.bold("Overrides:")),console.log(s.gray(` ${t.sources.overrides.join(", ")}`))),Object.keys(t.connectionEnv).length>0){console.log(""),console.log(s.bold("Connection env (preview):"));for(let[o,r]of Object.entries(t.connectionEnv))console.log(s.gray(` ${o}=${r}`));}if(t.warnings.length>0){console.log(""),console.log(s.yellow("Warnings:"));for(let o of t.warnings)console.log(s.yellow(` - ${o}`));}console.log("");}function aa(t){let e=t.command("infra").description("Plan and manage workspace infrastructure (Docker sidecar stack)");e.command("plan").description("Discover infra needs and generate compose plan artifacts").option("--workspace <path>","Workspace root path").option("--json","Print plan as JSON").option("--dry-run","Compute plan without writing artifacts").option("--verbose","Show all scanned project env vars").action(async o=>{try{let r=ar(o.workspace),n=await mn({workspacePath:r}),i=await fn({workspacePath:r,plan:n,dryRun:o.dryRun});if(o.json){console.log(JSON.stringify({...n,artifacts:o.dryRun?{composePath:i.composePath,planPath:i.planPath,envExamplePath:i.envExamplePath,dryRun:true}:{composePath:i.composePath,planPath:i.planPath,envExamplePath:i.envExamplePath}},null,2));return}Wl(n,{verbose:o.verbose}),o.dryRun?console.log(s.yellow(`Dry run \u2014 no files written.
127
127
  `)):(console.log(s.green("Artifacts written:")),console.log(s.gray(` ${i.composePath}`)),console.log(s.gray(` ${i.planPath}`)),console.log(s.gray(` ${i.envExamplePath}
128
128
  `)));}catch(r){console.error(s.red(`
129
129
  \u274C ${r instanceof Error?r.message:String(r)}
130
- `)),process.exit(1);}}),e.command("up").description("Start planned infrastructure services via Docker Compose").option("--workspace <path>","Workspace root path").option("--detach","Run containers in background",true).option("--build","Build images before starting").option("--no-plan","Skip refreshing plan artifacts before starting").action(async o=>{try{let r=Go(o.workspace);if(o.plan!==false){let l=await Qr({workspacePath:r});await Xr({workspacePath:r,plan:l});}if((await Zr(r)).services.length===0)throw new Error("Infra plan has no services. Run: npx workspai infra plan (from a workspace with .env.example, core modules, or .workspai/infra/overrides.json)");let i=["up"];o.detach!==false&&i.push("-d"),o.build&&i.push("--build");let a=await en({workspacePath:r,args:i});if(a.stdout&&process.stdout.write(a.stdout),a.stderr&&process.stderr.write(a.stderr),a.exitCode!==0){let l=$i(a.stderr);l&&console.error(s.yellow(`
131
- \u26A0\uFE0F ${l}
130
+ `)),process.exit(1);}}),e.command("up").description("Start planned infrastructure services via Docker Compose").option("--workspace <path>","Workspace root path").option("--detach","Run containers in background",true).option("--build","Build images before starting").option("--no-plan","Skip refreshing plan artifacts before starting").action(async o=>{try{let r=ar(o.workspace);if(o.plan!==false){let c=await mn({workspacePath:r});await fn({workspacePath:r,plan:c});}if((await gn(r)).services.length===0)throw new Error("Infra plan has no services. Run: npx workspai infra plan (from a workspace with .env.example, core modules, or .workspai/infra/overrides.json)");let i=["up"];o.detach!==false&&i.push("-d"),o.build&&i.push("--build");let a=await hn({workspacePath:r,args:i});if(a.stdout&&process.stdout.write(a.stdout),a.stderr&&process.stderr.write(a.stderr),a.exitCode!==0){let c=sa(a.stderr);c&&console.error(s.yellow(`
131
+ \u26A0\uFE0F ${c}
132
132
  `)),process.exit(a.exitCode);}o.detach!==false&&(console.log(s.green(`
133
133
  \u2705 Infrastructure stack started.
134
134
  `)),console.log(s.gray(`Check status: npx workspai infra status
135
135
  `)));}catch(r){console.error(s.red(`
136
136
  \u274C ${r instanceof Error?r.message:String(r)}
137
- `)),process.exit(1);}}),e.command("down").description("Stop planned infrastructure services").option("--workspace <path>","Workspace root path").option("--volumes","Remove named volumes").action(async o=>{try{let r=Go(o.workspace);await Zr(r);let n=["down"];o.volumes&&n.push("-v");let i=await en({workspacePath:r,args:n});i.stdout&&process.stdout.write(i.stdout),i.stderr&&process.stderr.write(i.stderr),i.exitCode!==0&&process.exit(i.exitCode),console.log(s.green(`
137
+ `)),process.exit(1);}}),e.command("down").description("Stop planned infrastructure services").option("--workspace <path>","Workspace root path").option("--volumes","Remove named volumes").action(async o=>{try{let r=ar(o.workspace);await gn(r);let n=["down"];o.volumes&&n.push("-v");let i=await hn({workspacePath:r,args:n});i.stdout&&process.stdout.write(i.stdout),i.stderr&&process.stderr.write(i.stderr),i.exitCode!==0&&process.exit(i.exitCode),console.log(s.green(`
138
138
  \u2705 Infrastructure stack stopped.
139
139
  `));}catch(r){console.error(s.red(`
140
140
  \u274C ${r instanceof Error?r.message:String(r)}
141
- `)),process.exit(1);}}),e.command("status").description("Show Docker Compose status for planned infrastructure").option("--workspace <path>","Workspace root path").option("--json","Print docker compose ps JSON output").option("--strict","Exit non-zero when any container is not healthy/running").action(async o=>{try{let r=Go(o.workspace),n=await Zr(r),i=o.json?["ps","--format","json"]:["ps"],a=await en({workspacePath:r,args:i});if(o.json){a.stdout&&process.stdout.write(a.stdout),a.exitCode!==0&&process.exit(a.exitCode);return}console.log(s.bold(`
141
+ `)),process.exit(1);}}),e.command("status").description("Show Docker Compose status for planned infrastructure").option("--workspace <path>","Workspace root path").option("--json","Print docker compose ps JSON output").option("--strict","Exit non-zero when any container is not healthy/running").action(async o=>{try{let r=ar(o.workspace),n=await gn(r),i=o.json?["ps","--format","json"]:["ps"],a=await hn({workspacePath:r,args:i});if(o.json){a.stdout&&process.stdout.write(a.stdout),a.exitCode!==0&&process.exit(a.exitCode);return}console.log(s.bold(`
142
142
  Workspai infra status
143
- `)),console.log(s.gray(`Workspace: ${r}`)),console.log(s.gray(`Planned services: ${n.services.map(l=>l.id).join(", ")||"none"}`)),console.log(""),a.stdout.trim()?process.stdout.write(a.stdout):(console.log(s.yellow("No running containers found for the infra stack.")),console.log(s.gray(`Start with: npx workspai infra up
143
+ `)),console.log(s.gray(`Workspace: ${r}`)),console.log(s.gray(`Planned services: ${n.services.map(c=>c.id).join(", ")||"none"}`)),console.log(""),a.stdout.trim()?process.stdout.write(a.stdout):(console.log(s.yellow("No running containers found for the infra stack.")),console.log(s.gray(`Start with: npx workspai infra up
144
144
  `))),a.exitCode!==0&&(a.stderr&&process.stderr.write(a.stderr),process.exit(a.exitCode)),o.strict&&/Restarting|Exit|unhealthy/i.test(a.stdout)&&(console.log(""),console.log(s.red("One or more infra containers are not healthy.")),console.log(s.gray(`Inspect logs with: docker logs workspai-postgres (or redis/mailpit)
145
145
  `)),process.exit(1));}catch(r){console.error(s.red(`
146
146
  \u274C ${r instanceof Error?r.message:String(r)}
147
- `)),process.exit(1);}});}function ol(t){try{let e=v.join(t,"Makefile");return P.existsSync(e)?P.readFileSync(e,"utf8"):""}catch{return ""}}function ze(t,e){let o=ol(t);return o?new RegExp(`^${e}\\s*:`,"m").test(o):false}var Vo=class{constructor(e){this.runCommand=e;}runCommand;runtime="dotnet";async run(e,o,r){return {exitCode:await this.runCommand(e,o,r)}}async ensureDotnetInstalled(e){return (await this.run("dotnet",["--version"],e)).exitCode===0?null:{exitCode:1,message:".NET SDK is not installed or not available on PATH. Install .NET 8+ from https://dotnet.microsoft.com/download and retry."}}findFilesBySuffix(e,o,r=3){let n=[],i=[{dir:e,depth:0}],a=new Set(["bin","obj",".git","node_modules",".workspai",".rapidkit"]);for(;i.length>0;){let l=i.shift();if(!l||l.depth>r)continue;let c=[];try{c=P.readdirSync(l.dir,{withFileTypes:true});}catch{continue}for(let d of c){let m=v.join(l.dir,d.name);if(d.isDirectory()){a.has(d.name)||i.push({dir:m,depth:l.depth+1});continue}d.name.toLowerCase().endsWith(o.toLowerCase())&&n.push(m);}}return n.sort()}findProjectFile(e){let o=this.findFilesBySuffix(e,".csproj");return o.find(r=>!r.toLowerCase().includes(".tests.csproj"))||o[0]||null}findTestProjectFile(e){return this.findFilesBySuffix(e,".csproj").find(r=>r.toLowerCase().includes(".tests.csproj"))||null}async checkPrereqs(){return this.run("dotnet",["--version"],process.cwd())}async warmSetupCache(e){let o=await this.ensureDotnetInstalled(e);return o||this.run("dotnet",["nuget","locals","all","--list"],e)}async initProject(e){let o=await this.ensureDotnetInstalled(e);if(o)return o;let r=this.findProjectFile(e),n=await this.run("dotnet",r?["restore",r]:["restore"],e);return n.exitCode===0?n:{exitCode:n.exitCode,message:"dotnet restore failed. Check NuGet connectivity, package references, and .NET SDK workload availability, then retry."}}async runDev(e){let o=await this.ensureDotnetInstalled(e);if(o)return o;let r=this.findProjectFile(e),n=r?["watch","--project",r,"run"]:["watch","run"];return this.run("dotnet",n,e)}async runTest(e){let o=await this.ensureDotnetInstalled(e);if(o)return o;let r=this.findTestProjectFile(e)||this.findProjectFile(e);return this.run("dotnet",r?["test",r]:["test"],e)}async runBuild(e){let o=await this.ensureDotnetInstalled(e);if(o)return o;let r=this.findProjectFile(e);return this.run("dotnet",r?["build",r,"-c","Release"]:["build","-c","Release"],e)}async runStart(e){let o=await this.ensureDotnetInstalled(e);if(o)return o;let r=this.findProjectFile(e);return this.run("dotnet",r?["run","--project",r]:["run"],e)}async runLint(e){if(ze(e,"lint"))return this.run("make",["lint"],e);let o=v.join(e,"Directory.Build.props");if(P.existsSync(o)&&P.readFileSync(o,"utf-8").includes("EnforceCodeStyleInBuild")){let r=await this.ensureDotnetInstalled(e);if(r)return r;let n=this.findProjectFile(e);return this.run("dotnet",n?["build",n,"-warnaserror"]:["build","-warnaserror"],e)}return {exitCode:1,message:"No .NET lint tooling detected. Add a Makefile lint target or enable EnforceCodeStyleInBuild in Directory.Build.props."}}async runFormat(e){if(ze(e,"format"))return this.run("make",["format"],e);let o=await this.ensureDotnetInstalled(e);return o||(P.existsSync(v.join(e,".editorconfig"))?this.run("dotnet",["format","--verify-no-changes"],e):{exitCode:1,message:"No .NET format tooling detected. Add a Makefile format target or an .editorconfig file for dotnet format."})}async doctorHints(e){return ["Install .NET 8+ SDK and ensure dotnet is on PATH.","Run dotnet restore after changing package references.","Use dotnet format --verify-no-changes in CI for deterministic code style."]}};var Bo=class{constructor(e){this.runCommand=e;}runCommand;runtime="go";async run(e,o,r){return {exitCode:await this.runCommand(e,o,r)}}async ensureGoInstalled(e){return (await this.run("go",["version"],e)).exitCode===0?null:{exitCode:1,message:"Go toolchain is not installed or not available on PATH. Install Go from https://go.dev/dl/ and retry."}}findGoRunTarget(e){let o=v.join(e,"main.go");if(P.existsSync(o))return "./main.go";let r=v.join(e,"cmd");try{let n=P.readdirSync(r,{withFileTypes:true}).filter(i=>i.isDirectory()).map(i=>i.name).sort();for(let i of n)if(P.existsSync(v.join(r,i,"main.go")))return `./cmd/${i}`}catch{}return "./."}findWorkspaceRoot(e){let o=e;for(;;){if(P.existsSync(v.join(o,".workspai-workspace"))||P.existsSync(v.join(o,".rapidkit-workspace")))return o;let r=v.dirname(o);if(r===o)break;o=r;}return null}resolveDependencyMode(e){let o$1=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(o$1==="shared-runtime-caches"||o$1==="shared-node-deps"||o$1==="isolated")return o$1;let r=this.findWorkspaceRoot(e);if(!r)return "isolated";let n=o(r,"policies.yml").find(i=>P.existsSync(i));if(!n)return "isolated";try{let l=P.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(l==="shared-runtime-caches"||l==="shared-node-deps"||l==="isolated")return l}catch{}return "isolated"}withGoCacheEnv(e,o){let r=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=r==="shared-runtime-caches"?v.join(n||e,".workspai","cache","go"):v.join(e,".workspai","cache","go"),a=process.env.GOMODCACHE,l=process.env.GOCACHE;return process.env.GOMODCACHE=v.join(i,"mod"),process.env.GOCACHE=v.join(i,"build"),o().finally(()=>{typeof a>"u"?delete process.env.GOMODCACHE:process.env.GOMODCACHE=a,typeof l>"u"?delete process.env.GOCACHE:process.env.GOCACHE=l;})}async checkPrereqs(){return this.run("go",["version"],process.cwd())}async warmSetupCache(e){return this.withGoCacheEnv(e,async()=>{try{return process.env.GOMODCACHE&&P.mkdirSync(process.env.GOMODCACHE,{recursive:true}),process.env.GOCACHE&&P.mkdirSync(process.env.GOCACHE,{recursive:true}),{exitCode:0}}catch{return {exitCode:1,message:"Failed to prepare Go cache directories"}}})}async initProject(e){return this.withGoCacheEnv(e,async()=>{let o=await this.ensureGoInstalled(e);return o||this.run("go",["mod","tidy"],e)})}async runDev(e){return this.withGoCacheEnv(e,()=>(async()=>{let o=await this.ensureGoInstalled(e);if(o)return o;let r=v.join(e,"Makefile");return P.existsSync(r)?this.run("make",["run"],e):this.run("go",["run",this.findGoRunTarget(e)],e)})())}async runTest(e){return this.withGoCacheEnv(e,async()=>{let o=await this.ensureGoInstalled(e);return o||this.run("go",["test","./..."],e)})}async runBuild(e){return this.withGoCacheEnv(e,async()=>{let o=await this.ensureGoInstalled(e);return o||this.run("go",["build","-buildvcs=false","./..."],e)})}async runStart(e){return this.withGoCacheEnv(e,async()=>{let r=(b()?[v.join(e,"server.exe"),v.join(e,"server")]:[v.join(e,"server")]).find(i=>P.existsSync(i));if(r)return this.run(r,[],e);let n=await this.ensureGoInstalled(e);return n||this.run("go",["run",this.findGoRunTarget(e)],e)})}async runLint(e){return this.withGoCacheEnv(e,async()=>{let o=await this.ensureGoInstalled(e);return o||(ze(e,"lint")?this.run("make",["lint"],e):P.existsSync(v.join(e,".golangci.yml"))||P.existsSync(v.join(e,".golangci.yaml"))?this.run("golangci-lint",["run","./..."],e):{exitCode:1,message:"No Go lint tooling detected. Add a Makefile lint target or .golangci.yml configuration."})})}async runFormat(e){return this.withGoCacheEnv(e,async()=>{let o=await this.ensureGoInstalled(e);return o||(ze(e,"fmt")?this.run("make",["fmt"],e):ze(e,"format")?this.run("make",["format"],e):this.run("go",["fmt","./..."],e))})}async doctorHints(e){return ["Install Go from https://go.dev/dl/ if missing.","Run go mod tidy when dependencies are out of sync.","Use make run for hot-reload if Makefile exists."]}};var Ho=class{constructor(e){this.runCommand=e;}runCommand;runtime="java";isExecutable(e){if(process.platform==="win32")return true;try{return (P.statSync(e).mode&73)!==0}catch{return false}}ensureWrapperExecutable(e){if(process.platform==="win32"||this.isExecutable(e))return true;try{return P.chmodSync(e,493),this.isExecutable(e)}catch{return false}}resolveJavaCommand(e){let o=process.env.JAVA_HOME?.trim();if(!o)return "java";let r=v.join(o,"bin",process.platform==="win32"?"java.exe":"java");return P.existsSync(r)?r:"java"}parseMajorJavaVersion(e){if(!e)return null;let r=e.trim().replace(/\"/g,"").split(".")[0],n=Number.parseInt(r,10);return Number.isFinite(n)?n:null}readRequiredJavaMajor(e){let o=v.join(e,"pom.xml");if(!P.existsSync(o))return 21;try{let n=P.readFileSync(o,"utf-8").match(/<java\.version>\s*([^<\s]+)\s*<\/java\.version>/i);return this.parseMajorJavaVersion(n?.[1])??21}catch{return 21}}async detectInstalledJavaMajor(e,o){try{let r=await execa(e,["-version"],{cwd:o,timeout:5e3,reject:false});if(r.exitCode!==0)return null;let n=`${r.stdout||""}
147
+ `)),process.exit(1);}});}function Ll(t){try{let e=C.join(t,"Makefile");return S.existsSync(e)?S.readFileSync(e,"utf8"):""}catch{return ""}}function et(t,e){let o=Ll(t);return o?new RegExp(`^${e}\\s*:`,"m").test(o):false}var lr=class{constructor(e){this.runCommand=e;}runCommand;runtime="dotnet";async run(e,o,r){return {exitCode:await this.runCommand(e,o,r)}}async ensureDotnetInstalled(e){return (await this.run("dotnet",["--version"],e)).exitCode===0?null:{exitCode:1,message:".NET SDK is not installed or not available on PATH. Install .NET 8+ from https://dotnet.microsoft.com/download and retry."}}findFilesBySuffix(e,o,r=3){let n=[],i=[{dir:e,depth:0}],a=new Set(["bin","obj",".git","node_modules",".workspai",".rapidkit"]);for(;i.length>0;){let c=i.shift();if(!c||c.depth>r)continue;let l=[];try{l=S.readdirSync(c.dir,{withFileTypes:true});}catch{continue}for(let p of l){let f=C.join(c.dir,p.name);if(p.isDirectory()){a.has(p.name)||i.push({dir:f,depth:c.depth+1});continue}p.name.toLowerCase().endsWith(o.toLowerCase())&&n.push(f);}}return n.sort()}findProjectFile(e){let o=this.findFilesBySuffix(e,".csproj");return o.find(r=>!r.toLowerCase().includes(".tests.csproj"))||o[0]||null}findTestProjectFile(e){return this.findFilesBySuffix(e,".csproj").find(r=>r.toLowerCase().includes(".tests.csproj"))||null}async checkPrereqs(){return this.run("dotnet",["--version"],process.cwd())}async warmSetupCache(e){let o=await this.ensureDotnetInstalled(e);return o||this.run("dotnet",["nuget","locals","all","--list"],e)}async initProject(e){let o=await this.ensureDotnetInstalled(e);if(o)return o;let r=this.findProjectFile(e),n=await this.run("dotnet",r?["restore",r]:["restore"],e);return n.exitCode===0?n:{exitCode:n.exitCode,message:"dotnet restore failed. Check NuGet connectivity, package references, and .NET SDK workload availability, then retry."}}async runDev(e){let o=await this.ensureDotnetInstalled(e);if(o)return o;let r=this.findProjectFile(e),n=r?["watch","--project",r,"run"]:["watch","run"];return this.run("dotnet",n,e)}async runTest(e){let o=await this.ensureDotnetInstalled(e);if(o)return o;let r=this.findTestProjectFile(e)||this.findProjectFile(e);return this.run("dotnet",r?["test",r]:["test"],e)}async runBuild(e){let o=await this.ensureDotnetInstalled(e);if(o)return o;let r=this.findProjectFile(e);return this.run("dotnet",r?["build",r,"-c","Release"]:["build","-c","Release"],e)}async runStart(e){let o=await this.ensureDotnetInstalled(e);if(o)return o;let r=this.findProjectFile(e);return this.run("dotnet",r?["run","--project",r]:["run"],e)}async runLint(e){if(et(e,"lint"))return this.run("make",["lint"],e);let o=C.join(e,"Directory.Build.props");if(S.existsSync(o)&&S.readFileSync(o,"utf-8").includes("EnforceCodeStyleInBuild")){let r=await this.ensureDotnetInstalled(e);if(r)return r;let n=this.findProjectFile(e);return this.run("dotnet",n?["build",n,"-warnaserror"]:["build","-warnaserror"],e)}return {exitCode:1,message:"No .NET lint tooling detected. Add a Makefile lint target or enable EnforceCodeStyleInBuild in Directory.Build.props."}}async runFormat(e){if(et(e,"format"))return this.run("make",["format"],e);let o=await this.ensureDotnetInstalled(e);return o||(S.existsSync(C.join(e,".editorconfig"))?this.run("dotnet",["format","--verify-no-changes"],e):{exitCode:1,message:"No .NET format tooling detected. Add a Makefile format target or an .editorconfig file for dotnet format."})}async doctorHints(e){return ["Install .NET 8+ SDK and ensure dotnet is on PATH.","Run dotnet restore after changing package references.","Use dotnet format --verify-no-changes in CI for deterministic code style."]}};var pr=class{constructor(e){this.runCommand=e;}runCommand;runtime="go";async run(e,o,r){return {exitCode:await this.runCommand(e,o,r)}}async ensureGoInstalled(e){return (await this.run("go",["version"],e)).exitCode===0?null:{exitCode:1,message:"Go toolchain is not installed or not available on PATH. Install Go from https://go.dev/dl/ and retry."}}findGoRunTarget(e){let o=C.join(e,"main.go");if(S.existsSync(o))return "./main.go";let r=C.join(e,"cmd");try{let n=S.readdirSync(r,{withFileTypes:true}).filter(i=>i.isDirectory()).map(i=>i.name).sort();for(let i of n)if(S.existsSync(C.join(r,i,"main.go")))return `./cmd/${i}`}catch{}return "./."}findWorkspaceRoot(e){let o=e;for(;;){if(S.existsSync(C.join(o,".workspai-workspace"))||S.existsSync(C.join(o,".rapidkit-workspace")))return o;let r=C.dirname(o);if(r===o)break;o=r;}return null}resolveDependencyMode(e){let o$1=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(o$1==="shared-runtime-caches"||o$1==="shared-node-deps"||o$1==="isolated")return o$1;let r=this.findWorkspaceRoot(e);if(!r)return "isolated";let n=o(r,"policies.yml").find(i=>S.existsSync(i));if(!n)return "isolated";try{let c=S.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(c==="shared-runtime-caches"||c==="shared-node-deps"||c==="isolated")return c}catch{}return "isolated"}withGoCacheEnv(e,o){let r=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=r==="shared-runtime-caches"?C.join(n||e,".workspai","cache","go"):C.join(e,".workspai","cache","go"),a=process.env.GOMODCACHE,c=process.env.GOCACHE;return process.env.GOMODCACHE=C.join(i,"mod"),process.env.GOCACHE=C.join(i,"build"),o().finally(()=>{typeof a>"u"?delete process.env.GOMODCACHE:process.env.GOMODCACHE=a,typeof c>"u"?delete process.env.GOCACHE:process.env.GOCACHE=c;})}async checkPrereqs(){return this.run("go",["version"],process.cwd())}async warmSetupCache(e){return this.withGoCacheEnv(e,async()=>{try{return process.env.GOMODCACHE&&S.mkdirSync(process.env.GOMODCACHE,{recursive:true}),process.env.GOCACHE&&S.mkdirSync(process.env.GOCACHE,{recursive:true}),{exitCode:0}}catch{return {exitCode:1,message:"Failed to prepare Go cache directories"}}})}async initProject(e){return this.withGoCacheEnv(e,async()=>{let o=await this.ensureGoInstalled(e);return o||this.run("go",["mod","tidy"],e)})}async runDev(e){return this.withGoCacheEnv(e,()=>(async()=>{let o=await this.ensureGoInstalled(e);if(o)return o;let r=C.join(e,"Makefile");return S.existsSync(r)?this.run("make",["run"],e):this.run("go",["run",this.findGoRunTarget(e)],e)})())}async runTest(e){return this.withGoCacheEnv(e,async()=>{let o=await this.ensureGoInstalled(e);return o||this.run("go",["test","./..."],e)})}async runBuild(e){return this.withGoCacheEnv(e,async()=>{let o=await this.ensureGoInstalled(e);return o||this.run("go",["build","-buildvcs=false","./..."],e)})}async runStart(e){return this.withGoCacheEnv(e,async()=>{let r=(b()?[C.join(e,"server.exe"),C.join(e,"server")]:[C.join(e,"server")]).find(i=>S.existsSync(i));if(r)return this.run(r,[],e);let n=await this.ensureGoInstalled(e);return n||this.run("go",["run",this.findGoRunTarget(e)],e)})}async runLint(e){return this.withGoCacheEnv(e,async()=>{let o=await this.ensureGoInstalled(e);return o||(et(e,"lint")?this.run("make",["lint"],e):S.existsSync(C.join(e,".golangci.yml"))||S.existsSync(C.join(e,".golangci.yaml"))?this.run("golangci-lint",["run","./..."],e):{exitCode:1,message:"No Go lint tooling detected. Add a Makefile lint target or .golangci.yml configuration."})})}async runFormat(e){return this.withGoCacheEnv(e,async()=>{let o=await this.ensureGoInstalled(e);return o||(et(e,"fmt")?this.run("make",["fmt"],e):et(e,"format")?this.run("make",["format"],e):this.run("go",["fmt","./..."],e))})}async doctorHints(e){return ["Install Go from https://go.dev/dl/ if missing.","Run go mod tidy when dependencies are out of sync.","Use make run for hot-reload if Makefile exists."]}};var dr=class{constructor(e){this.runCommand=e;}runCommand;runtime="java";isExecutable(e){if(process.platform==="win32")return true;try{return (S.statSync(e).mode&73)!==0}catch{return false}}ensureWrapperExecutable(e){if(process.platform==="win32"||this.isExecutable(e))return true;try{return S.chmodSync(e,493),this.isExecutable(e)}catch{return false}}resolveJavaCommand(e){let o=process.env.JAVA_HOME?.trim();if(!o)return "java";let r=C.join(o,"bin",process.platform==="win32"?"java.exe":"java");return S.existsSync(r)?r:"java"}parseMajorJavaVersion(e){if(!e)return null;let r=e.trim().replace(/\"/g,"").split(".")[0],n=Number.parseInt(r,10);return Number.isFinite(n)?n:null}readRequiredJavaMajor(e){let o=C.join(e,"pom.xml");if(!S.existsSync(o))return 21;try{let n=S.readFileSync(o,"utf-8").match(/<java\.version>\s*([^<\s]+)\s*<\/java\.version>/i);return this.parseMajorJavaVersion(n?.[1])??21}catch{return 21}}async detectInstalledJavaMajor(e,o){try{let r=await execa(e,["-version"],{cwd:o,timeout:5e3,reject:false});if(r.exitCode!==0)return null;let n=`${r.stdout||""}
148
148
  ${r.stderr||""}`,i=n.match(/version\s+"([^"]+)"/i);if(i?.[1])return this.parseMajorJavaVersion(i[1]);let a=n.match(/(?:openjdk|java)\s+(\d+(?:[._]\d+)?)/i);return a?.[1]?this.parseMajorJavaVersion(a[1]):null}catch{return null}}parseMavenVersion(e){if(!e)return null;let o=e.match(/Apache Maven\s+(\d+)\.(\d+)\.(\d+)/i);return o?[Number.parseInt(o[1],10),Number.parseInt(o[2],10),Number.parseInt(o[3],10)]:null}isMavenVersionAtLeast(e,o){for(let r=0;r<3;r+=1){if(e[r]>o[r])return true;if(e[r]<o[r])return false}return true}async checkSystemMavenVersion(e){try{let o=await execa("mvn",["-version"],{cwd:e,timeout:5e3,reject:false});if(o.exitCode!==0)return {exitCode:o.exitCode||1,message:"Maven is required and must be available on PATH (3.9+)."};let r=this.parseMavenVersion(`${o.stdout||""}
149
- ${o.stderr||""}`);return r?this.isMavenVersionAtLeast(r,[3,9,0])?{exitCode:0}:{exitCode:1,message:`Maven ${r.join(".")} detected; Maven 3.9+ is required.`}:{exitCode:1,message:"Unable to parse Maven version. Ensure Maven 3.9+ is installed and retry."}}catch{return {exitCode:1,message:"Maven version check failed. Install Maven 3.9+ and ensure mvn is on PATH."}}}shouldUseGradleNoDaemon(){return process.env.CI==="true"||process.env.RAPIDKIT_GRADLE_NO_DAEMON==="1"}inspectJavaProject(e){let o=P.existsSync(v.join(e,"pom.xml")),r=P.existsSync(v.join(e,"mvnw"))||P.existsSync(v.join(e,"mvnw.cmd")),n=P.existsSync(v.join(e,"build.gradle"))||P.existsSync(v.join(e,"build.gradle.kts"))||P.existsSync(v.join(e,"settings.gradle"))||P.existsSync(v.join(e,"settings.gradle.kts")),i=P.existsSync(v.join(e,"gradlew"))||P.existsSync(v.join(e,"gradlew.bat"));return {hasMavenProject:o||r,hasMavenWrapper:r,hasGradleProject:n||i,hasGradleWrapper:i}}findWorkspaceRoot(e){let o=e;for(;;){if(P.existsSync(v.join(o,".workspai-workspace"))||P.existsSync(v.join(o,".rapidkit-workspace")))return o;let r=v.dirname(o);if(r===o)break;o=r;}return null}resolveDependencyMode(e){let o$1=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(o$1==="shared-runtime-caches"||o$1==="shared-node-deps"||o$1==="isolated")return o$1;let r=this.findWorkspaceRoot(e);if(!r)return "isolated";let n=o(r,"policies.yml").find(i=>P.existsSync(i));if(!n)return "isolated";try{let l=P.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(l==="shared-runtime-caches"||l==="shared-node-deps"||l==="isolated")return l}catch{}return "isolated"}buildToolCommand(e){return this.isGradleProject(e)?this.gradleCommand(e):this.mavenCommand(e)}mavenCommand(e){let o=v.join(e,"mvnw.cmd");if(process.platform==="win32"&&P.existsSync(o))return {command:o,baseArgs:[]};let r=v.join(e,"mvnw");return P.existsSync(r)?this.ensureWrapperExecutable(r)?{command:r,baseArgs:[]}:{command:"sh",baseArgs:[r]}:{command:"mvn",baseArgs:[]}}gradleCommand(e){let o=v.join(e,"gradlew.bat");if(process.platform==="win32"&&P.existsSync(o))return {command:o,baseArgs:[]};let r=v.join(e,"gradlew");return P.existsSync(r)?this.ensureWrapperExecutable(r)?{command:r,baseArgs:[]}:{command:"sh",baseArgs:[r]}:{command:"gradle",baseArgs:[]}}isGradleProject(e){return this.inspectJavaProject(e).hasGradleProject}isMavenProject(e){return this.inspectJavaProject(e).hasMavenProject}discoverWorkspaceJavaProjects(e){let o=[],r=new Set,n=[e];for(;n.length>0;){let i=n.shift();if(!i||r.has(i))continue;r.add(i);let a=[];try{a=P.readdirSync(i,{withFileTypes:true});}catch{continue}for(let l of a){if(!l.isDirectory()||l.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(l.name))continue;let c=v.join(i,l.name),d=this.inspectJavaProject(c);(d.hasMavenProject||d.hasGradleProject)&&o.push(c),n.push(c);}}return o}withJavaCacheEnv(e,o){let r=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=r==="shared-runtime-caches"?v.join(n||e,".workspai","cache","java","m2"):v.join(e,".workspai","cache","java","m2"),a=r==="shared-runtime-caches"?v.join(n||e,".workspai","cache","java","gradle"):v.join(e,".workspai","cache","java","gradle"),l=process.env.MAVEN_OPTS,c=process.env.GRADLE_USER_HOME,d=`-Dmaven.repo.local=${i}`;return process.env.MAVEN_OPTS=l?`${l} ${d}`:d,process.env.GRADLE_USER_HOME=a,o().finally(()=>{typeof l>"u"?delete process.env.MAVEN_OPTS:process.env.MAVEN_OPTS=l,typeof c>"u"?delete process.env.GRADLE_USER_HOME:process.env.GRADLE_USER_HOME=c;})}async runBuildTool(e,o,r=true){return this.withJavaCacheEnv(e,async()=>{try{let{command:n,baseArgs:i}=this.buildToolCommand(e),a=await this.runCommand(n,[...i,...o],e);if(a===0||!r)return {exitCode:a};let l=P.existsSync(v.join(e,"pom.xml")),c=P.existsSync(v.join(e,"build.gradle"))||P.existsSync(v.join(e,"build.gradle.kts"));return {exitCode:a,message:l||c?"Java build failed. Verify pom.xml/build.gradle syntax and dependencies, then retry.":"Java build tool is not installed or not available on PATH. Install Maven/Gradle and JDK 21+, or commit mvnw/gradlew wrapper scripts."}}catch(n){return {exitCode:1,message:`Java command execution failed: ${n instanceof Error?n.message:String(n)}. Verify pom.xml/build.gradle integrity and wrapper permissions.`}}})}resolveJarPath(e){let o=[v.join(e,"target"),v.join(e,"build","libs")];for(let r of o){if(!P.existsSync(r))continue;let i=P.readdirSync(r).filter(a=>a.toLowerCase().endsWith(".jar")).find(a=>!a.toLowerCase().endsWith("-sources.jar")&&!a.toLowerCase().endsWith("-javadoc.jar")&&!a.toLowerCase().endsWith("-plain.jar"));if(i)return v.join(r,i)}return null}commandArgsFor(e,o){if(e==="gradle"){let r=this.shouldUseGradleNoDaemon()?["--no-daemon"]:[];return o==="init"?[...r,"dependencies"]:o==="dev"?[...r,"bootRun"]:o==="test"?[...r,"test"]:[...r,"bootJar"]}return o==="init"?["-B","-q","-DskipTests","dependency:go-offline"]:o==="dev"?["spring-boot:run"]:o==="test"?["test"]:["-DskipTests","package"]}detectBuildTool(e){return this.isGradleProject(e)?"gradle":"maven"}async checkPrereqs(){let e=process.cwd(),o=this.resolveJavaCommand(e),r=await this.runCommand(o,["-version"],e);if(r!==0)return {exitCode:r,message:"JDK 21+ is required. Ensure java is on PATH or JAVA_HOME/bin/java is available."};if(this.isMavenProject(e)){let l=this.readRequiredJavaMajor(e),c=await this.detectInstalledJavaMajor(o,e);if(c!==null&&c<l)return {exitCode:1,message:`Detected Java ${c}, but project requires Java ${l}+.`};let d=v.join(process.env.JAVA_HOME||"","release");if(process.env.JAVA_HOME&&P.existsSync(d))try{let p=P.readFileSync(d,"utf-8").match(/^JAVA_VERSION="([^"]+)"/m),u=this.parseMajorJavaVersion(p?.[1]);if(u!==null&&u<l)return {exitCode:1,message:`Detected JAVA_HOME version ${u}, but project requires Java ${l}+.`}}catch{}}if(this.isMavenProject(e)||this.isGradleProject(e)){let l=this.detectBuildTool(e),c=l==="gradle"?["--version"]:["-version"],d=await this.runBuildTool(e,c);return d.exitCode!==0?d:l==="maven"&&!this.inspectJavaProject(e).hasMavenWrapper?this.checkSystemMavenVersion(e):d}let n=this.findWorkspaceRoot(e);if(n&&n===e){let l=this.discoverWorkspaceJavaProjects(n);if(l.length>0){let c=l.reduce((p,u)=>Math.max(p,this.readRequiredJavaMajor(u)),0);if(c>0){let p=await this.detectInstalledJavaMajor(o,e);if(p!==null&&p<c){let u=l.filter(f=>this.readRequiredJavaMajor(f)>p).map(f=>v.relative(e,f)).join(", ");return {exitCode:1,message:`Detected Java ${p}, but workspace project(s) [${u}] require Java ${c}+.`}}}let d=false,m=false;for(let p of l){let u=this.inspectJavaProject(p);u.hasMavenProject&&!u.hasMavenWrapper&&(d=true),u.hasGradleProject&&!u.hasGradleWrapper&&(m=true);}if(d){let p=await this.withJavaCacheEnv(e,async()=>this.runCommand("mvn",["-version"],e));if(p!==0)return {exitCode:p,message:"Maven is required for one or more workspace Java projects without Maven Wrapper. Install Maven 3.9+, or add mvnw/mvnw.cmd to those projects."};let u=await this.checkSystemMavenVersion(e);if(u.exitCode!==0)return u}if(m){let p=await this.withJavaCacheEnv(e,async()=>this.runCommand("gradle",["--version"],e));if(p!==0)return {exitCode:p,message:"Gradle is required for one or more workspace Java projects without Gradle Wrapper. Install Gradle 8+, or add gradlew/gradlew.bat to those projects."}}return {exitCode:0}}}let i=await this.withJavaCacheEnv(e,async()=>this.runCommand("mvn",["-version"],e));if(i===0){let l=await this.checkSystemMavenVersion(e);return l.exitCode!==0?l:{exitCode:0}}let a=await this.withJavaCacheEnv(e,async()=>this.runCommand("gradle",["--version"],e));return a===0?{exitCode:0}:{exitCode:i||a||1,message:"Neither Maven nor Gradle is available on PATH. Install one of them, or use mvnw/gradlew wrappers in project roots."}}async warmSetupCache(e){return this.withJavaCacheEnv(e,async()=>{try{let o=process.env.MAVEN_OPTS?.match(/-Dmaven\.repo\.local=([^\s]+)/)?.[1];return o&&P.mkdirSync(o,{recursive:true}),process.env.GRADLE_USER_HOME&&P.mkdirSync(process.env.GRADLE_USER_HOME,{recursive:true}),{exitCode:0}}catch{return {exitCode:1,message:"Failed to prepare Java cache directories"}}})}async initProject(e){return this.runBuildTool(e,this.commandArgsFor(this.detectBuildTool(e),"init"))}async runDev(e){return this.runBuildTool(e,this.commandArgsFor(this.detectBuildTool(e),"dev"))}async runTest(e){return this.runBuildTool(e,this.commandArgsFor(this.detectBuildTool(e),"test"))}async runBuild(e){return this.runBuildTool(e,this.commandArgsFor(this.detectBuildTool(e),"build"))}async runStart(e){let o=this.resolveJarPath(e);if(o)return {exitCode:await this.runCommand(this.resolveJavaCommand(e),["-jar",o],e)};let r=await this.runBuild(e);if(r.exitCode!==0)return r;let n=this.resolveJarPath(e);return n?{exitCode:await this.runCommand(this.resolveJavaCommand(e),["-jar",n],e)}:{exitCode:1,message:"Spring Boot build completed, but no runnable JAR was found under target/ or build/libs/. Verify build output naming and packaging plugins."}}async runLint(e){if(ze(e,"lint"))return {exitCode:await this.runCommand("make",["lint"],e)};let o=v.join(e,"pom.xml");return P.existsSync(o)&&P.readFileSync(o,"utf-8").includes("checkstyle")?this.runBuildTool(e,["checkstyle:check"]):{exitCode:1,message:"No Java lint tooling detected. Add a Makefile lint target or configure checkstyle in Maven/Gradle."}}async runFormat(e){return ze(e,"format")?{exitCode:await this.runCommand("make",["format"],e)}:["build.gradle","build.gradle.kts"].map(r=>v.join(e,r)).filter(r=>P.existsSync(r)).some(r=>P.readFileSync(r,"utf-8").includes("spotless"))?this.runBuildTool(e,["spotlessApply"]):{exitCode:1,message:"No Java format tooling detected. Add a Makefile format target or configure spotless in Gradle."}}async doctorHints(e){return ["Install JDK 21+ and Maven/Gradle (or commit mvnw/gradlew wrappers) for reliable local builds.","Run npx workspai init after dependency changes to warm Java caches for your build tool.","Use SPRING_PROFILES_ACTIVE to switch environments without changing source config."]}};var qo=class{constructor(e){this.runCommand=e;}runCommand;runtime="node";async run(e,o,r){return {exitCode:await this.runCommand(e,o,r)}}findWorkspaceRoot(e){let o=e;for(;;){if(P.existsSync(v.join(o,".workspai-workspace"))||P.existsSync(v.join(o,".rapidkit-workspace")))return o;let r=v.dirname(o);if(r===o)break;o=r;}return null}resolveDependencyMode(e){let o$1=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(o$1==="shared-runtime-caches"||o$1==="shared-node-deps"||o$1==="isolated")return o$1;let r=this.findWorkspaceRoot(e);if(!r)return "isolated";let n=o(r,"policies.yml").find(i=>P.existsSync(i));if(!n)return "isolated";try{let l=P.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(l==="shared-runtime-caches"||l==="shared-node-deps"||l==="isolated")return l}catch{}return "isolated"}withDependencyEnv(e,o,r){let n=this.resolveDependencyMode(e),i=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),a=n==="isolated"?v.join(e,".workspai","cache","node"):v.join(i||e,".workspai","cache","node"),l=process.env.npm_config_cache,c=process.env.npm_config_store_dir,d=process.env.RAPIDKIT_DEP_SHARING_MODE,m=process.env.RAPIDKIT_WORKSPACE_PATH;return process.env.RAPIDKIT_DEP_SHARING_MODE=n,i&&(process.env.RAPIDKIT_WORKSPACE_PATH=i),o==="pnpm"?(process.env.npm_config_store_dir=v.join(a,"pnpm-store"),process.env.npm_config_cache=v.join(a,"pnpm-cache")):o==="yarn"?process.env.npm_config_cache=v.join(a,"yarn-cache"):process.env.npm_config_cache=v.join(a,"npm-cache"),r().finally(()=>{typeof l>"u"?delete process.env.npm_config_cache:process.env.npm_config_cache=l,typeof c>"u"?delete process.env.npm_config_store_dir:process.env.npm_config_store_dir=c,typeof d>"u"?delete process.env.RAPIDKIT_DEP_SHARING_MODE:process.env.RAPIDKIT_DEP_SHARING_MODE=d,typeof m>"u"?delete process.env.RAPIDKIT_WORKSPACE_PATH:process.env.RAPIDKIT_WORKSPACE_PATH=m;})}detectPackageManager(e){if(P.existsSync(v.join(e,"package-lock.json")))return "npm";if(P.existsSync(v.join(e,"pnpm-lock.yaml")))return "pnpm";if(P.existsSync(v.join(e,"yarn.lock")))return "yarn";if(!this.commandAvailable("npm")){if(this.commandAvailable("pnpm"))return "pnpm";if(this.commandAvailable("yarn"))return "yarn"}return "npm"}hasPinnedPackageManager(e){return P.existsSync(v.join(e,"package-lock.json"))||P.existsSync(v.join(e,"pnpm-lock.yaml"))||P.existsSync(v.join(e,"yarn.lock"))}availablePackageManagers(e){let o=this.detectPackageManager(e);return this.hasPinnedPackageManager(e)?[o]:[o,...["npm","pnpm","yarn"].filter(n=>n!==o&&this.commandAvailable(n))]}commandAvailable(e){let o=e$6(e);return spawnSync(o.command,[...o.prefixArgs,"--version"],{stdio:"ignore",shell:c$6(),env:g$5()}).status===0}scriptArgs(e,o){return e==="npm"?["run-script",o,"--foreground-scripts"]:["run",o]}async runScriptWithFallback(e,o){let r={exitCode:1};for(let n of this.availablePackageManagers(e))if(r=await this.withDependencyEnv(e,n,()=>this.run(n,this.scriptArgs(n,o),e)),r.exitCode===0)return r;return r}async runLifecycle(e,o){let r=d$4(e),n=i$3(e,r),i=n$2(e,o,{framework:n.key});return i?this.runScriptWithFallback(e,i.scriptName):{exitCode:1,message:`No npm script available for \`${o}\`. Add a "${o}" script to package.json.`}}async checkPrereqs(){return this.run("node",["--version"],process.cwd())}async warmSetupCache(e){let o=this.detectPackageManager(e);return this.withDependencyEnv(e,o,async()=>{try{return process.env.npm_config_cache&&P.mkdirSync(process.env.npm_config_cache,{recursive:true}),o==="pnpm"&&process.env.npm_config_store_dir&&P.mkdirSync(process.env.npm_config_store_dir,{recursive:true}),{exitCode:0}}catch{return {exitCode:1,message:"Failed to prepare Node cache directories"}}})}async initProject(e){let o=this.detectPackageManager(e),r=this.resolveDependencyMode(e),n=r==="shared-runtime-caches"||r==="shared-node-deps"?["install","--prefer-offline"]:["install"];return this.withDependencyEnv(e,o,()=>this.run(o,n,e))}async runDev(e){return this.runLifecycle(e,"dev")}async runTest(e){return this.runLifecycle(e,"test")}async runBuild(e){return this.runLifecycle(e,"build")}async runStart(e){return this.runLifecycle(e,"start")}async runLint(e){return this.runLifecycle(e,"lint")}async runFormat(e){return this.runLifecycle(e,"format")}async doctorHints(e){return ["Install Node.js LTS and ensure node/npm are on PATH.","Use lockfiles (package-lock.json, pnpm-lock.yaml, yarn.lock) for deterministic installs.","Run install before dev/test/build if dependencies changed."]}};var Yo=class{constructor(e){this.runCore=e;}runCore;runtime="python";async run(e,o){return {exitCode:await this.withPythonCacheEnv(o,()=>this.runCore(e,o))}}findWorkspaceRoot(e){let o=e;for(;;){if(P.existsSync(v.join(o,".workspai-workspace"))||P.existsSync(v.join(o,".rapidkit-workspace")))return o;let r=v.dirname(o);if(r===o)break;o=r;}return null}resolveDependencyMode(e){let o$1=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(o$1==="shared-runtime-caches"||o$1==="shared-node-deps"||o$1==="isolated")return o$1;let r=this.findWorkspaceRoot(e);if(!r)return "isolated";let n=o(r,"policies.yml").find(i=>P.existsSync(i));if(!n)return "isolated";try{let l=P.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(l==="shared-runtime-caches"||l==="shared-node-deps"||l==="isolated")return l}catch{}return "isolated"}withPythonCacheEnv(e,o){let r=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=r==="shared-runtime-caches"?v.join(n||e,".workspai","cache","python"):v.join(e,".workspai","cache","python"),a=process.env.PIP_CACHE_DIR,l=process.env.POETRY_CACHE_DIR;return process.env.PIP_CACHE_DIR=v.join(i,"pip"),process.env.POETRY_CACHE_DIR=v.join(i,"poetry"),o().finally(()=>{typeof a>"u"?delete process.env.PIP_CACHE_DIR:process.env.PIP_CACHE_DIR=a,typeof l>"u"?delete process.env.POETRY_CACHE_DIR:process.env.POETRY_CACHE_DIR=l;})}async checkPrereqs(){let e=process.cwd(),o=await this.run(["doctor","check"],e);return o.exitCode===0?o:this.run(["doctor"],e)}async initProject(e){return this.run(["init"],e)}async runDev(e){return this.run(["dev"],e)}async runTest(e){return this.run(["test"],e)}async runBuild(e){return this.run(["build"],e)}async runStart(e){return this.run(["start"],e)}async doctorHints(e){return ['Run "npx workspai doctor workspace" for a full workspace scan.','Use "npx workspai init" after adding or changing modules.',"Use `npx workspai <command>` from the project root to avoid environment drift."]}};function nl(){let t={...process.env},e=t.PATH||"";if(e){let o=e.split(v.delimiter).filter(r=>!r.replace(/\\/g,"/").includes("/.pyenv/shims")).join(v.delimiter);t.PATH=o;}return t.PYENV_VERSION="system",t.POETRY_PYTHON=t.POETRY_PYTHON||h$4(),typeof t.RAPIDKIT_SKIP_LOCK_SYNC>"u"&&(t.RAPIDKIT_SKIP_LOCK_SYNC="1"),t}function Je(t,e){return t==="go"?new Bo((o,r,n)=>e.runCommandInCwd(o,r,n)):t==="node"?new qo((o,r,n)=>e.runCommandInCwd(o,r,n)):t==="java"?new Ho((o,r,n)=>e.runCommandInCwd(o,r,n)):t==="dotnet"?new Vo((o,r,n)=>e.runCommandInCwd(o,r,n)):new Yo((o,r)=>e.runCoreRapidkit(o,{cwd:r,env:nl()}))}var Ti=v.join(Rr.homedir(),".workspai","cache"),Fi=1440*60*1e3;function nn(){let t=a$a("CACHE_DIR");if(t)return t;let e=process.env.VITEST_WORKER_ID?.trim();return e?v.join(Ti,`vitest-${e}`):Ti}var Xo=class t{static instance;memoryCache=new Map;constructor(){}static getInstance(){return t.instance||(t.instance=new t),t.instance}getCacheKey(e){return createHash("md5").update(e).digest("hex")}getCachePath(e){return v.join(nn(),`${this.getCacheKey(e)}.json`)}getTempCachePath(e){let o=`${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`;return `${e}.${o}.tmp`}async get(e,o="1.0"){let r=this.memoryCache.get(e);if(r&&r.version===o&&Date.now()-r.timestamp<Fi)return f.debug(`Cache hit (memory): ${e}`),r.data;try{let n=this.getCachePath(e),i=await promises.readFile(n,"utf-8"),a=JSON.parse(i);if(a.version===o&&Date.now()-a.timestamp<Fi)return f.debug(`Cache hit (disk): ${e}`),this.memoryCache.set(e,a),a.data;await promises.unlink(n).catch(()=>{});}catch{f.debug(`Cache miss: ${e}`);}return null}async set(e,o,r="1.0"){let n={data:o,timestamp:Date.now(),version:r};this.memoryCache.set(e,n);try{await promises.mkdir(nn(),{recursive:true});let i=this.getCachePath(e),a=this.getTempCachePath(i);await promises.writeFile(a,JSON.stringify(n),"utf-8"),await promises.rename(a,i),f.debug(`Cache set: ${e}`);}catch(i){f.debug(`Cache write failed: ${e}`,i);}}async invalidate(e){this.memoryCache.delete(e);try{let o=this.getCachePath(e);await promises.unlink(o),f.debug(`Cache invalidated: ${e}`);}catch{}}async clear(){this.memoryCache.clear();try{let e=nn(),o=await promises.readdir(e);await Promise.all(o.map(r=>promises.unlink(v.join(e,r)))),f.debug("Cache cleared");}catch{}}};var Zo=["list","sync","registry","foundation","model","snapshot","diff","impact","verify","graph","watch","context","agent-sync","remediation-plan","explain","why","trace","feedback","mcp","policy","contract","share","export","archive","hydrate","import","run","init"],er=["model","snapshot","diff","impact","verify","context","agent-sync","remediation-plan","explain","why","trace"];function Li(t){return er.includes(t)}var Ji="rapidkit-runtime-command-surface-v1";var Ki="doctor-remediation-plan-v2";function tr(){return {runtimeCommandSurface:Ji,cliLogEvent:c$9,freshnessMetadata:a$j,factFreshness:c$8,blockerResolution:a$i,workspaceModel:j$1,workspaceImpact:e$3,workspaceVerify:c$7,workspaceContext:a$h,workspaceDependencyGraph:i$5,workspaceIntelligenceHistory:a$g,agentCustomizationPack:k$2,workspaceOperationalSkill:a$f,workspaceSkillsIndex:b$a,workspaceExplain:a$e,agentActionOutcome:a$d,doctorRemediationPlan:Ki,artifactRemediationPlan:a$c,doctorFixResult:a$b}}var cl=["catalog","pulse","nova","orbit","atlas","vertex","summit","beacon","ledger","flux","nexus","apex","harbor","forge","spark","portal","studio","canvas","quantum","vault","zenith","compass","vector","catalyst","saas","commerce","radar","stellar","prism","cedar","momentum","signal","cipher","lumen","trail","ridge"],ll={"fastapi.standard":"api","fastapi.ddd":"api","nestjs.standard":"api","springboot.standard":"service","gofiber.standard":"api","gogin.standard":"api","dotnet.webapi.clean":"api"},dl={nextjs:"web",remix:"app","vite-react":"web","vite-vue":"web","vite-svelte":"web","vite-solid":"web","vite-vanilla":"app",nuxt:"app",angular:"app",astro:"site",sveltekit:"app"};function pl(t){return t[Math.floor(Math.random()*t.length)]}function sn(t){let e=pl(cl),o=k$3(t);if(o){let i=dl[o.id]??"app";return `${e}-${i}`}let r=a$4(t),n=r?ll[r.id]??"service":"app";return `${e}-${n}`}async function gl(t){let e=await promises.readFile(t);return createHash("sha256").update(e).digest("hex")}async function Gi(t,e){await E.outputFile(t,`${JSON.stringify(e,null,2)}
150
- `,"utf-8");}function Ke(t,e){return v.isAbsolute(e)?e:v.join(t,e)}function hl(t,e){if(t.target)return t.target;if(t.source)return v.basename(t.source);if(t.url)try{let o=new URL(t.url).pathname,r=v.basename(o);if(r&&r!=="/")return r}catch{}return `${e}.artifact`}async function yl(t){let e=o(t,"trusted-sources.lock").find(r=>E.pathExistsSync(r)),o$1=new Set(["localhost","127.0.0.1"]);if(!e)return o$1;try{let n=(await promises.readFile(e,"utf-8")).split(/\r?\n/).map(i=>i.trim()).filter(i=>i.length>0&&!i.startsWith("#"));for(let i of n)o$1.add(i.toLowerCase());}catch{}return o$1}async function wl(t,e,o){await E.ensureDir(v.dirname(e)),await new Promise((r,n)=>{let a=(t.startsWith("https://")?qi:Hi).get(t,l=>{if(!l.statusCode||l.statusCode<200||l.statusCode>=300){n(new Error(`HTTP ${l.statusCode||"unknown"}`)),l.resume();return}let c=createWriteStream(e);l.pipe(c),c.on("finish",()=>{c.close(),r();}),c.on("error",d=>{n(d);});});a.setTimeout(o,()=>{a.destroy(new Error(`Request timeout after ${o}ms`));}),a.on("error",l=>{n(l);});});}async function kl(t,e,o,r,n){let i=new URL(t),a=JSON.stringify(e),l=i.protocol==="https:"?qi:Hi;await new Promise((c,d)=>{let m=l.request({method:"POST",hostname:i.hostname,port:i.port||(i.protocol==="https:"?443:80),path:`${i.pathname}${i.search}`,headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(a),...r?{Authorization:`Bearer ${r}`}:{},...n||{}}},p=>{if(!p.statusCode||p.statusCode<200||p.statusCode>=300){d(new Error(`HTTP ${p.statusCode||"unknown"}`)),p.resume();return}p.resume(),c();});m.setTimeout(o,()=>{m.destroy(new Error(`Request timeout after ${o}ms`));}),m.on("error",p=>{d(p);}),m.write(a),m.end();});}function Ui(t){return new Promise(e=>setTimeout(e,t))}async function vl(t,e,o,r){let n=Ke(t,e||".workspai/reports/evidence-export-dead-letter.ndjson");return await E.ensureDir(v.dirname(n)),await promises.appendFile(n,`${JSON.stringify({timestamp:new Date().toISOString(),reason:r,payload:o})}
151
- `,"utf-8"),n}function Pl(t,e){if(!e?.enabled)return {headers:{}};let o=process.env[e.hmacKeyEnv];if(!o)return {headers:{},error:`Evidence signing key env is missing: ${e.hmacKeyEnv}`};let r=(e.algorithm||"sha256").toLowerCase(),n=e.headerName||"x-rapidkit-evidence-signature",i=createHmac(r,o).update(JSON.stringify(t)).digest("hex");return {headers:{[n]:i,"x-rapidkit-evidence-signature-alg":r}}}async function bl(t,e,o){let r=(o.algorithm||"sha256").toLowerCase(),n=Ke(t,o.publicKeyPath);if(!await E.pathExists(n))return {verified:false,algorithm:r,publicKeyPath:n,publicKeyFingerprint:"",signature:o.signature,message:`Public key not found: ${n}`};try{let i=await promises.readFile(n,"utf-8"),a=await promises.readFile(e),l=createVerify(r);l.update(a),l.end();let c=Buffer.from(o.signature,"base64"),d=l.verify(i,c),m=createHash("sha256").update(i).digest("hex");return {verified:d,algorithm:r,publicKeyPath:n,publicKeyFingerprint:m,signature:o.signature,message:d?"Attestation verified.":"Attestation signature verification failed."}}catch(i){return {verified:false,algorithm:r,publicKeyPath:n,publicKeyFingerprint:"",signature:o.signature,message:`Attestation verification error: ${i.message}`}}}async function Sl(t,e,o,r){let n=process.env.RAPIDKIT_SIGSTORE_MOCK;if(n==="success")return {verified:true,tlogVerified:r.requireTransparencyLog,message:"Sigstore verification passed (mock).",identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:o.bundlePath||null,certificatePath:o.certificatePath||null,signaturePath:o.signaturePath||null};if(n==="fail")return {verified:false,tlogVerified:false,message:"Sigstore verification failed (mock).",identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:o.bundlePath||null,certificatePath:o.certificatePath||null,signaturePath:o.signaturePath||null};let i=o.signaturePath?Ke(t,o.signaturePath):null;if(!i||!await E.pathExists(i))return {verified:false,tlogVerified:false,message:"Sigstore signaturePath is missing or not found.",identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:o.bundlePath||null,certificatePath:o.certificatePath||null,signaturePath:i};let a=["verify-blob",e,"--signature",i],l=o.certificatePath?Ke(t,o.certificatePath):null;l&&a.push("--certificate",l);let c=o.bundlePath?Ke(t,o.bundlePath):null;c&&a.push("--bundle",c);let d=o.keyPath?Ke(t,o.keyPath):null;d&&a.push("--key",d),o.identity&&a.push("--certificate-identity",o.identity),o.issuer&&a.push("--certificate-oidc-issuer",o.issuer),o.rekorUrl&&a.push("--rekor-url",o.rekorUrl),r.requireTransparencyLog||a.push("--insecure-ignore-tlog");try{let m=await execa("cosign",a,{reject:false});return m.exitCode===0?{verified:true,tlogVerified:r.requireTransparencyLog,message:"Sigstore verification passed.",identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:c,certificatePath:l,signaturePath:i}:{verified:false,tlogVerified:false,message:`Sigstore verification failed: ${m.stderr||m.stdout||"unknown error"}`,identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:c,certificatePath:l,signaturePath:i}}catch(m){return {verified:false,tlogVerified:false,message:`Sigstore verification error: ${m.message}`,identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:c,certificatePath:l,signaturePath:i}}}async function xl(t,e){let o=e.algorithm||"sha256",r=Ke(t,e.policyPath),n=Ke(t,e.signaturePath),i=Ke(t,e.publicKeyPath);if(!await E.pathExists(r))return {verified:false,message:`Governance policy bundle not found: ${r}`,policies:null};if(!await E.pathExists(n))return {verified:false,message:`Governance policy signature not found: ${n}`,policies:null};if(!await E.pathExists(i))return {verified:false,message:`Governance policy public key not found: ${i}`,policies:null};try{let a=await promises.readFile(r,"utf-8"),l=(await promises.readFile(n,"utf-8")).trim(),c=await promises.readFile(i,"utf-8"),d=createVerify(o);return d.update(a),d.end(),d.verify(c,Buffer.from(l,"base64"))?{verified:true,message:"Governance policy bundle verified.",policies:JSON.parse(a).policies||{}}:{verified:false,message:"Governance policy bundle signature verification failed.",policies:null}}catch(a){return {verified:false,message:`Governance policy bundle verification error: ${a.message}`,policies:null}}}async function an(t,e){let o$1=[],r={syncedArtifacts:0,verifiedArtifacts:0,rotatedFiles:0,lockWritten:false,governanceBundleVerified:false,transparencyEvidenceWritten:false,transparencyEvidenceRecords:0,evidenceExported:false,evidenceExportTarget:null},n=o(t,"mirror-config.json").find(U=>E.pathExistsSync(U))??l(t,"mirror-config.json"),i=l(t,"mirror.lock"),a=l(t,"mirror","artifacts"),l$1=l(t,"reports"),c=await yl(t);if(!await E.pathExists(n))return o$1.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: .workspai/mirror-config.json not found."}),{checks:o$1,details:r};let d={};try{d=JSON.parse(await promises.readFile(n,"utf-8"));}catch{return o$1.push({id:"mirror.lifecycle.config",status:"failed",message:"Mirror lifecycle failed: invalid JSON in mirror-config.json."}),{checks:o$1,details:r}}if(!(e.forceRun===true||e.ciMode||e.offlineMode||d.mode==="offline-only"))return o$1.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: not in ci/offline mode."}),{checks:o$1,details:r};await E.ensureDir(a);let p=Math.max(0,d.prefetch?.retries??2),u=Math.max(0,d.prefetch?.backoffMs??250),f=Math.max(1e3,d.prefetch?.timeoutMs??15e3),g=d.security?.requireAttestation===true,h=d.security?.requireSigstore===true,k=d.security?.requireTransparencyLog===true,b=d.security?.requireSignedGovernance===true,w=d.security?.evidenceExport,y=(process.env.RAPIDKIT_ENV||d.security?.governance?.environment||"dev").toLowerCase(),x=d.security?.governance?.policies||{};if(d.security?.governanceBundle){let U=await xl(t,d.security.governanceBundle);if(o$1.push({id:"governance.bundle.verify",status:U.verified?"passed":"failed",message:U.message}),U.verified&&U.policies)x=U.policies,r.governanceBundleVerified=true;else if(b)return {checks:o$1,details:r}}let S=x[y],A=k||S?.requireTransparencyLog===true,I=[],Y=Array.isArray(d.artifacts)?d.artifacts:[],te=[];for(let U=0;U<Y.length;U+=1){let D=Y[U],R=D.id||`artifact-${U+1}`,ue=D.source?Ke(t,D.source):null,ie=hl(D,R),H=v.join(a,ie),Z=false,je={sourceType:"path",source:ue||D.url||"unknown",host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true};if(ue&&await E.pathExists(ue))await E.ensureDir(v.dirname(H)),await E.copyFile(ue,H),r.syncedArtifacts+=1,Z=true,je={sourceType:"path",source:ue,host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true},o$1.push({id:`mirror.sync.${R}`,status:"passed",message:`Mirrored artifact ${R} from source path.`});else if(D.url){let Ee="";try{Ee=new URL(D.url).hostname.toLowerCase();}catch{o$1.push({id:`mirror.prefetch.${R}`,status:"failed",message:`Invalid URL for ${R}: ${D.url}`});continue}if(!(process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||c.has(Ee))){o$1.push({id:`mirror.prefetch.trust.${R}`,status:"failed",message:`Untrusted mirror host for ${R}: ${Ee}. Add host to .workspai/trusted-sources.lock or set RAPIDKIT_TRUSTED_SOURCES=1.`});continue}if(e.offlineMode&&(await E.pathExists(H)?(Z=true,je={sourceType:"url",source:D.url,host:Ee,fetchedAt:new Date().toISOString(),attempts:0,trusted:true},o$1.push({id:`mirror.prefetch.${R}`,status:"passed",message:`Offline mode reused existing mirrored artifact ${R}.`})):o$1.push({id:`mirror.prefetch.${R}`,status:"failed",message:`Offline mode cannot prefetch remote artifact ${R} without an existing mirrored copy.`}),!Z))continue;if(!Z){let ye=null,xt=0;for(let Ye=1;Ye<=p+1;Ye+=1){xt=Ye;try{await wl(D.url,H,f),r.syncedArtifacts+=1,Z=true,je={sourceType:"url",source:D.url,host:Ee,fetchedAt:new Date().toISOString(),attempts:xt,trusted:true},o$1.push({id:`mirror.prefetch.${R}`,status:"passed",message:xt>1?`Prefetched artifact ${R} from ${Ee} after ${xt} attempts.`:`Prefetched artifact ${R} from ${Ee}.`});break}catch(j){if(ye=j,Ye<=p){await Ui(u*Ye);continue}}}if(!Z){o$1.push({id:`mirror.prefetch.${R}`,status:"failed",message:`Failed to prefetch ${R} after ${p+1} attempt(s): ${ye?.message||"unknown error"}`});continue}}if(!Z){o$1.push({id:`mirror.prefetch.${R}`,status:"failed",message:`Failed to prefetch ${R}.`});continue}}if(!Z){D.required||e.offlineMode?o$1.push({id:`mirror.sync.${R}`,status:"failed",message:`Mirror source missing for ${R}${ue?`: ${ue}`:""}`}):o$1.push({id:`mirror.sync.${R}`,status:"skipped",message:`Mirror source not found for optional artifact ${R}.`});continue}let Ve=await gl(H);if(D.sha256&&D.sha256.toLowerCase()!==Ve.toLowerCase()){o$1.push({id:`mirror.verify.${R}`,status:"failed",message:`Checksum mismatch for ${R}.`});continue}r.verifiedArtifacts+=1,o$1.push({id:`mirror.verify.${R}`,status:"passed",message:`Checksum verified for ${R}.`});let he=D.attestation?await bl(t,H,D.attestation):null;if(D.attestation){if(o$1.push({id:`mirror.attest.${R}`,status:he?.verified?"passed":"failed",message:he?.message||"Attestation verification failed."}),!he?.verified)continue}else if(g){o$1.push({id:`mirror.attest.${R}`,status:"failed",message:`Attestation is required but missing for ${R}.`});continue}else o$1.push({id:`mirror.attest.${R}`,status:"skipped",message:`No attestation provided for ${R}.`});let Re=D.attestation?.sigstore,G=Re?await Sl(t,H,Re,{requireTransparencyLog:A}):null;if(Re){if(o$1.push({id:`mirror.sigstore.${R}`,status:G?.verified?"passed":"failed",message:G?.message||"Sigstore verification failed."}),I.push({artifactId:R,verified:!!G?.verified,tlogVerified:!!G?.tlogVerified,identity:G?.identity||null,issuer:G?.issuer||null,rekorUrl:G?.rekorUrl||null,timestamp:new Date().toISOString(),environment:y}),!G?.verified)continue}else if(h){o$1.push({id:`mirror.sigstore.${R}`,status:"failed",message:`Sigstore attestation is required but missing for ${R}.`});continue}else o$1.push({id:`mirror.sigstore.${R}`,status:"skipped",message:`No Sigstore attestation provided for ${R}.`});if(Re&&G?.verified&&S){let Ee=S.allowedIdentities||[];if(Ee.length>0){let ye=!!G.identity&&Ee.includes(G.identity);if(o$1.push({id:`mirror.sigstore.policy.identity.${R}`,status:ye?"passed":"failed",message:ye?`Sigstore identity policy passed for ${R} in ${y}.`:`Sigstore identity policy failed for ${R} in ${y}.`}),!ye)continue}let lo=S.allowedIssuers||[];if(lo.length>0){let ye=!!G.issuer&&lo.includes(G.issuer);if(o$1.push({id:`mirror.sigstore.policy.issuer.${R}`,status:ye?"passed":"failed",message:ye?`Sigstore issuer policy passed for ${R} in ${y}.`:`Sigstore issuer policy failed for ${R} in ${y}.`}),!ye)continue}let St=S.allowedRekorUrls||[];if(St.length>0){let ye=!!G.rekorUrl&&St.includes(G.rekorUrl);if(o$1.push({id:`mirror.sigstore.policy.rekor.${R}`,status:ye?"passed":"failed",message:ye?`Sigstore Rekor policy passed for ${R} in ${y}.`:`Sigstore Rekor policy failed for ${R} in ${y}.`}),!ye)continue}}else S&&o$1.push({id:`mirror.sigstore.policy.${R}`,status:"skipped",message:`Sigstore governance policy configured for ${y} but no verified Sigstore attestation for ${R}.`});let $e=await promises.stat(H);te.push({id:R,path:v.relative(t,H),sha256:Ve,size:$e.size,provenance:je,attestation:{detached:{provided:!!D.attestation,verified:he?.verified||false,algorithm:he?.algorithm||null,publicKeyPath:he?.publicKeyPath||null,publicKeyFingerprint:he?.publicKeyFingerprint||null,signature:he?.signature||null,verifiedAt:he?.verified?new Date().toISOString():null},sigstore:{provided:!!Re,verified:G?.verified||false,tlogVerified:G?.tlogVerified||false,identity:G?.identity||null,issuer:G?.issuer||null,rekorUrl:G?.rekorUrl||null,bundlePath:G?.bundlePath||null,certificatePath:G?.certificatePath||null,signaturePath:G?.signaturePath||null,verifiedAt:G?.verified?new Date().toISOString():null}}});}let K=d.retention?.keepLast;if(typeof K=="number"&&K>0){let D=(await promises.readdir(a,{withFileTypes:true})).filter(R=>R.isFile()).map(R=>v.join(a,R.name));if(D.length>K){let R=await Promise.all(D.map(async ie=>({filePath:ie,stat:await promises.stat(ie)})));R.sort((ie,H)=>H.stat.mtimeMs-ie.stat.mtimeMs);let ue=R.slice(K);for(let ie of ue)await promises.unlink(ie.filePath),r.rotatedFiles+=1;}}o$1.push({id:"mirror.rotate",status:"passed",message:r.rotatedFiles>0?`Mirror retention rotation removed ${r.rotatedFiles} file(s).`:"Mirror retention rotation completed with no removals."});let B={schemaVersion:"1.0",generatedAt:new Date().toISOString(),mode:d.mode||null,environment:y,artifacts:te};if(await promises.writeFile(i,`${JSON.stringify(B,null,2)}
152
- `,"utf-8"),r.lockWritten=true,o$1.push({id:"mirror.lock.write",status:"passed",message:`Mirror lock updated at ${v.relative(t,i)}.`}),r.transparencyEvidenceRecords=I.length,I.length>0){let U={schemaVersion:"1.0",generatedAt:new Date().toISOString(),environment:y,records:I},D=new Date().toISOString().replace(/[:.]/g,"-"),R=v.join(l$1,`transparency-evidence-${D}.json`),ue=v.join(l$1,"transparency-evidence.latest.json");if(await E.ensureDir(l$1),await Gi(R,U),await Gi(ue,U),r.transparencyEvidenceWritten=true,o$1.push({id:"sigstore.evidence.write",status:"passed",message:`Transparency evidence written to ${v.relative(t,ue)}.`}),w?.enabled){let ie=Math.max(1e3,w.timeoutMs??1e4);if(w.target==="file")if(!w.filePath)o$1.push({id:"sigstore.evidence.export.file",status:"failed",message:"Evidence export target=file requires security.evidenceExport.filePath."});else try{let H=Ke(t,w.filePath);await E.ensureDir(v.dirname(H)),await promises.appendFile(H,`${JSON.stringify(U)}
153
- `,"utf-8"),r.evidenceExported=true,r.evidenceExportTarget=H,o$1.push({id:"sigstore.evidence.export.file",status:"passed",message:`Transparency evidence exported to file sink ${H}.`});}catch(H){o$1.push({id:"sigstore.evidence.export.file",status:"failed",message:`Evidence file export failed: ${H.message}`});}else if(w.target==="http")if(!w.endpoint)o$1.push({id:"sigstore.evidence.export.http",status:"failed",message:"Evidence export target=http requires security.evidenceExport.endpoint."});else {let H=Math.max(0,w.retries??0),Z=Math.max(0,w.backoffMs??500),je=Pl(U,w.signing);je.error&&o$1.push({id:"sigstore.evidence.export.http",status:"failed",message:je.error});try{let Ve=w.authTokenEnv?process.env[w.authTokenEnv]:void 0,he=false,Re=null;for(let G=1;G<=H+1;G+=1)try{if(je.error)throw new Error(je.error);await kl(w.endpoint,U,ie,Ve,je.headers),r.evidenceExported=true,r.evidenceExportTarget=w.endpoint,o$1.push({id:"sigstore.evidence.export.http",status:"passed",message:G>1?`Transparency evidence exported to HTTP endpoint ${w.endpoint} after ${G} attempts.`:`Transparency evidence exported to HTTP endpoint ${w.endpoint}.`}),he=true;break}catch($e){Re=$e,G<=H&&await Ui(Z*G);}if(!he)throw Re||new Error("unknown evidence export error")}catch(Ve){let he=`Evidence HTTP export failed: ${Ve.message}`;o$1.push({id:"sigstore.evidence.export.http",status:"failed",message:he});try{let Re=await vl(t,w.deadLetterPath,U,he);o$1.push({id:"sigstore.evidence.export.deadletter",status:"passed",message:`Evidence export failure persisted to dead-letter sink ${Re}.`});}catch(Re){o$1.push({id:"sigstore.evidence.export.deadletter",status:"failed",message:`Evidence dead-letter write failed: ${Re.message}`});}}}if(w.failOnError&&o$1.some(Z=>Z.status==="failed"&&(Z.id==="sigstore.evidence.export.file"||Z.id==="sigstore.evidence.export.http")))return {checks:o$1,details:r}}else o$1.push({id:"sigstore.evidence.export",status:"skipped",message:"Central evidence export not configured (security.evidenceExport.enabled=false)."});}else o$1.push({id:"sigstore.evidence.write",status:"skipped",message:"No Sigstore records available for transparency evidence output."}),o$1.push({id:"sigstore.evidence.export",status:"skipped",message:"Central evidence export skipped because no transparency evidence records exist."});return {checks:o$1,details:r}}function or(t){let e=a$l(t.detection.runtime),o=o$3({runtime:t.detection.runtime,moduleSupport:t.moduleSupport,projectPath:t.projectPath,framework:t.detection.key}),r=[];r.push({id:"framework-detection",status:t.detection.key==="unknown"?"warn":"pass",message:t.detection.key==="unknown"?"Workspai could not confidently identify the project framework.":`Detected ${t.detection.displayName} with ${t.detection.confidence} confidence.`,recommendation:t.detection.key==="unknown"?"Add .workspai/project.json metadata or import a project with recognizable runtime manifests.":void 0}),r.push({id:"runtime-support",status:e.tier==="observed"?"warn":"pass",message:`${e.displayName} is supported at ${e.tier} tier.`,recommendation:e.tier==="observed"?"Observed runtimes are contract-aware but may need manual commands until a first-class kit exists.":void 0}),r.push({id:"module-mutation-policy",status:t.moduleSupport?"pass":"warn",message:t.moduleSupport?"RapidKit Core module mutation is enabled for this project.":"RapidKit Core module mutation is disabled for this imported project.",recommendation:t.moduleSupport?void 0:"Use project lifecycle and workspace governance commands; enable module_support only after validating a compatible module generator."}),r.push({id:"lifecycle-commands",status:o.lifecycleCommands.length>1?"pass":"warn",message:o.lifecycleCommands.length>1?`Lifecycle commands available: ${o.lifecycleCommands.join(", ")}.`:"Only help-level lifecycle support is available for this runtime today.",recommendation:o.lifecycleCommands.length>1?void 0:"Add runtime scripts or a Workspai runtime adapter before relying on dev/test/build/start."});let n=r.some(a=>a.status==="fail"),i=r.some(a=>a.status==="warn");return {schemaVersion:1,kind:"rapidkit.import_readiness",generatedAt:(t.generatedAt??new Date).toISOString(),status:n?"blocked":i?"review":"ready",project:{name:t.projectName,relativePath:t.relativePath,...t.projectKind?{kind:t.projectKind}:{},source:t.source},detection:{runtime:t.detection.runtime,framework:t.detection.key,frameworkDisplayName:t.detection.displayName,confidence:t.detection.confidence,supportTier:t.detection.supportTier,importStack:t.detection.importStack},commandSupport:{lifecycleCommands:o.lifecycleCommands,unsupportedLifecycleCommands:o.unsupportedLifecycleCommands,moduleCommands:o.moduleCommands},checks:r}}function Cl(t){if(typeof t?.kit_name=="string")return t.kit_name;if(typeof t?.kit=="string")return t.kit}function rr(t){if(t.existingProjectJson?.module_support===true){let e=Cl(t.existingProjectJson),o=e?a$4(e):void 0;return o?.owner==="core"&&o.moduleSupport===true}return false}function zi(t){return t.replace(/\\/g,"/")}function jl(t,e){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,80)||e}function Rl(t,e){let o=zi(v.relative(t,e));return !o||o.startsWith("..")?true:o.split("/").filter(Boolean).some(r=>r==="..")}function oo(t){let e=zi(v.relative(t.workspacePath,t.projectPath)),o=Rl(t.workspacePath,t.projectPath),r=jl(t.projectName,v.basename(t.projectPath)),n=o?`external/${r}`:e||r;return {relativePath:e||n,contractRelativePath:n,isExternal:o}}var Xi={"python-only":"python","node-only":"node","go-only":"go","java-only":"java","dotnet-only":"dotnet"},Al={python:"Python",node:"Node",go:"Go",java:"Java",dotnet:".NET",php:"PHP",ruby:"Ruby",rust:"Rust",elixir:"Elixir",clojure:"Clojure",scala:"Scala",kotlin:"Kotlin",deno:"Deno",bun:"Bun",c:"C",cpp:"C++",unknown:"Unknown"},Il={python:"python-only",node:"node-only",go:"go-only",java:"java-only",dotnet:"dotnet-only"},Yi=["node","deno","bun","python","go","java","kotlin","scala","dotnet","php","ruby","rust","elixir","clojure","c","cpp","unknown"];function ln(t){return t==="bun"||t==="deno"?"node":t==="kotlin"||t==="scala"?"java":t}function dn(t){return typeof t!="string"||t.trim().length===0?"minimal":t.trim().toLowerCase()}function ro(t){if(typeof t!="string")return "unknown";let e=t.trim().toLowerCase();return e==="python"||e==="node"||e==="go"||e==="java"||e==="dotnet"||e==="php"||e==="ruby"||e==="rust"||e==="elixir"||e==="clojure"||e==="scala"||e==="kotlin"||e==="deno"||e==="bun"||e==="c"||e==="cpp"?e:e==="c++"||e==="cplusplus"||e==="cc"||e==="clang++"||e==="g++"?"cpp":e==="clang"||e==="gcc"?"c":"unknown"}function nr(t){let e=new Set;for(let o of t)e.add(ro(o));return [...e].sort((o,r)=>Yi.indexOf(o)-Yi.indexOf(r))}function $l(t){let e=nr(t).filter(o=>o!=="unknown");if(e.length!==0)return e.length===1?Il[e[0]]:"polyglot"}function Qi(t,e={}){return `npx workspai bootstrap --profile ${t}${e.ci?" --ci --json":""}`}function Ml(t,e){return t?"none":e==="strict"?"error":"warning"}function no(t){let e=t.ok?void 0:$l(t.runtimes)??"polyglot";return {ok:t.ok,checkId:t.checkId,status:t.ok?"passed":"failed",profile:t.profile,runtimes:t.runtimes,message:t.message,recommendedProfile:e,recommendedCommand:e?Qi(e):void 0,ciRecommendedCommand:e?Qi(e,{ci:true}):void 0,severity:Ml(t.ok,t.mode)}}function wt(t){let e=dn(t.profile),o=nr(t.runtimes),r=t.mode??"warn",n=Xi[e];if(n){let i=o.length===0||o.every(a=>ln(a)===n);return no({ok:i,checkId:`profile.${e}`,profile:e,runtimes:o,message:i?`${e} profile validated for discovered projects.`:`${e} profile mismatch: detected runtimes [${o.join(", ")}].`,mode:r})}if(e==="minimal"){let i=o.filter(c=>c!=="unknown"),l=new Set(i.map(c=>ln(c))).size<=1;return no({ok:l,checkId:"profile.minimal",profile:e,runtimes:o,message:l?"minimal profile is compatible with detected runtime mix.":`minimal profile mismatch: multiple runtimes detected [${i.join(", ")}].`,mode:r})}return no({ok:true,checkId:`profile.${e}`,profile:e,runtimes:o,message:`${e} profile accepts the detected runtime mix.`,mode:r})}function lt(t){let e=dn(t.profile),o=ro(t.runtime),r=t.mode??"warn",n=Xi[e];if(!n||o==="unknown")return no({ok:true,checkId:`profile.${e}`,profile:e,runtimes:[o],message:o==="unknown"?`Project "${t.subjectLabel}" runtime is unknown; profile compatibility will be checked by workspace doctor.`:`${e} profile accepts project "${t.subjectLabel}".`,mode:r});let i=ln(o)===n;return no({ok:i,checkId:`profile.${e}`,profile:e,runtimes:i?[o]:nr([n,o]),message:i?`Project "${t.subjectLabel}" is compatible with workspace profile "${e}".`:`Project "${t.subjectLabel}" is ${Al[o]}, but workspace profile is "${e}".`,mode:r})}async function Ft(t){let e=(await Promise.all(o(t,"policies.yml").map(async o=>await E__default.pathExists(o)?o:null))).find(o=>typeof o=="string");if(!e)return "warn";try{return (await E__default.readFile(e,"utf-8")).match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]==="strict"?"strict":"warn"}catch{return "warn"}}async function Lt(t){let e=(await Promise.all(o(t,"workspace.json").map(async o=>await E__default.pathExists(o)?o:null))).find(o=>typeof o=="string");if(!e)return "minimal";try{let o=await E__default.readJson(e);return dn(o.profile)}catch{return "minimal"}}async function kt(t,e={}){let o=new Set,r=[],n=new Set,i=[t];for(;i.length>0;){let a=i.pop();if(!a||n.has(a))continue;n.add(a);let l=[];try{l=await P.promises.readdir(a,{withFileTypes:true});}catch{continue}for(let c of l){if(!c.isDirectory()||c.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(c.name))continue;let d=v.join(a,c.name);if(d!==t&&f$5(d))continue;if((await Promise.all([...p(d,"context.json"),...p(d,"project.json")].map(async p=>E__default.pathExists(p)))).some(Boolean)){r.push(d);continue}i.push(d);}}for(let a of r){let l=d$4(a);o.add(ro(i$3(a,l).runtime));}for(let a of await a$k(t))o.add(ro(a.runtime));for(let a of e.additionalRuntimes??[])o.add(ro(a));return nr(o)}function sr(t,e={}){let o=e.ci?t.ciRecommendedCommand:t.recommendedCommand;return o?`Recommended: ${o}`:null}function Zi(t){return t.trim().toLowerCase().replace(/\.git$/i,"").replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,64)}function Nl(t){let e=t.trim();if(!e)return "imported-project";let o=e.replace(/\\/g,"/").replace(/\/+$/,"").split("/"),r=o[o.length-1]||e,n=r.split(":"),i=(n[n.length-1]||r).replace(/\.git$/i,"");return Zi(i)||"imported-project"}function pn(t){let e=t.trim();return e.includes("://")||e.startsWith("git@")}function Wl(t){return pn(t)?"git-url":"local-folder"}async function Dl(t,e){let o=Zi(e)||"imported-project",r=0;for(;;){let n=r===0?o:r===1?`${o}-imported`:`${o}-imported-${r}`,i=v.join(t,n);if(!await E__default.pathExists(i))return i;r+=1;}}function Tl(t,e){let o=v.resolve(t),r=v.resolve(e),n=v.relative(o,r);return n===""||n.length>0&&!n.startsWith("..")&&!v.isAbsolute(n)}function Fl(t,e){if(Tl(t,e))throw new Error("Import source must be outside the current workspace root.")}function Ll(t){return t.startsWith(".env")?![".env.example",".env.sample",".env.template",".env.defaults",".env.dist"].includes(t):false}function Jl(t){let e=v.basename(t);return !([".git","node_modules",".venv","venv","__pycache__",".pytest_cache",".mypy_cache",".ruff_cache",".next",".turbo",".cache","dist","build","target","bin","obj","vendor","packages"].includes(e)||Ll(e)||e.endsWith(".pem")||e.endsWith(".key"))}async function Kl(t){for(let e of p(t,"project.json"))if(await E__default.pathExists(e))try{return await E__default.readJson(e)}catch{return null}return null}async function Gl(t){let e=new Date().toISOString(),o=typeof t.existingProjectJson?.name=="string"?t.existingProjectJson.name:v.basename(t.projectPath),r=oo({workspacePath:t.workspacePath,projectPath:t.projectPath,projectName:o}),n=r.contractRelativePath,i=q$1(t.projectPath,"project.json"),a=q$1(t.projectPath,"import.json"),l=q$1(t.projectPath,"import-readiness.json"),c=rr({existingProjectJson:t.existingProjectJson}),d=Array.isArray(t.existingProjectJson?.modules)?t.existingProjectJson.modules:[],m=t.existingProjectJson?.contracts&&typeof t.existingProjectJson.contracts=="object"&&!Array.isArray(t.existingProjectJson.contracts)?t.existingProjectJson.contracts:{owns:[],apis:[],publishes:[],consumes:[],dependsOn:[],env:[]},p={...t.existingProjectJson||{},schema_version:typeof t.existingProjectJson?.schema_version=="string"?t.existingProjectJson.schema_version:"1.0",name:typeof t.existingProjectJson?.name=="string"?t.existingProjectJson.name:v.basename(t.projectPath),slug:typeof t.existingProjectJson?.slug=="string"?t.existingProjectJson.slug:v.basename(t.projectPath),kind:t.projectKind,runtime:t.detection.runtime,framework:t.detection.key,kit:typeof t.existingProjectJson?.kit=="string"?t.existingProjectJson.kit:`imported.${t.detection.key}`,kit_name:typeof t.existingProjectJson?.kit_name=="string"?t.existingProjectJson.kit_name:`imported.${t.detection.key}`,engine:typeof t.existingProjectJson?.engine=="string"?t.existingProjectJson.engine:"npm",module_support:c,modules:d,contracts:m,import:{managed_by:"workspai",source_type:t.sourceType,imported_at:e,relative_path:n,discovered_relative_path:r.relativePath,is_external:r.isExternal,detection:{framework:t.detection.key,runtime:t.detection.runtime,confidence:t.detection.confidence,support_tier:t.detection.supportTier,source:t.detection.source}}},u={schema_version:"1.0",kind:"workspai.imported_project",imported_at:e,managed_by:"workspai",source:{type:t.sourceType,name:v.basename(t.projectPath)},project:{name:p.name,slug:p.slug,relative_path:n,kind:t.projectKind,module_support:c},detection:{framework:t.detection.key,framework_display_name:t.detection.displayName,runtime:t.detection.runtime,kind:t.projectKind,confidence:t.detection.confidence,support_tier:t.detection.supportTier,import_stack:t.detection.importStack,source:t.detection.source},policy:{copied_secrets:false,copied_dependency_caches:false,module_mutation_enabled:c,profile_compatibility:{ok:t.profileCompatibility.ok,profile:t.profileCompatibility.profile,runtimes:t.profileCompatibility.runtimes,message:t.profileCompatibility.message,recommended_profile:t.profileCompatibility.recommendedProfile,recommended_command:t.profileCompatibility.recommendedCommand}}},f=or({projectName:String(p.name),relativePath:n,projectKind:t.projectKind,source:t.sourceType,detection:t.detection,moduleSupport:c,projectPath:t.projectPath,generatedAt:new Date(e)});return await E__default.ensureDir(v.dirname(i)),await E__default.writeJson(i,p,{spaces:2}),await E__default.writeJson(a,u,{spaces:2}),await E__default.writeJson(l,f,{spaces:2}),{projectJsonPath:i,importJsonPath:a,importReadinessPath:l,moduleSupport:c}}async function Ul(t,e){let o={name:e.name,path:e.path,relativePath:e.relativePath,stack:e.stack,runtime:e.runtime,framework:e.framework,frameworkDisplayName:e.frameworkDisplayName,supportTier:e.supportTier,moduleSupport:e.moduleSupport,confidence:e.confidence,source:e.source,importedAt:new Date().toISOString()};await b$9(t,[o]);}async function ea(t){await E__default.pathExists(t)&&await E__default.remove(t);}async function ta(t,e){await ea(e),await c$3(t,[e]);}async function oa(t){let e=v.resolve(t.workspacePath),o=t.source.trim(),r=t.sourceType??Wl(o),n=t.name??(r==="git-url"?Nl(o):v.basename(o)),i=await Dl(e,n),a=false;try{if(r==="local-folder"){let w=v.resolve(o),y=await E__default.stat(w).catch(()=>null);if(!y||!y.isDirectory())throw new Error("Import source is not a directory.");if(f$5(w))throw new Error("This is a workspace. Import it as a workspace instead.");Fl(e,w),a=true,await E__default.copy(w,i,{overwrite:false,errorOnExist:true,filter:Jl});}else a=true,await execa("git",["clone","--depth","1",o,i],{timeout:12e4});let l=await Kl(i),c=i$3(i,l),d=await h$3(i,l),[m,p]=await Promise.all([Lt(e),t.profilePolicyMode?Promise.resolve(t.profilePolicyMode):Ft(e)]),u=lt({profile:m,runtime:c.runtime,subjectLabel:v.basename(i),mode:p}),f=wt({profile:m,runtimes:await kt(e,{additionalRuntimes:[c.runtime]}),mode:p}),g=u.ok?f:u;if(!g.ok&&p==="strict")throw new Error(g.message);let h=await Gl({workspacePath:e,projectPath:i,sourceType:r,detection:c,existingProjectJson:l,projectKind:d,profileCompatibility:g}),k=oo({workspacePath:e,projectPath:i,projectName:v.basename(i)}),b={name:v.basename(i),path:i,relativePath:k.contractRelativePath,stack:c.importStack,runtime:c.runtime,framework:c.key,frameworkDisplayName:c.displayName,supportTier:c.supportTier,moduleSupport:h.moduleSupport,confidence:c.confidence,source:r,projectJsonPath:h.projectJsonPath,importJsonPath:h.importJsonPath,importReadinessPath:h.importReadinessPath,profileCompatibility:g};return await Ul(e,b),b}catch(l){if(a)try{await ea(i);}catch(c){let d=l instanceof Error?l.message:String(l),m=c instanceof Error?c.message:String(c);throw new Error(`Import failed: ${d}. Rollback also failed: ${m}`)}throw l}}function Vl(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,64)}function Bl(t,e){return v.resolve(t)===v.resolve(e)}async function Hl(t){for(let e of p(t,"project.json"))if(await E__default.pathExists(e))try{return await E__default.readJson(e)}catch{return null}return null}function ql(t){let e=Array.isArray(t.existingProjectJson?.modules)?t.existingProjectJson.modules:[],o=t.existingProjectJson?.contracts&&typeof t.existingProjectJson.contracts=="object"&&!Array.isArray(t.existingProjectJson.contracts)?t.existingProjectJson.contracts:{owns:[],apis:[],publishes:[],consumes:[],dependsOn:[],env:[]};return {...t.existingProjectJson||{},schema_version:typeof t.existingProjectJson?.schema_version=="string"?t.existingProjectJson.schema_version:"1.0",name:typeof t.existingProjectJson?.name=="string"?t.existingProjectJson.name:t.projectName,slug:typeof t.existingProjectJson?.slug=="string"?t.existingProjectJson.slug:t.projectName,kind:t.projectKind,runtime:t.detection.runtime,framework:t.detection.key,kit:typeof t.existingProjectJson?.kit=="string"?t.existingProjectJson.kit:`adopted.${t.detection.key}`,kit_name:typeof t.existingProjectJson?.kit_name=="string"?t.existingProjectJson.kit_name:`adopted.${t.detection.key}`,engine:typeof t.existingProjectJson?.engine=="string"?t.existingProjectJson.engine:"npm",module_support:t.moduleSupport,modules:e,contracts:o,adoption:{managed_by:"workspai",mode:"linked",adopted_at:t.adoptedAt,relative_path:t.contractRelativePath,discovered_relative_path:t.discoveredRelativePath,is_external:t.isExternal,detection:{framework:t.detection.key,runtime:t.detection.runtime,confidence:t.detection.confidence,support_tier:t.detection.supportTier,source:t.detection.source}}}}async function ra(t,e,o){let r=p(e,"project.json"),n=q$1(e,"project.json"),i=p(e,"adopt.json"),a=p(e,"adopt-readiness.json");if(o)await E__default.ensureDir(v.dirname(n)),await E__default.writeJson(n,o,{spaces:2});else for(let c of r)await E__default.pathExists(c)&&await E__default.remove(c);for(let c of i)await E__default.pathExists(c)&&await E__default.remove(c);for(let c of a)await E__default.pathExists(c)&&await E__default.remove(c);let{removeImportedProjectsRegistryEntries:l}=await import('./imported-projects-registry-FOIE27WT.js');await l(t,[e]);}async function na(t){let e=v.resolve(t.workspacePath),o=v.resolve(t.source),r=await E__default.stat(o).catch(()=>null);if(!r||!r.isDirectory())throw new Error("Adopt source is not a directory.");if(Bl(e,o))throw new Error("Adopt source cannot be the workspace root itself.");if(f$5(o))throw new Error("This is a workspace. Import it as a workspace instead.");let n=await Hl(o),i=i$3(o,n),a=await h$3(o,n),l=Vl(t.name||(typeof n?.name=="string"?n.name:"")||v.basename(o))||"adopted-project",c=oo({workspacePath:e,projectPath:o,projectName:l}),d=(t.now??new Date).toISOString(),m=q$1(o,"project.json"),p=q$1(o,"adopt.json"),u=q$1(o,"adopt-readiness.json"),f=rr({existingProjectJson:n}),[g,h]=await Promise.all([Lt(e),t.profilePolicyMode?Promise.resolve(t.profilePolicyMode):Ft(e)]),k=lt({profile:g,runtime:i.runtime,subjectLabel:l,mode:h}),b=wt({profile:g,runtimes:await kt(e,{additionalRuntimes:[i.runtime]}),mode:h}),w=k.ok?b:k;if(!w.ok&&h==="strict")throw new Error(w.message);let y=ql({projectName:l,contractRelativePath:c.contractRelativePath,isExternal:c.isExternal,discoveredRelativePath:c.relativePath,detection:i,existingProjectJson:n,projectKind:a,moduleSupport:f,adoptedAt:d}),x={schema_version:"1.0",kind:"workspai.adopted_project",adopted_at:d,managed_by:"workspai",mode:"linked",workspace:{path:e},project:{name:l,path:o,relative_path:c.contractRelativePath,discovered_relative_path:c.relativePath,is_external:c.isExternal,kind:a,module_support:f},detection:{framework:i.key,framework_display_name:i.displayName,runtime:i.runtime,kind:a,confidence:i.confidence,support_tier:i.supportTier,import_stack:i.importStack,source:i.source},policy:{moved_source:false,copied_source:false,module_mutation_enabled:f,workspace_contract:"linked-project",profile_compatibility:{ok:w.ok,profile:w.profile,runtimes:w.runtimes,message:w.message,recommended_profile:w.recommendedProfile,recommended_command:w.recommendedCommand}}},S=or({projectName:l,relativePath:c.contractRelativePath,projectKind:a,source:"adopted-local",detection:i,moduleSupport:f,projectPath:o,generatedAt:new Date(d)});if(t.dryRun!==true){await E__default.ensureDir(v.dirname(m)),await E__default.writeJson(m,y,{spaces:2}),await E__default.writeJson(p,x,{spaces:2}),await E__default.writeJson(u,S,{spaces:2});let A={name:l,path:o,relativePath:c.contractRelativePath,relationship:"adopted",stack:i.importStack,runtime:i.runtime,framework:i.key,frameworkDisplayName:i.displayName,supportTier:i.supportTier,moduleSupport:f,confidence:i.confidence,source:"adopted-local",importedAt:d};await b$9(e,[A]);}return {name:l,path:o,relativePath:c.relativePath,contractRelativePath:c.contractRelativePath,isExternal:c.isExternal,relationship:"adopted",stack:i.importStack,runtime:i.runtime,framework:i.key,frameworkDisplayName:i.displayName,supportTier:i.supportTier,moduleSupport:f,confidence:i.confidence,projectJsonPath:m,adoptJsonPath:p,adoptReadinessPath:u,profileCompatibility:w,wroteFiles:t.dryRun!==true}}function un(t){if(!t||typeof t!="object")return null;let e=t.code;return e==="PYTHON_NOT_FOUND"||e==="BRIDGE_VENV_BOOTSTRAP_FAILED"||e==="BRIDGE_VENV_CREATE_FAILED"||e==="BRIDGE_PIP_BOOTSTRAP_FAILED"?e:null}function Ql(t=process.argv){let e=v.basename(t[1]??"").toLowerCase().replace(/\.(cmd|ps1|exe|js)$/i,"");return e==="rapidkit"||e==="rapidkit-npm"?"rapidkit":"workspai"}function Xl(t){let e=t.trim().toLowerCase();return e?e.startsWith("fastapi")?"fastapi":e.startsWith("nestjs")?"nestjs":null:null}function Ie(t,e){let o=t.indexOf(e);if(o>=0&&o+1<t.length)return t[o+1];let r=t.find(n=>n.startsWith(`${e}=`));if(r)return r.slice(e.length+1)}async function ia(t){let e=oe(process.cwd()),o=t.trim().toLowerCase();if(!e||!o)return true;try{let[r,n]=await Promise.all([Lt(e),Ft(e)]),i=a$4(o),l=k$3(o)?"node":i?.runtime??"python",c=lt({profile:r,runtime:l,subjectLabel:o,mode:n}),d=wt({profile:r,runtimes:await kt(e,{additionalRuntimes:[l]}),mode:n}),m=c.ok?d:c;if(m.ok)return true;let p=sr(m);if(n==="strict")return console.log(s.red(`\u274C Profile violation (strict mode): ${m.message}`)),p&&console.log(s.gray(`\u{1F4A1} ${p}`)),false;console.log(s.yellow(`\u26A0\uFE0F Profile warning: ${m.message}`)),p&&console.log(s.gray(`\u{1F4A1} ${p}`));}catch{}return true}function xn(){return i$6()}function aa(){let t={...process.env},e=t.PATH||"";return e&&(t.PATH=e.split(v.delimiter).filter(o=>!o.replace(/\\/g,"/").includes("/.pyenv/shims")).join(v.delimiter)),t.PYENV_VERSION="system",t.POETRY_PYTHON||(t.POETRY_PYTHON=h$4()),t.RAPIDKIT_SKIP_LOCK_SYNC||(t.RAPIDKIT_SKIP_LOCK_SYNC="1"),t.POETRY_KEYRING_ENABLED||(t.POETRY_KEYRING_ENABLED="false"),t.PYTHON_KEYRING_BACKEND||(t.PYTHON_KEYRING_BACKEND="keyring.backends.null.Keyring"),t.POETRY_NO_INTERACTION||(t.POETRY_NO_INTERACTION="1"),t}function Zl(t){return l$3(v.join(t,".venv"))}async function Ca(t,e){return await z(t,["--version"],e)===0}async function bt(t){let e=v.join(t,"go.mod");if(await E__default.pathExists(e))return "go";let o=v.join(t,"pom.xml"),r=v.join(t,"build.gradle"),n=v.join(t,"build.gradle.kts");if(await E__default.pathExists(o)||await E__default.pathExists(r)||await E__default.pathExists(n))return "java";if((await E__default.pathExists(t)?await P.promises.readdir(t,{withFileTypes:true}):[]).some(p=>p.isFile()&&p.name.toLowerCase().endsWith(".sln")))return "dotnet";let a=v.join(t,"src");if(await E__default.pathExists(a)&&(await P.promises.readdir(a,{withFileTypes:true})).some(u=>u.isFile()&&u.name.toLowerCase().endsWith(".csproj")))return "dotnet";let l=v.join(t,"package.json");if(await E__default.pathExists(l))return "node";let c=v.join(t,"pyproject.toml"),d=v.join(t,"requirements.txt"),m=v.join(t,"poetry.lock");return await E__default.pathExists(c)||await E__default.pathExists(d)||await E__default.pathExists(m)?"python":null}async function ed(t){for(let e of xn())if(await z(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function ja(t){for(let e of xn())if(await z(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function td(t){let e=l$3(v.join(t,".venv"));if(!await E__default.pathExists(e)){let i=await ja(t);if(i!==0)return i}if(!await Ca("poetry",t))return 0;let r=await z("poetry",["config","virtualenvs.in-project","true","--local"],t);if(r!==0)return r;let n=await z("poetry",["env","use",e],t);return n!==0?n:0}async function od(t){let e=l$3(v.join(t,".venv"));if(!await E__default.pathExists(e)){let n=await ja(t);if(n!==0)return n}await z(e,["-m","pip","install","--upgrade","pip","setuptools","wheel"],t);let o=v.join(t,"requirements.txt");if(await E__default.pathExists(o)&&await z(e,["-m","pip","install","-r","requirements.txt"],t)===0)return 0;let r=v.join(t,"pyproject.toml");return await E__default.pathExists(r)&&(await z(e,["-m","pip","install","-e","."],t)===0||await z(e,["-m","pip","install","."],t)===0)?0:1}async function mn(t,e){return await td(t)!==0&&console.log(s.yellow("\u26A0\uFE0F Could not fully configure Poetry local venv. Trying fallback installer...")),(await e.initProject(t)).exitCode===0&&await E__default.pathExists(v.join(t,".venv"))?0:(console.log(s.yellow("\u26A0\uFE0F Python init fallback: installing dependencies directly into project .venv")),await od(t))}async function fn(t){let e=await Pt("init",t);if(e===0)return 0;let o=["npm","pnpm","yarn"];for(let r of o){if(!await Ca(r,t))continue;if(await z(r,["install"],t)===0)return console.log(s.green(`\u2705 Node init fallback succeeded with ${r} install`)),0}return e}function rd(t,e){let o=n=>/^\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?$/.test(n),r=Ie([...e],"--port");if(r&&!/^\d+$/.test(r.trim()))return "Invalid --port. Expected numeric TCP port, e.g. 8080";if(t==="springboot.standard"){let n=Ie([...e],"--java-version"),i=Ie([...e],"--spring-boot-version"),a=Ie([...e],"--springdoc-version"),l=Ie([...e],"--group-id"),c=Ie([...e],"--package-name");if(n&&!/^\d+$/.test(n.trim()))return "Invalid --java-version. Expected major version number, e.g. 21";if(i&&!o(i.trim()))return "Invalid --spring-boot-version. Expected semantic version, e.g. 3.5.0";if(a&&!o(a.trim()))return "Invalid --springdoc-version. Expected semantic version, e.g. 2.8.9";if(l&&!/^[A-Za-z0-9_.-]+$/.test(l.trim()))return "Invalid --group-id. Use dot-separated Java package identifiers only.";if(c&&!/^[A-Za-z0-9_.-]+$/.test(c.trim()))return "Invalid --package-name. Use dot-separated Java package identifiers only."}if(t==="dotnet.webapi.clean"){let n=Ie([...e],"--target-framework"),i=Ie([...e],"--root-namespace");if(n&&!/^net\d+\.\d+$/.test(n.trim()))return "Invalid --target-framework. Expected .NET target framework, e.g. net8.0";if(i&&!/^[A-Za-z0-9_.]+$/.test(i.trim()))return "Invalid --root-namespace. Use dot-separated .NET namespace identifiers only."}return null}async function wn(t){if(t[0]!=="create"||t[1]!=="project")return 1;let e=t[2],o=a$4(e),r=t[3];if(!o||o.owner!=="npm")return 1;if(!r)return process.stderr.write(`Usage: ${o.createUsage??"workspai create project <kit> <name> [--output <dir>]"}
154
- `),1;try{h(r);}catch(d){let m=d instanceof Error?d.message:String(d);return process.stderr.write(`${m}
155
- `),1}let n=rd(o.id,t);if(n)return process.stderr.write(`${n}
156
- `),1;let i=Ie(t,"--output")||process.cwd(),a=v.resolve(i,r),l=t.includes("--skip-git")||t.includes("--no-git"),c=t.includes("--skip-install");try{let{default:d}=await import('fs-extra');if(await d.ensureDir(v.dirname(a)),await d.pathExists(a))return process.stderr.write(`\u274C Directory "${a}" already exists
157
- `),1;await d.ensureDir(a),await e$2(o,{projectName:r,projectPath:a,args:t,skipGit:l,skipInstall:c});let m=oe(process.cwd());if(m){let{syncWorkspaceProjects:p}=await import('./workspace-PR6VZRBG.js');await p(m,true);}return 0}catch(d){return process.stderr.write(`Workspai ${o.id} generator failed: ${d?.message??d}
158
- `),1}}async function ca(t){let e=k$3(t[2]);if(!e)return 1;try{let o=await o$2({args:t});if(!o.dryRun){let r=oe(process.cwd()),n=false;r||(r=(await Cn()).workspacePath,n=true);let{registerProjectInWorkspace:i,registerWorkspace:a,syncWorkspaceProjects:l}=await import('./workspace-PR6VZRBG.js'),c=i$7({workspacePath:r,result:o});await a(r,v.basename(r)),await b$9(r,[c]),await i(r,o.projectName,o.projectPath),await l(r,true),await ot(r,{silent:true}),n&&(console.log(s.gray(`\u2139\uFE0F Project created outside a Workspai workspace \u2014 linked to managed workspace "${e$5}" (${c.relationship}).`)),console.log(s.gray(` Registry: ${v.join(p$2(),"workspaces.json")}`)),console.log(s.gray(" Tip: run from inside a workspace next time, or create one with `workspai create workspace`.")));}return 0}catch(o){return process.stderr.write(`Workspai ${e.kitId} generator failed: ${o?.message??o}
149
+ ${o.stderr||""}`);return r?this.isMavenVersionAtLeast(r,[3,9,0])?{exitCode:0}:{exitCode:1,message:`Maven ${r.join(".")} detected; Maven 3.9+ is required.`}:{exitCode:1,message:"Unable to parse Maven version. Ensure Maven 3.9+ is installed and retry."}}catch{return {exitCode:1,message:"Maven version check failed. Install Maven 3.9+ and ensure mvn is on PATH."}}}shouldUseGradleNoDaemon(){return process.env.CI==="true"||process.env.RAPIDKIT_GRADLE_NO_DAEMON==="1"}inspectJavaProject(e){let o=S.existsSync(C.join(e,"pom.xml")),r=S.existsSync(C.join(e,"mvnw"))||S.existsSync(C.join(e,"mvnw.cmd")),n=S.existsSync(C.join(e,"build.gradle"))||S.existsSync(C.join(e,"build.gradle.kts"))||S.existsSync(C.join(e,"settings.gradle"))||S.existsSync(C.join(e,"settings.gradle.kts")),i=S.existsSync(C.join(e,"gradlew"))||S.existsSync(C.join(e,"gradlew.bat"));return {hasMavenProject:o||r,hasMavenWrapper:r,hasGradleProject:n||i,hasGradleWrapper:i}}findWorkspaceRoot(e){let o=e;for(;;){if(S.existsSync(C.join(o,".workspai-workspace"))||S.existsSync(C.join(o,".rapidkit-workspace")))return o;let r=C.dirname(o);if(r===o)break;o=r;}return null}resolveDependencyMode(e){let o$1=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(o$1==="shared-runtime-caches"||o$1==="shared-node-deps"||o$1==="isolated")return o$1;let r=this.findWorkspaceRoot(e);if(!r)return "isolated";let n=o(r,"policies.yml").find(i=>S.existsSync(i));if(!n)return "isolated";try{let c=S.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(c==="shared-runtime-caches"||c==="shared-node-deps"||c==="isolated")return c}catch{}return "isolated"}buildToolCommand(e){return this.isGradleProject(e)?this.gradleCommand(e):this.mavenCommand(e)}mavenCommand(e){let o=C.join(e,"mvnw.cmd");if(process.platform==="win32"&&S.existsSync(o))return {command:o,baseArgs:[]};let r=C.join(e,"mvnw");return S.existsSync(r)?this.ensureWrapperExecutable(r)?{command:r,baseArgs:[]}:{command:"sh",baseArgs:[r]}:{command:"mvn",baseArgs:[]}}gradleCommand(e){let o=C.join(e,"gradlew.bat");if(process.platform==="win32"&&S.existsSync(o))return {command:o,baseArgs:[]};let r=C.join(e,"gradlew");return S.existsSync(r)?this.ensureWrapperExecutable(r)?{command:r,baseArgs:[]}:{command:"sh",baseArgs:[r]}:{command:"gradle",baseArgs:[]}}isGradleProject(e){return this.inspectJavaProject(e).hasGradleProject}isMavenProject(e){return this.inspectJavaProject(e).hasMavenProject}discoverWorkspaceJavaProjects(e){let o=[],r=new Set,n=[e];for(;n.length>0;){let i=n.shift();if(!i||r.has(i))continue;r.add(i);let a=[];try{a=S.readdirSync(i,{withFileTypes:true});}catch{continue}for(let c of a){if(!c.isDirectory()||c.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(c.name))continue;let l=C.join(i,c.name),p=this.inspectJavaProject(l);(p.hasMavenProject||p.hasGradleProject)&&o.push(l),n.push(l);}}return o}withJavaCacheEnv(e,o){let r=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=r==="shared-runtime-caches"?C.join(n||e,".workspai","cache","java","m2"):C.join(e,".workspai","cache","java","m2"),a=r==="shared-runtime-caches"?C.join(n||e,".workspai","cache","java","gradle"):C.join(e,".workspai","cache","java","gradle"),c=process.env.MAVEN_OPTS,l=process.env.GRADLE_USER_HOME,p=`-Dmaven.repo.local=${i}`;return process.env.MAVEN_OPTS=c?`${c} ${p}`:p,process.env.GRADLE_USER_HOME=a,o().finally(()=>{typeof c>"u"?delete process.env.MAVEN_OPTS:process.env.MAVEN_OPTS=c,typeof l>"u"?delete process.env.GRADLE_USER_HOME:process.env.GRADLE_USER_HOME=l;})}async runBuildTool(e,o,r=true){return this.withJavaCacheEnv(e,async()=>{try{let{command:n,baseArgs:i}=this.buildToolCommand(e),a=await this.runCommand(n,[...i,...o],e);if(a===0||!r)return {exitCode:a};let c=S.existsSync(C.join(e,"pom.xml")),l=S.existsSync(C.join(e,"build.gradle"))||S.existsSync(C.join(e,"build.gradle.kts"));return {exitCode:a,message:c||l?"Java build failed. Verify pom.xml/build.gradle syntax and dependencies, then retry.":"Java build tool is not installed or not available on PATH. Install Maven/Gradle and JDK 21+, or commit mvnw/gradlew wrapper scripts."}}catch(n){return {exitCode:1,message:`Java command execution failed: ${n instanceof Error?n.message:String(n)}. Verify pom.xml/build.gradle integrity and wrapper permissions.`}}})}resolveJarPath(e){let o=[C.join(e,"target"),C.join(e,"build","libs")];for(let r of o){if(!S.existsSync(r))continue;let i=S.readdirSync(r).filter(a=>a.toLowerCase().endsWith(".jar")).find(a=>!a.toLowerCase().endsWith("-sources.jar")&&!a.toLowerCase().endsWith("-javadoc.jar")&&!a.toLowerCase().endsWith("-plain.jar"));if(i)return C.join(r,i)}return null}commandArgsFor(e,o){if(e==="gradle"){let r=this.shouldUseGradleNoDaemon()?["--no-daemon"]:[];return o==="init"?[...r,"dependencies"]:o==="dev"?[...r,"bootRun"]:o==="test"?[...r,"test"]:[...r,"bootJar"]}return o==="init"?["-B","-q","-DskipTests","dependency:go-offline"]:o==="dev"?["spring-boot:run"]:o==="test"?["test"]:["-DskipTests","package"]}detectBuildTool(e){return this.isGradleProject(e)?"gradle":"maven"}async checkPrereqs(){let e=process.cwd(),o=this.resolveJavaCommand(e),r=await this.runCommand(o,["-version"],e);if(r!==0)return {exitCode:r,message:"JDK 21+ is required. Ensure java is on PATH or JAVA_HOME/bin/java is available."};if(this.isMavenProject(e)){let c=this.readRequiredJavaMajor(e),l=await this.detectInstalledJavaMajor(o,e);if(l!==null&&l<c)return {exitCode:1,message:`Detected Java ${l}, but project requires Java ${c}+.`};let p=C.join(process.env.JAVA_HOME||"","release");if(process.env.JAVA_HOME&&S.existsSync(p))try{let d=S.readFileSync(p,"utf-8").match(/^JAVA_VERSION="([^"]+)"/m),w=this.parseMajorJavaVersion(d?.[1]);if(w!==null&&w<c)return {exitCode:1,message:`Detected JAVA_HOME version ${w}, but project requires Java ${c}+.`}}catch{}}if(this.isMavenProject(e)||this.isGradleProject(e)){let c=this.detectBuildTool(e),l=c==="gradle"?["--version"]:["-version"],p=await this.runBuildTool(e,l);return p.exitCode!==0?p:c==="maven"&&!this.inspectJavaProject(e).hasMavenWrapper?this.checkSystemMavenVersion(e):p}let n=this.findWorkspaceRoot(e);if(n&&n===e){let c=this.discoverWorkspaceJavaProjects(n);if(c.length>0){let l=c.reduce((d,w)=>Math.max(d,this.readRequiredJavaMajor(w)),0);if(l>0){let d=await this.detectInstalledJavaMajor(o,e);if(d!==null&&d<l){let w=c.filter(h=>this.readRequiredJavaMajor(h)>d).map(h=>C.relative(e,h)).join(", ");return {exitCode:1,message:`Detected Java ${d}, but workspace project(s) [${w}] require Java ${l}+.`}}}let p=false,f=false;for(let d of c){let w=this.inspectJavaProject(d);w.hasMavenProject&&!w.hasMavenWrapper&&(p=true),w.hasGradleProject&&!w.hasGradleWrapper&&(f=true);}if(p){let d=await this.withJavaCacheEnv(e,async()=>this.runCommand("mvn",["-version"],e));if(d!==0)return {exitCode:d,message:"Maven is required for one or more workspace Java projects without Maven Wrapper. Install Maven 3.9+, or add mvnw/mvnw.cmd to those projects."};let w=await this.checkSystemMavenVersion(e);if(w.exitCode!==0)return w}if(f){let d=await this.withJavaCacheEnv(e,async()=>this.runCommand("gradle",["--version"],e));if(d!==0)return {exitCode:d,message:"Gradle is required for one or more workspace Java projects without Gradle Wrapper. Install Gradle 8+, or add gradlew/gradlew.bat to those projects."}}return {exitCode:0}}}let i=await this.withJavaCacheEnv(e,async()=>this.runCommand("mvn",["-version"],e));if(i===0){let c=await this.checkSystemMavenVersion(e);return c.exitCode!==0?c:{exitCode:0}}let a=await this.withJavaCacheEnv(e,async()=>this.runCommand("gradle",["--version"],e));return a===0?{exitCode:0}:{exitCode:i||a||1,message:"Neither Maven nor Gradle is available on PATH. Install one of them, or use mvnw/gradlew wrappers in project roots."}}async warmSetupCache(e){return this.withJavaCacheEnv(e,async()=>{try{let o=process.env.MAVEN_OPTS?.match(/-Dmaven\.repo\.local=([^\s]+)/)?.[1];return o&&S.mkdirSync(o,{recursive:true}),process.env.GRADLE_USER_HOME&&S.mkdirSync(process.env.GRADLE_USER_HOME,{recursive:true}),{exitCode:0}}catch{return {exitCode:1,message:"Failed to prepare Java cache directories"}}})}async initProject(e){return this.runBuildTool(e,this.commandArgsFor(this.detectBuildTool(e),"init"))}async runDev(e){return this.runBuildTool(e,this.commandArgsFor(this.detectBuildTool(e),"dev"))}async runTest(e){return this.runBuildTool(e,this.commandArgsFor(this.detectBuildTool(e),"test"))}async runBuild(e){return this.runBuildTool(e,this.commandArgsFor(this.detectBuildTool(e),"build"))}async runStart(e){let o=this.resolveJarPath(e);if(o)return {exitCode:await this.runCommand(this.resolveJavaCommand(e),["-jar",o],e)};let r=await this.runBuild(e);if(r.exitCode!==0)return r;let n=this.resolveJarPath(e);return n?{exitCode:await this.runCommand(this.resolveJavaCommand(e),["-jar",n],e)}:{exitCode:1,message:"Spring Boot build completed, but no runnable JAR was found under target/ or build/libs/. Verify build output naming and packaging plugins."}}async runLint(e){if(et(e,"lint"))return {exitCode:await this.runCommand("make",["lint"],e)};let o=C.join(e,"pom.xml");return S.existsSync(o)&&S.readFileSync(o,"utf-8").includes("checkstyle")?this.runBuildTool(e,["checkstyle:check"]):{exitCode:1,message:"No Java lint tooling detected. Add a Makefile lint target or configure checkstyle in Maven/Gradle."}}async runFormat(e){return et(e,"format")?{exitCode:await this.runCommand("make",["format"],e)}:["build.gradle","build.gradle.kts"].map(r=>C.join(e,r)).filter(r=>S.existsSync(r)).some(r=>S.readFileSync(r,"utf-8").includes("spotless"))?this.runBuildTool(e,["spotlessApply"]):{exitCode:1,message:"No Java format tooling detected. Add a Makefile format target or configure spotless in Gradle."}}async doctorHints(e){return ["Install JDK 21+ and Maven/Gradle (or commit mvnw/gradlew wrappers) for reliable local builds.","Run npx workspai init after dependency changes to warm Java caches for your build tool.","Use SPRING_PROFILES_ACTIVE to switch environments without changing source config."]}};var ur=class{constructor(e){this.runCommand=e;}runCommand;runtime="node";async run(e,o,r){return {exitCode:await this.runCommand(e,o,r)}}findWorkspaceRoot(e){let o=e;for(;;){if(S.existsSync(C.join(o,".workspai-workspace"))||S.existsSync(C.join(o,".rapidkit-workspace")))return o;let r=C.dirname(o);if(r===o)break;o=r;}return null}resolveDependencyMode(e){let o$1=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(o$1==="shared-runtime-caches"||o$1==="shared-node-deps"||o$1==="isolated")return o$1;let r=this.findWorkspaceRoot(e);if(!r)return "isolated";let n=o(r,"policies.yml").find(i=>S.existsSync(i));if(!n)return "isolated";try{let c=S.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(c==="shared-runtime-caches"||c==="shared-node-deps"||c==="isolated")return c}catch{}return "isolated"}withDependencyEnv(e,o,r){let n=this.resolveDependencyMode(e),i=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),a=n==="isolated"?C.join(e,".workspai","cache","node"):C.join(i||e,".workspai","cache","node"),c=process.env.npm_config_cache,l=process.env.npm_config_store_dir,p=process.env.RAPIDKIT_DEP_SHARING_MODE,f=process.env.RAPIDKIT_WORKSPACE_PATH;return process.env.RAPIDKIT_DEP_SHARING_MODE=n,i&&(process.env.RAPIDKIT_WORKSPACE_PATH=i),o==="pnpm"?(process.env.npm_config_store_dir=C.join(a,"pnpm-store"),process.env.npm_config_cache=C.join(a,"pnpm-cache")):o==="yarn"?process.env.npm_config_cache=C.join(a,"yarn-cache"):process.env.npm_config_cache=C.join(a,"npm-cache"),r().finally(()=>{typeof c>"u"?delete process.env.npm_config_cache:process.env.npm_config_cache=c,typeof l>"u"?delete process.env.npm_config_store_dir:process.env.npm_config_store_dir=l,typeof p>"u"?delete process.env.RAPIDKIT_DEP_SHARING_MODE:process.env.RAPIDKIT_DEP_SHARING_MODE=p,typeof f>"u"?delete process.env.RAPIDKIT_WORKSPACE_PATH:process.env.RAPIDKIT_WORKSPACE_PATH=f;})}detectPackageManager(e){if(S.existsSync(C.join(e,"package-lock.json")))return "npm";if(S.existsSync(C.join(e,"pnpm-lock.yaml")))return "pnpm";if(S.existsSync(C.join(e,"yarn.lock")))return "yarn";if(!this.commandAvailable("npm")){if(this.commandAvailable("pnpm"))return "pnpm";if(this.commandAvailable("yarn"))return "yarn"}return "npm"}hasPinnedPackageManager(e){return S.existsSync(C.join(e,"package-lock.json"))||S.existsSync(C.join(e,"pnpm-lock.yaml"))||S.existsSync(C.join(e,"yarn.lock"))}availablePackageManagers(e){let o=this.detectPackageManager(e);return this.hasPinnedPackageManager(e)?[o]:[o,...["npm","pnpm","yarn"].filter(n=>n!==o&&this.commandAvailable(n))]}commandAvailable(e){let o=e$7(e);return spawnSync(o.command,[...o.prefixArgs,"--version"],{stdio:"ignore",shell:c$7(),env:g$5()}).status===0}scriptArgs(e,o){return e==="npm"?["run-script",o,"--foreground-scripts"]:["run",o]}async runScriptWithFallback(e,o){let r={exitCode:1};for(let n of this.availablePackageManagers(e))if(r=await this.withDependencyEnv(e,n,()=>this.run(n,this.scriptArgs(n,o),e)),r.exitCode===0)return r;return r}async runLifecycle(e,o){let r=d$5(e),n=i$3(e,r),i=n$2(e,o,{framework:n.key});return i?this.runScriptWithFallback(e,i.scriptName):{exitCode:1,message:`No npm script available for \`${o}\`. Add a "${o}" script to package.json.`}}async checkPrereqs(){return this.run("node",["--version"],process.cwd())}async warmSetupCache(e){let o=this.detectPackageManager(e);return this.withDependencyEnv(e,o,async()=>{try{return process.env.npm_config_cache&&S.mkdirSync(process.env.npm_config_cache,{recursive:true}),o==="pnpm"&&process.env.npm_config_store_dir&&S.mkdirSync(process.env.npm_config_store_dir,{recursive:true}),{exitCode:0}}catch{return {exitCode:1,message:"Failed to prepare Node cache directories"}}})}async initProject(e){let o=this.detectPackageManager(e),r=this.resolveDependencyMode(e),n=r==="shared-runtime-caches"||r==="shared-node-deps"?["install","--prefer-offline"]:["install"];return this.withDependencyEnv(e,o,()=>this.run(o,n,e))}async runDev(e){return this.runLifecycle(e,"dev")}async runTest(e){return this.runLifecycle(e,"test")}async runBuild(e){return this.runLifecycle(e,"build")}async runStart(e){return this.runLifecycle(e,"start")}async runLint(e){return this.runLifecycle(e,"lint")}async runFormat(e){return this.runLifecycle(e,"format")}async doctorHints(e){return ["Install Node.js LTS and ensure node/npm are on PATH.","Use lockfiles (package-lock.json, pnpm-lock.yaml, yarn.lock) for deterministic installs.","Run install before dev/test/build if dependencies changed."]}};var fr=class{constructor(e){this.runCore=e;}runCore;runtime="python";async run(e,o){return {exitCode:await this.withPythonCacheEnv(o,()=>this.runCore(e,o))}}findWorkspaceRoot(e){let o=e;for(;;){if(S.existsSync(C.join(o,".workspai-workspace"))||S.existsSync(C.join(o,".rapidkit-workspace")))return o;let r=C.dirname(o);if(r===o)break;o=r;}return null}resolveDependencyMode(e){let o$1=process.env.RAPIDKIT_DEP_SHARING_MODE?.toLowerCase();if(o$1==="shared-runtime-caches"||o$1==="shared-node-deps"||o$1==="isolated")return o$1;let r=this.findWorkspaceRoot(e);if(!r)return "isolated";let n=o(r,"policies.yml").find(i=>S.existsSync(i));if(!n)return "isolated";try{let c=S.readFileSync(n,"utf-8").match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();if(c==="shared-runtime-caches"||c==="shared-node-deps"||c==="isolated")return c}catch{}return "isolated"}withPythonCacheEnv(e,o){let r=this.resolveDependencyMode(e),n=process.env.RAPIDKIT_WORKSPACE_PATH||this.findWorkspaceRoot(e),i=r==="shared-runtime-caches"?C.join(n||e,".workspai","cache","python"):C.join(e,".workspai","cache","python"),a=process.env.PIP_CACHE_DIR,c=process.env.POETRY_CACHE_DIR;return process.env.PIP_CACHE_DIR=C.join(i,"pip"),process.env.POETRY_CACHE_DIR=C.join(i,"poetry"),o().finally(()=>{typeof a>"u"?delete process.env.PIP_CACHE_DIR:process.env.PIP_CACHE_DIR=a,typeof c>"u"?delete process.env.POETRY_CACHE_DIR:process.env.POETRY_CACHE_DIR=c;})}async checkPrereqs(){let e=process.cwd(),o=await this.run(["doctor","check"],e);return o.exitCode===0?o:this.run(["doctor"],e)}async initProject(e){return this.run(["init"],e)}async runDev(e){return this.run(["dev"],e)}async runTest(e){return this.run(["test"],e)}async runBuild(e){return this.run(["build"],e)}async runStart(e){return this.run(["start"],e)}async doctorHints(e){return ['Run "npx workspai doctor workspace" for a full workspace scan.','Use "npx workspai init" after adding or changing modules.',"Use `npx workspai <command>` from the project root to avoid environment drift."]}};function Jl(){let t={...process.env},e=t.PATH||"";if(e){let o=e.split(C.delimiter).filter(r=>!r.replace(/\\/g,"/").includes("/.pyenv/shims")).join(C.delimiter);t.PATH=o;}return t.PYENV_VERSION="system",t.POETRY_PYTHON=t.POETRY_PYTHON||h$4(),typeof t.RAPIDKIT_SKIP_LOCK_SYNC>"u"&&(t.RAPIDKIT_SKIP_LOCK_SYNC="1"),t}function Ue(t,e){return t==="go"?new pr((o,r,n)=>e.runCommandInCwd(o,r,n)):t==="node"?new ur((o,r,n)=>e.runCommandInCwd(o,r,n)):t==="java"?new dr((o,r,n)=>e.runCommandInCwd(o,r,n)):t==="dotnet"?new lr((o,r,n)=>e.runCommandInCwd(o,r,n)):new fr((o,r)=>e.runCoreRapidkit(o,{cwd:r,env:Jl()}))}var da=C.join(Br.homedir(),".workspai","cache"),ua=1440*60*1e3;function vn(){let t=a$b("CACHE_DIR");if(t)return t;let e=process.env.VITEST_WORKER_ID?.trim();return e?C.join(da,`vitest-${e}`):da}var hr=class t{static instance;memoryCache=new Map;constructor(){}static getInstance(){return t.instance||(t.instance=new t),t.instance}getCacheKey(e){return createHash("md5").update(e).digest("hex")}getCachePath(e){return C.join(vn(),`${this.getCacheKey(e)}.json`)}getTempCachePath(e){let o=`${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`;return `${e}.${o}.tmp`}async get(e,o="1.0"){let r=this.memoryCache.get(e);if(r&&r.version===o&&Date.now()-r.timestamp<ua)return f.debug(`Cache hit (memory): ${e}`),r.data;try{let n=this.getCachePath(e),i=await promises.readFile(n,"utf-8"),a=JSON.parse(i);if(a.version===o&&Date.now()-a.timestamp<ua)return f.debug(`Cache hit (disk): ${e}`),this.memoryCache.set(e,a),a.data;await promises.unlink(n).catch(()=>{});}catch{f.debug(`Cache miss: ${e}`);}return null}async set(e,o,r="1.0"){let n={data:o,timestamp:Date.now(),version:r};this.memoryCache.set(e,n);try{await promises.mkdir(vn(),{recursive:true});let i=this.getCachePath(e),a=this.getTempCachePath(i);await promises.writeFile(a,JSON.stringify(n),"utf-8"),await promises.rename(a,i),f.debug(`Cache set: ${e}`);}catch(i){f.debug(`Cache write failed: ${e}`,i);}}async invalidate(e){this.memoryCache.delete(e);try{let o=this.getCachePath(e);await promises.unlink(o),f.debug(`Cache invalidated: ${e}`);}catch{}}async clear(){this.memoryCache.clear();try{let e=vn(),o=await promises.readdir(e);await Promise.all(o.map(r=>promises.unlink(C.join(e,r)))),f.debug("Cache cleared");}catch{}}};var fo=["list","sync","registry","foundation","model","snapshot","diff","impact","verify","graph","watch","context","agent-sync","remediation-plan","explain","why","trace","feedback","mcp","policy","contract","share","export","archive","hydrate","import","run","init"],yr=["model","snapshot","diff","impact","verify","context","agent-sync","remediation-plan","explain","why","trace"];function ma(t){return yr.includes(t)}var fa="workspai-project-entry-capability-v1";var ga="rapidkit-runtime-command-surface-v1";var ha="doctor-remediation-plan-v2";var ya="workspai-workspace-intelligence-architecture-v1";var wa={autopilotRelease:"autopilot-release-v1",workspaceList:"rapidkit-workspace-list-v1",workspaceSync:"rapidkit-workspace-sync-v1",compatibilityMatrix:"rapidkit.compatibility-matrix.v1",mcpDesign:"workspai-mcp-design.v1",agentHooks:"workspai-agent-hooks.v1",projectArchive:"rapidkit-project-archive-v1",workspaceSnapshot:"rapidkit-workspace-snapshot-v1",workspaceSnapshotV2:"rapidkit-workspace-snapshot-v2",infraPlan:"rapidkit.infra-plan.v1",privateProductManifest:"rapidkit.private-product-manifest.v1",productFactoryPlan:"rapidkit.product-factory-plan.v1",workspaceModelCache:"workspace-model-cache.v1",workspaceWatchEvent:"workspace-watch-event.v1",doctorProjectScan:"doctor-project-scan-v2",doctorWorkspaceCache:"doctor-workspace-cache-v2"};var Gl="workspai-published-contract-catalog-v1";function go(){return {runtimeCommandSurface:ga,cliOperationResult:a$n,publishedContractCatalog:Gl,workspaceArchiveCapabilities:a$m,workspaceArchiveManifest:b$c,workspaceArchiveOperationResult:c$3,projectEntryCapability:fa,workspaceIntelligenceArchitecture:ya,workspaceIntelligenceChain:a$l,workspaceIntelligenceArtifacts:b$a,cliLogEvent:c$c,freshnessMetadata:a$k,factFreshness:c$b,blockerResolution:a$j,workspaceModel:j$1,workspaceImpact:f$8,workspaceVerify:c$a,workspaceContext:c$9,workspaceDependencyGraph:i$5,workspaceIntelligenceHistory:a$i,agentCustomizationPackCapabilities:l$3,agentCustomizationPackReport:b$a.agentCustomizationPack,agentReportsIndex:b$a.agentIndex,workspaceOperationalSkill:a$h,workspaceSkillsIndex:b$b,workspaceExplain:a$g,agentActionOutcome:a$f,doctorRemediationPlan:ha,artifactRemediationPlan:a$e,doctorFixResult:a$d,...wa}}function wr(){let t=go(),e={runtimeCommandSurface:"contracts/runtime-command-surface.v1.json",cliOperationResult:"contracts/cli-operation-result.v1.json",publishedContractCatalog:"contracts/published-contract-catalog.v1.json",workspaceArchiveCapabilities:"contracts/workspace-archive-capabilities.v1.json",workspaceArchiveManifest:"contracts/workspace-archive-manifest.v1.json",workspaceArchiveOperationResult:"contracts/workspace-archive-operation-result.v1.json",projectEntryCapability:"contracts/project-entry-capability.v1.json",workspaceIntelligenceArchitecture:"contracts/workspace-intelligence-architecture.v1.json",workspaceIntelligenceChain:"contracts/workspace-intelligence-chain.v1.json",workspaceIntelligenceArtifacts:null,cliLogEvent:"contracts/cli-log-event.v1.json",freshnessMetadata:null,factFreshness:"contracts/workspace-intelligence/fact-freshness.v1.json",blockerResolution:"contracts/workspace-intelligence/blocker-resolution.v1.json",workspaceModel:"contracts/workspace-intelligence/workspace-model.v1.json",workspaceImpact:"contracts/workspace-intelligence/workspace-impact.v1.json",workspaceVerify:"contracts/workspace-intelligence/workspace-verify.v1.json",workspaceContext:"contracts/workspace-intelligence/workspace-context.v1.json",workspaceDependencyGraph:"contracts/workspace-intelligence/workspace-dependency-graph.v1.json",workspaceIntelligenceHistory:"contracts/workspace-intelligence/workspace-intelligence-history.v1.json",agentCustomizationPackCapabilities:"contracts/agent-customization-pack.v1.json",agentCustomizationPackReport:"contracts/workspace-intelligence/agent-customization-pack-report.v1.json",agentReportsIndex:"contracts/workspace-intelligence/agent-reports-index.v1.json",workspaceOperationalSkill:"contracts/workspace-intelligence/workspace-operational-skill.v1.json",workspaceSkillsIndex:"contracts/workspace-intelligence/workspace-skills-index.v1.json",workspaceExplain:"contracts/workspace-intelligence/workspace-explain.v1.json",agentActionOutcome:"contracts/workspace-intelligence/agent-action-outcome.v1.json",doctorRemediationPlan:"contracts/doctor-remediation-plan.v2.json",artifactRemediationPlan:"contracts/artifact-remediation-plan.v1.json",doctorFixResult:"contracts/workspace-intelligence/doctor-fix-result.v1.json",autopilotRelease:"contracts/autopilot-release.v1.json",workspaceList:"contracts/workspace-list.v1.json",workspaceSync:"contracts/workspace-sync.v1.json",compatibilityMatrix:"contracts/compatibility-matrix.v1.json",mcpDesign:"contracts/workspace-intelligence/mcp-design.v1.json",agentHooks:"contracts/workspace-intelligence/agent-hooks.v1.json",projectArchive:"contracts/project-archive.v1.json",workspaceSnapshot:"contracts/workspace-snapshot.v1.json",workspaceSnapshotV2:"contracts/workspace-snapshot.v2.json",infraPlan:"contracts/infra-plan.v1.json",privateProductManifest:"contracts/private-product-manifest.v1.json",productFactoryPlan:"contracts/product-factory-plan.v1.json",workspaceModelCache:"contracts/workspace-model-cache.v1.json",workspaceWatchEvent:"contracts/workspace-watch-event.v1.json",doctorProjectScan:"contracts/doctor-project-scan.v2.json",doctorWorkspaceCache:"contracts/doctor-workspace-cache.v2.json"};return Object.fromEntries(Object.entries(t).map(([o,r])=>{let n=e[o];return [o,{schemaVersion:r,contractPath:n,publication:n?o==="runtimeCommandSurface"||o.endsWith("Capabilities")?"capability-contract":"json-schema":"embedded-type",...o==="workspaceIntelligenceArtifacts"?{artifacts:Object.fromEntries(Object.keys(a$c).map(i=>[i,{path:a$c[i],schemaVersion:b$a[i],contractPath:c$8[i]}]))}:{}}]}))}var Pn="rapidkit-command-capabilities-v1",ka="rapidkit-version-v1";var Ul=["catalog","pulse","nova","orbit","atlas","vertex","summit","beacon","ledger","flux","nexus","apex","harbor","forge","spark","portal","studio","canvas","quantum","vault","zenith","compass","vector","catalyst","saas","commerce","radar","stellar","prism","cedar","momentum","signal","cipher","lumen","trail","ridge"],Hl={"fastapi.standard":"api","fastapi.ddd":"api","nestjs.standard":"api","springboot.standard":"service","gofiber.standard":"api","gogin.standard":"api","dotnet.webapi.clean":"api"},Bl={nextjs:"web",remix:"app","vite-react":"web","vite-vue":"web","vite-svelte":"web","vite-solid":"web","vite-vanilla":"app",nuxt:"app",angular:"app",astro:"site",sveltekit:"app"};function ql(t){return t[Math.floor(Math.random()*t.length)]}function bn(t){let e=ql(Ul),o=k$2(t);if(o){let i=Bl[o.id]??"app";return `${e}-${i}`}let r=a$3(t),n=r?Hl[r.id]??"service":"app";return `${e}-${n}`}async function Xl(t){let e=await promises.readFile(t);return createHash("sha256").update(e).digest("hex")}async function Zl(t){if(!await R.pathExists(t))return [];let e=[],o=[t];for(;o.length>0;){let r=o.shift();if(r)for(let n of await promises.readdir(r,{withFileTypes:true})){let i=C.join(r,n.name);n.isFile()?e.push(i):n.isDirectory()&&o.push(i);}}return e}async function va(t,e){await R.outputFile(t,`${JSON.stringify(e,null,2)}
150
+ `,"utf-8");}function He(t,e){return C.isAbsolute(e)?e:C.join(t,e)}function ep(t,e){if(t.target)return t.target;if(t.source)return C.basename(t.source);if(t.url)try{let o=new URL(t.url).pathname,r=C.basename(o);if(r&&r!=="/")return r}catch{}return `${e}.artifact`}async function tp(t){let e=o(t,"trusted-sources.lock").find(r=>existsSync(r)),o$1=new Set(["localhost","127.0.0.1"]);if(!e)return o$1;try{let n=(await promises.readFile(e,"utf-8")).split(/\r?\n/).map(i=>i.trim()).filter(i=>i.length>0&&!i.startsWith("#"));for(let i of n)o$1.add(i.toLowerCase());}catch{}return o$1}async function op(t,e,o){await R.ensureDir(C.dirname(e)),await new Promise((r,n)=>{let a=(t.startsWith("https://")?xa:Sa).get(t,c=>{if(!c.statusCode||c.statusCode<200||c.statusCode>=300){n(new Error(`HTTP ${c.statusCode||"unknown"}`)),c.resume();return}let l=createWriteStream(e);c.pipe(l),l.on("finish",()=>{l.close(),r();}),l.on("error",p=>{n(p);});});a.setTimeout(o,()=>{a.destroy(new Error(`Request timeout after ${o}ms`));}),a.on("error",c=>{n(c);});});}async function rp(t,e,o,r,n){let i=new URL(t),a=JSON.stringify(e),c=i.protocol==="https:"?xa:Sa;await new Promise((l,p)=>{let f=c.request({method:"POST",hostname:i.hostname,port:i.port||(i.protocol==="https:"?443:80),path:`${i.pathname}${i.search}`,headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(a),...r?{Authorization:`Bearer ${r}`}:{},...n||{}}},d=>{if(!d.statusCode||d.statusCode<200||d.statusCode>=300){p(new Error(`HTTP ${d.statusCode||"unknown"}`)),d.resume();return}d.resume(),l();});f.setTimeout(o,()=>{f.destroy(new Error(`Request timeout after ${o}ms`));}),f.on("error",d=>{p(d);}),f.write(a),f.end();});}function Pa(t){return new Promise(e=>setTimeout(e,t))}async function np(t,e,o,r){let n=He(t,e||".workspai/reports/evidence-export-dead-letter.ndjson");return await R.ensureDir(C.dirname(n)),await promises.appendFile(n,`${JSON.stringify({timestamp:new Date().toISOString(),reason:r,payload:o})}
151
+ `,"utf-8"),n}function sp(t,e){if(!e?.enabled)return {headers:{}};let o=process.env[e.hmacKeyEnv];if(!o)return {headers:{},error:`Evidence signing key env is missing: ${e.hmacKeyEnv}`};let r=(e.algorithm||"sha256").toLowerCase(),n=e.headerName||"x-rapidkit-evidence-signature",i=createHmac(r,o).update(JSON.stringify(t)).digest("hex");return {headers:{[n]:i,"x-rapidkit-evidence-signature-alg":r}}}async function ip(t,e,o){let r=(o.algorithm||"sha256").toLowerCase(),n=He(t,o.publicKeyPath);if(!await R.pathExists(n))return {verified:false,algorithm:r,publicKeyPath:n,publicKeyFingerprint:"",signature:o.signature,message:`Public key not found: ${n}`};try{let i=await promises.readFile(n,"utf-8"),a=await promises.readFile(e),c=createVerify(r);c.update(a),c.end();let l=Buffer.from(o.signature,"base64"),p=c.verify(i,l),f=createHash("sha256").update(i).digest("hex");return {verified:p,algorithm:r,publicKeyPath:n,publicKeyFingerprint:f,signature:o.signature,message:p?"Attestation verified.":"Attestation signature verification failed."}}catch(i){return {verified:false,algorithm:r,publicKeyPath:n,publicKeyFingerprint:"",signature:o.signature,message:`Attestation verification error: ${i.message}`}}}async function ap(t,e,o,r){let n=process.env.RAPIDKIT_SIGSTORE_MOCK;if(n==="success")return {verified:true,tlogVerified:r.requireTransparencyLog,message:"Sigstore verification passed (mock).",identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:o.bundlePath||null,certificatePath:o.certificatePath||null,signaturePath:o.signaturePath||null};if(n==="fail")return {verified:false,tlogVerified:false,message:"Sigstore verification failed (mock).",identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:o.bundlePath||null,certificatePath:o.certificatePath||null,signaturePath:o.signaturePath||null};let i=o.signaturePath?He(t,o.signaturePath):null;if(!i||!await R.pathExists(i))return {verified:false,tlogVerified:false,message:"Sigstore signaturePath is missing or not found.",identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:o.bundlePath||null,certificatePath:o.certificatePath||null,signaturePath:i};let a=["verify-blob",e,"--signature",i],c=o.certificatePath?He(t,o.certificatePath):null;c&&a.push("--certificate",c);let l=o.bundlePath?He(t,o.bundlePath):null;l&&a.push("--bundle",l);let p=o.keyPath?He(t,o.keyPath):null;p&&a.push("--key",p),o.identity&&a.push("--certificate-identity",o.identity),o.issuer&&a.push("--certificate-oidc-issuer",o.issuer),o.rekorUrl&&a.push("--rekor-url",o.rekorUrl),r.requireTransparencyLog||a.push("--insecure-ignore-tlog");try{let f=await execa("cosign",a,{reject:false});return f.exitCode===0?{verified:true,tlogVerified:r.requireTransparencyLog,message:"Sigstore verification passed.",identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:l,certificatePath:c,signaturePath:i}:{verified:false,tlogVerified:false,message:`Sigstore verification failed: ${f.stderr||f.stdout||"unknown error"}`,identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:l,certificatePath:c,signaturePath:i}}catch(f){return {verified:false,tlogVerified:false,message:`Sigstore verification error: ${f.message}`,identity:o.identity||null,issuer:o.issuer||null,rekorUrl:o.rekorUrl||null,bundlePath:l,certificatePath:c,signaturePath:i}}}async function cp(t,e){let o=e.algorithm||"sha256",r=He(t,e.policyPath),n=He(t,e.signaturePath),i=He(t,e.publicKeyPath);if(!await R.pathExists(r))return {verified:false,message:`Governance policy bundle not found: ${r}`,policies:null};if(!await R.pathExists(n))return {verified:false,message:`Governance policy signature not found: ${n}`,policies:null};if(!await R.pathExists(i))return {verified:false,message:`Governance policy public key not found: ${i}`,policies:null};try{let a=await promises.readFile(r,"utf-8"),c=(await promises.readFile(n,"utf-8")).trim(),l=await promises.readFile(i,"utf-8"),p=createVerify(o);return p.update(a),p.end(),p.verify(l,Buffer.from(c,"base64"))?{verified:true,message:"Governance policy bundle verified.",policies:JSON.parse(a).policies||{}}:{verified:false,message:"Governance policy bundle signature verification failed.",policies:null}}catch(a){return {verified:false,message:`Governance policy bundle verification error: ${a.message}`,policies:null}}}async function jn(t,e){let o$1=[],r={syncedArtifacts:0,verifiedArtifacts:0,rotatedFiles:0,lockWritten:false,governanceBundleVerified:false,transparencyEvidenceWritten:false,transparencyEvidenceRecords:0,evidenceExported:false,evidenceExportTarget:null},n=o(t,"mirror-config.json").find(N=>existsSync(N))??l(t,"mirror-config.json"),i=l(t,"mirror.lock"),a=l(t,"mirror","artifacts"),c=l(t,"reports"),l$1=await tp(t);if(!await R.pathExists(n))return o$1.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: .workspai/mirror-config.json not found."}),{checks:o$1,details:r};let p={};try{p=JSON.parse(await promises.readFile(n,"utf-8"));}catch{return o$1.push({id:"mirror.lifecycle.config",status:"failed",message:"Mirror lifecycle failed: invalid JSON in mirror-config.json."}),{checks:o$1,details:r}}if(!(e.forceRun===true||e.ciMode||e.offlineMode||p.mode==="offline-only"))return o$1.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror lifecycle skipped: not in ci/offline mode."}),{checks:o$1,details:r};await R.ensureDir(a);let d=Math.max(0,p.prefetch?.retries??2),w=Math.max(0,p.prefetch?.backoffMs??250),h=Math.max(1e3,p.prefetch?.timeoutMs??15e3),k=p.security?.requireAttestation===true,j=p.security?.requireSigstore===true,_=p.security?.requireTransparencyLog===true,y=p.security?.requireSignedGovernance===true,m=p.security?.evidenceExport,g=(process.env.RAPIDKIT_ENV||p.security?.governance?.environment||"dev").toLowerCase(),v=p.security?.governance?.policies||{};if(p.security?.governanceBundle){let N=await cp(t,p.security.governanceBundle);if(o$1.push({id:"governance.bundle.verify",status:N.verified?"passed":"failed",message:N.message}),N.verified&&N.policies)v=N.policies,r.governanceBundleVerified=true;else if(y)return {checks:o$1,details:r}}let u=v[g],b=_||u?.requireTransparencyLog===true,P=[],x=Array.isArray(p.artifacts)?p.artifacts:[],A=[];for(let N=0;N<x.length;N+=1){let D=x[N],M=D.id||`artifact-${N+1}`,me=D.source?He(t,D.source):null,se=ep(D,M),Y=C.join(a,se),ee=false,Ee={sourceType:"path",source:me||D.url||"unknown",host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true};if(me&&await R.pathExists(me))await R.ensureDir(C.dirname(Y)),await promises.copyFile(me,Y),r.syncedArtifacts+=1,ee=true,Ee={sourceType:"path",source:me,host:null,fetchedAt:new Date().toISOString(),attempts:1,trusted:true},o$1.push({id:`mirror.sync.${M}`,status:"passed",message:`Mirrored artifact ${M} from source path.`});else if(D.url){let _e="";try{_e=new URL(D.url).hostname.toLowerCase();}catch{o$1.push({id:`mirror.prefetch.${M}`,status:"failed",message:`Invalid URL for ${M}: ${D.url}`});continue}if(!(process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||l$1.has(_e))){o$1.push({id:`mirror.prefetch.trust.${M}`,status:"failed",message:`Untrusted mirror host for ${M}: ${_e}. Add host to .workspai/trusted-sources.lock or set RAPIDKIT_TRUSTED_SOURCES=1.`});continue}if(e.offlineMode&&(await R.pathExists(Y)?(ee=true,Ee={sourceType:"url",source:D.url,host:_e,fetchedAt:new Date().toISOString(),attempts:0,trusted:true},o$1.push({id:`mirror.prefetch.${M}`,status:"passed",message:`Offline mode reused existing mirrored artifact ${M}.`})):o$1.push({id:`mirror.prefetch.${M}`,status:"failed",message:`Offline mode cannot prefetch remote artifact ${M} without an existing mirrored copy.`}),!ee))continue;if(!ee){let ke=null,wt=0;for(let tt=1;tt<=d+1;tt+=1){wt=tt;try{await op(D.url,Y,h),r.syncedArtifacts+=1,ee=true,Ee={sourceType:"url",source:D.url,host:_e,fetchedAt:new Date().toISOString(),attempts:wt,trusted:true},o$1.push({id:`mirror.prefetch.${M}`,status:"passed",message:wt>1?`Prefetched artifact ${M} from ${_e} after ${wt} attempts.`:`Prefetched artifact ${M} from ${_e}.`});break}catch(O){if(ke=O,tt<=d){await Pa(w*tt);continue}}}if(!ee){o$1.push({id:`mirror.prefetch.${M}`,status:"failed",message:`Failed to prefetch ${M} after ${d+1} attempt(s): ${ke?.message||"unknown error"}`});continue}}if(!ee){o$1.push({id:`mirror.prefetch.${M}`,status:"failed",message:`Failed to prefetch ${M}.`});continue}}if(!ee){D.required||e.offlineMode?o$1.push({id:`mirror.sync.${M}`,status:"failed",message:`Mirror source missing for ${M}${me?`: ${me}`:""}`}):o$1.push({id:`mirror.sync.${M}`,status:"skipped",message:`Mirror source not found for optional artifact ${M}.`});continue}let ze=await Xl(Y);if(D.sha256&&D.sha256.toLowerCase()!==ze.toLowerCase()){o$1.push({id:`mirror.verify.${M}`,status:"failed",message:`Checksum mismatch for ${M}.`});continue}r.verifiedArtifacts+=1,o$1.push({id:`mirror.verify.${M}`,status:"passed",message:`Checksum verified for ${M}.`});let we=D.attestation?await ip(t,Y,D.attestation):null;if(D.attestation){if(o$1.push({id:`mirror.attest.${M}`,status:we?.verified?"passed":"failed",message:we?.message||"Attestation verification failed."}),!we?.verified)continue}else if(k){o$1.push({id:`mirror.attest.${M}`,status:"failed",message:`Attestation is required but missing for ${M}.`});continue}else o$1.push({id:`mirror.attest.${M}`,status:"skipped",message:`No attestation provided for ${M}.`});let Re=D.attestation?.sigstore,B=Re?await ap(t,Y,Re,{requireTransparencyLog:b}):null;if(Re){if(o$1.push({id:`mirror.sigstore.${M}`,status:B?.verified?"passed":"failed",message:B?.message||"Sigstore verification failed."}),P.push({artifactId:M,verified:!!B?.verified,tlogVerified:!!B?.tlogVerified,identity:B?.identity||null,issuer:B?.issuer||null,rekorUrl:B?.rekorUrl||null,timestamp:new Date().toISOString(),environment:g}),!B?.verified)continue}else if(j){o$1.push({id:`mirror.sigstore.${M}`,status:"failed",message:`Sigstore attestation is required but missing for ${M}.`});continue}else o$1.push({id:`mirror.sigstore.${M}`,status:"skipped",message:`No Sigstore attestation provided for ${M}.`});if(Re&&B?.verified&&u){let _e=u.allowedIdentities||[];if(_e.length>0){let ke=!!B.identity&&_e.includes(B.identity);if(o$1.push({id:`mirror.sigstore.policy.identity.${M}`,status:ke?"passed":"failed",message:ke?`Sigstore identity policy passed for ${M} in ${g}.`:`Sigstore identity policy failed for ${M} in ${g}.`}),!ke)continue}let jo=u.allowedIssuers||[];if(jo.length>0){let ke=!!B.issuer&&jo.includes(B.issuer);if(o$1.push({id:`mirror.sigstore.policy.issuer.${M}`,status:ke?"passed":"failed",message:ke?`Sigstore issuer policy passed for ${M} in ${g}.`:`Sigstore issuer policy failed for ${M} in ${g}.`}),!ke)continue}let At=u.allowedRekorUrls||[];if(At.length>0){let ke=!!B.rekorUrl&&At.includes(B.rekorUrl);if(o$1.push({id:`mirror.sigstore.policy.rekor.${M}`,status:ke?"passed":"failed",message:ke?`Sigstore Rekor policy passed for ${M} in ${g}.`:`Sigstore Rekor policy failed for ${M} in ${g}.`}),!ke)continue}}else u&&o$1.push({id:`mirror.sigstore.policy.${M}`,status:"skipped",message:`Sigstore governance policy configured for ${g} but no verified Sigstore attestation for ${M}.`});let Le=await promises.stat(Y);A.push({id:M,path:C.relative(t,Y),sha256:ze,size:Le.size,provenance:Ee,attestation:{detached:{provided:!!D.attestation,verified:we?.verified||false,algorithm:we?.algorithm||null,publicKeyPath:we?.publicKeyPath||null,publicKeyFingerprint:we?.publicKeyFingerprint||null,signature:we?.signature||null,verifiedAt:we?.verified?new Date().toISOString():null},sigstore:{provided:!!Re,verified:B?.verified||false,tlogVerified:B?.tlogVerified||false,identity:B?.identity||null,issuer:B?.issuer||null,rekorUrl:B?.rekorUrl||null,bundlePath:B?.bundlePath||null,certificatePath:B?.certificatePath||null,signaturePath:B?.signaturePath||null,verifiedAt:B?.verified?new Date().toISOString():null}}});}let I=p.retention?.keepLast;if(typeof I=="number"&&I>0){let N=new Set(A.map(M=>C.resolve(t,M.path))),D=(await Zl(a)).filter(M=>!N.has(C.resolve(M)));if(D.length>I){let M=await Promise.all(D.map(async se=>({filePath:se,stat:await promises.stat(se)})));M.sort((se,Y)=>Y.stat.mtimeMs-se.stat.mtimeMs);let me=M.slice(I);for(let se of me)await promises.unlink(se.filePath),r.rotatedFiles+=1;}}o$1.push({id:"mirror.rotate",status:"passed",message:r.rotatedFiles>0?`Mirror retention rotation removed ${r.rotatedFiles} file(s).`:"Mirror retention rotation completed with no removals."});let W={schemaVersion:"1.0",generatedAt:new Date().toISOString(),mode:p.mode||null,environment:g,artifacts:A};if(await promises.writeFile(i,`${JSON.stringify(W,null,2)}
152
+ `,"utf-8"),r.lockWritten=true,o$1.push({id:"mirror.lock.write",status:"passed",message:`Mirror lock updated at ${C.relative(t,i)}.`}),r.transparencyEvidenceRecords=P.length,P.length>0){let N={schemaVersion:"1.0",generatedAt:new Date().toISOString(),environment:g,records:P},D=new Date().toISOString().replace(/[:.]/g,"-"),M=C.join(c,`transparency-evidence-${D}.json`),me=C.join(c,"transparency-evidence.latest.json");if(await R.ensureDir(c),await va(M,N),await va(me,N),r.transparencyEvidenceWritten=true,o$1.push({id:"sigstore.evidence.write",status:"passed",message:`Transparency evidence written to ${C.relative(t,me)}.`}),m?.enabled){let se=Math.max(1e3,m.timeoutMs??1e4);if(m.target==="file")if(!m.filePath)o$1.push({id:"sigstore.evidence.export.file",status:"failed",message:"Evidence export target=file requires security.evidenceExport.filePath."});else try{let Y=He(t,m.filePath);await R.ensureDir(C.dirname(Y)),await promises.appendFile(Y,`${JSON.stringify(N)}
153
+ `,"utf-8"),r.evidenceExported=true,r.evidenceExportTarget=Y,o$1.push({id:"sigstore.evidence.export.file",status:"passed",message:`Transparency evidence exported to file sink ${Y}.`});}catch(Y){o$1.push({id:"sigstore.evidence.export.file",status:"failed",message:`Evidence file export failed: ${Y.message}`});}else if(m.target==="http")if(!m.endpoint)o$1.push({id:"sigstore.evidence.export.http",status:"failed",message:"Evidence export target=http requires security.evidenceExport.endpoint."});else {let Y=Math.max(0,m.retries??0),ee=Math.max(0,m.backoffMs??500),Ee=sp(N,m.signing);Ee.error&&o$1.push({id:"sigstore.evidence.export.http",status:"failed",message:Ee.error});try{let ze=m.authTokenEnv?process.env[m.authTokenEnv]:void 0,we=false,Re=null;for(let B=1;B<=Y+1;B+=1)try{if(Ee.error)throw new Error(Ee.error);await rp(m.endpoint,N,se,ze,Ee.headers),r.evidenceExported=true,r.evidenceExportTarget=m.endpoint,o$1.push({id:"sigstore.evidence.export.http",status:"passed",message:B>1?`Transparency evidence exported to HTTP endpoint ${m.endpoint} after ${B} attempts.`:`Transparency evidence exported to HTTP endpoint ${m.endpoint}.`}),we=true;break}catch(Le){Re=Le,B<=Y&&await Pa(ee*B);}if(!we)throw Re||new Error("unknown evidence export error")}catch(ze){let we=`Evidence HTTP export failed: ${ze.message}`;o$1.push({id:"sigstore.evidence.export.http",status:"failed",message:we});try{let Re=await np(t,m.deadLetterPath,N,we);o$1.push({id:"sigstore.evidence.export.deadletter",status:"passed",message:`Evidence export failure persisted to dead-letter sink ${Re}.`});}catch(Re){o$1.push({id:"sigstore.evidence.export.deadletter",status:"failed",message:`Evidence dead-letter write failed: ${Re.message}`});}}}if(m.failOnError&&o$1.some(ee=>ee.status==="failed"&&(ee.id==="sigstore.evidence.export.file"||ee.id==="sigstore.evidence.export.http")))return {checks:o$1,details:r}}else o$1.push({id:"sigstore.evidence.export",status:"skipped",message:"Central evidence export not configured (security.evidenceExport.enabled=false)."});}else o$1.push({id:"sigstore.evidence.write",status:"skipped",message:"No Sigstore records available for transparency evidence output."}),o$1.push({id:"sigstore.evidence.export",status:"skipped",message:"Central evidence export skipped because no transparency evidence records exist."});return {checks:o$1,details:r}}function kr(t){let e=a$p(t.detection.runtime),o=o$3({runtime:t.detection.runtime,moduleSupport:t.moduleSupport,projectPath:t.projectPath,framework:t.detection.key}),r=[];r.push({id:"framework-detection",status:t.detection.key==="unknown"?"warn":"pass",message:t.detection.key==="unknown"?"Workspai could not confidently identify the project framework.":`Detected ${t.detection.displayName} with ${t.detection.confidence} confidence.`,recommendation:t.detection.key==="unknown"?"Add .workspai/project.json metadata or import a project with recognizable runtime manifests.":void 0}),r.push({id:"runtime-support",status:e.tier==="observed"?"warn":"pass",message:`${e.displayName} is supported at ${e.tier} tier.`,recommendation:e.tier==="observed"?"Observed runtimes are contract-aware but may need manual commands until a first-class kit exists.":void 0}),r.push({id:"module-mutation-policy",status:t.moduleSupport?"pass":"warn",message:t.moduleSupport?"RapidKit Core module mutation is enabled for this project.":"RapidKit Core module mutation is disabled for this imported project.",recommendation:t.moduleSupport?void 0:"Use project lifecycle and workspace governance commands; enable module_support only after validating a compatible module generator."}),r.push({id:"lifecycle-commands",status:o.lifecycleCommands.length>1?"pass":"warn",message:o.lifecycleCommands.length>1?`Lifecycle commands available: ${o.lifecycleCommands.join(", ")}.`:"Only help-level lifecycle support is available for this runtime today.",recommendation:o.lifecycleCommands.length>1?void 0:"Add runtime scripts or a Workspai runtime adapter before relying on dev/test/build/start."});let n=r.some(a=>a.status==="fail"),i=r.some(a=>a.status==="warn");return {schemaVersion:1,kind:"rapidkit.import_readiness",generatedAt:(t.generatedAt??new Date).toISOString(),status:n?"blocked":i?"review":"ready",project:{name:t.projectName,relativePath:t.relativePath,...t.projectKind?{kind:t.projectKind}:{},source:t.source},detection:{runtime:t.detection.runtime,framework:t.detection.key,frameworkDisplayName:t.detection.displayName,confidence:t.detection.confidence,supportTier:t.detection.supportTier,importStack:t.detection.importStack},commandSupport:{lifecycleCommands:o.lifecycleCommands,unsupportedLifecycleCommands:o.unsupportedLifecycleCommands,moduleCommands:o.moduleCommands},checks:r}}function lp(t){if(typeof t?.kit_name=="string")return t.kit_name;if(typeof t?.kit=="string")return t.kit}function vr(t){if(t.existingProjectJson?.module_support===true){let e=lp(t.existingProjectJson),o=e?a$3(e):void 0;return o?.owner==="core"&&o.moduleSupport===true}return false}function Ea(t){return t.replace(/\\/g,"/")}function pp(t,e){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,80)||e}function dp(t,e){let o=Ea(C.relative(t,e));return !o||o.startsWith("..")?true:o.split("/").filter(Boolean).some(r=>r==="..")}function ho(t){let e=Ea(C.relative(t.workspacePath,t.projectPath)),o=dp(t.workspacePath,t.projectPath),r=pp(t.projectName,C.basename(t.projectPath)),n=o?`external/${r}`:e||r;return {relativePath:e||n,contractRelativePath:n,isExternal:o}}var Aa={"python-only":"python","node-only":"node","go-only":"go","java-only":"java","dotnet-only":"dotnet"},fp={python:"Python",node:"Node",go:"Go",java:"Java",dotnet:".NET",php:"PHP",ruby:"Ruby",rust:"Rust",elixir:"Elixir",clojure:"Clojure",scala:"Scala",kotlin:"Kotlin",deno:"Deno",bun:"Bun",c:"C",cpp:"C++",unknown:"Unknown"},gp={python:"python-only",node:"node-only",go:"go-only",java:"java-only",dotnet:"dotnet-only"},Ra=["node","deno","bun","python","go","java","kotlin","scala","dotnet","php","ruby","rust","elixir","clojure","c","cpp","unknown"];function Sn(t){return t==="bun"||t==="deno"?"node":t==="kotlin"||t==="scala"?"java":t}function xn(t){return typeof t!="string"||t.trim().length===0?"minimal":t.trim().toLowerCase()}function yo(t){if(typeof t!="string")return "unknown";let e=t.trim().toLowerCase();return e==="python"||e==="node"||e==="go"||e==="java"||e==="dotnet"||e==="php"||e==="ruby"||e==="rust"||e==="elixir"||e==="clojure"||e==="scala"||e==="kotlin"||e==="deno"||e==="bun"||e==="c"||e==="cpp"?e:e==="c++"||e==="cplusplus"||e==="cc"||e==="clang++"||e==="g++"?"cpp":e==="clang"||e==="gcc"?"c":"unknown"}function Pr(t){let e=new Set;for(let o of t)e.add(yo(o));return [...e].sort((o,r)=>Ra.indexOf(o)-Ra.indexOf(r))}function hp(t){let e=Pr(t).filter(o=>o!=="unknown");if(e.length!==0)return e.length===1?gp[e[0]]:"polyglot"}function _a(t,e={}){return `npx workspai bootstrap --profile ${t}${e.ci?" --ci --json":""}`}function yp(t,e){return t?"none":e==="strict"?"error":"warning"}function wo(t){let e=t.ok?void 0:hp(t.runtimes)??"polyglot";return {ok:t.ok,checkId:t.checkId,status:t.ok?"passed":"failed",profile:t.profile,runtimes:t.runtimes,message:t.message,recommendedProfile:e,recommendedCommand:e?_a(e):void 0,ciRecommendedCommand:e?_a(e,{ci:true}):void 0,severity:yp(t.ok,t.mode)}}function St(t){let e=xn(t.profile),o=Pr(t.runtimes),r=t.mode??"warn",n=Aa[e];if(n){let i=o.length===0||o.every(a=>Sn(a)===n);return wo({ok:i,checkId:`profile.${e}`,profile:e,runtimes:o,message:i?`${e} profile validated for discovered projects.`:`${e} profile mismatch: detected runtimes [${o.join(", ")}].`,mode:r})}if(e==="minimal"){let i=o.filter(l=>l!=="unknown"),c=new Set(i.map(l=>Sn(l))).size<=1;return wo({ok:c,checkId:"profile.minimal",profile:e,runtimes:o,message:c?"minimal profile is compatible with detected runtime mix.":`minimal profile mismatch: multiple runtimes detected [${i.join(", ")}].`,mode:r})}return wo({ok:true,checkId:`profile.${e}`,profile:e,runtimes:o,message:`${e} profile accepts the detected runtime mix.`,mode:r})}function ht(t){let e=xn(t.profile),o=yo(t.runtime),r=t.mode??"warn",n=Aa[e];if(!n||o==="unknown")return wo({ok:true,checkId:`profile.${e}`,profile:e,runtimes:[o],message:o==="unknown"?`Project "${t.subjectLabel}" runtime is unknown; profile compatibility will be checked by workspace doctor.`:`${e} profile accepts project "${t.subjectLabel}".`,mode:r});let i=Sn(o)===n;return wo({ok:i,checkId:`profile.${e}`,profile:e,runtimes:i?[o]:Pr([n,o]),message:i?`Project "${t.subjectLabel}" is compatible with workspace profile "${e}".`:`Project "${t.subjectLabel}" is ${fp[o]}, but workspace profile is "${e}".`,mode:r})}async function qt(t){let e=(await Promise.all(o(t,"policies.yml").map(async o=>await R__default.pathExists(o)?o:null))).find(o=>typeof o=="string");if(!e)return "warn";try{return (await R__default.readFile(e,"utf-8")).match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]==="strict"?"strict":"warn"}catch{return "warn"}}async function zt(t){let e=(await Promise.all(o(t,"workspace.json").map(async o=>await R__default.pathExists(o)?o:null))).find(o=>typeof o=="string");if(!e)return "minimal";try{let o=await R__default.readJson(e);return xn(o.profile)}catch{return "minimal"}}async function xt(t,e={}){let o=new Set,r=[],n=new Set,i=[t];for(;i.length>0;){let a=i.pop();if(!a||n.has(a))continue;n.add(a);let c=[];try{c=await S.promises.readdir(a,{withFileTypes:true});}catch{continue}for(let l of c){if(!l.isDirectory()||l.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(l.name))continue;let p$1=C.join(a,l.name);if(p$1!==t&&f$7(p$1))continue;if((await Promise.all([...p(p$1,"context.json"),...p(p$1,"project.json")].map(async d=>R__default.pathExists(d)))).some(Boolean)){r.push(p$1);continue}i.push(p$1);}}for(let a of r){let c=d$5(a);o.add(yo(i$3(a,c).runtime));}for(let a of await a$o(t))o.add(yo(a.runtime));for(let a of e.additionalRuntimes??[])o.add(yo(a));return Pr(o)}function br(t,e={}){let o=e.ci?t.ciRecommendedCommand:t.recommendedCommand;return o?`Recommended: ${o}`:null}function Ia(t){return t.trim().toLowerCase().replace(/\.git$/i,"").replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,64)}function kp(t){let e=t.trim();if(!e)return "imported-project";let o=e.replace(/\\/g,"/").replace(/\/+$/,"").split("/"),r=o[o.length-1]||e,n=r.split(":"),i=(n[n.length-1]||r).replace(/\.git$/i,"");return Ia(i)||"imported-project"}function En(t){let e=t.trim();return e.includes("://")||e.startsWith("git@")}function vp(t){return En(t)?"git-url":"local-folder"}async function Pp(t,e){let o=Ia(e)||"imported-project",r=0;for(;;){let n=r===0?o:r===1?`${o}-imported`:`${o}-imported-${r}`,i=C.join(t,n);if(!await R__default.pathExists(i))return i;r+=1;}}function bp(t,e){let o=C.resolve(t),r=C.resolve(e),n=C.relative(o,r);return n===""||n.length>0&&!n.startsWith("..")&&!C.isAbsolute(n)}function jp(t,e){if(bp(t,e))throw new Error("Import source must be outside the current workspace root.")}function Cp(t){return t.startsWith(".env")?![".env.example",".env.sample",".env.template",".env.defaults",".env.dist"].includes(t):false}function Sp(t){let e=C.basename(t);return !([".git","node_modules",".venv","venv","__pycache__",".pytest_cache",".mypy_cache",".ruff_cache",".next",".turbo",".cache","dist","build","target","bin","obj","vendor","packages"].includes(e)||Cp(e)||e.endsWith(".pem")||e.endsWith(".key"))}async function xp(t){for(let e of p(t,"project.json"))if(await R__default.pathExists(e))try{return await R__default.readJson(e)}catch{return null}return null}async function Ep(t){let e=new Date().toISOString(),o=typeof t.existingProjectJson?.name=="string"?t.existingProjectJson.name:C.basename(t.projectPath),r=ho({workspacePath:t.workspacePath,projectPath:t.projectPath,projectName:o}),n=r.contractRelativePath,i=q$1(t.projectPath,"project.json"),a=q$1(t.projectPath,"import.json"),c=q$1(t.projectPath,"import-readiness.json"),l=vr({existingProjectJson:t.existingProjectJson}),p=Array.isArray(t.existingProjectJson?.modules)?t.existingProjectJson.modules:[],f=t.existingProjectJson?.contracts&&typeof t.existingProjectJson.contracts=="object"&&!Array.isArray(t.existingProjectJson.contracts)?t.existingProjectJson.contracts:{owns:[],apis:[],publishes:[],consumes:[],dependsOn:[],env:[]},d={...t.existingProjectJson||{},schema_version:typeof t.existingProjectJson?.schema_version=="string"?t.existingProjectJson.schema_version:"1.0",name:typeof t.existingProjectJson?.name=="string"?t.existingProjectJson.name:C.basename(t.projectPath),slug:typeof t.existingProjectJson?.slug=="string"?t.existingProjectJson.slug:C.basename(t.projectPath),kind:t.projectKind,runtime:t.detection.runtime,framework:t.detection.key,kit:typeof t.existingProjectJson?.kit=="string"?t.existingProjectJson.kit:`imported.${t.detection.key}`,kit_name:typeof t.existingProjectJson?.kit_name=="string"?t.existingProjectJson.kit_name:`imported.${t.detection.key}`,engine:typeof t.existingProjectJson?.engine=="string"?t.existingProjectJson.engine:"npm",module_support:l,modules:p,contracts:f,import:{managed_by:"workspai",source_type:t.sourceType,imported_at:e,relative_path:n,discovered_relative_path:r.relativePath,is_external:r.isExternal,detection:{framework:t.detection.key,runtime:t.detection.runtime,confidence:t.detection.confidence,support_tier:t.detection.supportTier,source:t.detection.source}}},w={schema_version:"1.0",kind:"workspai.imported_project",imported_at:e,managed_by:"workspai",source:{type:t.sourceType,name:C.basename(t.projectPath)},project:{name:d.name,slug:d.slug,relative_path:n,kind:t.projectKind,module_support:l},detection:{framework:t.detection.key,framework_display_name:t.detection.displayName,runtime:t.detection.runtime,kind:t.projectKind,confidence:t.detection.confidence,support_tier:t.detection.supportTier,import_stack:t.detection.importStack,source:t.detection.source},policy:{copied_secrets:false,copied_dependency_caches:false,module_mutation_enabled:l,profile_compatibility:{ok:t.profileCompatibility.ok,profile:t.profileCompatibility.profile,runtimes:t.profileCompatibility.runtimes,message:t.profileCompatibility.message,recommended_profile:t.profileCompatibility.recommendedProfile,recommended_command:t.profileCompatibility.recommendedCommand}}},h=kr({projectName:String(d.name),relativePath:n,projectKind:t.projectKind,source:t.sourceType,detection:t.detection,moduleSupport:l,projectPath:t.projectPath,generatedAt:new Date(e)});return await R__default.ensureDir(C.dirname(i)),await R__default.writeJson(i,d,{spaces:2}),await R__default.writeJson(a,w,{spaces:2}),await R__default.writeJson(c,h,{spaces:2}),{projectJsonPath:i,importJsonPath:a,importReadinessPath:c,moduleSupport:l}}async function Rp(t,e){let o={name:e.name,path:e.path,relativePath:e.relativePath,stack:e.stack,runtime:e.runtime,framework:e.framework,frameworkDisplayName:e.frameworkDisplayName,supportTier:e.supportTier,moduleSupport:e.moduleSupport,confidence:e.confidence,source:e.source,importedAt:new Date().toISOString()};await b$9(t,[o]);}async function $a(t){await R__default.pathExists(t)&&await R__default.remove(t);}async function Oa(t,e){await $a(e),await c$5(t,[e]);}async function Na(t){let e=C.resolve(t.workspacePath),o=t.source.trim(),r=t.sourceType??vp(o),n=t.name??(r==="git-url"?kp(o):C.basename(o)),i=await Pp(e,n),a=false;try{if(r==="local-folder"){let m=C.resolve(o),g=await R__default.stat(m).catch(()=>null);if(!g||!g.isDirectory())throw new Error("Import source is not a directory.");if(f$7(m))throw new Error("This is a workspace. Import it as a workspace instead.");jp(e,m),a=true,await R__default.copy(m,i,{overwrite:false,errorOnExist:true,filter:Sp});}else a=true,await execa("git",["clone","--depth","1",o,i],{timeout:12e4,env:a$9()});let c=await xp(i),l=i$3(i,c),p=await h$3(i,c),[f,d]=await Promise.all([zt(e),t.profilePolicyMode?Promise.resolve(t.profilePolicyMode):qt(e)]),w=ht({profile:f,runtime:l.runtime,subjectLabel:C.basename(i),mode:d}),h=St({profile:f,runtimes:await xt(e,{additionalRuntimes:[l.runtime]}),mode:d}),k=w.ok?h:w;if(!k.ok&&d==="strict")throw new Error(k.message);let j=await Ep({workspacePath:e,projectPath:i,sourceType:r,detection:l,existingProjectJson:c,projectKind:p,profileCompatibility:k}),_=ho({workspacePath:e,projectPath:i,projectName:C.basename(i)}),y={name:C.basename(i),path:i,relativePath:_.contractRelativePath,stack:l.importStack,runtime:l.runtime,framework:l.key,frameworkDisplayName:l.displayName,supportTier:l.supportTier,moduleSupport:j.moduleSupport,confidence:l.confidence,source:r,projectJsonPath:j.projectJsonPath,importJsonPath:j.importJsonPath,importReadinessPath:j.importReadinessPath,profileCompatibility:k};return await Rp(e,y),y}catch(c){if(a)try{await $a(i);}catch(l){let p=c instanceof Error?c.message:String(c),f=l instanceof Error?l.message:String(l);throw new Error(`Import failed: ${p}. Rollback also failed: ${f}`)}throw c}}function _p(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,64)}function Ap(t,e){return C.resolve(t)===C.resolve(e)}async function Ip(t){for(let e of p(t,"project.json"))if(await R__default.pathExists(e))try{return await R__default.readJson(e)}catch{return null}return null}function $p(t){let e=Array.isArray(t.existingProjectJson?.modules)?t.existingProjectJson.modules:[],o=t.existingProjectJson?.contracts&&typeof t.existingProjectJson.contracts=="object"&&!Array.isArray(t.existingProjectJson.contracts)?t.existingProjectJson.contracts:{owns:[],apis:[],publishes:[],consumes:[],dependsOn:[],env:[]};return {...t.existingProjectJson||{},schema_version:typeof t.existingProjectJson?.schema_version=="string"?t.existingProjectJson.schema_version:"1.0",name:typeof t.existingProjectJson?.name=="string"?t.existingProjectJson.name:t.projectName,slug:typeof t.existingProjectJson?.slug=="string"?t.existingProjectJson.slug:t.projectName,kind:t.projectKind,runtime:t.detection.runtime,framework:t.detection.key,kit:typeof t.existingProjectJson?.kit=="string"?t.existingProjectJson.kit:`adopted.${t.detection.key}`,kit_name:typeof t.existingProjectJson?.kit_name=="string"?t.existingProjectJson.kit_name:`adopted.${t.detection.key}`,engine:typeof t.existingProjectJson?.engine=="string"?t.existingProjectJson.engine:"npm",module_support:t.moduleSupport,modules:e,contracts:o,adoption:{managed_by:"workspai",mode:"linked",adopted_at:t.adoptedAt,relative_path:t.contractRelativePath,discovered_relative_path:t.discoveredRelativePath,is_external:t.isExternal,detection:{framework:t.detection.key,runtime:t.detection.runtime,confidence:t.detection.confidence,support_tier:t.detection.supportTier,source:t.detection.source}}}}async function Ma(t,e,o){let r=p(e,"project.json"),n=q$1(e,"project.json"),i=p(e,"adopt.json"),a=p(e,"adopt-readiness.json");if(o)await R__default.ensureDir(C.dirname(n)),await R__default.writeJson(n,o,{spaces:2});else for(let l of r)await R__default.pathExists(l)&&await R__default.remove(l);for(let l of i)await R__default.pathExists(l)&&await R__default.remove(l);for(let l of a)await R__default.pathExists(l)&&await R__default.remove(l);let{removeImportedProjectsRegistryEntries:c}=await import('./imported-projects-registry-FOIE27WT.js');await c(t,[e]);}async function Ta(t){let e=C.resolve(t.workspacePath),o=C.resolve(t.source),r=await R__default.stat(o).catch(()=>null);if(!r||!r.isDirectory())throw new Error("Adopt source is not a directory.");if(Ap(e,o))throw new Error("Adopt source cannot be the workspace root itself.");if(f$7(o))throw new Error("This is a workspace. Import it as a workspace instead.");let n=await Ip(o),i=i$3(o,n),a=await h$3(o,n),c=_p(t.name||(typeof n?.name=="string"?n.name:"")||C.basename(o))||"adopted-project",l=ho({workspacePath:e,projectPath:o,projectName:c}),p=(t.now??new Date).toISOString(),f=q$1(o,"project.json"),d=q$1(o,"adopt.json"),w=q$1(o,"adopt-readiness.json"),h=vr({existingProjectJson:n}),[k,j]=await Promise.all([zt(e),t.profilePolicyMode?Promise.resolve(t.profilePolicyMode):qt(e)]),_=ht({profile:k,runtime:i.runtime,subjectLabel:c,mode:j}),y=St({profile:k,runtimes:await xt(e,{additionalRuntimes:[i.runtime]}),mode:j}),m=_.ok?y:_;if(!m.ok&&j==="strict")throw new Error(m.message);let g=$p({projectName:c,contractRelativePath:l.contractRelativePath,isExternal:l.isExternal,discoveredRelativePath:l.relativePath,detection:i,existingProjectJson:n,projectKind:a,moduleSupport:h,adoptedAt:p}),v={schema_version:"1.0",kind:"workspai.adopted_project",adopted_at:p,managed_by:"workspai",mode:"linked",workspace:{path:e},project:{name:c,path:o,relative_path:l.contractRelativePath,discovered_relative_path:l.relativePath,is_external:l.isExternal,kind:a,module_support:h},detection:{framework:i.key,framework_display_name:i.displayName,runtime:i.runtime,kind:a,confidence:i.confidence,support_tier:i.supportTier,import_stack:i.importStack,source:i.source},policy:{moved_source:false,copied_source:false,module_mutation_enabled:h,workspace_contract:"linked-project",profile_compatibility:{ok:m.ok,profile:m.profile,runtimes:m.runtimes,message:m.message,recommended_profile:m.recommendedProfile,recommended_command:m.recommendedCommand}}},u=kr({projectName:c,relativePath:l.contractRelativePath,projectKind:a,source:"adopted-local",detection:i,moduleSupport:h,projectPath:o,generatedAt:new Date(p)});if(t.dryRun!==true){await R__default.ensureDir(C.dirname(f)),await R__default.writeJson(f,g,{spaces:2}),await R__default.writeJson(d,v,{spaces:2}),await R__default.writeJson(w,u,{spaces:2});let b={name:c,path:o,relativePath:l.contractRelativePath,relationship:"adopted",stack:i.importStack,runtime:i.runtime,framework:i.key,frameworkDisplayName:i.displayName,supportTier:i.supportTier,moduleSupport:h,confidence:i.confidence,source:"adopted-local",importedAt:p};await b$9(e,[b]);}return {name:c,path:o,relativePath:l.relativePath,contractRelativePath:l.contractRelativePath,isExternal:l.isExternal,relationship:"adopted",stack:i.importStack,runtime:i.runtime,framework:i.key,frameworkDisplayName:i.displayName,supportTier:i.supportTier,moduleSupport:h,confidence:i.confidence,projectJsonPath:f,adoptJsonPath:d,adoptReadinessPath:w,profileCompatibility:m,wroteFiles:t.dryRun!==true}}function Rn(t){if(!t||typeof t!="object")return null;let e=t.code;return e==="PYTHON_NOT_FOUND"||e==="BRIDGE_VENV_BOOTSTRAP_FAILED"||e==="BRIDGE_VENV_CREATE_FAILED"||e==="BRIDGE_PIP_BOOTSTRAP_FAILED"?e:null}function Mp(t=process.argv){let e=C.basename(t[1]??"").toLowerCase().replace(/\.(cmd|ps1|exe|js)$/i,"");return e==="rapidkit"||e==="rapidkit-npm"?"rapidkit":"workspai"}function Qt(){return process.env.WORKSPAI_DEBUG_ARGS==="1"||process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"}function Tp(t){let e=t.trim().toLowerCase();return e?e.startsWith("fastapi")?"fastapi":e.startsWith("nestjs")?"nestjs":null:null}function be(t,e){let o=t.indexOf(e);if(o>=0&&o+1<t.length)return t[o+1];let r=t.find(n=>n.startsWith(`${e}=`));if(r)return r.slice(e.length+1)}function Wp(t){if(t===void 0||t.trim()==="")return;let e=t.trim();if(!/^\d+$/.test(e))throw new Error("--max-workers must be an integer between 1 and 16.");let o=Number(e);if(!Number.isSafeInteger(o)||o<1||o>16)throw new Error("--max-workers must be an integer between 1 and 16.");return o}function Nn(t){try{return Wp(t.raw)}catch(e){let o=e instanceof Error?e.message:String(e);t.json?console.log(JSON.stringify(c$2({operation:t.operation,code:"cli.option.max-workers.invalid",message:o,context:{value:t.raw??null,minimum:1,maximum:16}}),null,2)):console.error(s.red(`\u274C ${o}`)),process.exit(1);}}async function Jn(t,e){let o=be(t,"--port")?.trim(),r=t[3];if(!o||!r||!/^\d+$/.test(o))return;let n=Number.parseInt(o,10);if(n<1||n>65535)return;let i=be(t,"--output")||".",a=C.resolve(e,i,r),c=p(a,"project.json").find(p=>S.existsSync(p))??q$1(a,"project.json");if(!await R__default.pathExists(c))return;let l=await R__default.readJson(c);await R__default.writeJson(c,{...l,ports:[{name:"http",port:n,protocol:"http"}]},{spaces:2});}async function Da(t){let e=re(process.cwd()),o=t.trim().toLowerCase();if(!e||!o)return true;try{let[r,n]=await Promise.all([zt(e),qt(e)]),i=a$3(o),c=k$2(o)?"node":i?.runtime??"python",l=ht({profile:r,runtime:c,subjectLabel:o,mode:n}),p=St({profile:r,runtimes:await xt(e,{additionalRuntimes:[c]}),mode:n}),f=l.ok?p:l;if(f.ok)return true;let d=br(f);if(n==="strict")return console.log(s.red(`\u274C Profile violation (strict mode): ${f.message}`)),d&&console.log(s.gray(`\u{1F4A1} ${d}`)),false;console.log(s.yellow(`\u26A0\uFE0F Profile warning: ${f.message}`)),d&&console.log(s.gray(`\u{1F4A1} ${d}`));}catch{}return true}function Kn(){return i$6()}function La(){let t={...process.env},e=t.PATH||"";return e&&(t.PATH=e.split(C.delimiter).filter(o=>!o.replace(/\\/g,"/").includes("/.pyenv/shims")).join(C.delimiter)),t.PYENV_VERSION="system",t.POETRY_PYTHON||(t.POETRY_PYTHON=h$4()),t.RAPIDKIT_SKIP_LOCK_SYNC||(t.RAPIDKIT_SKIP_LOCK_SYNC="1"),t.POETRY_KEYRING_ENABLED||(t.POETRY_KEYRING_ENABLED="false"),t.PYTHON_KEYRING_BACKEND||(t.PYTHON_KEYRING_BACKEND="keyring.backends.null.Keyring"),t.POETRY_NO_INTERACTION||(t.POETRY_NO_INTERACTION="1"),t}function Dp(t){return l$4(C.join(t,".venv"))}async function nc(t,e){return await Q(t,["--version"],e)===0}async function _t(t){let e=C.join(t,"go.mod");if(await R__default.pathExists(e))return "go";let o=C.join(t,"pom.xml"),r=C.join(t,"build.gradle"),n=C.join(t,"build.gradle.kts");if(await R__default.pathExists(o)||await R__default.pathExists(r)||await R__default.pathExists(n))return "java";if((await R__default.pathExists(t)?await S.promises.readdir(t,{withFileTypes:true}):[]).some(d=>d.isFile()&&d.name.toLowerCase().endsWith(".sln")))return "dotnet";let a=C.join(t,"src");if(await R__default.pathExists(a)&&(await S.promises.readdir(a,{withFileTypes:true})).some(w=>w.isFile()&&w.name.toLowerCase().endsWith(".csproj")))return "dotnet";let c=C.join(t,"package.json");if(await R__default.pathExists(c))return "node";let l=C.join(t,"pyproject.toml"),p=C.join(t,"requirements.txt"),f=C.join(t,"poetry.lock");return await R__default.pathExists(l)||await R__default.pathExists(p)||await R__default.pathExists(f)?"python":null}async function Lp(t){for(let e of Kn())if(await Q(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function sc(t){for(let e of Kn())if(await Q(e,e==="py"?["-3","-m","venv",".venv"]:["-m","venv",".venv"],t)===0)return 0;return 1}async function Fp(t){let e=l$4(C.join(t,".venv"));if(!await R__default.pathExists(e)){let i=await sc(t);if(i!==0)return i}if(!await nc("poetry",t))return 0;let r=await Q("poetry",["config","virtualenvs.in-project","true","--local"],t);if(r!==0)return r;let n=await Q("poetry",["env","use",e],t);return n!==0?n:0}async function Jp(t){let e=l$4(C.join(t,".venv"));if(!await R__default.pathExists(e)){let n=await sc(t);if(n!==0)return n}await Q(e,["-m","pip","install","--upgrade","pip","setuptools","wheel"],t);let o=C.join(t,"requirements.txt");if(await R__default.pathExists(o)&&await Q(e,["-m","pip","install","-r","requirements.txt"],t)===0)return 0;let r=C.join(t,"pyproject.toml");return await R__default.pathExists(r)&&(await Q(e,["-m","pip","install","-e","."],t)===0||await Q(e,["-m","pip","install","."],t)===0)?0:1}async function _n(t,e){return await Fp(t)!==0&&console.log(s.yellow("\u26A0\uFE0F Could not fully configure Poetry local venv. Trying fallback installer...")),(await e.initProject(t)).exitCode===0&&await R__default.pathExists(C.join(t,".venv"))?0:(console.log(s.yellow("\u26A0\uFE0F Python init fallback: installing dependencies directly into project .venv")),await Jp(t))}async function An(t){let e=await Rt("init",t);if(e===0)return 0;let o=["npm","pnpm","yarn"];for(let r of o){if(!await nc(r,t))continue;if(await Q(r,["install"],t)===0)return console.log(s.green(`\u2705 Node init fallback succeeded with ${r} install`)),0}return e}function Kp(t,e){let o=n=>/^\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?$/.test(n),r=be([...e],"--port");if(r&&!/^\d+$/.test(r.trim()))return "Invalid --port. Expected numeric TCP port, e.g. 8080";if(t==="springboot.standard"){let n=be([...e],"--java-version"),i=be([...e],"--spring-boot-version"),a=be([...e],"--springdoc-version"),c=be([...e],"--group-id"),l=be([...e],"--package-name");if(n&&!/^\d+$/.test(n.trim()))return "Invalid --java-version. Expected major version number, e.g. 21";if(i&&!o(i.trim()))return "Invalid --spring-boot-version. Expected semantic version, e.g. 3.5.0";if(a&&!o(a.trim()))return "Invalid --springdoc-version. Expected semantic version, e.g. 2.8.9";if(c&&!/^[A-Za-z0-9_.-]+$/.test(c.trim()))return "Invalid --group-id. Use dot-separated Java package identifiers only.";if(l&&!/^[A-Za-z0-9_.-]+$/.test(l.trim()))return "Invalid --package-name. Use dot-separated Java package identifiers only."}if(t==="dotnet.webapi.clean"){let n=be([...e],"--target-framework"),i=be([...e],"--root-namespace");if(n&&!/^net\d+\.\d+$/.test(n.trim()))return "Invalid --target-framework. Expected .NET target framework, e.g. net8.0";if(i&&!/^[A-Za-z0-9_.]+$/.test(i.trim()))return "Invalid --root-namespace. Use dot-separated .NET namespace identifiers only."}return null}async function Mn(t){if(t[0]!=="create"||t[1]!=="project")return 1;let e=t[2],o=a$3(e),r=t[3];if(!o||o.owner!=="npm")return 1;if(!r)return process.stderr.write(`Usage: ${o.createUsage??"workspai create project <kit> <name> [--output <dir>]"}
154
+ `),1;try{h(r);}catch(p){let f=p instanceof Error?p.message:String(p);return process.stderr.write(`${f}
155
+ `),1}let n=Kp(o.id,t);if(n)return process.stderr.write(`${n}
156
+ `),1;let i=be(t,"--output")||process.cwd(),a=C.resolve(i,r),c=t.includes("--skip-git")||t.includes("--no-git"),l=t.includes("--skip-install");try{let{default:p}=await import('fs-extra');if(await p.ensureDir(C.dirname(a)),await p.pathExists(a))return process.stderr.write(`\u274C Directory "${a}" already exists
157
+ `),1;await p.ensureDir(a),await e$3(o,{projectName:r,projectPath:a,args:t,skipGit:c,skipInstall:l}),await Jn(t,process.cwd());let f=re(process.cwd());if(f){let{syncWorkspaceProjects:d}=await import('./workspace-FQT3QIRS.js');await d(f,true);}return 0}catch(p){return process.stderr.write(`Workspai ${o.id} generator failed: ${p?.message??p}
158
+ `),1}}async function Fa(t){let e=k$2(t[2]);if(!e)return 1;try{let o=await o$2({args:t});if(!o.dryRun){let r=re(process.cwd()),n=false;r||(r=(await Vn()).workspacePath,n=true);let{registerProjectInWorkspace:i,registerWorkspace:a,syncWorkspaceProjects:c}=await import('./workspace-FQT3QIRS.js'),l=i$7({workspacePath:r,result:o});await a(r,C.basename(r)),await b$9(r,[l]),await i(r,o.projectName,o.projectPath),await c(r,true),await at(r,{silent:true}),n&&(console.log(s.gray(`\u2139\uFE0F Project created outside a Workspai workspace \u2014 linked to managed workspace "${e$6}" (${l.relationship}).`)),console.log(s.gray(` Registry: ${C.join(p$2(),"workspaces.json")}`)),console.log(s.gray(" Tip: run from inside a workspace next time, or create one with `workspai create workspace`.")));}return 0}catch(o){return process.stderr.write(`Workspai ${e.kitId} generator failed: ${o?.message??o}
159
159
  `),t[3]||process.stderr.write(`Usage: ${n$1(e.id)}
160
- `),1}}async function ir(t,e){if(t.includes("--json"))return process.stderr.write("Workspai CLI offline fallback does not support --json for `create` commands.\nInstall Python 3.10+ and retry the same command.\n"),1;if(t[0]!=="create")return 1;if(t[1]!=="project")return process.stderr.write(`Workspai CLI could not run the Python core engine for \`create\`.
160
+ `),1}}async function jr(t,e){if(t.includes("--json"))return process.stderr.write("Workspai CLI offline fallback does not support --json for `create` commands.\nInstall Python 3.10+ and retry the same command.\n"),1;if(t[0]!=="create")return 1;if(t[1]!=="project")return process.stderr.write(`Workspai CLI could not run the Python core engine for \`create\`.
161
161
  Reason: ${e}.
162
162
  Install Python 3.10+ to use the interactive wizard and full kit catalog.
163
163
  `),1;let n=t[2],i=t[3];if(!n||!i)return process.stderr.write(`Usage: npx workspai create project <kit> <name> [--output <dir>]
164
164
  Tip: offline fallback supports only fastapi* and nestjs* kits.
165
- `),1;let a=Xl(n);if(!a)return process.stderr.write(`Workspai CLI could not run the Python core engine to create this kit.
165
+ `),1;let a=Tp(n);if(!a)return process.stderr.write(`Workspai CLI could not run the Python core engine to create this kit.
166
166
  Reason: ${e}.
167
167
  Requested kit: ${n}
168
168
  Offline fallback only supports: fastapi.standard, nestjs.standard (and their shorthands).
169
169
  Install Python 3.10+ to access all kits.
170
- `),1;let l=Ie(t,"--output")||process.cwd(),c=v.resolve(l,i),d=t.includes("--skip-git")||t.includes("--no-git"),m=t.includes("--skip-install");try{if(await E__default.ensureDir(v.dirname(c)),await E__default.pathExists(c))return process.stderr.write(`\u274C Directory "${c}" already exists
171
- `),1;let p="pip",u=oe(process.cwd());if(u)try{let{readWorkspaceMarker:g}=await import('./workspace-marker-SMBC3Z2Q.js'),h=await g(u);h?.metadata?.npm?.installMethod&&(p=h.metadata.npm.installMethod,f.debug(`Detected workspace engine: ${p}`));}catch(g){f.debug("Failed to read workspace marker",g);}else f.debug("No workspace found, using default engine: pip");await E__default.ensureDir(c);let{generateDemoKit:f$1}=await import('./demo-kit-AJ5LIM5G.js');if(await f$1(c,{project_name:i,template:a,kit_name:n,skipGit:d,skipInstall:m,engine:p}),u){let{syncWorkspaceProjects:g}=await import('./workspace-PR6VZRBG.js');await g(u,true),await ot(u,{silent:true});}return 0}catch(p){return process.stderr.write(`Workspai CLI offline fallback failed: ${p?.message??p}
172
- `),1}}function nd(t){let e=t.requested||"requested stack";if(process.stderr.write(`${s.yellow("Workspai native create is not available for this request yet.")}
170
+ `),1;let c=be(t,"--output")||process.cwd(),l=C.resolve(c,i),p=t.includes("--skip-git")||t.includes("--no-git"),f$1=t.includes("--skip-install");try{if(await R__default.ensureDir(C.dirname(l)),await R__default.pathExists(l))return process.stderr.write(`\u274C Directory "${l}" already exists
171
+ `),1;let d="pip",w=re(process.cwd());if(w)try{let{readWorkspaceMarker:k}=await import('./workspace-marker-SMBC3Z2Q.js'),j=await k(w);j?.metadata?.npm?.installMethod&&(d=j.metadata.npm.installMethod,f.debug(`Detected workspace engine: ${d}`));}catch(k){f.debug("Failed to read workspace marker",k);}else f.debug("No workspace found, using default engine: pip");await R__default.ensureDir(l);let{generateDemoKit:h}=await import('./demo-kit-DZ7TPG7K.js');if(await h(l,{project_name:i,template:a,kit_name:n,skipGit:p,skipInstall:f$1,engine:d}),await Jn(t,process.cwd()),w){let{syncWorkspaceProjects:k}=await import('./workspace-FQT3QIRS.js');await k(w,true),await at(w,{silent:true});}return 0}catch(d){return process.stderr.write(`Workspai CLI offline fallback failed: ${d?.message??d}
172
+ `),1}}function Vp(t){let e=t.requested||"requested stack";if(process.stderr.write(`${s.yellow("Workspai native create is not available for this request yet.")}
173
173
  `),process.stderr.write(s.gray(`Requested: ${e}
174
174
  `)),process.stderr.write(s.gray(`Lane: ${t.lane} (${t.status})
175
175
  `)),process.stderr.write(s.gray(`Reason: ${t.reason}
176
- `)),t.officialCommands?.length){process.stderr.write(s.gray(`External generator candidates:
176
+ `)),t.officialCommands?.length){process.stderr.write(s.gray(`Official generator candidates:
177
177
  `));for(let o of t.officialCommands)process.stderr.write(s.gray(` - ${o}
178
- `));}process.stderr.write(s.gray("Use an external generator if needed, then run `npx workspai adopt <project-path>` to add Workspace Intelligence.\n"));}function sd(){console.log(`Usage: npx workspai create project <kit> <name> [options]
178
+ `));}process.stderr.write(s.gray("Use an external generator if needed, then run `npx workspai adopt <project-path>` to add Workspace Intelligence.\n"));}function Ja(){console.log(`Usage: npx workspai create project <kit> <name> [options]
179
179
 
180
180
  Scaffold a project and register it with Workspace Intelligence.
181
181
 
@@ -206,75 +206,111 @@ Options:
206
206
 
207
207
  Notes:
208
208
  Python-backed kits delegate execution to RapidKit Core when needed, but the
209
- Workspai CLI owns the command UX, workspace registration, and artifacts.`);}function id(t){let e=t[2]??"<kit>",o=t[3]??"<name>",r=Ie(t,"--output")||process.cwd();console.log("Workspai create project dry run"),console.log(` kit: ${e}`),console.log(` name: ${o}`),console.log(` output: ${v.resolve(r)}`),console.log(" execution: RapidKit Core bridge"),console.log(" writes: none"),console.log(""),console.log("Run without --dry-run to scaffold the project.");}async function Ra(t){let e$1=t[0]==="create"&&t[1]==="frontend",o=m$1(t);if(o&&(t=o),e$1&&!l$2(t[2]))return process.stderr.write(`Unknown frontend generator: ${t[2]?.replace(/^frontend\./,"")}
209
+ Workspai CLI owns the command UX, workspace registration, and artifacts.`);}function Gp(){console.log(`Usage: npx workspai create workspace [name] [options]
210
+
211
+ Create a Workspai workspace and initialize Workspace Intelligence files.
212
+
213
+ Examples:
214
+ npx workspai create workspace my-workspace
215
+ npx workspai create workspace my-workspace --output ./workspaces --yes
216
+ npx workspai my-workspace --here
217
+
218
+ Options:
219
+ --output <dir> Parent directory for the workspace
220
+ --here Create in the current directory
221
+ -y, --yes Accept defaults in non-interactive mode
222
+ --profile <profile> minimal | python-only | node-only | go-only | java-only | dotnet-only | polyglot | enterprise
223
+ --install-method <method> poetry | venv | pipx
224
+ --skip-python-engine Skip RapidKit Core installation for now
225
+ --skip-git Do not initialize git
226
+ --dry-run Show the planned workspace without writing files
227
+
228
+ Mental model:
229
+ Repository
230
+ \u2193
231
+ Workspace Intelligence
232
+ \u2193
233
+ Developers \xB7 CI \xB7 IDEs \xB7 AI Agents`);}function Up(){console.log(`Usage: npx workspai create <workspace|project> [options]
234
+
235
+ Create a workspace or scaffold a project into Workspace Intelligence.
236
+
237
+ Commands:
238
+ create workspace [name] Create a Workspai workspace
239
+ create project <kit> <name> Scaffold a project and register it
240
+
241
+ Shortcuts:
242
+ npx workspai my-workspace Create a workspace
243
+
244
+ Run:
245
+ npx workspai create workspace --help
246
+ npx workspai create project --help`);}function Hp(t){let e=t[2]??"<kit>",o=t[3]??"<name>",r=be(t,"--output")||process.cwd();console.log("Workspai create project dry run"),console.log(` kit: ${e}`),console.log(` name: ${o}`),console.log(` output: ${C.resolve(r)}`),console.log(" execution: RapidKit Core bridge"),console.log(" writes: none"),console.log(""),console.log("Run without --dry-run to scaffold the project.");}async function ic(t){if(t[0]==="create"&&(t.includes("--help")||t.includes("-h")||t.includes("help")))return t[1]==="project"?Ja():t[1]==="workspace"?Gp():Up(),0;let e$1=t[0]==="create"&&t[1]==="frontend",o=m$1(t);if(o&&(t=o),e$1&&!l$2(t[2]))return process.stderr.write(`Unknown frontend generator: ${t[2]?.replace(/^frontend\./,"")}
210
247
  `),process.stderr.write(`Usage: ${n$1()}
211
- `),1;if(process.env.RAPIDKIT_FORCE_OFFLINE_CREATE_FALLBACK==="1"&&t[0]==="create")return ir(t,"PYTHON_NOT_FOUND");let r=new Set(["--yes","-y","--skip-git","--skip-install","--debug","--dry-run","--no-update-check","--create-workspace","--no-workspace","--here"]);if(t[0]==="create"&&(!t[1]||t[1].startsWith("-"))){let n=t.includes("--yes")||t.includes("-y"),i=t.slice(1),a$1;!process.stdin.isTTY||n?(a$1="workspace",process.stdin.isTTY&&console.log(s.gray("\u2139\uFE0F No subcommand provided for `create`; defaulting to `create workspace`."))):(process.stdin.isTTY&&a("create"),a$1=(await b$3([{type:"rawlist",name:"createTarget",message:"What do you want to create?",choices:[{name:"workspace",value:"workspace"},{name:"project",value:"project"}]}])).createTarget);let l=["create",a$1,...i];return await Ra(l)}if(t[0]==="create"&&t[1]==="workspace")try{let n=t.includes("--yes")||t.includes("-y"),i$2=t.includes("--skip-git")||t.includes("--no-git"),a$2=t.includes("--skip-python-engine")||t.includes("--no-python-engine"),l=t.includes("--dry-run"),c=t[2]&&!t[2].startsWith("-")?t[2]:void 0,d=Ie(t,"--install-method"),m=d==="poetry"||d==="venv"||d==="pipx"?d:void 0,p=Ie(t,"--profile"),u=p==="minimal"||p==="java-only"||p==="go-only"||p==="dotnet-only"||p==="python-only"||p==="node-only"||p==="polyglot"||p==="enterprise"?p:void 0,f=c;if(f||(n?f="my-workspace":(process.stdin.isTTY&&a("create workspace"),f=(await b$3([{type:"input",name:"workspaceName",message:"Workspace name:",default:"my-workspace"}])).workspaceName)),!f||!f.trim())return process.stderr.write(`Workspace name is required.
212
- `),1;try{h(f);}catch(x){if(x instanceof a$1)return process.stderr.write(`${x.message}
213
- `),1;throw x}let g=await i(t,{hasYes:n}),h$2=g$1(f.trim(),{argv:t,outputParent:g});l||await E__default.ensureDir(v.dirname(h$2));let k=i$1(f.trim());if(!l&&(h$1(k,h$2,{outputParent:g})&&k&&await E__default.pathExists(k)||await E__default.pathExists(h$2)))return process.stderr.write(`\u274C Workspace "${f}" already exists
214
- `),k&&k!==h$2&&process.stderr.write(` Found at: ${k}
215
- `),1;let b=await b$1(),w=b.author||process.env.USER||"Workspai User";if(!n){let x=await b$3([{type:"input",name:"author",message:"Author name:",default:w}]);x.author?.trim()&&(w=x.author.trim());}let{createProject:y}=await import('./create-WRZO4HK2.js');return await y(f,{skipGit:i$2,skipPythonEngine:a$2,yes:n,dryRun:l,userConfig:{...b,author:w},installMethod:m,profile:u,parentDirectory:v.dirname(h$2)}),l||(console.log(s.gray(`\u2139\uFE0F Workspace root: ${h$2}`)),console.log(s.gray(` Next: ${f$2(h$2)} && npx workspai create project`))),0}catch(n){return process.stderr.write(`Workspai CLI failed to create workspace: ${n?.message??n}
216
- `),1}try{if(t[0]==="create"&&t[1]==="project"){if(t.includes("--help")||t.includes("-h"))return sd(),0;if(!t[2]||t[2].startsWith("-")){process.stdin.isTTY&&a("create project");let{kitChoice:w}=await b$3([{type:"rawlist",name:"kitChoice",message:"Select a kit to scaffold:",choices:a$6()}]);if(d$1(w)||l$2(w)){let S=sn(w),{projectName:A}=await b$3([{type:"input",name:"projectName",message:"Project name:",default:S,validate:B=>B.trim().length>0||"Project name is required"}]),I=t.slice(2).filter(B=>B.startsWith("-")),Y=["create","project",w,A.trim(),...I];if(!await ia(w))return 1;let te=l$2(w)?await ca(Y):await wn(Y),K=oe(process.cwd());return te===0&&K&&await ot(K),te}let y=sn(w),{projectName:x}=await b$3([{type:"input",name:"projectName",message:"Project name:",default:y,validate:S=>S.trim().length>0||"Project name is required"}]);t.splice(2,0,w,x.trim());}let i=t[2],a$1=f$4({kitId:i,framework:i,runtime:i});if(g$3(a$1))return nd(a$1),1;if(!await ia(t[2]||""))return 1;if(d$1(t[2])){let w=await wn(t),y=oe(process.cwd());return w===0&&y&&await ot(y),w}if(l$2(t[2]))return await ca(t);if(t.includes("--skip-python-engine")||t.includes("--no-python-engine"))return process.stderr.write("`--skip-python-engine` is a workspace creation option. For projects, use `--skip-install` to scaffold first, then run `npx workspai init` when ready.\n"),1;if(t.includes("--dry-run"))return id(t),0;let l=t.includes("--create-workspace"),c=t.includes("--no-workspace"),d=t.includes("--yes")||t.includes("-y"),m=t.includes("--skip-git")||t.includes("--no-git");if(!!!Pn(process.cwd())){let{registerWorkspaceAtPath:w}=await import('./create-WRZO4HK2.js');if(l)await w(process.cwd(),{skipGit:m,yes:d,userConfig:await b$1()});else if(!c)if(d)await w(process.cwd(),{skipGit:m,yes:true,userConfig:await b$1()});else {let{createWs:y}=await b$3([{type:"confirm",name:"createWs",message:"This project will be created outside a Workspai workspace. Create and register a workspace here?",default:true}]);y&&await w(process.cwd(),{skipGit:m,yes:false,userConfig:await b$1()});}}let f$1=[...t.filter(w=>{let y=w.split("=")[0];return !r.has(w)&&!r.has(y)})],g=oe(process.cwd()),b=t.includes("--skip-install")||!!g?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0;try{await d$5();let w=await e(f$1,{cwd:process.cwd(),env:b});if(w===0&&g&&!t.includes("--skip-install")&&(console.log(s.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(s.white(" Next: cd <project-name> && npx workspai init"))),w===0){let y=g||oe(process.cwd());if(y){try{let S=t[3];if(S){let A=t.indexOf("--output"),I=A>=0?t[A+1]:".",Y=v.resolve(process.cwd(),I,S),te=v.join(y,".python-version"),K=v.join(Y,".python-version");if(P.existsSync(te)&&P.existsSync(Y)){let B=P.readFileSync(te,"utf-8");P.writeFileSync(K,B.trim()+`
217
- `),f.debug(`Synced Python version ${B.trim()} from workspace to ${S}`);}}}catch(S){f.debug("Could not sync Python version from workspace:",S);}let{syncWorkspaceProjects:x}=await import('./workspace-PR6VZRBG.js');await x(y,true),await ot(y);}}return w}catch(w){let y=un(w);return y?await ir(f$1,y):(process.stderr.write(`Workspai failed to run the Python core engine: ${w?.message??w}
218
- `),1)}}if(t[0]==="create"&&t[1]!=="project")try{await d$5();let n=await e(t,{cwd:process.cwd()});if(n===0){let i=oe(process.cwd());if(i){let{syncWorkspaceProjects:a}=await import('./workspace-PR6VZRBG.js');await a(i,true);}}return n}catch(n){let i=un(n);return i?await ir(t,i):(process.stderr.write(`Workspai failed to run the Python core engine: ${n?.message??n}
219
- `),1)}return await d$5(),await e(t,{cwd:process.cwd()})}catch(n){let i=un(n);return i?await ir(t,i):(process.stderr.write(`Workspai failed to run the Python core engine: ${n?.message??n}
220
- `),1)}}var la=["init","dev","start","build","test","docs","lint","format","create","help","--help","-h"],Ea=["analyze","readiness","doctor","autopilot","pipeline","import","adopt","snapshot","workspace","bootstrap","setup","cache","mirror","ai","config","product","infra","shell","commands"],ad=["analyze","readiness","doctor","autopilot","pipeline","import","adopt","snapshot","workspace","ai","config","product","infra","shell","commands"],cd=["bootstrap","setup","cache","mirror"],ld=[["project","commands"],["project","archives"],["project","archive"],["project","restore"],["project","delete"]],dd=["init"],pd=k,da=[...pd,...l$1];function ud(t){return !!t&&Ea.includes(t)}function _a(t){let e=t[0],o=t[1];return ld.some(([r,n])=>e!==r?false:o?o===n:true)}function ao(t){return ud(t[0])||_a(t)}function md(t){return !!t&&ad.includes(t)}function pa(t){return md(t[0])||_a(t)}function ua(t){return !!t&&cd.includes(t)}function fd(t=process.env){let e=t.npm_config_user_agent||"",o=t.npm_execpath||"",r=t.npm_command||"";return e.startsWith("npm/")||e.includes(" npx/")||/(?:^|[/\\])npx(?:\.cmd)?$/i.test(o)||/(?:^|[/\\])npm(?:\.cmd)?$/i.test(o)||r==="exec"||r==="x"||r==="run-script"}function Aa(t={}){let e=q(process.cwd());if(t.json){console.log(JSON.stringify(e,null,2));return}console.log(s.bold("Workspai project command capabilities")),console.log(s.gray(`Project: ${e.projectRoot??"not detected"}`)),console.log(s.gray(`Runtime: ${e.runtime} (${e.runtimeSupportTier}) | Framework: ${e.frameworkDisplayName} (${e.frameworkSupportTier}) | Module support: ${e.moduleSupport?"yes":"no"}`)),console.log(s.gray(`Doctor support: ${e.runtimeDoctorSupport}`)),console.log(""),console.log(s.green(`Supported: ${e.supportedCommands.join(", ")||"none"}`)),console.log(s.yellow(`Global: ${e.globalCommands.join(", ")||"none"}`)),console.log(s.red(`Unsupported: ${e.unsupportedCommands.join(", ")||"none"}`));}var Ia="rapidkit-command-capabilities-v1",gd="rapidkit-version-v1";function hd(){return {schemaVersion:gd,cli:"workspai",version:c(),node:process.version,platform:process.platform,capabilitiesSchemaVersion:Ia,contracts:tr()}}function yd(){let t=[...Ea,"create","project"],e=["version","add","list","info","upgrade","diff","merge","optimize","license","checkpoint","reconcile","rollback","uninstall","frameworks","modules"],o=["init","dev","start","build","test","lint","format","help"],r=[...Zo],n=[...er];return {schemaVersion:Ia,scope:"global",cli:"workspai",version:c(),cwd:process.cwd(),contracts:tr(),commands:{npmOwned:t,coreBacked:e,projectScoped:o},workspace:{command:"workspace",subcommands:r,intelligenceSubcommands:n},commandMap:Object.fromEntries([...t.map(i=>[i,{command:i,owner:"npm-wrapper",status:"supported",scope:i==="project"?"project-introspection":"workspace"}]),...e.map(i=>[i,{command:i,owner:"python-core",status:"delegated",scope:"core"}]),...o.map(i=>[i,{command:i,owner:"runtime-adapter",status:i==="help"?"supported":"runtime-dependent",scope:"project"}])])}}function wd(t={}){let e=yd();if(t.json){console.log(JSON.stringify(e,null,2));return}console.log(s.bold("Workspai command capabilities")),console.log(s.gray(`CLI: ${e.cli} v${e.version}`)),console.log(""),console.log(s.green(`npm wrapper: ${e.commands.npmOwned.join(", ")}`)),console.log(s.cyan(`Python core: ${e.commands.coreBacked.join(", ")}`)),console.log(s.yellow(`Project runtime: ${e.commands.projectScoped.join(", ")}`)),console.log(s.magenta(`Workspace intelligence: ${e.workspace.intelligenceSubcommands.join(", ")}`)),console.log(""),console.log(s.gray("Tip: run `workspai project commands --json` inside a project."));}function kn(t){return s$1(t)?(Aa({json:t.includes("--json")||t.includes("--ci")}),true):false}function vn(t$1){let e=q(process.cwd());if(!e.projectRoot)return false;let o=r$1(t$1,process.cwd());if(!o||o.status!=="unsupported")return false;console.error(s.red(t(o,e))),process.exit(1);}function Ue(t){return P.existsSync(v.join(t,".workspai-workspace"))||P.existsSync(v.join(t,".workspai","workspace.json"))||P.existsSync(v.join(t,".rapidkit-workspace"))||P.existsSync(v.join(t,".rapidkit","workspace.json"))}function $a(t){let e=t;for(;;){let o=p(e,"context.json").find(n=>P.existsSync(n));if(o)return o;let r=v.dirname(e);if(r===e)break;e=r;}return null}function Pn(t){let e=t,o=v.resolve(tmpdir());for(;;){let r=[v.join(e,".workspai-workspace"),v.join(e,".rapidkit-workspace")].find(i=>P.existsSync(i));if(r&&v.resolve(e)!==o)return r;let n=v.dirname(e);if(n===e)break;e=n;}return null}function oe(t){let e=t,o=v.resolve(tmpdir());for(;;){if((P.existsSync(v.join(e,".workspai-workspace"))||P.existsSync(v.join(e,".workspai","workspace.json"))||P.existsSync(v.join(e,".rapidkit-workspace"))||P.existsSync(v.join(e,".rapidkit","workspace.json")))&&v.resolve(e)!==o)return e;let n=v.dirname(e);if(n===e)break;e=n;}return null}async function ot(t,e){try{let{syncWorkspaceContract:o}=await import('./workspace-contract-XUGMCUSQ.js'),r=await o({workspacePath:t});if(!e?.silent&&(r.addedProjects.length>0||r.updatedProjects.length>0)&&console.log(s.gray(`\u2139\uFE0F Workspace contract synced (${r.contract.projects.length} project(s)).`)),!e?.silent&&r.verification.status!=="passed"){console.log(s.yellow("\u26A0\uFE0F Workspace contract verification failed after project sync."));for(let n of r.verification.violations)console.log(s.gray(` Violation: ${n}`));console.log(s.white(" Next: npx workspai workspace contract inspect"));}}catch(o){e?.silent||console.log(s.yellow(`\u26A0\uFE0F Workspace contract sync skipped: ${o.message}`));}}async function kd(t,e=process.cwd(),o=process.platform){if(!(!!t.workspaceFlag||t.scope==="workspace")||!b(o))return {detected:false};let n=o$1(e,o);for(let i of n){if(!await E__default.pathExists(i))continue;let a=i.toLowerCase();if(a.endsWith("rapidkit.cmd")||a.endsWith("rapidkit.exe"))return {detected:true,candidatePath:i,reason:"Found workspace-local rapidkit launcher on Windows."}}return {detected:false}}function vd(t){let e=t;for(;;){let o=v.join(e,".rapidkit-workspace"),r=v.join(e,".rapidkit","workspace.json");if(!P.existsSync(o)&&P.existsSync(r))return e;let n=v.dirname(e);if(n===e)break;e=n;}return null}var Ma={enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true};function Pd(t){return t&&t.match(/^[\t ]*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]==="strict"?"strict":"warn"}function io(t,e){let o=t.match(new RegExp(`^[\\t ]*${e}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return o?o[1]==="true":Ma[e]}function ma(t){let e=t??"";return {mode:Pd(e),dependency_sharing_mode:Oa(e),rules:{enforce_workspace_marker:io(e,"enforce_workspace_marker"),enforce_toolchain_lock:io(e,"enforce_toolchain_lock"),disallow_untrusted_tool_sources:io(e,"disallow_untrusted_tool_sources"),enforce_compatibility_matrix:io(e,"enforce_compatibility_matrix"),require_mirror_lock_for_offline:io(e,"require_mirror_lock_for_offline")}}}function fa(t,e,o){let r=`${e}: ${o}`,n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`^[\\t ]*${n}:\\s*.*$`,"m");if(i.test(t))return t.replace(i,r);let a=/^[\t ]*rules:\s*(?:#.*)?$/m;return a.test(t)?t.replace(a,`${r}
248
+ `),1;if(process.env.RAPIDKIT_FORCE_OFFLINE_CREATE_FALLBACK==="1"&&t[0]==="create")return jr(t,"PYTHON_NOT_FOUND");let r=new Set(["--yes","-y","--skip-git","--skip-install","--debug","--dry-run","--no-update-check","--create-workspace","--no-workspace","--here"]);if(t[0]==="create"&&(!t[1]||t[1].startsWith("-"))){let n=t.includes("--yes")||t.includes("-y"),i=t.slice(1),a$1;!process.stdin.isTTY||n?(a$1="workspace",process.stdin.isTTY&&console.log(s.gray("\u2139\uFE0F No subcommand provided for `create`; defaulting to `create workspace`."))):(process.stdin.isTTY&&a("create"),a$1=(await b$3([{type:"rawlist",name:"createTarget",message:"What do you want to create?",choices:[{name:"workspace",value:"workspace"},{name:"project",value:"project"}]}])).createTarget);let c=["create",a$1,...i];return await ic(c)}if(t[0]==="create"&&t[1]==="workspace")try{let n=t.includes("--yes")||t.includes("-y"),i$2=t.includes("--skip-git")||t.includes("--no-git"),a$2=t.includes("--skip-python-engine")||t.includes("--no-python-engine"),c=t.includes("--dry-run"),l=t[2]&&!t[2].startsWith("-")?t[2]:void 0,p=be(t,"--install-method"),f=p==="poetry"||p==="venv"||p==="pipx"?p:void 0,d=be(t,"--profile"),w=d==="minimal"||d==="java-only"||d==="go-only"||d==="dotnet-only"||d==="python-only"||d==="node-only"||d==="polyglot"||d==="enterprise"?d:void 0,h$2=l;if(h$2||(n?h$2="my-workspace":(process.stdin.isTTY&&a("create workspace"),h$2=(await b$3([{type:"input",name:"workspaceName",message:"Workspace name:",default:"my-workspace"}])).workspaceName)),!h$2||!h$2.trim())return process.stderr.write(`Workspace name is required.
249
+ `),1;try{h(h$2);}catch(v){if(v instanceof a$1)return process.stderr.write(`${v.message}
250
+ `),1;throw v}let k=await i(t,{hasYes:n}),j=g(h$2.trim(),{argv:t,outputParent:k});c||await R__default.ensureDir(C.dirname(j));let _=i$1(h$2.trim());if(!c&&(h$1(_,j,{outputParent:k})&&_&&await R__default.pathExists(_)||await R__default.pathExists(j)))return process.stderr.write(`\u274C Workspace "${h$2}" already exists
251
+ `),_&&_!==j&&process.stderr.write(` Found at: ${_}
252
+ `),1;let y=await b$1(),m=y.author||process.env.USER||"Workspai User";if(!n){let v=await b$3([{type:"input",name:"author",message:"Author name:",default:m}]);v.author?.trim()&&(m=v.author.trim());}let{createProject:g$1}=await import('./create-DFAWAS5C.js');return await g$1(h$2,{skipGit:i$2,skipPythonEngine:a$2,yes:n,dryRun:c,userConfig:{...y,author:m},installMethod:f,profile:w,parentDirectory:C.dirname(j)}),c||(console.log(s.gray(`\u2139\uFE0F Workspace root: ${j}`)),console.log(s.gray(` Next: ${f$2(j)} && npx workspai create project`))),0}catch(n){return process.stderr.write(`Workspai CLI failed to create workspace: ${n?.message??n}
253
+ `),1}try{if(t[0]==="create"&&t[1]==="project"){if(t.includes("--help")||t.includes("-h"))return Ja(),0;if(!t[2]||t[2].startsWith("-")){process.stdin.isTTY&&a("create project");let{kitChoice:m}=await b$3([{type:"rawlist",name:"kitChoice",message:"Select a kit to scaffold:",choices:a$6()}]);if(d$1(m)||l$2(m)){let u=bn(m),{projectName:b}=await b$3([{type:"input",name:"projectName",message:"Project name:",default:u,validate:W=>W.trim().length>0||"Project name is required"}]),P=t.slice(2).filter(W=>W.startsWith("-")),x=["create","project",m,b.trim(),...P];if(!await Da(m))return 1;let A=l$2(m)?await Fa(x):await Mn(x),I=re(process.cwd());return A===0&&I&&await at(I),A}let g=bn(m),{projectName:v}=await b$3([{type:"input",name:"projectName",message:"Project name:",default:g,validate:u=>u.trim().length>0||"Project name is required"}]);t.splice(2,0,m,v.trim());}let i=t[2],a$1=f$5({kitId:i,framework:i,runtime:i});if(g$2(a$1))return Vp(a$1),1;if(!await Da(t[2]||""))return 1;if(d$1(t[2])){let m=await Mn(t),g=re(process.cwd());return m===0&&g&&await at(g),m}if(l$2(t[2]))return await Fa(t);if(t.includes("--skip-python-engine")||t.includes("--no-python-engine"))return process.stderr.write("`--skip-python-engine` is a workspace creation option. For projects, use `--skip-install` to scaffold first, then run `npx workspai init` when ready.\n"),1;if(t.includes("--dry-run"))return Hp(t),0;let c=t.includes("--create-workspace"),l=t.includes("--no-workspace"),p=t.includes("--yes")||t.includes("-y"),f$1=t.includes("--skip-git")||t.includes("--no-git");if(!!!Dn(process.cwd())){let{registerWorkspaceAtPath:m}=await import('./create-DFAWAS5C.js');if(c)await m(process.cwd(),{skipGit:f$1,yes:p,userConfig:await b$1()});else if(!l)if(p)await m(process.cwd(),{skipGit:f$1,yes:true,userConfig:await b$1()});else {let{createWs:g}=await b$3([{type:"confirm",name:"createWs",message:"This project will be created outside a Workspai workspace. Create and register a workspace here?",default:true}]);g&&await m(process.cwd(),{skipGit:f$1,yes:false,userConfig:await b$1()});}}let h=[...t.filter(m=>{let g=m.split("=")[0];return !r.has(m)&&!r.has(g)})],k=re(process.cwd()),y=t.includes("--skip-install")||!!k?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0;try{await d$7();let m=await e(h,{cwd:process.cwd(),env:y});if(m===0&&k&&!t.includes("--skip-install")&&(console.log(s.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(s.white(" Next: cd <project-name> && npx workspai init"))),m===0){await Jn(t,process.cwd());let g=k||re(process.cwd());if(g){try{let u=t[3];if(u){let b=t.indexOf("--output"),P=b>=0?t[b+1]:".",x=C.resolve(process.cwd(),P,u),A=C.join(g,".python-version"),I=C.join(x,".python-version");if(S.existsSync(A)&&S.existsSync(x)){let W=S.readFileSync(A,"utf-8");S.writeFileSync(I,W.trim()+`
254
+ `),f.debug(`Synced Python version ${W.trim()} from workspace to ${u}`);}}}catch(u){f.debug("Could not sync Python version from workspace:",u);}let{syncWorkspaceProjects:v}=await import('./workspace-FQT3QIRS.js');await v(g,true),await at(g);}}return m}catch(m){let g=Rn(m);return g?await jr(h,g):(process.stderr.write(`Workspai failed to run the Python core engine: ${m?.message??m}
255
+ `),1)}}if(t[0]==="create"&&t[1]!=="project")try{await d$7();let n=await e(t,{cwd:process.cwd()});if(n===0){let i=re(process.cwd());if(i){let{syncWorkspaceProjects:a}=await import('./workspace-FQT3QIRS.js');await a(i,true);}}return n}catch(n){let i=Rn(n);return i?await jr(t,i):(process.stderr.write(`Workspai failed to run the Python core engine: ${n?.message??n}
256
+ `),1)}return await d$7(),await e(t,{cwd:process.cwd()})}catch(n){let i=Rn(n);return i?await jr(t,i):(process.stderr.write(`Workspai failed to run the Python core engine: ${n?.message??n}
257
+ `),1)}}var Ka=["init","dev","start","build","test","docs","lint","format","create","help","--help","-h"],ac=[...e$4,"autopilot","pipeline","import","adopt","snapshot","bootstrap","setup","cache","mirror","ai","config","product","infra","shell","commands"],Bp=[...e$4,"autopilot","pipeline","import","adopt","snapshot","ai","config","product","infra","shell","commands"],qp=["bootstrap","setup","cache","mirror"],zp=[["project","commands"],["project","archives"],["project","archive"],["project","restore"],["project","delete"]],Yp=["init"],Qp=k,Va=[...Qp,...l$1];function Xp(t){return !!t&&ac.includes(t)}function cc(t){let e=t[0],o=t[1];return e==="project"&&(o==="--help"||o==="-h"||o==="help")?true:zp.some(([r,n])=>e!==r?false:o?o===n:true)}function Po(t){return Xp(t[0])||cc(t)}function Zp(t){return !!t&&Bp.includes(t)}function Ga(t){return Zp(t[0])||cc(t)}function Ua(t){return !!t&&qp.includes(t)}function ed(t=process.env){let e=t.npm_config_user_agent||"",o=t.npm_execpath||"",r=t.npm_command||"";return e.startsWith("npm/")||e.includes(" npx/")||/(?:^|[/\\])npx(?:\.cmd)?$/i.test(o)||/(?:^|[/\\])npm(?:\.cmd)?$/i.test(o)||r==="exec"||r==="x"||r==="run-script"}function lc(t={}){let e=q(process.cwd());if(t.json){console.log(JSON.stringify(e,null,2));return}console.log(s.bold("Workspai project command capabilities")),console.log(s.gray(`Project: ${e.projectRoot??"not detected"}`)),console.log(s.gray(`Runtime: ${e.runtime} (${e.runtimeSupportTier}) | Framework: ${e.frameworkDisplayName} (${e.frameworkSupportTier}) | Module support: ${e.moduleSupport?"yes":"no"}`)),console.log(s.gray(`Doctor support: ${e.runtimeDoctorSupport}`)),console.log(""),console.log(s.green(`Supported: ${e.supportedCommands.join(", ")||"none"}`)),console.log(s.yellow(`Global: ${e.globalCommands.join(", ")||"none"}`)),console.log(s.red(`Unsupported: ${e.unsupportedCommands.join(", ")||"none"}`));}function td(){return {schemaVersion:ka,cli:"workspai",version:c(),node:process.version,platform:process.platform,capabilitiesSchemaVersion:Pn,contracts:go(),contractCatalog:wr()}}function od(){let t=[...ac,"create","project"],e=[...a$7].filter(i=>!t.includes(i)),o=["init","dev","start","build","test","lint","format","help"],r=[...fo],n=[...yr];return {schemaVersion:Pn,scope:"global",cli:"workspai",version:c(),cwd:process.cwd(),contracts:go(),contractCatalog:wr(),commands:{npmOwned:t,coreBacked:e,projectScoped:o},workspace:{command:"workspace",subcommands:r,intelligenceSubcommands:n},commandMap:Object.fromEntries([...t.map(i=>[i,{command:i,owner:"npm-wrapper",status:"supported",scope:i==="project"?"project-introspection":"workspace"}]),...e.map(i=>[i,{command:i,owner:"python-core",status:"delegated",scope:"core"}]),...o.map(i=>[i,{command:i,owner:"runtime-adapter",status:i==="help"?"supported":"runtime-dependent",scope:"project"}])])}}function rd(t={}){let e=od();if(t.json){console.log(JSON.stringify(e,null,2));return}console.log(s.bold("Workspai command capabilities")),console.log(s.gray(`CLI: ${e.cli} v${e.version}`)),console.log(""),console.log(s.green(`npm wrapper: ${e.commands.npmOwned.join(", ")}`)),console.log(s.cyan(`Python core: ${e.commands.coreBacked.join(", ")}`)),console.log(s.yellow(`Project runtime: ${e.commands.projectScoped.join(", ")}`)),console.log(s.magenta(`Workspace intelligence: ${e.workspace.intelligenceSubcommands.join(", ")}`)),console.log(""),console.log(s.gray("Tip: run `workspai project commands --json` inside a project."));}function Tn(t){return s$1(t)?(lc({json:t.includes("--json")||t.includes("--ci")}),true):false}function Wn(t$1){let e=q(process.cwd());if(!e.projectRoot)return false;let o=r$1(t$1,process.cwd());if(!o||o.status!=="unsupported")return false;console.error(s.red(t(o,e))),process.exit(1);}function qe(t){return S.existsSync(C.join(t,".workspai-workspace"))||S.existsSync(C.join(t,".workspai","workspace.json"))||S.existsSync(C.join(t,".rapidkit-workspace"))||S.existsSync(C.join(t,".rapidkit","workspace.json"))}function pc(t){let e=t;for(;;){let o=p(e,"context.json").find(n=>S.existsSync(n));if(o)return o;let r=C.dirname(e);if(r===e)break;e=r;}return null}function Dn(t){let e=t,o=C.resolve(tmpdir());for(;;){let r=[C.join(e,".workspai-workspace"),C.join(e,".rapidkit-workspace")].find(i=>S.existsSync(i));if(r&&C.resolve(e)!==o)return r;let n=C.dirname(e);if(n===e)break;e=n;}return null}function re(t){let e=t,o=C.resolve(tmpdir());for(;;){if((S.existsSync(C.join(e,".workspai-workspace"))||S.existsSync(C.join(e,".workspai","workspace.json"))||S.existsSync(C.join(e,".rapidkit-workspace"))||S.existsSync(C.join(e,".rapidkit","workspace.json")))&&C.resolve(e)!==o)return e;let n=C.dirname(e);if(n===e)break;e=n;}return null}async function at(t,e){try{let{syncWorkspaceContract:o}=await import('./workspace-contract-SEI4SNSG.js'),r=await o({workspacePath:t});if(!e?.silent&&(r.addedProjects.length>0||r.updatedProjects.length>0)&&console.log(s.gray(`\u2139\uFE0F Workspace contract synced (${r.contract.projects.length} project(s)).`)),!e?.silent&&r.verification.status!=="passed"){console.log(s.yellow("\u26A0\uFE0F Workspace contract verification failed after project sync."));for(let n of r.verification.violations)console.log(s.gray(` Violation: ${n}`));console.log(s.white(" Next: npx workspai workspace contract inspect"));}}catch(o){e?.silent||console.log(s.yellow(`\u26A0\uFE0F Workspace contract sync skipped: ${o.message}`));}}async function nd(t,e=process.cwd(),o=process.platform){if(!(!!t.workspaceFlag||t.scope==="workspace")||!b(o))return {detected:false};let n=o$1(e,o);for(let i of n){if(!await R__default.pathExists(i))continue;let a=i.toLowerCase();if(a.endsWith("rapidkit.cmd")||a.endsWith("rapidkit.exe"))return {detected:true,candidatePath:i,reason:"Found workspace-local rapidkit launcher on Windows."}}return {detected:false}}function sd(t){let e=t;for(;;){let o=C.join(e,".rapidkit-workspace"),r=C.join(e,".rapidkit","workspace.json");if(!S.existsSync(o)&&S.existsSync(r))return e;let n=C.dirname(e);if(n===e)break;e=n;}return null}var dc={enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true};function id(t){return t&&t.match(/^[\t ]*mode:\s*(warn|strict)\s*(?:#.*)?$/m)?.[1]==="strict"?"strict":"warn"}function vo(t,e){let o=t.match(new RegExp(`^[\\t ]*${e}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return o?o[1]==="true":dc[e]}function Ha(t){let e=t??"";return {mode:id(e),dependency_sharing_mode:uc(e),rules:{enforce_workspace_marker:vo(e,"enforce_workspace_marker"),enforce_toolchain_lock:vo(e,"enforce_toolchain_lock"),disallow_untrusted_tool_sources:vo(e,"disallow_untrusted_tool_sources"),enforce_compatibility_matrix:vo(e,"enforce_compatibility_matrix"),require_mirror_lock_for_offline:vo(e,"require_mirror_lock_for_offline")}}}function Ba(t,e,o){let r=`${e}: ${o}`,n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`^[\\t ]*${n}:\\s*.*$`,"m");if(i.test(t))return t.replace(i,r);let a=/^[\t ]*rules:\s*(?:#.*)?$/m;return a.test(t)?t.replace(a,`${r}
221
258
  rules:`):`${t.endsWith(`
222
259
  `)?t:`${t}
223
260
  `}${r}
224
- `}function bd(t,e,o){let r=` ${e}: ${o?"true":"false"}`,n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`^[\\t ]+${n}:\\s*.*$`,"m");if(i.test(t))return t.replace(i,r);let a=/^[\t ]*rules:\s*(?:#.*)?$/m;return a.test(t)?t.replace(a,`rules:
261
+ `}function ad(t,e,o){let r=` ${e}: ${o?"true":"false"}`,n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`^[\\t ]+${n}:\\s*.*$`,"m");if(i.test(t))return t.replace(i,r);let a=/^[\t ]*rules:\s*(?:#.*)?$/m;return a.test(t)?t.replace(a,`rules:
225
262
  ${r}`):`${t.endsWith(`
226
263
  `)?t:`${t}
227
264
  `}rules:
228
265
  ${r}
229
- `}function Sd(){return ['version: "1.0"','mode: warn # "warn" or "strict"','dependency_sharing_mode: isolated # "isolated" or "shared-runtime-caches" or "shared-node-deps"',"# change profile (recommended): npx workspai bootstrap --profile polyglot","# change mode/dependency manually: edit this file and rerun npx workspai init","rules:"," enforce_workspace_marker: true"," enforce_toolchain_lock: false"," disallow_untrusted_tool_sources: false"," enforce_compatibility_matrix: false"," require_mirror_lock_for_offline: true",""].join(`
230
- `)}async function ga(t){for(let e of o(t,"policies.yml"))if(await E__default.pathExists(e))return P.promises.readFile(e,"utf-8");return Sd()}async function xd(t,e){let o=l(t,"policies.yml");await E__default.ensureDir(v.dirname(o));let r=e.endsWith(`
266
+ `}function cd(){return ['version: "1.0"','mode: warn # "warn" or "strict"','dependency_sharing_mode: isolated # "isolated" or "shared-runtime-caches" or "shared-node-deps"',"# change profile (recommended): npx workspai bootstrap --profile polyglot","# change mode/dependency manually: edit this file and rerun npx workspai init","rules:"," enforce_workspace_marker: true"," enforce_toolchain_lock: false"," disallow_untrusted_tool_sources: false"," enforce_compatibility_matrix: false"," require_mirror_lock_for_offline: true",""].join(`
267
+ `)}async function qa(t){for(let e of o(t,"policies.yml"))if(await R__default.pathExists(e))return S.promises.readFile(e,"utf-8");return cd()}async function ld(t,e){let o=l(t,"policies.yml");await R__default.ensureDir(C.dirname(o));let r=e.endsWith(`
231
268
  `)?e:`${e}
232
- `;await P.promises.writeFile(o,r,"utf-8");}function Cd(t){let e=t.trim().toLowerCase();return e==="true"||e==="1"||e==="on"?true:e==="false"||e==="0"||e==="off"?false:null}function Oa(t){if(!t)return "isolated";let o=t.match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();return o==="shared-runtime-caches"||o==="shared-node-deps"||o==="isolated"?o:"isolated"}function Na(t){if(!t)return {mode:"isolated",status:"skipped",message:"No policies.yml found; dependency_sharing_mode defaults to isolated."};let e=t.match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m);if(!e)return {mode:"isolated",status:"skipped",message:"dependency_sharing_mode is not set; defaulting to isolated."};let o=e[1].toLowerCase();return o==="isolated"||o==="shared-runtime-caches"||o==="shared-node-deps"?{mode:o,status:"passed",message:`dependency_sharing_mode is valid: ${o}.`}:{mode:"isolated",status:"failed",message:`Invalid dependency_sharing_mode: ${o}. Use one of: isolated, shared-runtime-caches, shared-node-deps.`}}async function Wa(t,e){let o$1=oe(t),r=o$1?o(o$1,"policies.yml").find(l=>P.existsSync(l)):null,n="isolated";if(r&&await E__default.pathExists(r))try{let l=await P.promises.readFile(r,"utf-8"),c=Na(l);if(c.status==="failed")return console.log(s.red(`\u274C ${c.message}`)),{ok:false,code:1};n=c.mode;}catch{return console.log(s.red("\u274C Failed to read workspace policy file (.workspai/policies.yml).")),{ok:false,code:1}}let i=process.env.RAPIDKIT_DEP_SHARING_MODE,a=process.env.RAPIDKIT_WORKSPACE_PATH;process.env.RAPIDKIT_DEP_SHARING_MODE=n,o$1&&(process.env.RAPIDKIT_WORKSPACE_PATH=o$1);try{return {ok:true,value:await e()}}finally{typeof i>"u"?delete process.env.RAPIDKIT_DEP_SHARING_MODE:process.env.RAPIDKIT_DEP_SHARING_MODE=i,typeof a>"u"?delete process.env.RAPIDKIT_WORKSPACE_PATH:process.env.RAPIDKIT_WORKSPACE_PATH=a;}}async function z(t,e,o,r={}){let{buildPackageRunnerSubprocessEnv:n,resolvePackageRunnerInvocation:i}=await import('./platform-capabilities-XAVU4HSM.js'),a=jd(t,e,o),l=a?{command:process.execPath,prefixArgs:["-e",a]}:i(t),c=l.command,d=a?l.prefixArgs:[...l.prefixArgs,...e],m=n();if(a){process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[workspai-cli] runCommandInCwd.nodeEval=${JSON.stringify({cwd:o,scriptBytes:a.length})}
233
- `);try{return Yl.runInThisContext(a,{filename:v.join(o,"package.json#script")}),0}catch(k){return process.stderr.write(`${k instanceof Error?k.stack||k.message:String(k)}
234
- `),1}}let u=!(process.argv.includes("--json")||process.env.RAPIDKIT_WORKSPACE_RUN_CHILD==="1"||process.env.RAPIDKIT_SUPPRESS_RUN_COMMAND_OUTPUT==="1")&&t==="npm"&&(e[0]==="run"||e[0]==="run-script"||e[0]==="install"),f=()=>{let k=m.npm_config_cache;if(!k)return "";let b=v.join(k,"_logs");try{let y=P.readdirSync(b).filter(S=>S.endsWith(".log")).map(S=>{let A=v.join(b,S);return {filePath:A,mtimeMs:P.statSync(A).mtimeMs}}).sort((S,A)=>A.mtimeMs-S.mtimeMs)[0]?.filePath;return y?P.readFileSync(y,"utf-8").split(/\r?\n/).map(S=>S.trim()).filter(S=>/(?:^|\s)(?:npm\s+)?(?:error|verbose\s+(?:stack|cwd|os|node|npm|exit|code))\b/i.test(S)).slice(0,12).join(`
235
- `):""}catch{return ""}},g=Number.parseInt(process.env.RAPIDKIT_CHILD_COMMAND_TIMEOUT_MS||"",10),h=r.timeoutMs&&r.timeoutMs>0?r.timeoutMs:Number.isFinite(g)&&g>0?g:void 0;return await new Promise(k=>{let b$1=[],w=[],y=false,x=null,S=null,A=()=>{try{S?.stdout?.destroy();}catch{}try{S?.stderr?.destroy();}catch{}try{S?.stdin?.destroy();}catch{}try{S?.removeAllListeners("close"),S?.removeAllListeners("error"),S?.unref();}catch{}};process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[workspai-cli] runCommandInCwd=${JSON.stringify({executable:c,args:d,cwd:o,directNodeEvalScript:a!==null,npmEnv:Object.fromEntries(Object.entries(m).filter(([I])=>["npm_config_if_present","npm_config_ignore_scripts","npm_config_loglevel","npm_config_silent","npm_config_json","npm_lifecycle_event","npm_lifecycle_script"].includes(I)))})}
236
- `),S=spawn(c,d,{stdio:u?"inherit":["ignore","pipe","pipe"],cwd:o,shell:c$6(),env:m,detached:!b()}),h&&h>0&&(x=setTimeout(()=>{if(!y){if(y=true,!b()&&S.pid)try{process.kill(-S.pid,"SIGTERM");}catch{S.kill("SIGTERM");}else S.kill("SIGTERM");A(),process.env.RAPIDKIT_SUPPRESS_RUN_COMMAND_OUTPUT!=="1"&&process.stderr.write(`RapidKit command timed out after ${h}ms: ${c} ${d.join(" ")}
237
- `),k(124);}},h)),u||(S.stdout?.on("data",I=>{b$1.push(I);}),S.stderr?.on("data",I=>{w.push(I);})),S.on("close",I=>{if(y)return;y=true,x&&clearTimeout(x);let Y=Buffer.concat(b$1),te=Buffer.concat(w),K=I&&I!==0&&Y.length===0&&te.length===0&&t==="npm"?f():"";process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[workspai-cli] runCommandInCwd.close=${JSON.stringify({code:I,stdoutBytes:Y.length,stderrBytes:te.length,npmFailureExcerptBytes:K.length})}
238
- `),process.env.RAPIDKIT_SUPPRESS_RUN_COMMAND_OUTPUT!=="1"&&(Y.length>0&&process.stdout.write(Y),te.length>0?process.stderr.write(te):K&&process.stderr.write(`${K}
239
- `)),k(I??1);}),S.on("error",()=>{y||(y=true,x&&clearTimeout(x),k(1));});})}function jd(t,e,o){if(t!=="npm")return null;let r=e[0];if(r!=="run"&&r!=="run-script")return null;let n=e.find((a,l)=>l>0&&!a.startsWith("-"));if(!n)return null;let i=v.join(o,"package.json");if(!P.existsSync(i))return null;try{let l=JSON.parse(P.readFileSync(i,"utf8")).scripts?.[n];return typeof l!="string"?null:Rd(l)}catch{return null}}function Rd(t){let e=t.trim(),o=e.match(/^node\s+(?:-e|--eval)\s+"((?:\\.|[^"\\])*)"$/);if(o)return o[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\");let r=e.match(/^node\s+(?:-e|--eval)\s+'((?:\\.|[^'\\])*)'$/);return r?r[1].replace(/\\'/g,"'").replace(/\\\\/g,"\\"):null}async function et(t,e){await E__default.outputFile(t,`${JSON.stringify(e,null,2)}
240
- `,"utf-8");}async function Ed(t,e,o){let r=process.env.RAPIDKIT_TEST_IMPORT_SYNC_FAIL==="1"&&(process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"),n=e.workspace?v.resolve(e.workspace):null,i=n??oe(process.cwd()),a=false,l=false;if(n){if(!Ue(n)){let p=`Workspace path is not a valid Workspai workspace: ${n}`;return e.json?console.log(JSON.stringify({error:p},null,2)):console.log(s.red(`\u274C ${p}`)),1}}else if(!i||!Ue(i)){let p=await Cn();i=p.workspacePath,a=true,l=p.created;}if(!i||!Ue(i)){let p="Not inside a Workspai workspace";return e.json?console.log(JSON.stringify({error:p},null,2)):(console.log(s.red(`\u274C ${p}`)),console.log(s.gray("\u{1F4A1} Run this command from a workspace root or pass --workspace <path>."))),1}let c=`cd ${i}`,d=o?.syncWorkspaceProjects??(async p=>{if(r)throw new Error("forced sync failure for command-level import rollback test");let{syncWorkspaceProjects:u}=await import('./workspace-PR6VZRBG.js');await u(p,true),await ot(p,{silent:true});}),m=o?.rollbackImportedProjectImport??ta;try{let p=await oa({workspacePath:i,source:t,name:e.name,sourceType:e.git===true?"git-url":void 0});try{await d(i);}catch(u){await m(i,p.path);try{await d(i);}catch{}throw new Error(`Workspace sync failed after import and the imported project was rolled back: ${u instanceof Error?u.message:String(u)}`)}if(e.json)return console.log(JSON.stringify({workspacePath:i,workspaceResolution:a?"default-auto":n?"explicit":"nearest",defaultWorkspaceCreated:a?l:false,suggestedCdCommand:c,importedProject:p},null,2)),0;if(a&&console.log(s.yellow(`\u2139 Imported outside a workspace, so Workspai used the default workspace: ${i}`)),console.log(s.green(`\u2714 Imported project: ${p.name}`)),console.log(s.gray(` Workspace: ${i}`)),console.log(s.gray(` Destination: ${p.path}`)),console.log(s.gray(` Stack: ${p.stack} (${p.confidence})`)),console.log(s.gray(` Source: ${e.git===true||pn(t)?"git-url":"local-folder"}`)),!p.profileCompatibility.ok){let u=sr(p.profileCompatibility);console.log(s.yellow(` Profile warning: ${p.profileCompatibility.message}`)),u&&console.log(s.gray(` ${u}`));}return console.log(s.gray(` Next shell step: ${c}`)),0}catch(p){let u=p instanceof Error?p.message:String(p);return e.json?console.log(JSON.stringify({error:u},null,2)):console.log(s.red(`\u274C Import failed: ${u}`)),1}}async function _d(t,e,o){let r=v.resolve(t||process.cwd()),n=e.workspace?v.resolve(e.workspace):null,i=n??oe(process.cwd()),a=false,l=false;if(n){if(!Ue(n)){let f=`Workspace path is not a valid Workspai workspace: ${n}`;return e.json?console.log(JSON.stringify({error:f},null,2)):console.log(s.red(`\u274C ${f}`)),1}}else if(!i||!Ue(i)){let f=await Cn();i=f.workspacePath,a=true,l=f.created;}if(!i||!Ue(i)){let f="Not inside a Workspai workspace";return e.json?console.log(JSON.stringify({error:f},null,2)):(console.log(s.red(`\u274C ${f}`)),console.log(s.gray("\u{1F4A1} Run this command from a workspace root or pass --workspace <path>."))),1}let c=process.env.RAPIDKIT_TEST_ADOPT_SYNC_FAIL==="1"&&(process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"),d=o?.syncWorkspaceProjects??(async f=>{if(c)throw new Error("forced sync failure for command-level adopt rollback test");let{syncWorkspaceProjects:g}=await import('./workspace-PR6VZRBG.js');await g(f,true),await ot(f,{silent:true});}),m=o?.registerProjectInWorkspace??(async(f,g,h)=>{let{registerProjectInWorkspace:k}=await import('./workspace-PR6VZRBG.js');await k(f,g,h);}),p$1=o?.registerWorkspace??(async(f,g)=>{let{registerWorkspace:h}=await import('./workspace-PR6VZRBG.js');await h(f,g);}),u=o?.rollbackAdoptedProjectImport??ra;try{let f=null;for(let h of p(r,"project.json"))if(await E__default.pathExists(h)){f=await E__default.readJson(h);break}let g=await na({workspacePath:i,source:r,name:e.name,dryRun:e.dryRun===true});if(e.dryRun!==true)try{await p$1(i,v.basename(i)),await m(i,g.name,g.path),await d(i);}catch(h){throw await u(i,g.path,f),new Error(`Workspace sync failed after adopt and adoption metadata was rolled back: ${h instanceof Error?h.message:String(h)}`)}if(e.json)return console.log(JSON.stringify({workspacePath:i,workspaceResolution:a?"default-auto":n?"explicit":"nearest",defaultWorkspaceCreated:a?l:false,dryRun:e.dryRun===true,adoptedProject:g},null,2)),0;if(a&&console.log(s.yellow(`\u2139 Adopted outside a workspace, so Workspai used the default workspace: ${i}`)),e.dryRun===true&&console.log(s.yellow("\u2139 Dry run: no adoption files were written.")),console.log(s.green(`\u2714 Adopted project: ${g.name}`)),console.log(s.gray(` Workspace: ${i}`)),console.log(s.gray(` Project: ${g.path}`)),console.log(s.gray(" Mode: linked (source was not moved or copied)")),console.log(s.gray(` Stack: ${g.stack} (${g.confidence})`)),!g.profileCompatibility.ok){let h=sr(g.profileCompatibility);console.log(s.yellow(` Profile warning: ${g.profileCompatibility.message}`)),h&&console.log(s.gray(` ${h}`));}return console.log(s.gray(` Report: ${g.adoptReadinessPath}`)),console.log(s.gray(" Next: npx workspai workspace model --json")),0}catch(f){let g=f instanceof Error?f.message:String(f);return e.json?console.log(JSON.stringify({error:g},null,2)):console.log(s.red(`\u274C Adopt failed: ${g}`)),1}}async function bn(t){let e=new Set(["python-only","polyglot","enterprise"]),o$1=Ad(),r="minimal",n=false;try{let c=o(t,"workspace.json").find(m=>P.existsSync(m))??l(t,"workspace.json"),d=JSON.parse(await P.promises.readFile(c,"utf-8"));r=d.profile??"minimal",n=d.bootstrap_note==="python-engine-skipped"||d.engine?.python_core?.status==="skipped";}catch{r="minimal";}if(!await(async()=>{if(!n&&e.has(r))return true;let c=await Da(t);if(c.length===0)return false;for(let d of c){let m=d$4(d),p=m?.module_support,u=j(d);if(n){if(u?.moduleSupport===true)return true;continue}if(!(e$1(m,d)||g$2(m,d)||h$2(m,d))&&p!==false)return i$2(m,d)||f$3(m,d),true}return false})())return 0;let a="poetry";try{let{readWorkspaceMarker:c}=await import('./workspace-marker-SMBC3Z2Q.js'),m=(await c(t))?.metadata?.npm?.installMethod;(m==="poetry"||m==="venv"||m==="pipx"||m==="pip")&&(a=m);}catch{}let l$1=async()=>{let c=Zl(t);if(!await E__default.pathExists(c)){let u=await ed(t);if(u!==0)return u}let d=a$a("DEV_PATH"),p=(d?await E__default.pathExists(d):false)&&d?["-m","pip","install",d,"--quiet","--disable-pip-version-check"]:["-m","pip","install","rapidkit-core","--quiet","--disable-pip-version-check"];return await z(c,p,t,{timeoutMs:o$1})};if(a==="venv"){let c=await l$1();if(c!==0)return c}else if(a==="poetry"){let c=v.join(t,"pyproject.toml"),d=false;try{d=(await P.promises.readFile(c,"utf-8")).includes("rapidkit-core");}catch{d=false;}if(d){let m=await l$1();if(m!==0)return m}else {let m=await z("poetry",["install","--no-root"],t,{timeoutMs:o$1});if(m!==0)return m;let p=await z("poetry",["add","rapidkit-core"],t,{timeoutMs:o$1});if(p!==0)return p}}else return 0;try{let{writeWorkspaceLauncher:c}=await import('./create-WRZO4HK2.js');await c(t,a==="venv"?"venv":"poetry");}catch{}try{let{markWorkspacePythonEngineInstalled:c}=await import('./workspace-python-engine-state-MTWIIZPY.js');await c(t,{installMethod:a==="venv"?"venv":"poetry",venvPath:".venv"});}catch{}return 0}function Ad(){let t=process.env.RAPIDKIT_WORKSPACE_DEPS_TIMEOUT_MS;if(t){let e=Number.parseInt(t,10);if(Number.isFinite(e)&&e>0)return e}return 12e4}async function Da(t){let e=[],o=new Set,r=[t];for(;r.length>0;){let n=r.pop();if(!n||o.has(n))continue;o.add(n);let i=[];try{i=await P.promises.readdir(n,{withFileTypes:true});}catch{continue}for(let a of i){if(!a.isDirectory()||a.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(a.name))continue;let l=v.join(n,a.name);if((await Promise.all([...p(l,"context.json"),...p(l,"project.json")].map(d=>E__default.pathExists(d)))).some(Boolean)){e.push(l);continue}r.push(l);}}return e}function Id(t){return j$2(t)}async function Cn(){let t=k$1(),e=v.basename(t),o=Ue(t);await b$8(t,d$6(e,c()));let r=l(t,"workspace.json");return await E__default.pathExists(r)||await et(r,{name:e,workspace_name:e,profile:"minimal",createdAt:new Date().toISOString(),createdBy:"workspai-cli-import-fallback"}),{workspacePath:t,created:!o}}async function gn(t){let o=await Je("go",{runCommandInCwd:z,runCoreRapidkit:e}).initProject(t);return ee(o)}function ee(t){return t.message&&console.log(s.red(`\u274C ${t.message}`)),t.exitCode}async function Pt(t,e$1){let o=Je("node",{runCommandInCwd:z,runCoreRapidkit:e});if(t==="init"){let n=await o.initProject(e$1);return ee(n)}if(t==="dev"){let n=await o.runDev(e$1);return ee(n)}if(t==="test"){let n=await o.runTest(e$1);return ee(n)}if(t==="build"){let n=await o.runBuild(e$1);return ee(n)}if(t==="lint"){let n=await o.runLint?.(e$1);return ee(n??{exitCode:1,message:"Lint is not supported."})}if(t==="format"){let n=await o.runFormat?.(e$1);return ee(n??{exitCode:1,message:"Format is not supported."})}let r=await o.runStart(e$1);return ee(r)}async function tt(t,e$1){let o=Je("java",{runCommandInCwd:z,runCoreRapidkit:e});if(t==="init"){let n=await o.initProject(e$1);return ee(n)}if(t==="dev"){let n=await o.runDev(e$1);return ee(n)}if(t==="test"){let n=await o.runTest(e$1);return ee(n)}if(t==="build"){let n=await o.runBuild(e$1);return ee(n)}if(t==="lint"){let n=await o.runLint?.(e$1);return ee(n??{exitCode:1,message:"Lint is not supported."})}if(t==="format"){let n=await o.runFormat?.(e$1);return ee(n??{exitCode:1,message:"Format is not supported."})}let r=await o.runStart(e$1);return ee(r)}function hn(t,e,o){let r=o.filter(n=>n.status==="failed").map(n=>{let i=n.id||"check";return n.message?`${i}: ${n.message}`:i}).slice(0,12);return f$6(t,{commandId:"bootstrap",exitCode:e,generatedAt:typeof t.timestamp=="string"?t.timestamp:new Date().toISOString(),blockers:r,runId:e$4()})}async function ha(t,e=Sn){let o$1=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof o$1>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let i=function(j){if(!j)return null;let $=j.trim().toLowerCase();return $==="minimal"||$==="java-only"||$==="go-only"||$==="dotnet-only"||$==="python-only"||$==="node-only"||$==="polyglot"||$==="enterprise"?$:null},a=function(j){let Me=j.match(/^\s*mode:\s*([a-zA-Z]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase()==="strict"?"strict":"warn",ve=(ce,_e)=>{let De=j.match(new RegExp(`^\\s*${ce}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return De?De[1].toLowerCase()==="true":_e};return {mode:Me,dependency_sharing_mode:Oa(j),rules:{enforce_workspace_marker:ve("enforce_workspace_marker",true),enforce_toolchain_lock:ve("enforce_toolchain_lock",false),disallow_untrusted_tool_sources:ve("disallow_untrusted_tool_sources",false),enforce_compatibility_matrix:ve("enforce_compatibility_matrix",false),require_mirror_lock_for_offline:ve("require_mirror_lock_for_offline",true)}}};let l$1=["init"],c,d=false,m=false,p=false,u=false;for(let j=1;j<t.length;j+=1){let $=t[j];if($==="--ci"){d=true;continue}if($==="--offline"){m=true;continue}if($==="--json"){p=true;continue}if($==="--compliance-only"){u=true;continue}if($==="--profile"){let Q=t[j+1];if(!Q||Q.startsWith("-"))return console.log(s.yellow("Usage: workspai bootstrap [path] [--profile <minimal|java-only|go-only|dotnet-only|python-only|node-only|polyglot|enterprise>] [--ci] [--offline] [--json] [--compliance-only]")),1;c=Q,j+=1;continue}if($.startsWith("--profile=")){c=$.slice(10);continue}l$1.push($);}let f=i(c);if(c&&!f)return console.log(s.red(`Invalid profile: ${c}. Use one of: minimal, java-only, go-only, dotnet-only, python-only, node-only, polyglot, enterprise.`)),1;let g=process.cwd(),h=l$1.slice(1).filter(j=>!j.startsWith("-"));if(h.length>0){let j=v.resolve(g,h[0]),$=d$4(j),Q=P.existsSync(j)?await bt(j):"unknown";if(!Ue(j)&&(e$1($,j)||g$2($,j)||h$2($,j)||f$3($,j)||i$2($,j)||Q!=="unknown"))return await e(l$1)}let k=v.join(g,".rapidkit-workspace"),b=v.join(g,".rapidkit","workspace.json"),w;!P.existsSync(k)&&P.existsSync(b)?w=g:(w=oe(g),w||(w=vd(g)));let y=[],x=null,S=null;if(w)try{let j=o(w,"workspace.json").find(Me=>P.existsSync(Me))??l(w,"workspace.json"),$=await P.promises.readFile(j,"utf-8"),Q=JSON.parse($);S=i(Q.profile);}catch{S=null;}let A=["minimal","java-only","python-only","node-only","go-only","dotnet-only","polyglot","enterprise"],I={minimal:"minimal \u2014 Foundation files only (fastest bootstrap, mixed projects)","java-only":"java-only \u2014 Java runtime (Spring Boot services)","python-only":"python-only \u2014 Python + Poetry (FastAPI, Django, ML pipelines)","node-only":"node-only \u2014 Node.js runtime (NestJS, Express, Next.js)","go-only":"go-only \u2014 Go runtime (Fiber, Gin, gRPC, microservices)","dotnet-only":"dotnet-only \u2014 .NET runtime (ASP.NET Core services)",polyglot:"polyglot \u2014 Python + Node.js + Go + Java + .NET multi-runtime workspace",enterprise:"enterprise \u2014 Polyglot + governance + Sigstore verification"},Y=f;if(!!w&&!f&&!d&&!p&&!!process.stdin.isTTY&&!!process.stdout.isTTY&&process.env.VITEST!=="true"&&process.env.VITEST!=="1"){let j=S||"minimal",{chosenProfile:$}=await b$3([{type:"rawlist",name:"chosenProfile",message:`Select workspace profile for bootstrap (current: ${j})`,choices:A.map(Q=>({name:Q===j?`${I[Q]} \u2190 current`:I[Q],value:Q})),default:A.indexOf(j)}]);Y=$;}let K=Y||S||"minimal";if(w)try{let $=K==="python-only"||K==="polyglot"||K==="enterprise"?"poetry":"venv",Q;try{let _e=(await P.promises.readFile(v.join(w,".python-version"),"utf-8")).trim();_e&&(Q=_e);}catch{}let{syncWorkspaceFoundationFiles:Me}=await import('./create-WRZO4HK2.js'),ve=await Me(w,{workspaceName:v.basename(w),installMethod:$,pythonVersion:Q,profile:K,writeMarker:true,writeGitignore:true,onlyIfMissing:true});y.push({id:"workspace.foundation.sync",status:ve.length>0?"passed":"skipped",message:ve.length>0?`Workspace foundation synchronized: ${ve.join(", ")}`:"Workspace foundation files are already up to date."});}catch(j){y.push({id:"workspace.foundation.sync",status:"failed",message:`Failed to synchronize workspace foundation files: ${j.message}`});}if(w&&Y&&Y!==S)try{let j=l(w,"workspace.json"),$=await P.promises.readFile(j,"utf-8"),Q=JSON.parse($);Q.profile=Y,await E__default.ensureDir(v.dirname(j)),await P.promises.writeFile(j,JSON.stringify(Q,null,2)+`
241
- `,"utf-8");}catch{}let B={mode:"warn",dependency_sharing_mode:"isolated",rules:{enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true}},U=null;if(w)try{let j=o(w,"policies.yml").find(Q=>P.existsSync(Q));if(!j)throw new Error("policy file missing");let $=await P.promises.readFile(j,"utf-8");U=$,B=a($);}catch{y.push({id:"policy.file",status:"skipped",message:"No workspace policy file found; using default bootstrap policy."});}else y.push({id:"workspace.detect",status:"skipped",message:"No workspace marker found; bootstrap runs in project/single-path mode."});if(w){let j=Na(U);B.dependency_sharing_mode=j.mode,y.push({id:"policy.schema.dependency_sharing_mode",status:j.status,message:j.message}),y.push({id:"policy.dependency_sharing_mode.effective",status:"passed",message:B.dependency_sharing_mode==="isolated"?"Effective dependency mode: isolated (default secure mode).":B.dependency_sharing_mode==="shared-node-deps"?"Effective dependency mode: shared-node-deps (Node projects share workspace-level caches).":"Effective dependency mode: shared-runtime-caches (Node/Python/Go share workspace-level caches)."});let $=P.existsSync(v.join(w,".workspai-workspace"))||P.existsSync(v.join(w,".rapidkit-workspace"));y.push({id:"policy.enforce_workspace_marker",status:!B.rules.enforce_workspace_marker||$?"passed":"failed",message:!B.rules.enforce_workspace_marker||$?"Workspace marker policy satisfied.":"Workspace marker policy failed: .workspai-workspace is missing."});let Q=o(w,"toolchain.lock").some(me=>P.existsSync(me));y.push({id:"policy.enforce_toolchain_lock",status:!B.rules.enforce_toolchain_lock||Q?"passed":"failed",message:!B.rules.enforce_toolchain_lock||Q?"Toolchain lock policy satisfied.":"Toolchain lock policy failed: .workspai/toolchain.lock is missing."});let Me=process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||o(w,"trusted-sources.lock").some(me=>P.existsSync(me));y.push({id:"policy.disallow_untrusted_tool_sources",status:!B.rules.disallow_untrusted_tool_sources||Me?"passed":"failed",message:!B.rules.disallow_untrusted_tool_sources||Me?"Trusted tool sources policy satisfied.":"Trusted tool sources policy failed: set RAPIDKIT_TRUSTED_SOURCES=1 or provide .workspai/trusted-sources.lock."});let ve=o(w,"compatibility-matrix.json").find(me=>P.existsSync(me))??l(w,"compatibility-matrix.json"),ce=P.existsSync(ve),_e=B.rules.enforce_compatibility_matrix;if(y.push({id:"policy.enforce_compatibility_matrix",status:!_e||ce?"passed":"failed",message:!_e||ce?"Compatibility matrix policy satisfied.":"Compatibility matrix policy failed: .workspai/compatibility-matrix.json is missing."}),ce)try{let me=await P.promises.readFile(ve,"utf-8"),Gt=JSON.parse(me),Rn=!!Gt&&typeof Gt=="object";y.push({id:"compatibility.matrix.parse",status:Rn?"passed":"failed",message:Rn?"Compatibility matrix parsed successfully.":"Compatibility matrix parse failed: invalid JSON object."});}catch{y.push({id:"compatibility.matrix.parse",status:"failed",message:"Compatibility matrix parse failed: invalid JSON."});}let De=o(w,"mirror-config.json").find(me=>P.existsSync(me))??l(w,"mirror-config.json"),Kt=o(w,"mirror.lock").find(me=>P.existsSync(me))??l(w,"mirror.lock"),lr=P.existsSync(De),dr=P.existsSync(Kt),jn={};if(lr)try{jn=JSON.parse(await P.promises.readFile(De,"utf-8")),y.push({id:"mirror.config.parse",status:"passed",message:"Mirror configuration parsed successfully."});}catch{y.push({id:"mirror.config.parse",status:"failed",message:"Mirror configuration parse failed: invalid JSON in .workspai/mirror-config.json."});}let pr=await an(w,{ciMode:d,offlineMode:m});if(y.push(...pr.checks.map(me=>({id:me.id,status:me.status,message:me.message}))),x=pr.details,pr.details.lockWritten&&(dr=true),m){let me=process.env.RAPIDKIT_MIRROR_ENABLED==="1"||jn.enabled===true;y.push({id:"offline.mirror.enabled",status:me?"passed":"failed",message:me?"Offline mode mirror is enabled.":'Offline mode requires mirror enablement (set RAPIDKIT_MIRROR_ENABLED=1 or .workspai/mirror-config.json {"enabled": true}).'});let Gt=B.rules.require_mirror_lock_for_offline;y.push({id:"offline.mirror.lock",status:!Gt||dr?"passed":"failed",message:!Gt||dr?"Offline mode mirror lock policy satisfied.":"Offline mode mirror lock policy failed: .workspai/mirror.lock is missing."});}else y.push({id:"offline.mirror.enabled",status:"skipped",message:"Offline mirror checks skipped (offline mode is disabled)."});let po=wt({profile:K,runtimes:await kt(w),mode:B.mode});po.profile!=="enterprise"?y.push({id:po.checkId,status:po.status,message:po.message}):(y.push({id:"profile.enterprise.ci",status:d?"passed":"failed",message:d?"enterprise profile running with --ci.":"enterprise profile expects --ci for deterministic non-interactive mode."}),y.push({id:"profile.enterprise.compatibility-matrix",status:ce?"passed":"failed",message:ce?"enterprise profile has compatibility matrix.":"enterprise profile requires .workspai/compatibility-matrix.json."}),y.push({id:"profile.enterprise.mirror-config",status:lr?"passed":"failed",message:lr?"enterprise profile has mirror configuration.":"enterprise profile requires .workspai/mirror-config.json."}));}d&&(process.env.RAPIDKIT_BOOTSTRAP_CI="1"),m&&(process.env.RAPIDKIT_OFFLINE_MODE="1");let R=y.some(j=>j.id.startsWith("policy.schema.")&&j.status==="failed")||B.mode==="strict"&&y.some(j=>j.status==="failed"),ie=l(w||g,"reports"),H=new Date().toISOString().replace(/[:.]/g,"-"),Z=v.join(ie,`bootstrap-compliance-${H}.json`),je=v.join(ie,"bootstrap-compliance.latest.json"),Ve={command:"bootstrap",timestamp:new Date().toISOString(),workspacePath:w,profile:K,options:{ci:d,offline:m,strict:B.mode==="strict"},policyMode:B.mode,policyRules:B.rules,mirrorLifecycle:x,checks:y};if(R){let j=hn({...Ve,result:"blocked",initExitCode:null},1,y);return await E__default.ensureDir(ie),await et(Z,j),await et(je,j),p?process.stdout.write(`${JSON.stringify(j,null,2)}
242
- `):(console.log(s.red("\u274C Bootstrap blocked by strict policy checks.")),console.log(s.gray(`Compliance report: ${Z}`))),1}if(p&&K==="enterprise"&&!d){let j=hn({...Ve,result:"blocked",initExitCode:null,complianceOnly:false,bootstrapRuntimeSkipped:{reason:"enterprise JSON bootstrap requires --ci for deterministic non-interactive execution.",nextAction:"npx workspai bootstrap --profile enterprise --ci --json"}},1,y);return await E__default.ensureDir(ie),await et(Z,j),await et(je,j),process.stdout.write(`${JSON.stringify(j,null,2)}
243
- `),1}let Re=async j=>{let $=process.stdout.write.bind(process.stdout),Q=process.stderr.write.bind(process.stderr),Me=[],ve=[];process.stdout.write=((ce,_e,De)=>{let Kt=typeof _e=="function"?_e:typeof De=="function"?De:void 0;return Me.push(typeof ce=="string"?ce:ce instanceof Uint8Array?Buffer.from(ce).toString("utf8"):String(ce)),Kt?.(),true}),process.stderr.write=((ce,_e,De)=>{let Kt=typeof _e=="function"?_e:typeof De=="function"?De:void 0;return ve.push(typeof ce=="string"?ce:ce instanceof Uint8Array?Buffer.from(ce).toString("utf8"):String(ce)),Kt?.(),true});try{return {exitCode:await j(),stdout:Me.join(""),stderr:ve.join("")}}finally{process.stdout.write=$,process.stderr.write=Q;}},G=j=>{let $=j.split(/\r?\n/).map(Q=>Q.trim()).filter(Boolean);return {bytes:Buffer.byteLength(j),excerpt:$.slice(0,12)}},$e=0,Ee;if(!(p&&u))if(p){let j=await Re(()=>e(l$1));$e=j.exitCode,Ee={captured:true,stdout:G(j.stdout),stderr:G(j.stderr)};}else $e=await e(l$1);let St=y.filter(j=>j.status==="failed").length,ye=$e!==0?"failed":St>0?"ok_with_warnings":"ok",xt=$e!==0?$e:St>0?1:0,Ye=hn({...Ve,result:ye,initExitCode:$e,complianceOnly:p&&u,...Ee?{initOutput:Ee}:{}},xt,y);if(await E__default.ensureDir(ie),await et(Z,Ye),await et(je,Ye),w&&$e===0)try{let{syncWorkspaceProjects:j}=await import('./workspace-PR6VZRBG.js');await j(w,p),await ot(w,{silent:p});}catch{}if(p)process.stdout.write(`${JSON.stringify(Ye,null,2)}
244
- `);else {let j=y.filter($=>$.status==="failed").length;j>0&&console.log(s.yellow(`\u26A0\uFE0F Bootstrap completed with ${j} policy/profile warnings.`)),console.log(s.gray(`Compliance report: ${Z}`));}return $e}finally{typeof o$1>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=o$1;}}async function ya(t){if(t.includes("--help")||t.includes("-h"))return console.log(s.yellow("Usage: workspai setup <python|node|go|java|dotnet> [--warm-deps]")),0;let e$1=(t[1]||"").toLowerCase(),o$1=t.includes("--json"),r=t.includes("--warm-deps")||t.includes("--warm-dependencies");if(!e$1||!["python","node","go","java","dotnet"].includes(e$1))return o$1?process.stdout.write(`${JSON.stringify({command:"setup",result:"error",error:"Usage: workspai setup <python|node|go|java|dotnet> [--warm-deps]"},null,2)}
245
- `):console.log(s.yellow("Usage: workspai setup <python|node|go|java|dotnet> [--warm-deps]")),1;let n=async(u,f)=>{if(u==="node"){if(!P.existsSync(v.join(f,"package.json")))return {exitCode:0,message:"Node warm-up skipped: package.json not found in current directory."};let h=P.existsSync(v.join(f,"pnpm-lock.yaml")),k=P.existsSync(v.join(f,"yarn.lock"));return h?{exitCode:await z("pnpm",["install","--lockfile-only","--ignore-scripts"],f)}:k?{exitCode:await z("yarn",["install","--ignore-scripts"],f)}:{exitCode:await z("npm",["install","--package-lock-only","--ignore-scripts"],f)}}if(u==="go")return P.existsSync(v.join(f,"go.mod"))?{exitCode:await z("go",["mod","download"],f)}:{exitCode:0,message:"Go warm-up skipped: go.mod not found in current directory."};if(u==="java"){let g=P.existsSync(v.join(f,"pom.xml")),h=P.existsSync(v.join(f,"build.gradle"))||P.existsSync(v.join(f,"build.gradle.kts")),k=v.join(f,process.platform==="win32"?"gradlew.bat":"gradlew"),b=P.existsSync(k);return !g&&!h?{exitCode:0,message:"Java warm-up skipped: pom.xml or build.gradle not found in current directory."}:g?{exitCode:await z("mvn",["-B","-q","-DskipTests","dependency:go-offline"],f)}:{exitCode:await z(b?k:"gradle",["--no-daemon","dependencies"],f)}}return u==="dotnet"?(()=>{let h=[{dir:f,depth:0}],k=new Set(["bin","obj",".git","node_modules",".workspai",".rapidkit"]);for(;h.length>0;){let b=h.shift();if(!b||b.depth>3)continue;let w=[];try{w=P.readdirSync(b.dir,{withFileTypes:true});}catch{continue}for(let y of w)if(y.isFile()){let x=y.name.toLowerCase();if(x.endsWith(".sln")||x.endsWith(".csproj"))return true}else y.isDirectory()&&!k.has(y.name)&&h.push({dir:v.join(b.dir,y.name),depth:b.depth+1});}return false})()?{exitCode:await z("dotnet",["restore"],f)}:{exitCode:0,message:".NET warm-up skipped: .sln or *.csproj not found in current project tree."}:{exitCode:0,message:"Dependency warm-up currently applies to node/go/java/dotnet runtimes."}};if(o$1){let u=process.env.RAPIDKIT_SUPPRESS_RUN_COMMAND_OUTPUT;process.env.RAPIDKIT_SUPPRESS_RUN_COMMAND_OUTPUT="1";try{let g=await Je(e$1,{runCommandInCwd:z,runCoreRapidkit:async(b,w)=>(await g$4(b,{...w,cwd:void 0})).exitCode}).checkPrereqs(),h=oe(process.cwd()),k=null;if(e$1==="node"&&g.exitCode===0&&(k=process.version),h&&k){let b=o(h,"toolchain.lock").find(x=>P.existsSync(x))??l(h,"toolchain.lock"),w=l(h,"toolchain.lock"),y={};try{y=JSON.parse(await P.promises.readFile(b,"utf-8"));}catch{}(!y.runtime||typeof y.runtime!="object")&&(y.runtime={}),y.runtime[e$1]={version:k,detectedAt:new Date().toISOString()},await E__default.ensureDir(v.dirname(w)),await P.promises.writeFile(w,JSON.stringify(y,null,2)+`
246
- `,"utf-8");}return process.stdout.write(`${JSON.stringify({command:"setup",runtime:e$1,result:g.exitCode===0?"ok":"failed",exitCode:g.exitCode,workspacePath:h,version:k,warmDeps:r},null,2)}
247
- `),g.exitCode}finally{typeof u>"u"?delete process.env.RAPIDKIT_SUPPRESS_RUN_COMMAND_OUTPUT:process.env.RAPIDKIT_SUPPRESS_RUN_COMMAND_OUTPUT=u;}}let i=Je(e$1,{runCommandInCwd:z,runCoreRapidkit:(u,f)=>e(u,{...f,cwd:void 0})}),a=await i.checkPrereqs(),l$1=await i.doctorHints(process.cwd()),c=oe(process.cwd()),d=c||process.cwd(),m=null,p=async()=>e$1!=="java"||!c?[]:m||(m=(await Da(c)).filter(f=>{let g=d$4(f);return g$2(g,f)}),m);if(a.exitCode===0){console.log(s.green(`\u2705 ${e$1} prerequisites look good.`));let u=["python","node","go","java","dotnet"].filter(f=>f!==e$1).join("/");if(console.log(s.gray(` Scope: validated ${e$1} runtime only. ${u} checks are optional unless your workspace profile uses them.`)),e$1==="python"&&console.log(s.gray(" Note: Poetry is recommended, but venv/pipx-based flows are supported in workspace creation.")),i.warmSetupCache&&((await i.warmSetupCache(d)).exitCode===0?console.log(s.gray(` ${e$1} cache warm-up completed.`)):console.log(s.yellow(` ${e$1} cache warm-up skipped (non-fatal).`))),r)if(e$1==="java"&&c){let f=await p();if(f.length>0){let g=0,h=0,k=0;for(let b of f){let w=await n("java",b),y=/skipped/i.test(w.message||""),x=v.relative(c,b)||v.basename(b);w.message&&console.log(s.gray(` [${x}] ${w.message}`)),w.exitCode===0&&!y?g+=1:w.exitCode===0&&y?k+=1:h+=1;}g>0&&console.log(s.gray(` java dependency warm-up completed for ${g} project(s) (--warm-deps).`)),h>0&&console.log(s.yellow(` java dependency warm-up failed for ${h} project(s) (non-fatal).`)),g===0&&h===0&&k>0&&console.log(s.gray(" java dependency warm-up skipped for discovered workspace projects."));}else {let g=await n("java",d),h=/skipped/i.test(g.message||"");g.message&&console.log(s.gray(` ${g.message}`)),g.exitCode===0&&!h?console.log(s.gray(` ${e$1} dependency warm-up completed (--warm-deps).`)):g.exitCode!==0&&console.log(s.yellow(` ${e$1} dependency warm-up failed (non-fatal).`));}}else {let f=await n(e$1,d),g=/skipped/i.test(f.message||"");f.message&&console.log(s.gray(` ${f.message}`)),f.exitCode===0&&!g?console.log(s.gray(` ${e$1} dependency warm-up completed (--warm-deps).`)):f.exitCode!==0&&console.log(s.yellow(` ${e$1} dependency warm-up failed (non-fatal).`));}if(c)try{let f=o(c,"toolchain.lock").find(b=>P.existsSync(b))??l(c,"toolchain.lock"),g=l(c,"toolchain.lock"),h={};try{h=JSON.parse(await P.promises.readFile(f,"utf-8"));}catch{}(!h.runtime||typeof h.runtime!="object")&&(h.runtime={});let k=h.runtime;if(e$1==="python"){let b=null;try{let{execa:w}=await import('execa');for(let y of xn()){let S=await w(y,y==="py"?["-3","--version"]:["--version"],{cwd:c,stdio:"pipe",reject:false,timeout:3e3});if(S.exitCode===0){let I=(S.stdout||S.stderr||"").match(/Python\s+(\S+)/);if(b=I?I[1]:null,b)break}}}catch{}k.python={...k.python||{},version:b,last_setup:new Date().toISOString()};}else if(e$1==="node")k.node={...k.node||{},version:process.version,last_setup:new Date().toISOString()};else if(e$1==="go"){let b=null;try{let{execa:w}=await import('execa'),x=((await w("go",["version"],{cwd:c,stdio:"pipe"})).stdout||"").match(/go(\d+\.\d+(?:\.\d+)?)/i);b=x?x[1]:null;}catch{}k.go={...k.go||{},version:b,last_setup:new Date().toISOString()};}else if(e$1==="java"){let b=null,w=null,y=null,x=await p(),A=P.existsSync(v.join(d,"pom.xml"))||P.existsSync(v.join(d,"build.gradle"))||P.existsSync(v.join(d,"build.gradle.kts"))?d:x[0]||d;try{let{execa:I}=await import('execa'),Y=await I("java",["-version"],{cwd:c,stdio:"pipe",reject:false,timeout:3e3}),K=`${Y.stdout||""}
248
- ${Y.stderr||""}`.match(/version\s+"([^"]+)"/i);b=K?K[1]:null;let B=P.existsSync(v.join(A,"pom.xml")),U=P.existsSync(v.join(A,"build.gradle"))||P.existsSync(v.join(A,"build.gradle.kts"));if(B){w="maven";let D=(()=>{let H=v.join(A,"mvnw.cmd");if(process.platform==="win32"&&P.existsSync(H))return H;let Z=v.join(A,"mvnw");return P.existsSync(Z)?Z:"mvn"})(),R=await I(D,["-version"],{cwd:A,stdio:"pipe",reject:false,timeout:3e3}),ie=`${R.stdout||""}
249
- ${R.stderr||""}`.match(/Apache Maven\s+(\S+)/i);y=ie?ie[1]:null;}else if(U){w="gradle";let D=(()=>{let H=v.join(A,"gradlew.bat");if(process.platform==="win32"&&P.existsSync(H))return H;let Z=v.join(A,"gradlew");return P.existsSync(Z)?Z:"gradle"})(),R=await I(D,["--version"],{cwd:A,stdio:"pipe",reject:false,timeout:3e3}),ie=`${R.stdout||""}
250
- ${R.stderr||""}`.match(/Gradle\s+(\S+)/i);y=ie?ie[1]:null;}}catch{}k.java={...k.java||{},version:b,build_tool:w,build_tool_version:y,last_setup:new Date().toISOString()};}else if(e$1==="dotnet"){let b=null;try{let{execa:w}=await import('execa'),x=((await w("dotnet",["--version"],{cwd:c,stdio:"pipe",reject:false,timeout:3e3})).stdout||"").trim();b=x.length>0?x:null;}catch{}k.dotnet={...k.dotnet||{},version:b,sdk:b,last_setup:new Date().toISOString()};}h.updated_at=new Date().toISOString(),await P.promises.writeFile(g,JSON.stringify(h,null,2)+`
251
- `,"utf-8"),console.log(s.gray(" toolchain.lock updated (.workspai/toolchain.lock)"));}catch{}}else console.log(s.red(`\u274C ${e$1} prerequisites check failed.`));if(l$1.length>0){console.log(s.gray(`
252
- Hints:`));for(let u of l$1)console.log(s.gray(`- ${u}`));}return a.exitCode}function $d(t){let e={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};for(let o of t.split(`
253
- `)){let r=o.trim(),n=r.match(/^strategy:\s*(\S+)/);n&&(e.strategy=n[1].replace(/['"]]/g,""));let i=r.match(/^prune_on_bootstrap:\s*(true|false)/);i&&(e.prune_on_bootstrap=i[1]==="true");let a=r.match(/^self_heal:\s*(true|false)/);a&&(e.self_heal=a[1]==="true");let l=r.match(/^verify_integrity:\s*(true|false)/);l&&(e.verify_integrity=l[1]==="true");}return e}async function wa(t){if(t.includes("--help")||t.includes("-h"))return console.log(s.yellow("Usage: workspai cache <status|clear|prune|repair>")),0;let e=(t[1]||"status").toLowerCase(),o$1=t.includes("--json"),r=t.includes("--dry-run"),n=Xo.getInstance(),i=oe(process.cwd()),a={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};if(i)try{let l=o(i,"cache-config.yml").find(d=>P.existsSync(d));if(!l)throw new Error("cache config missing");let c=await P.promises.readFile(l,"utf-8");a=$d(c);}catch{}if(e==="status"){let l={command:"cache",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:i,cache:{enabled:true,strategy:a.strategy,selfHeal:a.self_heal,pruneOnBootstrap:a.prune_on_bootstrap,verifyIntegrity:a.verify_integrity,inMemory:true}};return o$1?(process.stdout.write(`${JSON.stringify(l,null,2)}
269
+ `;await S.promises.writeFile(o,r,"utf-8");}function pd(t){let e=t.trim().toLowerCase();return e==="true"||e==="1"||e==="on"?true:e==="false"||e==="0"||e==="off"?false:null}function uc(t){if(!t)return "isolated";let o=t.match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase();return o==="shared-runtime-caches"||o==="shared-node-deps"||o==="isolated"?o:"isolated"}function mc(t){if(!t)return {mode:"isolated",status:"skipped",message:"No policies.yml found; dependency_sharing_mode defaults to isolated."};let e=t.match(/^\s*dependency_sharing_mode:\s*([a-zA-Z\-]+)\s*(?:#.*)?$/m);if(!e)return {mode:"isolated",status:"skipped",message:"dependency_sharing_mode is not set; defaulting to isolated."};let o=e[1].toLowerCase();return o==="isolated"||o==="shared-runtime-caches"||o==="shared-node-deps"?{mode:o,status:"passed",message:`dependency_sharing_mode is valid: ${o}.`}:{mode:"isolated",status:"failed",message:`Invalid dependency_sharing_mode: ${o}. Use one of: isolated, shared-runtime-caches, shared-node-deps.`}}async function fc(t,e){let o$1=re(t),r=o$1?o(o$1,"policies.yml").find(c=>S.existsSync(c)):null,n="isolated";if(r&&await R__default.pathExists(r))try{let c=await S.promises.readFile(r,"utf-8"),l=mc(c);if(l.status==="failed")return console.log(s.red(`\u274C ${l.message}`)),{ok:false,code:1};n=l.mode;}catch{return console.log(s.red("\u274C Failed to read workspace policy file (.workspai/policies.yml).")),{ok:false,code:1}}let i=process.env.RAPIDKIT_DEP_SHARING_MODE,a=process.env.RAPIDKIT_WORKSPACE_PATH;process.env.RAPIDKIT_DEP_SHARING_MODE=n,o$1&&(process.env.RAPIDKIT_WORKSPACE_PATH=o$1);try{return {ok:true,value:await e()}}finally{typeof i>"u"?delete process.env.RAPIDKIT_DEP_SHARING_MODE:process.env.RAPIDKIT_DEP_SHARING_MODE=i,typeof a>"u"?delete process.env.RAPIDKIT_WORKSPACE_PATH:process.env.RAPIDKIT_WORKSPACE_PATH=a;}}async function Q(t,e,o,r={}){let{buildPackageRunnerSubprocessEnv:n,resolvePackageRunnerInvocation:i}=await import('./platform-capabilities-YICBF4FA.js'),a=dd(t,e,o),c=a?{command:process.execPath,prefixArgs:["-e",a]}:i(t),l=c.command,p=a?c.prefixArgs:[...c.prefixArgs,...e],f=n();if(a){Qt()&&process.stderr.write(`[workspai-cli] runCommandInCwd.nodeEval=${JSON.stringify({cwd:o,scriptBytes:a.length})}
270
+ `);try{return Np.runInThisContext(a,{filename:C.join(o,"package.json#script")}),0}catch(_){return process.stderr.write(`${_ instanceof Error?_.stack||_.message:String(_)}
271
+ `),1}}let w=!(process.argv.includes("--json")||process.env.RAPIDKIT_WORKSPACE_RUN_CHILD==="1"||process.env.RAPIDKIT_SUPPRESS_RUN_COMMAND_OUTPUT==="1")&&t==="npm"&&(e[0]==="run"||e[0]==="run-script"||e[0]==="install"),h=()=>{let _=f.npm_config_cache;if(!_)return "";let y=C.join(_,"_logs");try{let g=S.readdirSync(y).filter(u=>u.endsWith(".log")).map(u=>{let b=C.join(y,u);return {filePath:b,mtimeMs:S.statSync(b).mtimeMs}}).sort((u,b)=>b.mtimeMs-u.mtimeMs)[0]?.filePath;return g?S.readFileSync(g,"utf-8").split(/\r?\n/).map(u=>u.trim()).filter(u=>/(?:^|\s)(?:npm\s+)?(?:error|verbose\s+(?:stack|cwd|os|node|npm|exit|code))\b/i.test(u)).slice(0,12).join(`
272
+ `):""}catch{return ""}},k=Number.parseInt(process.env.RAPIDKIT_CHILD_COMMAND_TIMEOUT_MS||"",10),j=r.timeoutMs&&r.timeoutMs>0?r.timeoutMs:Number.isFinite(k)&&k>0?k:void 0;return await new Promise(_=>{let y=[],m=[],g=false,v=null,u=null,b$1=()=>{try{u?.stdout?.destroy();}catch{}try{u?.stderr?.destroy();}catch{}try{u?.stdin?.destroy();}catch{}try{u?.removeAllListeners("close"),u?.removeAllListeners("error"),u?.unref();}catch{}};Qt()&&process.stderr.write(`[workspai-cli] runCommandInCwd=${JSON.stringify({executable:l,args:p,cwd:o,directNodeEvalScript:a!==null,npmEnv:Object.fromEntries(Object.entries(f).filter(([P])=>["npm_config_if_present","npm_config_ignore_scripts","npm_config_loglevel","npm_config_silent","npm_config_json","npm_lifecycle_event","npm_lifecycle_script"].includes(P)))})}
273
+ `),u=spawn(l,p,{stdio:w?"inherit":["ignore","pipe","pipe"],cwd:o,shell:c$7(),env:f,detached:!b()}),j&&j>0&&(v=setTimeout(()=>{if(!g){if(g=true,!b()&&u.pid)try{process.kill(-u.pid,"SIGTERM");}catch{u.kill("SIGTERM");}else u.kill("SIGTERM");b$1(),process.env.RAPIDKIT_SUPPRESS_RUN_COMMAND_OUTPUT!=="1"&&process.stderr.write(`RapidKit command timed out after ${j}ms: ${l} ${p.join(" ")}
274
+ `),_(124);}},j)),w||(u.stdout?.on("data",P=>{y.push(P);}),u.stderr?.on("data",P=>{m.push(P);})),u.on("close",P=>{if(g)return;g=true,v&&clearTimeout(v);let x=Buffer.concat(y),A=Buffer.concat(m),I=P&&P!==0&&x.length===0&&A.length===0&&t==="npm"?h():"";Qt()&&process.stderr.write(`[workspai-cli] runCommandInCwd.close=${JSON.stringify({code:P,stdoutBytes:x.length,stderrBytes:A.length,npmFailureExcerptBytes:I.length})}
275
+ `),process.env.RAPIDKIT_SUPPRESS_RUN_COMMAND_OUTPUT!=="1"&&(x.length>0&&process.stdout.write(x),A.length>0?process.stderr.write(A):I&&process.stderr.write(`${I}
276
+ `)),_(P??1);}),u.on("error",()=>{g||(g=true,v&&clearTimeout(v),_(1));});})}function dd(t,e,o){if(t!=="npm")return null;let r=e[0];if(r!=="run"&&r!=="run-script")return null;let n=e.find((a,c)=>c>0&&!a.startsWith("-"));if(!n)return null;let i=C.join(o,"package.json");if(!S.existsSync(i))return null;try{let c=JSON.parse(S.readFileSync(i,"utf8")).scripts?.[n];return typeof c!="string"?null:ud(c)}catch{return null}}function ud(t){let e=t.trim(),o=e.match(/^node\s+(?:-e|--eval)\s+"((?:\\.|[^"\\])*)"$/);if(o)return o[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\");let r=e.match(/^node\s+(?:-e|--eval)\s+'((?:\\.|[^'\\])*)'$/);return r?r[1].replace(/\\'/g,"'").replace(/\\\\/g,"\\"):null}async function st(t,e){await R__default.outputFile(t,`${JSON.stringify(e,null,2)}
277
+ `,"utf-8");}async function md(t,e,o){let r=process.env.RAPIDKIT_TEST_IMPORT_SYNC_FAIL==="1"&&(process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"),n=e.workspace?C.resolve(e.workspace):null,i=n??re(process.cwd()),a=false,c=false;if(n){if(!qe(n)){let d=`Workspace path is not a valid Workspai workspace: ${n}`;return e.json?console.log(JSON.stringify({error:d},null,2)):console.log(s.red(`\u274C ${d}`)),1}}else if(!i||!qe(i)){let d=await Vn();i=d.workspacePath,a=true,c=d.created;}if(!i||!qe(i)){let d="Not inside a Workspai workspace";return e.json?console.log(JSON.stringify({error:d},null,2)):(console.log(s.red(`\u274C ${d}`)),console.log(s.gray("\u{1F4A1} Run this command from a workspace root or pass --workspace <path>."))),1}let l=`cd ${i}`,p=o?.syncWorkspaceProjects??(async d=>{if(r)throw new Error("forced sync failure for command-level import rollback test");let{syncWorkspaceProjects:w}=await import('./workspace-FQT3QIRS.js');await w(d,true),await at(d,{silent:true});}),f=o?.rollbackImportedProjectImport??Oa;try{let d=await Na({workspacePath:i,source:t,name:e.name,sourceType:e.git===true?"git-url":void 0});try{await p(i);}catch(w){await f(i,d.path);try{await p(i);}catch{}throw new Error(`Workspace sync failed after import and the imported project was rolled back: ${w instanceof Error?w.message:String(w)}`)}if(e.json)return console.log(JSON.stringify({workspacePath:i,workspaceResolution:a?"default-auto":n?"explicit":"nearest",defaultWorkspaceCreated:a?c:false,suggestedCdCommand:l,importedProject:d},null,2)),0;if(a&&console.log(s.yellow(`\u2139 Imported outside a workspace, so Workspai used the default workspace: ${i}`)),console.log(s.green(`\u2714 Imported project: ${d.name}`)),console.log(s.gray(` Workspace: ${i}`)),console.log(s.gray(` Destination: ${d.path}`)),console.log(s.gray(` Stack: ${d.stack} (${d.confidence})`)),console.log(s.gray(` Source: ${e.git===true||En(t)?"git-url":"local-folder"}`)),!d.profileCompatibility.ok){let w=br(d.profileCompatibility);console.log(s.yellow(` Profile warning: ${d.profileCompatibility.message}`)),w&&console.log(s.gray(` ${w}`));}return console.log(s.gray(` Next shell step: ${l}`)),0}catch(d){let w=d instanceof Error?d.message:String(d);return e.json?console.log(JSON.stringify({error:w},null,2)):console.log(s.red(`\u274C Import failed: ${w}`)),1}}async function fd(t,e,o){let r=C.resolve(t||process.cwd()),n=e.workspace?C.resolve(e.workspace):null,i=n??re(process.cwd()),a=false,c=false;if(n){if(!qe(n)){let h=`Workspace path is not a valid Workspai workspace: ${n}`;return e.json?console.log(JSON.stringify({error:h},null,2)):console.log(s.red(`\u274C ${h}`)),1}}else if(!i||!qe(i)){let h=await Vn();i=h.workspacePath,a=true,c=h.created;}if(!i||!qe(i)){let h="Not inside a Workspai workspace";return e.json?console.log(JSON.stringify({error:h},null,2)):(console.log(s.red(`\u274C ${h}`)),console.log(s.gray("\u{1F4A1} Run this command from a workspace root or pass --workspace <path>."))),1}let l=process.env.RAPIDKIT_TEST_ADOPT_SYNC_FAIL==="1"&&(process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test"),p$1=o?.syncWorkspaceProjects??(async h=>{if(l)throw new Error("forced sync failure for command-level adopt rollback test");let{syncWorkspaceProjects:k}=await import('./workspace-FQT3QIRS.js');await k(h,true),await at(h,{silent:true});}),f=o?.registerProjectInWorkspace??(async(h,k,j)=>{let{registerProjectInWorkspace:_}=await import('./workspace-FQT3QIRS.js');await _(h,k,j);}),d=o?.registerWorkspace??(async(h,k)=>{let{registerWorkspace:j}=await import('./workspace-FQT3QIRS.js');await j(h,k);}),w=o?.rollbackAdoptedProjectImport??Ma;try{let h=null;for(let j of p(r,"project.json"))if(await R__default.pathExists(j)){h=await R__default.readJson(j);break}let k=await Ta({workspacePath:i,source:r,name:e.name,dryRun:e.dryRun===true});if(e.dryRun!==true)try{await d(i,C.basename(i)),await f(i,k.name,k.path),await p$1(i);}catch(j){throw await w(i,k.path,h),new Error(`Workspace sync failed after adopt and adoption metadata was rolled back: ${j instanceof Error?j.message:String(j)}`)}if(e.json)return console.log(JSON.stringify({workspacePath:i,workspaceResolution:a?"default-auto":n?"explicit":"nearest",defaultWorkspaceCreated:a?c:false,dryRun:e.dryRun===true,adoptedProject:k},null,2)),0;if(a&&console.log(s.yellow(`\u2139 Adopted outside a workspace, so Workspai used the default workspace: ${i}`)),e.dryRun===true&&console.log(s.yellow("\u2139 Dry run: no adoption files were written.")),console.log(s.green(`\u2714 Adopted project: ${k.name}`)),console.log(s.gray(` Workspace: ${i}`)),console.log(s.gray(` Project: ${k.path}`)),console.log(s.gray(" Mode: linked (source was not moved or copied)")),console.log(s.gray(` Stack: ${k.stack} (${k.confidence})`)),!k.profileCompatibility.ok){let j=br(k.profileCompatibility);console.log(s.yellow(` Profile warning: ${k.profileCompatibility.message}`)),j&&console.log(s.gray(` ${j}`));}return console.log(s.gray(` Report: ${k.adoptReadinessPath}`)),console.log(s.gray(" Next: npx workspai workspace model --json")),0}catch(h){let k=h instanceof Error?h.message:String(h);return e.json?console.log(JSON.stringify({error:k},null,2)):console.log(s.red(`\u274C Adopt failed: ${k}`)),1}}async function Ln(t){let e=new Set(["python-only","polyglot","enterprise"]),o$1=gd(),r="minimal",n=false;try{let l$1=o(t,"workspace.json").find(f=>S.existsSync(f))??l(t,"workspace.json"),p=JSON.parse(await S.promises.readFile(l$1,"utf-8"));r=p.profile??"minimal",n=p.bootstrap_note==="python-engine-skipped"||p.engine?.python_core?.status==="skipped";}catch{r="minimal";}if(!await(async()=>{if(!n&&e.has(r))return true;let l=await gc(t);if(l.length===0)return false;for(let p of l){let f=d$5(p),d=f?.module_support,w=j(p);if(n){if(w?.moduleSupport===true)return true;continue}if(!(e$2(f,p)||g$1(f,p)||h$2(f,p))&&d!==false)return i$2(f,p)||f$4(f,p),true}return false})())return 0;let a="poetry";try{let{readWorkspaceMarker:l}=await import('./workspace-marker-SMBC3Z2Q.js'),f=(await l(t))?.metadata?.npm?.installMethod;(f==="poetry"||f==="venv"||f==="pipx"||f==="pip")&&(a=f);}catch{}let c=async()=>{let l=Dp(t);if(!await R__default.pathExists(l)){let w=await Lp(t);if(w!==0)return w}let p=a$b("DEV_PATH"),d=(p?await R__default.pathExists(p):false)&&p?["-m","pip","install",p,"--quiet","--disable-pip-version-check"]:["-m","pip","install","rapidkit-core","--quiet","--disable-pip-version-check"];return await Q(l,d,t,{timeoutMs:o$1})};if(a==="venv"){let l=await c();if(l!==0)return l}else if(a==="poetry"){let l=C.join(t,"pyproject.toml"),p=false;try{p=(await S.promises.readFile(l,"utf-8")).includes("rapidkit-core");}catch{p=false;}if(p){let f=await c();if(f!==0)return f}else {let f=await Q("poetry",["install","--no-root"],t,{timeoutMs:o$1});if(f!==0)return f;let d=await Q("poetry",["add","rapidkit-core"],t,{timeoutMs:o$1});if(d!==0)return d}}else return 0;try{let{writeWorkspaceLauncher:l}=await import('./create-DFAWAS5C.js');await l(t,a==="venv"?"venv":"poetry");}catch{}try{let{markWorkspacePythonEngineInstalled:l}=await import('./workspace-python-engine-state-MTWIIZPY.js');await l(t,{installMethod:a==="venv"?"venv":"poetry",venvPath:".venv"});}catch{}return 0}function gd(){let t=process.env.RAPIDKIT_WORKSPACE_DEPS_TIMEOUT_MS;if(t){let e=Number.parseInt(t,10);if(Number.isFinite(e)&&e>0)return e}return 12e4}async function gc(t){let e=[],o=new Set,r=[t];for(;r.length>0;){let n=r.pop();if(!n||o.has(n))continue;o.add(n);let i=[];try{i=await S.promises.readdir(n,{withFileTypes:true});}catch{continue}for(let a of i){if(!a.isDirectory()||a.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(a.name))continue;let c=C.join(n,a.name);if((await Promise.all([...p(c,"context.json"),...p(c,"project.json")].map(p=>R__default.pathExists(p)))).some(Boolean)){e.push(c);continue}r.push(c);}}return e}function hd(t){return j$2(t)}async function Vn(){let t=k$1(),e=C.basename(t),o=qe(t);await b$8(t,d$8(e,c()));let r=l(t,"workspace.json");return await R__default.pathExists(r)||await st(r,{name:e,workspace_name:e,profile:"minimal",createdAt:new Date().toISOString(),createdBy:"workspai-cli-import-fallback"}),{workspacePath:t,created:!o}}async function In(t){let o=await Ue("go",{runCommandInCwd:Q,runCoreRapidkit:e}).initProject(t);return te(o)}function te(t){return t.message&&console.log(s.red(`\u274C ${t.message}`)),t.exitCode}async function Rt(t,e$1){let o=Ue("node",{runCommandInCwd:Q,runCoreRapidkit:e});if(t==="init"){let n=await o.initProject(e$1);return te(n)}if(t==="dev"){let n=await o.runDev(e$1);return te(n)}if(t==="test"){let n=await o.runTest(e$1);return te(n)}if(t==="build"){let n=await o.runBuild(e$1);return te(n)}if(t==="lint"){let n=await o.runLint?.(e$1);return te(n??{exitCode:1,message:"Lint is not supported."})}if(t==="format"){let n=await o.runFormat?.(e$1);return te(n??{exitCode:1,message:"Format is not supported."})}let r=await o.runStart(e$1);return te(r)}async function it(t,e$1){let o=Ue("java",{runCommandInCwd:Q,runCoreRapidkit:e});if(t==="init"){let n=await o.initProject(e$1);return te(n)}if(t==="dev"){let n=await o.runDev(e$1);return te(n)}if(t==="test"){let n=await o.runTest(e$1);return te(n)}if(t==="build"){let n=await o.runBuild(e$1);return te(n)}if(t==="lint"){let n=await o.runLint?.(e$1);return te(n??{exitCode:1,message:"Lint is not supported."})}if(t==="format"){let n=await o.runFormat?.(e$1);return te(n??{exitCode:1,message:"Format is not supported."})}let r=await o.runStart(e$1);return te(r)}function $n(t,e,o){let r=o.filter(n=>n.status==="failed").map(n=>{let i=n.id||"check";return n.message?`${i}: ${n.message}`:i}).slice(0,12);return f$9(t,{commandId:"bootstrap",exitCode:e,generatedAt:typeof t.timestamp=="string"?t.timestamp:new Date().toISOString(),blockers:r,runId:e$5()})}async function za(t,e=Fn){if(t.includes("--help")||t.includes("-h")||t.includes("help"))return console.log(s.yellow("Usage: workspai bootstrap [path] [--profile <minimal|java-only|go-only|dotnet-only|python-only|node-only|polyglot|enterprise>] [--ci] [--offline] [--json] [--compliance-only]")),0;let o$1=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof o$1>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let i=function(O){if(!O)return null;let L=O.trim().toLowerCase();return L==="minimal"||L==="java-only"||L==="go-only"||L==="dotnet-only"||L==="python-only"||L==="node-only"||L==="polyglot"||L==="enterprise"?L:null},a=function(O){let Oe=O.match(/^\s*mode:\s*([a-zA-Z]+)\s*(?:#.*)?$/m)?.[1]?.toLowerCase()==="strict"?"strict":"warn",je=(ae,Ae)=>{let Fe=O.match(new RegExp(`^\\s*${ae}:\\s*(true|false)\\s*(?:#.*)?$`,"m"));return Fe?Fe[1].toLowerCase()==="true":Ae};return {mode:Oe,dependency_sharing_mode:uc(O),rules:{enforce_workspace_marker:je("enforce_workspace_marker",true),enforce_toolchain_lock:je("enforce_toolchain_lock",false),disallow_untrusted_tool_sources:je("disallow_untrusted_tool_sources",false),enforce_compatibility_matrix:je("enforce_compatibility_matrix",false),require_mirror_lock_for_offline:je("require_mirror_lock_for_offline",true)}}};let c=["init"],l$1,p=false,f=false,d=false,w=false;for(let O=1;O<t.length;O+=1){let L=t[O];if(L==="--ci"){p=true;continue}if(L==="--offline"){f=true;continue}if(L==="--json"){d=true;continue}if(L==="--compliance-only"){w=true;continue}if(L==="--profile"){let X=t[O+1];if(!X||X.startsWith("-"))return console.log(s.yellow("Usage: workspai bootstrap [path] [--profile <minimal|java-only|go-only|dotnet-only|python-only|node-only|polyglot|enterprise>] [--ci] [--offline] [--json] [--compliance-only]")),1;l$1=X,O+=1;continue}if(L.startsWith("--profile=")){l$1=L.slice(10);continue}c.push(L);}let h=i(l$1);if(l$1&&!h)return console.log(s.red(`Invalid profile: ${l$1}. Use one of: minimal, java-only, go-only, dotnet-only, python-only, node-only, polyglot, enterprise.`)),1;let k=process.cwd(),j=c.slice(1).filter(O=>!O.startsWith("-"));if(j.length>0){let O=C.resolve(k,j[0]),L=d$5(O),X=S.existsSync(O)?await _t(O):"unknown";if(!qe(O)&&(e$2(L,O)||g$1(L,O)||h$2(L,O)||f$4(L,O)||i$2(L,O)||X!=="unknown"))return await e(c)}let _=C.join(k,".rapidkit-workspace"),y=C.join(k,".rapidkit","workspace.json"),m;!S.existsSync(_)&&S.existsSync(y)?m=k:(m=re(k),m||(m=sd(k)));let g=[],v=null,u=null;if(m)try{let O=o(m,"workspace.json").find(Oe=>S.existsSync(Oe))??l(m,"workspace.json"),L=await S.promises.readFile(O,"utf-8"),X=JSON.parse(L);u=i(X.profile);}catch{u=null;}let b=["minimal","java-only","python-only","node-only","go-only","dotnet-only","polyglot","enterprise"],P={minimal:"minimal \u2014 Foundation files only (fastest bootstrap, mixed projects)","java-only":"java-only \u2014 Java runtime (Spring Boot services)","python-only":"python-only \u2014 Python + Poetry (FastAPI, Django, ML pipelines)","node-only":"node-only \u2014 Node.js runtime (NestJS, Express, Next.js)","go-only":"go-only \u2014 Go runtime (Fiber, Gin, gRPC, microservices)","dotnet-only":"dotnet-only \u2014 .NET runtime (ASP.NET Core services)",polyglot:"polyglot \u2014 Python + Node.js + Go + Java + .NET multi-runtime workspace",enterprise:"enterprise \u2014 Polyglot + governance + Sigstore verification"},x=h;if(!!m&&!h&&!p&&!d&&!!process.stdin.isTTY&&!!process.stdout.isTTY&&process.env.VITEST!=="true"&&process.env.VITEST!=="1"){let O=u||"minimal",{chosenProfile:L}=await b$3([{type:"rawlist",name:"chosenProfile",message:`Select workspace profile for bootstrap (current: ${O})`,choices:b.map(X=>({name:X===O?`${P[X]} \u2190 current`:P[X],value:X})),default:b.indexOf(O)}]);x=L;}let I=x||u||"minimal";if(m&&!w)try{let L=I==="python-only"||I==="polyglot"||I==="enterprise"?"poetry":"venv",X;try{let Ae=(await S.promises.readFile(C.join(m,".python-version"),"utf-8")).trim();Ae&&(X=Ae);}catch{}let{syncWorkspaceFoundationFiles:Oe}=await import('./create-DFAWAS5C.js'),je=await Oe(m,{workspaceName:C.basename(m),installMethod:L,pythonVersion:X,profile:I,writeMarker:true,writeGitignore:true,onlyIfMissing:true});g.push({id:"workspace.foundation.sync",status:je.length>0?"passed":"skipped",message:je.length>0?`Workspace foundation synchronized: ${je.join(", ")}`:"Workspace foundation files are already up to date."});}catch(O){g.push({id:"workspace.foundation.sync",status:"failed",message:`Failed to synchronize workspace foundation files: ${O.message}`});}else m&&g.push({id:"workspace.foundation.sync",status:"skipped",message:"Workspace foundation synchronization skipped by --compliance-only."});if(m&&!w&&x&&x!==u)try{let O=l(m,"workspace.json"),L=await S.promises.readFile(O,"utf-8"),X=JSON.parse(L);X.profile=x,await R__default.ensureDir(C.dirname(O)),await S.promises.writeFile(O,JSON.stringify(X,null,2)+`
278
+ `,"utf-8");}catch{}let W={mode:"warn",dependency_sharing_mode:"isolated",rules:{enforce_workspace_marker:true,enforce_toolchain_lock:false,disallow_untrusted_tool_sources:false,enforce_compatibility_matrix:false,require_mirror_lock_for_offline:true}},N=null;if(m)try{let O=o(m,"policies.yml").find(X=>S.existsSync(X));if(!O)throw new Error("policy file missing");let L=await S.promises.readFile(O,"utf-8");N=L,W=a(L);}catch{g.push({id:"policy.file",status:"skipped",message:"No workspace policy file found; using default bootstrap policy."});}else g.push({id:"workspace.detect",status:"skipped",message:"No workspace marker found; bootstrap runs in project/single-path mode."});if(m){let O=mc(N);W.dependency_sharing_mode=O.mode,g.push({id:"policy.schema.dependency_sharing_mode",status:O.status,message:O.message}),g.push({id:"policy.dependency_sharing_mode.effective",status:"passed",message:W.dependency_sharing_mode==="isolated"?"Effective dependency mode: isolated (default secure mode).":W.dependency_sharing_mode==="shared-node-deps"?"Effective dependency mode: shared-node-deps (Node projects share workspace-level caches).":"Effective dependency mode: shared-runtime-caches (Node/Python/Go share workspace-level caches)."});let L=S.existsSync(C.join(m,".workspai-workspace"))||S.existsSync(C.join(m,".rapidkit-workspace"));g.push({id:"policy.enforce_workspace_marker",status:!W.rules.enforce_workspace_marker||L?"passed":"failed",message:!W.rules.enforce_workspace_marker||L?"Workspace marker policy satisfied.":"Workspace marker policy failed: .workspai-workspace is missing."});let X=o(m,"toolchain.lock").some(fe=>S.existsSync(fe));g.push({id:"policy.enforce_toolchain_lock",status:!W.rules.enforce_toolchain_lock||X?"passed":"failed",message:!W.rules.enforce_toolchain_lock||X?"Toolchain lock policy satisfied.":"Toolchain lock policy failed: .workspai/toolchain.lock is missing."});let Oe=process.env.RAPIDKIT_TRUSTED_SOURCES==="1"||o(m,"trusted-sources.lock").some(fe=>S.existsSync(fe));g.push({id:"policy.disallow_untrusted_tool_sources",status:!W.rules.disallow_untrusted_tool_sources||Oe?"passed":"failed",message:!W.rules.disallow_untrusted_tool_sources||Oe?"Trusted tool sources policy satisfied.":"Trusted tool sources policy failed: set RAPIDKIT_TRUSTED_SOURCES=1 or provide .workspai/trusted-sources.lock."});let je=o(m,"compatibility-matrix.json").find(fe=>S.existsSync(fe))??l(m,"compatibility-matrix.json"),ae=S.existsSync(je),Ae=W.rules.enforce_compatibility_matrix;if(g.push({id:"policy.enforce_compatibility_matrix",status:!Ae||ae?"passed":"failed",message:!Ae||ae?"Compatibility matrix policy satisfied.":"Compatibility matrix policy failed: .workspai/compatibility-matrix.json is missing."}),ae)try{let fe=await S.promises.readFile(je,"utf-8"),ot=JSON.parse(fe),Un=!!ot&&typeof ot=="object";g.push({id:"compatibility.matrix.parse",status:Un?"passed":"failed",message:Un?"Compatibility matrix parsed successfully.":"Compatibility matrix parse failed: invalid JSON object."});}catch{g.push({id:"compatibility.matrix.parse",status:"failed",message:"Compatibility matrix parse failed: invalid JSON."});}let Fe=o(m,"mirror-config.json").find(fe=>S.existsSync(fe))??l(m,"mirror-config.json"),Xt=o(m,"mirror.lock").find(fe=>S.existsSync(fe))??l(m,"mirror.lock"),xr=S.existsSync(Fe),Er=S.existsSync(Xt),Gn={};if(xr)try{Gn=JSON.parse(await S.promises.readFile(Fe,"utf-8")),g.push({id:"mirror.config.parse",status:"passed",message:"Mirror configuration parsed successfully."});}catch{g.push({id:"mirror.config.parse",status:"failed",message:"Mirror configuration parse failed: invalid JSON in .workspai/mirror-config.json."});}if(w)g.push({id:"mirror.lifecycle",status:"skipped",message:"Mirror synchronization lifecycle skipped by --compliance-only."});else {let fe=await jn(m,{ciMode:p,offlineMode:f});g.push(...fe.checks.map(ot=>({id:ot.id,status:ot.status,message:ot.message}))),v=fe.details,fe.details.lockWritten&&(Er=true);}if(f){let fe=process.env.RAPIDKIT_MIRROR_ENABLED==="1"||Gn.enabled===true;g.push({id:"offline.mirror.enabled",status:fe?"passed":"failed",message:fe?"Offline mode mirror is enabled.":'Offline mode requires mirror enablement (set RAPIDKIT_MIRROR_ENABLED=1 or .workspai/mirror-config.json {"enabled": true}).'});let ot=W.rules.require_mirror_lock_for_offline;g.push({id:"offline.mirror.lock",status:!ot||Er?"passed":"failed",message:!ot||Er?"Offline mode mirror lock policy satisfied.":"Offline mode mirror lock policy failed: .workspai/mirror.lock is missing."});}else g.push({id:"offline.mirror.enabled",status:"skipped",message:"Offline mirror checks skipped (offline mode is disabled)."});let Co=St({profile:I,runtimes:await xt(m),mode:W.mode});Co.profile!=="enterprise"?g.push({id:Co.checkId,status:Co.status,message:Co.message}):(g.push({id:"profile.enterprise.ci",status:p?"passed":w?"skipped":"failed",message:p?"enterprise profile running with --ci.":w?"Enterprise runtime execution skipped by --compliance-only; --ci is not required.":"enterprise profile expects --ci for deterministic non-interactive mode."}),g.push({id:"profile.enterprise.compatibility-matrix",status:ae?"passed":"failed",message:ae?"enterprise profile has compatibility matrix.":"enterprise profile requires .workspai/compatibility-matrix.json."}),g.push({id:"profile.enterprise.mirror-config",status:xr?"passed":"failed",message:xr?"enterprise profile has mirror configuration.":"enterprise profile requires .workspai/mirror-config.json."}));}p&&(process.env.RAPIDKIT_BOOTSTRAP_CI="1"),f&&(process.env.RAPIDKIT_OFFLINE_MODE="1");let M=g.some(O=>O.id.startsWith("policy.schema.")&&O.status==="failed")||W.mode==="strict"&&g.some(O=>O.status==="failed"),se=l(m||k,"reports"),Y=new Date().toISOString().replace(/[:.]/g,"-"),ee=C.join(se,`bootstrap-compliance-${Y}.json`),Ee=C.join(se,"bootstrap-compliance.latest.json"),ze={command:"bootstrap",timestamp:new Date().toISOString(),workspacePath:m,profile:I,options:{ci:p,offline:f,strict:W.mode==="strict",complianceOnly:w},policyMode:W.mode,policyRules:W.rules,mirrorLifecycle:v,checks:g};if(M){let O=$n({...ze,result:"blocked",initExitCode:null},1,g);return await R__default.ensureDir(se),await st(ee,O),await st(Ee,O),d?process.stdout.write(`${JSON.stringify(O,null,2)}
279
+ `):(console.log(s.red("\u274C Bootstrap blocked by strict policy checks.")),console.log(s.gray(`Compliance report: ${ee}`))),1}if(d&&I==="enterprise"&&!p&&!w){let O=$n({...ze,result:"blocked",initExitCode:null,complianceOnly:false,bootstrapRuntimeSkipped:{reason:"enterprise JSON bootstrap requires --ci for deterministic non-interactive execution.",nextAction:"npx workspai bootstrap --profile enterprise --ci --json"}},1,g);return await R__default.ensureDir(se),await st(ee,O),await st(Ee,O),process.stdout.write(`${JSON.stringify(O,null,2)}
280
+ `),1}let Re=async O=>{let L=process.stdout.write.bind(process.stdout),X=process.stderr.write.bind(process.stderr),Oe=[],je=[];process.stdout.write=((ae,Ae,Fe)=>{let Xt=typeof Ae=="function"?Ae:typeof Fe=="function"?Fe:void 0;return Oe.push(typeof ae=="string"?ae:ae instanceof Uint8Array?Buffer.from(ae).toString("utf8"):String(ae)),Xt?.(),true}),process.stderr.write=((ae,Ae,Fe)=>{let Xt=typeof Ae=="function"?Ae:typeof Fe=="function"?Fe:void 0;return je.push(typeof ae=="string"?ae:ae instanceof Uint8Array?Buffer.from(ae).toString("utf8"):String(ae)),Xt?.(),true});try{return {exitCode:await O(),stdout:Oe.join(""),stderr:je.join("")}}finally{process.stdout.write=L,process.stderr.write=X;}},B=O=>{let L=O.split(/\r?\n/).map(X=>X.trim()).filter(Boolean);return {bytes:Buffer.byteLength(O),excerpt:L.slice(0,12)}},Le=0,_e;if(!w)if(d){let O=await Re(()=>e(c));Le=O.exitCode,_e={captured:true,stdout:B(O.stdout),stderr:B(O.stderr)};}else Le=await e(c);let At=g.filter(O=>O.status==="failed").length,ke=Le!==0?"failed":At>0?"ok_with_warnings":"ok",wt=Le!==0?Le:At>0?1:0,tt=$n({...ze,result:ke,initExitCode:Le,complianceOnly:w,..._e?{initOutput:_e}:{}},wt,g);if(await R__default.ensureDir(se),await st(ee,tt),await st(Ee,tt),m&&!w&&Le===0)try{let{syncWorkspaceProjects:O}=await import('./workspace-FQT3QIRS.js');await O(m,d),await at(m,{silent:d});}catch{}if(d)process.stdout.write(`${JSON.stringify(tt,null,2)}
281
+ `);else {let O=g.filter(L=>L.status==="failed").length;O>0&&console.log(s.yellow(`\u26A0\uFE0F Bootstrap completed with ${O} policy/profile warnings.`)),console.log(s.gray(`Compliance report: ${ee}`));}return wt}finally{typeof o$1>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=o$1;}}async function Ya(t){if(t.includes("--help")||t.includes("-h"))return console.log(s.yellow("Usage: workspai setup <python|node|go|java|dotnet> [--warm-deps]")),0;let e$1=(t[1]||"").toLowerCase(),o$1=t.includes("--json"),r=t.includes("--warm-deps")||t.includes("--warm-dependencies");if(!e$1||!["python","node","go","java","dotnet"].includes(e$1))return o$1?process.stdout.write(`${JSON.stringify({command:"setup",result:"error",error:"Usage: workspai setup <python|node|go|java|dotnet> [--warm-deps]"},null,2)}
282
+ `):console.log(s.yellow("Usage: workspai setup <python|node|go|java|dotnet> [--warm-deps]")),1;let n=async(w,h)=>{if(w==="node"){if(!S.existsSync(C.join(h,"package.json")))return {exitCode:0,message:"Node warm-up skipped: package.json not found in current directory."};let j=S.existsSync(C.join(h,"pnpm-lock.yaml")),_=S.existsSync(C.join(h,"yarn.lock"));return j?{exitCode:await Q("pnpm",["install","--lockfile-only","--ignore-scripts"],h)}:_?{exitCode:await Q("yarn",["install","--ignore-scripts"],h)}:{exitCode:await Q("npm",["install","--package-lock-only","--ignore-scripts"],h)}}if(w==="go")return S.existsSync(C.join(h,"go.mod"))?{exitCode:await Q("go",["mod","download"],h)}:{exitCode:0,message:"Go warm-up skipped: go.mod not found in current directory."};if(w==="java"){let k=S.existsSync(C.join(h,"pom.xml")),j=S.existsSync(C.join(h,"build.gradle"))||S.existsSync(C.join(h,"build.gradle.kts")),_=C.join(h,process.platform==="win32"?"gradlew.bat":"gradlew"),y=S.existsSync(_);return !k&&!j?{exitCode:0,message:"Java warm-up skipped: pom.xml or build.gradle not found in current directory."}:k?{exitCode:await Q("mvn",["-B","-q","-DskipTests","dependency:go-offline"],h)}:{exitCode:await Q(y?_:"gradle",["--no-daemon","dependencies"],h)}}return w==="dotnet"?(()=>{let j=[{dir:h,depth:0}],_=new Set(["bin","obj",".git","node_modules",".workspai",".rapidkit"]);for(;j.length>0;){let y=j.shift();if(!y||y.depth>3)continue;let m=[];try{m=S.readdirSync(y.dir,{withFileTypes:true});}catch{continue}for(let g of m)if(g.isFile()){let v=g.name.toLowerCase();if(v.endsWith(".sln")||v.endsWith(".csproj"))return true}else g.isDirectory()&&!_.has(g.name)&&j.push({dir:C.join(y.dir,g.name),depth:y.depth+1});}return false})()?{exitCode:await Q("dotnet",["restore"],h)}:{exitCode:0,message:".NET warm-up skipped: .sln or *.csproj not found in current project tree."}:{exitCode:0,message:"Dependency warm-up currently applies to node/go/java/dotnet runtimes."}};if(o$1){let w=process.env.RAPIDKIT_SUPPRESS_RUN_COMMAND_OUTPUT;process.env.RAPIDKIT_SUPPRESS_RUN_COMMAND_OUTPUT="1";try{let k=await Ue(e$1,{runCommandInCwd:Q,runCoreRapidkit:async(y,m)=>(await g$4(y,{...m,cwd:void 0})).exitCode}).checkPrereqs(),j=re(process.cwd()),_=null;if(e$1==="node"&&k.exitCode===0&&(_=process.version),j&&_){let y=o(j,"toolchain.lock").find(v=>S.existsSync(v))??l(j,"toolchain.lock"),m=l(j,"toolchain.lock"),g={};try{g=JSON.parse(await S.promises.readFile(y,"utf-8"));}catch{}(!g.runtime||typeof g.runtime!="object")&&(g.runtime={}),g.runtime[e$1]={version:_,detectedAt:new Date().toISOString()},await R__default.ensureDir(C.dirname(m)),await S.promises.writeFile(m,JSON.stringify(g,null,2)+`
283
+ `,"utf-8");}return process.stdout.write(`${JSON.stringify({command:"setup",runtime:e$1,result:k.exitCode===0?"ok":"failed",exitCode:k.exitCode,workspacePath:j,version:_,warmDeps:r},null,2)}
284
+ `),k.exitCode}finally{typeof w>"u"?delete process.env.RAPIDKIT_SUPPRESS_RUN_COMMAND_OUTPUT:process.env.RAPIDKIT_SUPPRESS_RUN_COMMAND_OUTPUT=w;}}let i=Ue(e$1,{runCommandInCwd:Q,runCoreRapidkit:(w,h)=>e(w,{...h,cwd:void 0})}),a=await i.checkPrereqs(),c=await i.doctorHints(process.cwd()),l$1=re(process.cwd()),p=l$1||process.cwd(),f=null,d=async()=>e$1!=="java"||!l$1?[]:f||(f=(await gc(l$1)).filter(h=>{let k=d$5(h);return g$1(k,h)}),f);if(a.exitCode===0){console.log(s.green(`\u2705 ${e$1} prerequisites look good.`));let w=["python","node","go","java","dotnet"].filter(h=>h!==e$1).join("/");if(console.log(s.gray(` Scope: validated ${e$1} runtime only. ${w} checks are optional unless your workspace profile uses them.`)),e$1==="python"&&console.log(s.gray(" Note: Poetry is recommended, but venv/pipx-based flows are supported in workspace creation.")),i.warmSetupCache&&((await i.warmSetupCache(p)).exitCode===0?console.log(s.gray(` ${e$1} cache warm-up completed.`)):console.log(s.yellow(` ${e$1} cache warm-up skipped (non-fatal).`))),r)if(e$1==="java"&&l$1){let h=await d();if(h.length>0){let k=0,j=0,_=0;for(let y of h){let m=await n("java",y),g=/skipped/i.test(m.message||""),v=C.relative(l$1,y)||C.basename(y);m.message&&console.log(s.gray(` [${v}] ${m.message}`)),m.exitCode===0&&!g?k+=1:m.exitCode===0&&g?_+=1:j+=1;}k>0&&console.log(s.gray(` java dependency warm-up completed for ${k} project(s) (--warm-deps).`)),j>0&&console.log(s.yellow(` java dependency warm-up failed for ${j} project(s) (non-fatal).`)),k===0&&j===0&&_>0&&console.log(s.gray(" java dependency warm-up skipped for discovered workspace projects."));}else {let k=await n("java",p),j=/skipped/i.test(k.message||"");k.message&&console.log(s.gray(` ${k.message}`)),k.exitCode===0&&!j?console.log(s.gray(` ${e$1} dependency warm-up completed (--warm-deps).`)):k.exitCode!==0&&console.log(s.yellow(` ${e$1} dependency warm-up failed (non-fatal).`));}}else {let h=await n(e$1,p),k=/skipped/i.test(h.message||"");h.message&&console.log(s.gray(` ${h.message}`)),h.exitCode===0&&!k?console.log(s.gray(` ${e$1} dependency warm-up completed (--warm-deps).`)):h.exitCode!==0&&console.log(s.yellow(` ${e$1} dependency warm-up failed (non-fatal).`));}if(l$1)try{let h=o(l$1,"toolchain.lock").find(y=>S.existsSync(y))??l(l$1,"toolchain.lock"),k=l(l$1,"toolchain.lock"),j={};try{j=JSON.parse(await S.promises.readFile(h,"utf-8"));}catch{}(!j.runtime||typeof j.runtime!="object")&&(j.runtime={});let _=j.runtime;if(e$1==="python"){let y=null;try{let{execa:m}=await import('execa');for(let g of Kn()){let u=await m(g,g==="py"?["-3","--version"]:["--version"],{cwd:l$1,stdio:"pipe",reject:false,timeout:3e3});if(u.exitCode===0){let P=(u.stdout||u.stderr||"").match(/Python\s+(\S+)/);if(y=P?P[1]:null,y)break}}}catch{}_.python={..._.python||{},version:y,last_setup:new Date().toISOString()};}else if(e$1==="node")_.node={..._.node||{},version:process.version,last_setup:new Date().toISOString()};else if(e$1==="go"){let y=null;try{let{execa:m}=await import('execa'),v=((await m("go",["version"],{cwd:l$1,stdio:"pipe"})).stdout||"").match(/go(\d+\.\d+(?:\.\d+)?)/i);y=v?v[1]:null;}catch{}_.go={..._.go||{},version:y,last_setup:new Date().toISOString()};}else if(e$1==="java"){let y=null,m=null,g=null,v=await d(),b=S.existsSync(C.join(p,"pom.xml"))||S.existsSync(C.join(p,"build.gradle"))||S.existsSync(C.join(p,"build.gradle.kts"))?p:v[0]||p;try{let{execa:P}=await import('execa'),x=await P("java",["-version"],{cwd:l$1,stdio:"pipe",reject:false,timeout:3e3}),I=`${x.stdout||""}
285
+ ${x.stderr||""}`.match(/version\s+"([^"]+)"/i);y=I?I[1]:null;let W=S.existsSync(C.join(b,"pom.xml")),N=S.existsSync(C.join(b,"build.gradle"))||S.existsSync(C.join(b,"build.gradle.kts"));if(W){m="maven";let D=(()=>{let Y=C.join(b,"mvnw.cmd");if(process.platform==="win32"&&S.existsSync(Y))return Y;let ee=C.join(b,"mvnw");return S.existsSync(ee)?ee:"mvn"})(),M=await P(D,["-version"],{cwd:b,stdio:"pipe",reject:false,timeout:3e3}),se=`${M.stdout||""}
286
+ ${M.stderr||""}`.match(/Apache Maven\s+(\S+)/i);g=se?se[1]:null;}else if(N){m="gradle";let D=(()=>{let Y=C.join(b,"gradlew.bat");if(process.platform==="win32"&&S.existsSync(Y))return Y;let ee=C.join(b,"gradlew");return S.existsSync(ee)?ee:"gradle"})(),M=await P(D,["--version"],{cwd:b,stdio:"pipe",reject:false,timeout:3e3}),se=`${M.stdout||""}
287
+ ${M.stderr||""}`.match(/Gradle\s+(\S+)/i);g=se?se[1]:null;}}catch{}_.java={..._.java||{},version:y,build_tool:m,build_tool_version:g,last_setup:new Date().toISOString()};}else if(e$1==="dotnet"){let y=null;try{let{execa:m}=await import('execa'),v=((await m("dotnet",["--version"],{cwd:l$1,stdio:"pipe",reject:false,timeout:3e3})).stdout||"").trim();y=v.length>0?v:null;}catch{}_.dotnet={..._.dotnet||{},version:y,sdk:y,last_setup:new Date().toISOString()};}j.updated_at=new Date().toISOString(),await S.promises.writeFile(k,JSON.stringify(j,null,2)+`
288
+ `,"utf-8"),console.log(s.gray(" toolchain.lock updated (.workspai/toolchain.lock)"));}catch{}}else console.log(s.red(`\u274C ${e$1} prerequisites check failed.`));if(c.length>0){console.log(s.gray(`
289
+ Hints:`));for(let w of c)console.log(s.gray(`- ${w}`));}return a.exitCode}function yd(t){let e={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};for(let o of t.split(`
290
+ `)){let r=o.trim(),n=r.match(/^strategy:\s*(\S+)/);n&&(e.strategy=n[1].replace(/['"]]/g,""));let i=r.match(/^prune_on_bootstrap:\s*(true|false)/);i&&(e.prune_on_bootstrap=i[1]==="true");let a=r.match(/^self_heal:\s*(true|false)/);a&&(e.self_heal=a[1]==="true");let c=r.match(/^verify_integrity:\s*(true|false)/);c&&(e.verify_integrity=c[1]==="true");}return e}async function Qa(t){if(t.includes("--help")||t.includes("-h"))return console.log(s.yellow("Usage: workspai cache <status|clear|prune|repair>")),0;let e=(t[1]||"status").toLowerCase(),o$1=t.includes("--json"),r=t.includes("--dry-run"),n=hr.getInstance(),i=re(process.cwd()),a={strategy:"shared",prune_on_bootstrap:false,self_heal:true,verify_integrity:false};if(i)try{let c=o(i,"cache-config.yml").find(p=>S.existsSync(p));if(!c)throw new Error("cache config missing");let l=await S.promises.readFile(c,"utf-8");a=yd(l);}catch{}if(e==="status"){let c={command:"cache",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:i,cache:{enabled:true,strategy:a.strategy,selfHeal:a.self_heal,pruneOnBootstrap:a.prune_on_bootstrap,verifyIntegrity:a.verify_integrity,inMemory:true}};return o$1?(process.stdout.write(`${JSON.stringify(c,null,2)}
254
291
  `),0):(console.log(s.cyan("Workspai cache is enabled")),console.log(s.cyan("Workspai cache status")),i?(console.log(s.gray(` Workspace: ${i}`)),console.log(s.gray(` Strategy: ${a.strategy}`)),console.log(s.gray(` Self-heal: ${a.self_heal}`)),console.log(s.gray(` Prune on bootstrap:${a.prune_on_bootstrap}`)),console.log(s.gray(` Verify integrity: ${a.verify_integrity}`))):console.log(s.gray(" (not inside a workspace \u2014 showing in-memory cache only)")),console.log(s.gray(" In-memory cache: enabled")),console.log(s.gray(" Use: workspai cache clear|prune|repair")),0)}return e==="clear"?(await n.clear(),o$1?(process.stdout.write(`${JSON.stringify({command:"cache",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:i,cache:{cleared:true,strategy:a.strategy}},null,2)}
255
292
  `),0):(console.log(s.green("Cache clear completed")),console.log(s.green("\u2705 Cache cleared (all entries removed).")),0)):e==="prune"?(r||await n.clear(),o$1?(process.stdout.write(`${JSON.stringify({command:"cache",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:i,dryRun:r,cache:{pruned:!r,strategy:a.strategy,pruneOnBootstrap:a.prune_on_bootstrap},nextActions:a.prune_on_bootstrap?[]:["Set prune_on_bootstrap: true in .workspai/cache-config.yml to auto-prune on bootstrap."]},null,2)}
256
293
  `),0):r?(console.log(s.green("Cache prune dry run completed")),console.log(s.gray(" No cache entries were removed.")),0):(console.log(s.green("\u2705 Cache pruned (stale entries removed).")),a.prune_on_bootstrap||console.log(s.gray(" Tip: set prune_on_bootstrap: true in .workspai/cache-config.yml to auto-prune on every bootstrap.")),0)):e==="repair"?a.self_heal?(await n.clear(),o$1?(process.stdout.write(`${JSON.stringify({command:"cache",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:i,cache:{repaired:true,selfHeal:a.self_heal,verifyIntegrity:a.verify_integrity}},null,2)}
257
294
  `),0):(console.log(s.green("\u2705 Cache repaired (self-heal applied, stale entries evicted).")),a.verify_integrity&&console.log(s.gray(" Integrity verification is enabled in cache-config.yml.")),0)):o$1?(process.stdout.write(`${JSON.stringify({command:"cache",action:e,result:"skipped",timestamp:new Date().toISOString(),workspacePath:i,reason:"self_heal is disabled in .workspai/cache-config.yml",cache:{selfHeal:a.self_heal,verifyIntegrity:a.verify_integrity}},null,2)}
258
- `),0):(console.log(s.yellow("\u26A0\uFE0F self_heal is disabled in .workspai/cache-config.yml \u2014 skipping repair.")),0):(console.log(s.yellow("Usage: workspai cache <status|clear|prune|repair>")),1)}async function Md(t,e,o,r,n=false){let i=(e||"show").toLowerCase(),a=l(t,"policies.yml");if(i==="show"||i==="status"||i==="get"){let p=await ga(t),u=ma(p);return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"ok",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,policy:u},null,2)}
259
- `),0):(console.log(s.cyan(`Policy file: ${a}`)),console.log(s.gray(` mode: ${u.mode}`)),console.log(s.gray(` dependency_sharing_mode: ${u.dependency_sharing_mode}`)),console.log(s.gray(" rules:")),console.log(s.gray(` enforce_workspace_marker: ${u.rules.enforce_workspace_marker}`)),console.log(s.gray(` enforce_toolchain_lock: ${u.rules.enforce_toolchain_lock}`)),console.log(s.gray(` disallow_untrusted_tool_sources: ${u.rules.disallow_untrusted_tool_sources}`)),console.log(s.gray(` enforce_compatibility_matrix: ${u.rules.enforce_compatibility_matrix}`)),console.log(s.gray(` require_mirror_lock_for_offline: ${u.rules.require_mirror_lock_for_offline}`)),console.log(s.gray("Examples:")),console.log(s.gray(" npx workspai workspace policy set mode strict")),console.log(s.gray(" npx workspai workspace policy set dependency_sharing_mode shared-runtime-caches")),console.log(s.gray(" npx workspai workspace policy set rules.enforce_toolchain_lock true")),0)}if(i!=="set")return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"error",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,error:{code:"workspace.policy.unknown_action",message:`Unknown workspace policy action: ${e||""}`},allowedActions:["show","status","get","set"]},null,2)}
295
+ `),0):(console.log(s.yellow("\u26A0\uFE0F self_heal is disabled in .workspai/cache-config.yml \u2014 skipping repair.")),0):(console.log(s.yellow("Usage: workspai cache <status|clear|prune|repair>")),1)}async function wd(t,e,o,r,n=false){let i=(e||"show").toLowerCase(),a=l(t,"policies.yml");if(i==="show"||i==="status"||i==="get"){let d=await qa(t),w=Ha(d);return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"ok",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,policy:w},null,2)}
296
+ `),0):(console.log(s.cyan(`Policy file: ${a}`)),console.log(s.gray(` mode: ${w.mode}`)),console.log(s.gray(` dependency_sharing_mode: ${w.dependency_sharing_mode}`)),console.log(s.gray(" rules:")),console.log(s.gray(` enforce_workspace_marker: ${w.rules.enforce_workspace_marker}`)),console.log(s.gray(` enforce_toolchain_lock: ${w.rules.enforce_toolchain_lock}`)),console.log(s.gray(` disallow_untrusted_tool_sources: ${w.rules.disallow_untrusted_tool_sources}`)),console.log(s.gray(` enforce_compatibility_matrix: ${w.rules.enforce_compatibility_matrix}`)),console.log(s.gray(` require_mirror_lock_for_offline: ${w.rules.require_mirror_lock_for_offline}`)),console.log(s.gray("Examples:")),console.log(s.gray(" npx workspai workspace policy set mode strict")),console.log(s.gray(" npx workspai workspace policy set dependency_sharing_mode shared-runtime-caches")),console.log(s.gray(" npx workspai workspace policy set rules.enforce_toolchain_lock true")),0)}if(i!=="set")return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"error",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,error:{code:"workspace.policy.unknown_action",message:`Unknown workspace policy action: ${e||""}`},allowedActions:["show","status","get","set"]},null,2)}
260
297
  `),1):(console.log(s.red(`Unknown workspace policy action: ${e||""}`)),console.log(s.gray("Available: show, set")),1);if(!o||typeof r>"u")return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"error",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,error:{code:"workspace.policy.missing_arguments",message:"Usage: workspai workspace policy set <key> <value>"},allowedKeys:["mode","dependency_sharing_mode","rules.enforce_workspace_marker","rules.enforce_toolchain_lock","rules.disallow_untrusted_tool_sources","rules.enforce_compatibility_matrix","rules.require_mirror_lock_for_offline"]},null,2)}
261
- `),1):(console.log(s.yellow("Usage: workspai workspace policy set <key> <value>")),console.log(s.gray("Allowed keys:")),console.log(s.gray(" mode (warn|strict)")),console.log(s.gray(" dependency_sharing_mode (isolated|shared-runtime-caches|shared-node-deps)")),console.log(s.gray(" rules.enforce_workspace_marker (true|false)")),console.log(s.gray(" rules.enforce_toolchain_lock (true|false)")),console.log(s.gray(" rules.disallow_untrusted_tool_sources (true|false)")),console.log(s.gray(" rules.enforce_compatibility_matrix (true|false)")),console.log(s.gray(" rules.require_mirror_lock_for_offline (true|false)")),1);let l$1=o.trim(),d=await ga(t);if(l$1==="mode"){let p=r.trim().toLowerCase();if(p!=="warn"&&p!=="strict")return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"error",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,error:{code:"workspace.policy.invalid_mode",message:"Invalid mode. Use: warn | strict"}},null,2)}
262
- `),1):(console.log(s.red("\u274C Invalid mode. Use: warn | strict")),1);d=fa(d,"mode",`${p} # "warn" or "strict"`);}else if(l$1==="dependency_sharing_mode"){let p=r.trim().toLowerCase();if(p!=="isolated"&&p!=="shared-runtime-caches"&&p!=="shared-node-deps")return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"error",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,error:{code:"workspace.policy.invalid_dependency_sharing_mode",message:"Invalid dependency_sharing_mode. Use: isolated | shared-runtime-caches | shared-node-deps"}},null,2)}
263
- `),1):(console.log(s.red("\u274C Invalid dependency_sharing_mode. Use: isolated | shared-runtime-caches | shared-node-deps")),1);d=fa(d,"dependency_sharing_mode",`${p} # "isolated" or "shared-runtime-caches" or "shared-node-deps"`);}else if(l$1.startsWith("rules.")){let p=l$1.slice(6);if(!(p in Ma))return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"error",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,error:{code:"workspace.policy.unknown_rule",message:`Unknown policy rule: ${p}`}},null,2)}
264
- `),1):(console.log(s.red(`\u274C Unknown policy rule: ${p}`)),1);let u=Cd(r);if(u===null)return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"error",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,error:{code:"workspace.policy.invalid_boolean",message:"Rule values must be boolean: true | false"}},null,2)}
265
- `),1):(console.log(s.red("\u274C Rule values must be boolean: true | false")),1);d=bd(d,p,u);}else return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"error",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,error:{code:"workspace.policy.unknown_key",message:`Unknown policy key: ${l$1}`}},null,2)}
266
- `),1):(console.log(s.red(`\u274C Unknown policy key: ${l$1}`)),1);await xd(t,d);let m=ma(d);return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"ok",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,updatedKey:l$1,policy:m},null,2)}
267
- `),0):(console.log(s.green(`\u2705 Updated ${l$1} in .workspai/policies.yml`)),console.log(s.gray(` mode: ${m.mode}`)),console.log(s.gray(` dependency_sharing_mode: ${m.dependency_sharing_mode}`)),console.log(s.gray(" Tip: run `npx workspai workspace policy show` to inspect all values.")),0)}async function ka(t){if(t.includes("--help")||t.includes("-h"))return console.log(s.yellow("Usage: workspai mirror <status|sync|verify|rotate> [--json]")),0;let e=(t[1]||"status").toLowerCase(),o$1=t.includes("--json"),r=oe(process.cwd());if(!r)return console.log(s.red("\u274C Not inside a Workspai workspace")),console.log(s.gray("\u{1F4A1} Run this command from within a workspace directory")),1;let n=o(r,"mirror-config.json").find(m=>P.existsSync(m))??l(r,"mirror-config.json"),i=o(r,"mirror.lock").find(m=>P.existsSync(m))??l(r,"mirror.lock"),a=l(r,"mirror","artifacts"),l$1=l(r,"reports");async function c(m){let p=new Date().toISOString().replace(/[:.]/g,"-"),u=v.join(l$1,`mirror-ops-${p}.json`),f=v.join(l$1,"mirror-ops.latest.json");await E__default.ensureDir(l$1),await et(u,m),await et(f,m);}async function d(){let m=await E__default.pathExists(n),p=await E__default.pathExists(i),u=0;return await E__default.pathExists(a)&&(u=(await P.promises.readdir(a,{withFileTypes:true})).filter(f=>f.isFile()).length),{configExists:m,lockExists:p,artifactsCount:u}}if(e==="status"){if(!await E__default.pathExists(n))try{let k={schema_version:"1.0",enabled:false,strategy:"on-demand",artifacts:[],created_at:new Date().toISOString(),note:"Auto-generated by workspai mirror status. Set enabled: true and add artifact entries to activate mirroring."};await E__default.ensureDir(v.dirname(n)),await P.promises.writeFile(n,JSON.stringify(k,null,2)+`
268
- `,"utf-8"),o$1||console.log(s.gray(" mirror-config.json created with defaults (.workspai/mirror-config.json)"));}catch{}let p=await E__default.pathExists(n),u=await E__default.pathExists(a),f=await E__default.pathExists(i),g=u?(await P.promises.readdir(a,{withFileTypes:true})).filter(k=>k.isFile()).length:0,h={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:r,mirror:{configExists:p,lockExists:f,artifactsCount:g}};return await c(h),o$1?(process.stdout.write(`${JSON.stringify(h,null,2)}
269
- `),0):(console.log(s.cyan("Workspai mirror status")),console.log(s.gray(`Workspace: ${r}`)),console.log(s.gray(`Config: ${p?"present":"missing"} (${n})`)),console.log(s.gray(`Lock: ${f?"present":"missing"} (${i})`)),console.log(s.gray(`Artifacts: ${g}`)),0)}if(e==="sync"||e==="verify"||e==="rotate"){let m=await an(r,{ciMode:true,offlineMode:e==="verify",forceRun:true}),p=m.checks.filter(g=>g.status==="failed"),u=m.checks.some(g=>g.id.startsWith("mirror.verify.")&&g.status==="failed");if(e==="verify"&&u){let g={command:"mirror",action:e,result:"failed",timestamp:new Date().toISOString(),workspacePath:r,mirror:await d(),details:m.details,checks:m.checks};if(await c(g),o$1)return process.stdout.write(`${JSON.stringify(g,null,2)}
270
- `),1;console.log(s.red("\u274C Mirror verify failed."));for(let h of m.checks.filter(k=>k.id.startsWith("mirror.verify.")))console.log(s.gray(`- ${h.id}: ${h.message}`));return 1}if(p.length>0){let g={command:"mirror",action:e,result:"failed",timestamp:new Date().toISOString(),workspacePath:r,mirror:await d(),details:m.details,checks:m.checks};if(await c(g),o$1)return process.stdout.write(`${JSON.stringify(g,null,2)}
271
- `),1;console.log(s.yellow(`\u26A0\uFE0F Mirror ${e} completed with ${p.length} issue(s).`));for(let h of p)console.log(s.gray(`- ${h.id}: ${h.message}`));return 1}let f={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:r,mirror:await d(),details:m.details,checks:m.checks};return await c(f),o$1?(process.stdout.write(`${JSON.stringify(f,null,2)}
272
- `),0):e==="rotate"?(console.log(s.green(`\u2705 Mirror rotate completed. Rotated files: ${m.details.rotatedFiles}.`)),0):e==="verify"?(console.log(s.green(`\u2705 Mirror verify completed. Verified artifacts: ${m.details.verifiedArtifacts}.`)),0):(console.log(s.green(`\u2705 Mirror sync completed. Synced artifacts: ${m.details.syncedArtifacts}.`)),0)}return console.log(s.yellow("Usage: workspai mirror <status|sync|verify|rotate> [--json]")),1}async function Sn(t){let e$2=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof e$2>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let o=process.cwd(),r=await Wa(o,async()=>{let n=oe(o),i=Je("python",{runCommandInCwd:z,runCoreRapidkit:e}),a=Je("dotnet",{runCommandInCwd:z,runCoreRapidkit:e}),l=t.slice(1).filter(g=>!g.startsWith("-"));if(l.length>0){let g=v.resolve(o,l[0]),h=d$4(g),k=await bt(g);return e$1(h,g)||k==="go"?await gn(g):g$2(h,g)||k==="java"?await tt("init",g):h$2(h,g)||k==="dotnet"?ee(await a.initProject(g)):f$3(h,g)||k==="node"?await fn(g):i$2(h,g)||k==="python"?await mn(g,i):await e(t,{cwd:o})}let c=d$4(o),d=!!oe(o)&&o===oe(o);if(!d&&e$1(c,o))return await gn(o);let m=await bt(o);if(!d&&(g$2(c,o)||m==="java"))return await tt("init",o);if(!d&&(h$2(c,o)||m==="dotnet"))return ee(await a.initProject(o));if(!d&&(f$3(c,o)||m==="node"))return await fn(o);if(!d&&(i$2(c,o)||m==="python"))return await mn(o,i);let p=n||oe(o),u=$a(o),f=u?v.dirname(v.dirname(u)):null;if(f&&f!==p){let g=d$4(f),h=await bt(f);return e$1(g,f)||h==="go"?await gn(f):g$2(g,f)||h==="java"?await tt("init",f):h$2(g,f)||h==="dotnet"?ee(await a.initProject(f)):f$3(g,f)||h==="node"?await fn(f):i$2(g,f)||h==="python"?await mn(f,i):await e(["init"],{cwd:f})}if(p&&o===p){console.log(s.yellow("\u26A0\uFE0F Running `npx workspai init` at workspace root.")),console.log(s.gray(" Root `init`, `workspace init`, and `workspace run init` now share the same full-init flow:\n workspace-profile dependencies first, then project dependency initialization.\n"));let g=await bn(p);if(g!==0)return g;let{runWorkspaceStage:h}=await import('./workspace-run-Y7YMUIHX.js');return (await h({workspacePath:p,stage:"init",affected:false,blastRadius:false,parallel:false,continueOnError:false,strict:false,json:false,enforceGates:false})).summary.exitCode}if(!p){let g$1=await b$1(),h=g(),{name:k}=Id(h);await E__default.ensureDir(h);let{createProject:b}=await import('./create-WRZO4HK2.js');return await b(k,{yes:true,userConfig:g$1,parentDirectory:h}),0}return await e(t,{cwd:o})});return r.ok?r.value:r.code}finally{typeof e$2>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=e$2;}}async function va(t){let e=oe(t);if(!e)return [];let o$1="warn";try{let c=o(e,"policies.yml").find(p=>P.existsSync(p));if(!c)return [];let d=await P.promises.readFile(c,"utf-8");(d.match(/^\s*enforcement_mode:\s*(warn|strict)\s*(?:#.*)?$/m)??d.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m))?.[1]==="strict"&&(o$1="strict");}catch{return []}if(o$1!=="strict")return [];let r=[],n=o(e,"toolchain.lock").find(c=>P.existsSync(c));if(!n||!P.existsSync(n))return r.push("toolchain.lock is missing \u2014 run `workspai bootstrap` first (strict mode requires a reproducible toolchain)."),r;let i={};try{i=JSON.parse(await P.promises.readFile(n,"utf-8"));}catch{return r.push("toolchain.lock is invalid JSON \u2014 regenerate it with `workspai bootstrap` before running commands in strict mode."),r}let a=i.runtime??{},l=d$4(t);e$1(l,t)&&!a.go?.version?r.push("go.version is not pinned in toolchain.lock \u2014 run `workspai setup go` first."):f$3(l,t)&&!a.node?.version?r.push("node.version is not pinned in toolchain.lock \u2014 run `workspai setup node` first."):g$2(l,t)&&!a.java?.version?r.push("java.version is not pinned in toolchain.lock \u2014 run `workspai setup java` first."):h$2(l,t)&&!a.dotnet?.version?r.push("dotnet.version is not pinned in toolchain.lock \u2014 run `workspai setup dotnet` first."):i$2(l,t)&&!a.python?.version&&r.push("python.version is not pinned in toolchain.lock \u2014 run `workspai setup python` first.");try{let c=o(e,"workspace.json").find(f=>P.existsSync(f));if(!c)throw new Error("workspace manifest missing");let m=JSON.parse(await P.promises.readFile(c,"utf-8")).profile??"",p=i$3(t,l),u=lt({profile:m,runtime:p.runtime,subjectLabel:v.basename(t),mode:"strict"});u.ok||r.push(`${u.message} Update the workspace profile or use a polyglot workspace.`);}catch{}return r}async function Od(){let t=async y=>{if(!b()||!y.toLowerCase().endsWith(".cmd"))return false;try{let S=(await E__default.readFile(y,"utf8")).replace(/\r\n/g,`
273
- `).toLowerCase(),A=S.includes("\\.rapidkit\\rapidkit"),I=S.includes("\\.rapidkit\\rapidkit.cmd")||S.includes("\\.rapidkit\\rapidkit.exe")||S.includes("\\.venv\\scripts\\rapidkit.exe");return A&&!I}catch{return false}},e$2=process.cwd(),o=process.argv.slice(2),r=o[0],n=r==="init",i=new Set(k),a=!r||r==="--help"||r==="-h"||r==="help",l=Ue(e$2),c=p(e$2,"project.json").some(y=>P.existsSync(y)),d=d$4(e$2),m=await bt(e$2),p$1=e$1(d,e$2)||f$3(d,e$2)||i$2(d,e$2)||g$2(d,e$2)||h$2(d,e$2)||c$4(m??void 0),u=!!r&&i.has(r)&&p$1,f$1=process.env.RAPIDKIT_LOCAL_LAUNCHER_BYPASS==="1";if(ao(o)||o[0]==="create")return false;if(kn(o))return true;if(o[0]==="init"&&l&&!c)return false;if(vn(o))return true;try{let y=r==="shell"&&o[1]==="activate",x=r==="create",S=await $s(e$2,{cwd:e$2,timeoutMs:1200});if(S.ok&&S.data?.isRapidkitProject&&S.data.engine==="python"){let A=x||ao(o);if(!a&&!y&&!A&&!n&&!u&&xr(o)){if(r&&da.includes(r)){let Y=await va(e$2).catch(()=>[]);if(Y.length>0){process.stderr.write(s.red("\u274C Strict policy violations prevent running this command:")+`
274
- `);for(let te of Y)process.stderr.write(s.red(` \u2022 ${te}`)+`
275
- `);process.exit(1);}}let I=await e(process.argv.slice(2),{cwd:e$2});process.exit(I);}}}catch{}let g=$a(e$2),h=b(),k$1=f$1?[]:o$1(e$2),b$1=null;for(let y of k$1)if(await E__default.pathExists(y)){if(await t(y)){f.warn(`Skipping legacy/broken Windows launcher candidate: ${y}. Falling back to core bridge.`);continue}b$1=y;break}let w=r==="create";if(r==="init"&&l&&!c)return false;if(r&&da.includes(r)){let y=await va(e$2);if(y.length>0){process.stderr.write(s.red("\u274C Strict policy violations prevent running this command:")+`
276
- `);for(let x of y)process.stderr.write(s.red(` \u2022 ${x}`)+`
277
- `);process.exit(1);}}if(b$1&&r&&la.includes(r)&&!w&&!n&&!u){f.debug(`Delegating to local CLI: ${b$1} ${o.join(" ")}`);let y=r==="init"?aa():process.env,x=spawn(b$1,o,{stdio:"inherit",cwd:e$2,shell:h,env:y});return x.on("close",S=>{process.exit(S??0);}),x.on("error",S=>{f.error(`Failed to run local rapidkit: ${S.message}`),process.exit(1);}),true}if(g&&await E__default.pathExists(g))try{let y=await E__default.readJson(g);if(Os(y.engine)){let x=o[0],S=f$1?[]:o$1(e$2),A=null;for(let I of S)if(await E__default.pathExists(I)){if(await t(I)){f.warn(`Skipping legacy/broken Windows launcher candidate: ${I}. Falling back to core bridge.`);continue}A=I;break}if(A&&x&&la.includes(x)&&x!=="init"&&!u){f.debug(`Delegating to local CLI (early detection): ${A} ${o.join(" ")}`);let I=x==="init"?aa():process.env,Y=spawn(A,o,{stdio:"inherit",cwd:e$2,env:I});return Y.on("close",te=>process.exit(te??0)),Y.on("error",te=>{f.error(`Failed to run local rapidkit: ${te.message}`),process.exit(1);}),true}if(x==="shell"&&o[1]==="activate"){let I=b()?`# RapidKit Core activation snippet (PowerShell)
298
+ `),1):(console.log(s.yellow("Usage: workspai workspace policy set <key> <value>")),console.log(s.gray("Allowed keys:")),console.log(s.gray(" mode (warn|strict)")),console.log(s.gray(" dependency_sharing_mode (isolated|shared-runtime-caches|shared-node-deps)")),console.log(s.gray(" rules.enforce_workspace_marker (true|false)")),console.log(s.gray(" rules.enforce_toolchain_lock (true|false)")),console.log(s.gray(" rules.disallow_untrusted_tool_sources (true|false)")),console.log(s.gray(" rules.enforce_compatibility_matrix (true|false)")),console.log(s.gray(" rules.require_mirror_lock_for_offline (true|false)")),1);let c=o.trim(),p=await qa(t);if(c==="mode"){let d=r.trim().toLowerCase();if(d!=="warn"&&d!=="strict")return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"error",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,error:{code:"workspace.policy.invalid_mode",message:"Invalid mode. Use: warn | strict"}},null,2)}
299
+ `),1):(console.log(s.red("\u274C Invalid mode. Use: warn | strict")),1);p=Ba(p,"mode",`${d} # "warn" or "strict"`);}else if(c==="dependency_sharing_mode"){let d=r.trim().toLowerCase();if(d!=="isolated"&&d!=="shared-runtime-caches"&&d!=="shared-node-deps")return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"error",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,error:{code:"workspace.policy.invalid_dependency_sharing_mode",message:"Invalid dependency_sharing_mode. Use: isolated | shared-runtime-caches | shared-node-deps"}},null,2)}
300
+ `),1):(console.log(s.red("\u274C Invalid dependency_sharing_mode. Use: isolated | shared-runtime-caches | shared-node-deps")),1);p=Ba(p,"dependency_sharing_mode",`${d} # "isolated" or "shared-runtime-caches" or "shared-node-deps"`);}else if(c.startsWith("rules.")){let d=c.slice(6);if(!(d in dc))return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"error",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,error:{code:"workspace.policy.unknown_rule",message:`Unknown policy rule: ${d}`}},null,2)}
301
+ `),1):(console.log(s.red(`\u274C Unknown policy rule: ${d}`)),1);let w=pd(r);if(w===null)return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"error",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,error:{code:"workspace.policy.invalid_boolean",message:"Rule values must be boolean: true | false"}},null,2)}
302
+ `),1):(console.log(s.red("\u274C Rule values must be boolean: true | false")),1);p=ad(p,d,w);}else return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"error",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,error:{code:"workspace.policy.unknown_key",message:`Unknown policy key: ${c}`}},null,2)}
303
+ `),1):(console.log(s.red(`\u274C Unknown policy key: ${c}`)),1);await ld(t,p);let f=Ha(p);return n?(process.stdout.write(`${JSON.stringify({command:"workspace policy",action:i,result:"ok",timestamp:new Date().toISOString(),workspacePath:t,policyPath:a,updatedKey:c,policy:f},null,2)}
304
+ `),0):(console.log(s.green(`\u2705 Updated ${c} in .workspai/policies.yml`)),console.log(s.gray(` mode: ${f.mode}`)),console.log(s.gray(` dependency_sharing_mode: ${f.dependency_sharing_mode}`)),console.log(s.gray(" Tip: run `npx workspai workspace policy show` to inspect all values.")),0)}async function Xa(t){if(t.includes("--help")||t.includes("-h"))return console.log(s.yellow("Usage: workspai mirror <status|sync|verify|rotate> [--json]")),0;let e=(t[1]||"status").toLowerCase(),o$1=t.includes("--json"),r=re(process.cwd());if(!r)return console.log(s.red("\u274C Not inside a Workspai workspace")),console.log(s.gray("\u{1F4A1} Run this command from within a workspace directory")),1;let n=o(r,"mirror-config.json").find(d=>S.existsSync(d))??l(r,"mirror-config.json"),i=o(r,"mirror.lock").find(d=>S.existsSync(d))??l(r,"mirror.lock"),a=l(r,"mirror","artifacts"),c=l(r,"reports");async function l$1(d){if(!await R__default.pathExists(d))return 0;let w=0,h=[d];for(;h.length>0;){let k=h.shift();if(!k)continue;let j=await S.promises.readdir(k,{withFileTypes:true});for(let _ of j)_.isFile()?w+=1:_.isDirectory()&&h.push(C.join(k,_.name));}return w}async function p(d){let w=new Date().toISOString().replace(/[:.]/g,"-"),h=C.join(c,`mirror-ops-${w}.json`),k=C.join(c,"mirror-ops.latest.json");await R__default.ensureDir(c),await st(h,d),await st(k,d);}async function f(){let d=await R__default.pathExists(n),w=await R__default.pathExists(i),h=await l$1(a);return {configExists:d,lockExists:w,artifactsCount:h}}if(e==="status"){let d=await R__default.pathExists(n),w=await R__default.pathExists(i),h=await l$1(a),k={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:r,mirror:{configExists:d,lockExists:w,artifactsCount:h}};return await p(k),o$1?(process.stdout.write(`${JSON.stringify(k,null,2)}
305
+ `),0):(console.log(s.cyan("Workspai mirror status")),console.log(s.gray(`Workspace: ${r}`)),console.log(s.gray(`Config: ${d?"present":"missing"} (${n})`)),console.log(s.gray(`Lock: ${w?"present":"missing"} (${i})`)),console.log(s.gray(`Artifacts: ${h}`)),0)}if(e==="sync"||e==="verify"||e==="rotate"){let d=await jn(r,{ciMode:true,offlineMode:e==="verify",forceRun:true}),w=d.checks.filter(j=>j.status==="failed"),h=d.checks.some(j=>j.id.startsWith("mirror.verify.")&&j.status==="failed");if(e==="verify"&&h){let j={command:"mirror",action:e,result:"failed",timestamp:new Date().toISOString(),workspacePath:r,mirror:await f(),details:d.details,checks:d.checks};if(await p(j),o$1)return process.stdout.write(`${JSON.stringify(j,null,2)}
306
+ `),1;console.log(s.red("\u274C Mirror verify failed."));for(let _ of d.checks.filter(y=>y.id.startsWith("mirror.verify.")))console.log(s.gray(`- ${_.id}: ${_.message}`));return 1}if(w.length>0){let j={command:"mirror",action:e,result:"failed",timestamp:new Date().toISOString(),workspacePath:r,mirror:await f(),details:d.details,checks:d.checks};if(await p(j),o$1)return process.stdout.write(`${JSON.stringify(j,null,2)}
307
+ `),1;console.log(s.yellow(`\u26A0\uFE0F Mirror ${e} completed with ${w.length} issue(s).`));for(let _ of w)console.log(s.gray(`- ${_.id}: ${_.message}`));return 1}let k={command:"mirror",action:e,result:"ok",timestamp:new Date().toISOString(),workspacePath:r,mirror:await f(),details:d.details,checks:d.checks};return await p(k),o$1?(process.stdout.write(`${JSON.stringify(k,null,2)}
308
+ `),0):e==="rotate"?(console.log(s.green(`\u2705 Mirror rotate completed. Rotated files: ${d.details.rotatedFiles}.`)),0):e==="verify"?(console.log(s.green(`\u2705 Mirror verify completed. Verified artifacts: ${d.details.verifiedArtifacts}.`)),0):(console.log(s.green(`\u2705 Mirror sync completed. Synced artifacts: ${d.details.syncedArtifacts}.`)),0)}return console.log(s.yellow("Usage: workspai mirror <status|sync|verify|rotate> [--json]")),1}async function Fn(t){let e$1=process.env.RAPIDKIT_SKIP_LOCK_SYNC;typeof e$1>"u"&&(process.env.RAPIDKIT_SKIP_LOCK_SYNC="1");try{let o=process.cwd(),r=await fc(o,async()=>{let n=re(o),i=Ue("python",{runCommandInCwd:Q,runCoreRapidkit:e}),a=Ue("dotnet",{runCommandInCwd:Q,runCoreRapidkit:e}),c=t.slice(1).filter(k=>!k.startsWith("-"));if(c.length>0){let k=C.resolve(o,c[0]),j=d$5(k),_=await _t(k);return e$2(j,k)||_==="go"?await In(k):g$1(j,k)||_==="java"?await it("init",k):h$2(j,k)||_==="dotnet"?te(await a.initProject(k)):f$4(j,k)||_==="node"?await An(k):i$2(j,k)||_==="python"?await _n(k,i):await e(t,{cwd:o})}let l=d$5(o),p=!!re(o)&&o===re(o);if(!p&&e$2(l,o))return await In(o);let f=await _t(o);if(!p&&(g$1(l,o)||f==="java"))return await it("init",o);if(!p&&(h$2(l,o)||f==="dotnet"))return te(await a.initProject(o));if(!p&&(f$4(l,o)||f==="node"))return await An(o);if(!p&&(i$2(l,o)||f==="python"))return await _n(o,i);let d=n||re(o),w=pc(o),h=w?C.dirname(C.dirname(w)):null;if(h&&h!==d){let k=d$5(h),j=await _t(h);return e$2(k,h)||j==="go"?await In(h):g$1(k,h)||j==="java"?await it("init",h):h$2(k,h)||j==="dotnet"?te(await a.initProject(h)):f$4(k,h)||j==="node"?await An(h):i$2(k,h)||j==="python"?await _n(h,i):await e(["init"],{cwd:h})}if(d&&o===d){console.log(s.yellow("\u26A0\uFE0F Running `npx workspai init` at workspace root.")),console.log(s.gray(" Root `init`, `workspace init`, and `workspace run init` now share the same full-init flow:\n workspace-profile dependencies first, then project dependency initialization.\n"));let k=await Ln(d);if(k!==0)return k;let{runWorkspaceStage:j}=await import('./workspace-run-VC4OUPRF.js');return (await j({workspacePath:d,stage:"init",affected:false,blastRadius:false,parallel:false,continueOnError:false,strict:false,json:false,enforceGates:false})).summary.exitCode}if(!d){let k=await b$1(),j=g$3(),{name:_}=hd(j);await R__default.ensureDir(j);let{createProject:y}=await import('./create-DFAWAS5C.js');return await y(_,{yes:true,userConfig:k,parentDirectory:j}),0}return await e(t,{cwd:o})});return r.ok?r.value:r.code}finally{typeof e$1>"u"?delete process.env.RAPIDKIT_SKIP_LOCK_SYNC:process.env.RAPIDKIT_SKIP_LOCK_SYNC=e$1;}}async function Za(t){let e=re(t);if(!e)return [];let o$1="warn";try{let l=o(e,"policies.yml").find(d=>S.existsSync(d));if(!l)return [];let p=await S.promises.readFile(l,"utf-8");(p.match(/^\s*enforcement_mode:\s*(warn|strict)\s*(?:#.*)?$/m)??p.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m))?.[1]==="strict"&&(o$1="strict");}catch{return []}if(o$1!=="strict")return [];let r=[],n=o(e,"toolchain.lock").find(l=>S.existsSync(l));if(!n||!S.existsSync(n))return r.push("toolchain.lock is missing \u2014 run `workspai bootstrap` first (strict mode requires a reproducible toolchain)."),r;let i={};try{i=JSON.parse(await S.promises.readFile(n,"utf-8"));}catch{return r.push("toolchain.lock is invalid JSON \u2014 regenerate it with `workspai bootstrap` before running commands in strict mode."),r}let a=i.runtime??{},c=d$5(t);e$2(c,t)&&!a.go?.version?r.push("go.version is not pinned in toolchain.lock \u2014 run `workspai setup go` first."):f$4(c,t)&&!a.node?.version?r.push("node.version is not pinned in toolchain.lock \u2014 run `workspai setup node` first."):g$1(c,t)&&!a.java?.version?r.push("java.version is not pinned in toolchain.lock \u2014 run `workspai setup java` first."):h$2(c,t)&&!a.dotnet?.version?r.push("dotnet.version is not pinned in toolchain.lock \u2014 run `workspai setup dotnet` first."):i$2(c,t)&&!a.python?.version&&r.push("python.version is not pinned in toolchain.lock \u2014 run `workspai setup python` first.");try{let l=o(e,"workspace.json").find(h=>S.existsSync(h));if(!l)throw new Error("workspace manifest missing");let f=JSON.parse(await S.promises.readFile(l,"utf-8")).profile??"",d=i$3(t,c),w=ht({profile:f,runtime:d.runtime,subjectLabel:C.basename(t),mode:"strict"});w.ok||r.push(`${w.message} Update the workspace profile or use a polyglot workspace.`);}catch{}return r}async function kd(){let t=async g=>{if(!b()||!g.toLowerCase().endsWith(".cmd"))return false;try{let u=(await R__default.readFile(g,"utf8")).replace(/\r\n/g,`
309
+ `).toLowerCase(),b=u.includes("\\.rapidkit\\rapidkit"),P=u.includes("\\.rapidkit\\rapidkit.cmd")||u.includes("\\.rapidkit\\rapidkit.exe")||u.includes("\\.venv\\scripts\\rapidkit.exe");return b&&!P}catch{return false}},e$1=process.cwd(),o=process.argv.slice(2),r=o[0],n=r==="init",i=new Set(k),a=!r||r==="--help"||r==="-h"||r==="help",c=qe(e$1),l=p(e$1,"project.json").some(g=>S.existsSync(g)),p$1=d$5(e$1),f$1=await _t(e$1),d=e$2(p$1,e$1)||f$4(p$1,e$1)||i$2(p$1,e$1)||g$1(p$1,e$1)||h$2(p$1,e$1)||c$6(f$1??void 0),w=!!r&&i.has(r)&&d,h=process.env.RAPIDKIT_LOCAL_LAUNCHER_BYPASS==="1";if(Po(o)||o[0]==="create")return false;if(Tn(o))return true;if(o[0]==="init"&&c&&!l)return false;if(Wn(o))return true;try{let g=r==="shell"&&o[1]==="activate",v=r==="create",u=await Zs(e$1,{cwd:e$1,timeoutMs:1200});if(u.ok&&u.data?.isRapidkitProject&&u.data.engine==="python"){let b=v||Po(o);if(!a&&!g&&!b&&!n&&!w&&Gr(o)){if(r&&Va.includes(r)){let x=await Za(e$1).catch(()=>[]);if(x.length>0){process.stderr.write(s.red("\u274C Strict policy violations prevent running this command:")+`
310
+ `);for(let A of x)process.stderr.write(s.red(` \u2022 ${A}`)+`
311
+ `);process.exit(1);}}let P=await e(process.argv.slice(2),{cwd:e$1});process.exit(P);}}}catch{}let k$1=pc(e$1),j=b(),_=h?[]:o$1(e$1),y=null;for(let g of _)if(await R__default.pathExists(g)){if(await t(g)){f.warn(`Skipping legacy/broken Windows launcher candidate: ${g}. Falling back to core bridge.`);continue}y=g;break}let m=r==="create";if(r==="init"&&c&&!l)return false;if(r&&Va.includes(r)){let g=await Za(e$1);if(g.length>0){process.stderr.write(s.red("\u274C Strict policy violations prevent running this command:")+`
312
+ `);for(let v of g)process.stderr.write(s.red(` \u2022 ${v}`)+`
313
+ `);process.exit(1);}}if(y&&r&&Ka.includes(r)&&!m&&!n&&!w){f.debug(`Delegating to local CLI: ${y} ${o.join(" ")}`);let g=r==="init"?La():process.env,v=spawn(y,o,{stdio:"inherit",cwd:e$1,shell:j,env:g});return v.on("close",u=>{process.exit(u??0);}),v.on("error",u=>{f.error(`Failed to run local rapidkit: ${u.message}`),process.exit(1);}),true}if(k$1&&await R__default.pathExists(k$1))try{let g=await R__default.readJson(k$1);if(ti(g.engine)){let v=o[0],u=h?[]:o$1(e$1),b$1=null;for(let P of u)if(await R__default.pathExists(P)){if(await t(P)){f.warn(`Skipping legacy/broken Windows launcher candidate: ${P}. Falling back to core bridge.`);continue}b$1=P;break}if(b$1&&v&&Ka.includes(v)&&v!=="init"&&!w){f.debug(`Delegating to local CLI (early detection): ${b$1} ${o.join(" ")}`);let P=v==="init"?La():process.env,x=spawn(b$1,o,{stdio:"inherit",cwd:e$1,env:P});return x.on("close",A=>process.exit(A??0)),x.on("error",A=>{f.error(`Failed to run local rapidkit: ${A.message}`),process.exit(1);}),true}if(v==="shell"&&o[1]==="activate"){let P=b()?`# RapidKit Core activation snippet (PowerShell)
278
314
  $venv = ".venv"
279
315
  if (Test-Path "$venv\\Scripts\\Activate.ps1") { . "$venv\\Scripts\\Activate.ps1" }
280
316
  $env:RAPIDKIT_PROJECT_ROOT = (Get-Location).Path
@@ -294,16 +330,16 @@ export RAPIDKIT_PROJECT_ROOT="$(pwd)"
294
330
  export PATH="$(pwd)/.workspai:$(pwd)/.rapidkit:$(pwd):$PATH"
295
331
  `;console.log(s.green.bold(`
296
332
  \u2705 Activation snippet \u2014 run the following to activate this project in your current shell:
297
- `)),console.log(I),console.log(s.gray(`
333
+ `)),console.log(P),console.log(s.gray(`
298
334
  \u{1F4A1} After activation you can run: workspai dev
299
- `)),process.exit(0);}if(!a&&!ao(o)&&x!=="init"&&!u&&xr(o)){let I=await e(o,{cwd:e$2});process.exit(I);}}}catch{}return false}var dt=null,ar=false,Nd=Ql(),pe="workspai",ke="npx workspai",se=new Command,Wd=process.env.RAPIDKIT_SHOW_LEGACY==="1"||process.env.RAPIDKIT_SHOW_LEGACY?.toLowerCase()==="true";async function Dd(t){if(t.length===0)return false;let e=t[0],o=t[1];if(s$1(t)||dd.includes(e))return false;if(l$1.includes(e)){if(e==="lint"||e==="format"){let n=d$4(process.cwd()),i=await bt(process.cwd());if(f$3(n,process.cwd())||i==="node"){let a=i$3(process.cwd(),n);if(n$2(process.cwd(),e,{framework:a.key})!==null)return false}if(i$2(n,process.cwd())||i==="python")return true;if(p$1(process.cwd()))return false}return true}if(ao(t)||e==="shell"&&o==="activate")return false;if(t.includes("--tui"))return true;if(e==="--help"||e==="-h"||e==="help"||e==="--version"||e==="-V"||e==="-v"||t.includes("--template")||t.includes("-t"))return false;let r=await i$4();return Sr(e,r)?true:t.some(n=>br.has(n))?false:r?r.has(e):!!(a$7.has(e)||t.length>1)}se.name(pe).description("Workspai workspace intelligence CLI").version(c());var Td=b()?`${ke} init; ${ke} dev`:`${ke} init && ${ke} dev`,Fd=v.join(g(),"my-workspace");se.addHelpText("beforeAll",`Workspai CLI
335
+ `)),process.exit(0);}if(!a&&!Po(o)&&v!=="init"&&!w&&Gr(o)){let P=await e(o,{cwd:e$1});process.exit(P);}}}catch{}return false}var yt=null,Cr=false,vd=Mp(),pe="workspai",ye="npx workspai",ne=new Command,Pd=process.env.RAPIDKIT_SHOW_LEGACY==="1"||process.env.RAPIDKIT_SHOW_LEGACY?.toLowerCase()==="true";async function bd(t){if(t.length===0)return false;let e=t[0],o=t[1];if(s$1(t)||Yp.includes(e))return false;if(l$1.includes(e)){if(e==="lint"||e==="format"){let n=d$5(process.cwd()),i=await _t(process.cwd());if(f$4(n,process.cwd())||i==="node"){let a=i$3(process.cwd(),n);if(n$2(process.cwd(),e,{framework:a.key})!==null)return false}if(i$2(n,process.cwd())||i==="python")return true;if(p$1(process.cwd()))return false}return true}if(Po(t)||e==="shell"&&o==="activate")return false;if(t.includes("--tui"))return true;if(e==="--help"||e==="-h"||e==="help"||e==="--version"||e==="-V"||e==="-v"||t.includes("--template")||t.includes("-t"))return false;let r=await i$4();return Vr(e,r)?true:t.some(n=>Kr.has(n))?false:r?r.has(e):!!(a$7.has(e)||t.length>1)}ne.name(pe).description("Workspai workspace intelligence CLI").version(c());var jd=b()?`${ye} init; ${ye} dev`:`${ye} init && ${ye} dev`,Cd="~/.workspai/workspaces/my-workspace";ne.addHelpText("beforeAll",`Workspai CLI
300
336
 
301
337
  Create workspaces, scaffold projects, and manage your development toolchain.
302
- `);se.addHelpText("afterAll",`
338
+ `);ne.addHelpText("afterAll",`
303
339
  Workspace Setup Commands
304
340
  ${pe} bootstrap Bootstrap projects in workspace (--profile java-only|python-only|node-only|go-only|dotnet-only|polyglot|enterprise)
305
341
  ${pe} analyze Analyze workspace/project health and generate enterprise evidence
306
- ${pe} setup <runtime> Set up runtime toolchain (runtime: python | node | go | java)
342
+ ${pe} setup <runtime> Set up runtime toolchain (runtime: python | node | go | java | dotnet)
307
343
  ${pe} readiness Build release-readiness evidence (use --json for CI)
308
344
  ${pe} autopilot release Run end-to-end release gate orchestration (audit|safe-fix|enforce)
309
345
  ${pe} workspace list List registered workspaces on this system
@@ -326,12 +362,12 @@ Project Commands
326
362
  ${pe} test Run tests
327
363
 
328
364
  Quick start:
329
- ${ke} my-workspace # Create workspace in ~/.workspai/workspaces
330
- ${ke} my-workspace --here # Create workspace in the current directory
331
- ${ke} create workspace --output .
332
- cd ${Fd} # Or cd my-workspace when using --here
333
- ${ke} create project # Interactive kit picker
334
- ${Td} # Install deps + run
365
+ ${ye} my-workspace # Create workspace in ~/.workspai/workspaces
366
+ ${ye} my-workspace --here # Create workspace in the current directory
367
+ ${ye} create workspace --output .
368
+ cd ${Cd} # Or cd my-workspace when using --here
369
+ ${ye} create project # Interactive kit picker
370
+ ${jd} # Install deps + run
335
371
 
336
372
  Notes:
337
373
  --here Create workspace in the current directory (alias for --output .)
@@ -340,34 +376,34 @@ Notes:
340
376
  It is different from core --skip-essentials (essential module installation).
341
377
 
342
378
  Use "${pe} help <command>" for more information.
343
- `);se.argument("[name]","Name of the workspace or project directory").addOption(new Option("-t, --template <template>","Legacy: create a project with template (fastapi, nestjs, springboot, gofiber, gogin, dotnet) instead of a workspace").hideHelp()).option("-y, --yes","Skip prompts and use defaults").option("--author <name>","Author/team name for workspace metadata").option("--here","Create workspace in the current directory (same as --output .)").option("--output <dir>","Parent directory for the new workspace folder").addOption(new Option("--skip-git","Skip git initialization").hideHelp()).addOption(new Option("--skip-python-engine","Create a Python-aware workspace without installing rapidkit-core now").hideHelp()).addOption(new Option("--skip-install","Legacy: skip installing dependencies (template mode)").hideHelp()).option("--debug","Enable debug logging").addOption(new Option("--dry-run","Show what would be created without creating it").hideHelp()).addOption(new Option("--install-method <method>","Installation method: poetry, venv, or pipx").choices(["poetry","venv","pipx"]).hideHelp()).addOption(new Option("--profile <profile>","Workspace bootstrap profile: minimal, java-only, python-only, node-only, go-only, dotnet-only, polyglot, enterprise").choices(["minimal","java-only","python-only","node-only","go-only","dotnet-only","polyglot","enterprise"]).hideHelp()).addOption(new Option("--create-workspace","When creating a project outside a workspace: create and register a workspace in the current directory").hideHelp()).addOption(new Option("--no-workspace","When creating a project outside a workspace: do not create a workspace").hideHelp()).option("--no-update-check","Skip checking for updates").action(async(t,e$1)=>{try{e$1.debug&&(f.setDebug(true),f.debug("Debug mode enabled"));let o=await b$1();f.debug("User config loaded",o);let r=await c$1();f.debug("Workspai config loaded",r);let n=d(o,r,{author:e$1.author,pythonVersion:void 0,skipGit:e$1.skipGit});f.debug("Merged config",n),e$1.updateCheck!==false&&await b$2(),a("workspace"),t||(Ta(),process.exit(0));try{h(t);}catch(c){throw c instanceof a$1&&(f.error(`
344
- \u274C ${c.message}`),c.details&&f.warn(`\u{1F4A1} ${c.details}
345
- `),process.exit(1)),c}let i$2=!!e$1.template,a$2;i$2||(e$1.here?a$2=process.cwd():e$1.output?a$2=v.resolve(e$1.output):a$2=await i([],{hasYes:e$1.yes}));let l=i$2?v.resolve(process.cwd(),t):g$1(t,{outputParent:a$2});if(dt=l,!e$1.dryRun){i$2||await E__default.ensureDir(v.dirname(l));let c=i$2?void 0:i$1(t);(!i$2&&h$1(c,l,{outputParent:a$2})&&c&&await E__default.pathExists(c)||await E__default.pathExists(l))&&(f.error(`
346
- \u274C Directory "${t}" already exists`),c&&c!==l&&console.log(s.gray(` Found at: ${c}`)),console.log(s.cyan(`
379
+ `);ne.argument("[name]","Name of the workspace or project directory").addOption(new Option("-t, --template <template>","Legacy: create a project with template (fastapi, nestjs, springboot, gofiber, gogin, dotnet) instead of a workspace").hideHelp()).option("-y, --yes","Skip prompts and use defaults").option("--author <name>","Author/team name for workspace metadata").option("--here","Create workspace in the current directory (same as --output .)").option("--output <dir>","Parent directory for the new workspace folder").addOption(new Option("--skip-git","Skip git initialization").hideHelp()).addOption(new Option("--skip-python-engine","Create a Python-aware workspace without installing rapidkit-core now").hideHelp()).addOption(new Option("--skip-install","Legacy: skip installing dependencies (template mode)").hideHelp()).option("--debug","Enable debug logging").addOption(new Option("--dry-run","Show what would be created without creating it").hideHelp()).addOption(new Option("--install-method <method>","Installation method: poetry, venv, or pipx").choices(["poetry","venv","pipx"]).hideHelp()).addOption(new Option("--profile <profile>","Workspace bootstrap profile: minimal, java-only, python-only, node-only, go-only, dotnet-only, polyglot, enterprise").choices(["minimal","java-only","python-only","node-only","go-only","dotnet-only","polyglot","enterprise"]).hideHelp()).addOption(new Option("--create-workspace","When creating a project outside a workspace: create and register a workspace in the current directory").hideHelp()).addOption(new Option("--no-workspace","When creating a project outside a workspace: do not create a workspace").hideHelp()).option("--no-update-check","Skip checking for updates").action(async(t,e$1)=>{try{e$1.debug&&(f.setDebug(true),f.debug("Debug mode enabled"));let o=await b$1();f.debug("User config loaded",o);let r=await c$1();f.debug("Workspai config loaded",r);let n=d(o,r,{author:e$1.author,pythonVersion:void 0,skipGit:e$1.skipGit});f.debug("Merged config",n),e$1.updateCheck!==false&&await b$2(),a("workspace"),t||(hc(),process.exit(0));try{h(t);}catch(l){throw l instanceof a$1&&(f.error(`
380
+ \u274C ${l.message}`),l.details&&f.warn(`\u{1F4A1} ${l.details}
381
+ `),process.exit(1)),l}let i$2=!!e$1.template,a$2;i$2||(e$1.here?a$2=process.cwd():e$1.output?a$2=C.resolve(e$1.output):a$2=await i([],{hasYes:e$1.yes}));let c=i$2?C.resolve(process.cwd(),t):g(t,{outputParent:a$2});if(yt=c,!e$1.dryRun){i$2||await R__default.ensureDir(C.dirname(c));let l=i$2?void 0:i$1(t);(!i$2&&h$1(l,c,{outputParent:a$2})&&l&&await R__default.pathExists(l)||await R__default.pathExists(c))&&(f.error(`
382
+ \u274C Directory "${t}" already exists`),l&&l!==c&&console.log(s.gray(` Found at: ${l}`)),console.log(s.cyan(`
347
383
  \u{1F4A1} Choose a different name or delete the existing directory.
348
384
  `)),process.exit(1));}if(e$1.dryRun){console.log(s.cyan(`
349
385
  \u{1F50D} Dry-run mode - showing what would be created:
350
- `)),console.log(s.white("\u{1F4C2} Path:"),l),console.log(s.white("\u{1F4E6} Type:"),i$2?`Project (${e$1.template})`:"Workspace"),console.log();return}if(!e$1.yes&&!i$2?await b$3([{type:"input",name:"author",message:"Author name:",default:process.env.USER||"Workspai User"}]):e$1.yes&&console.log(s.gray(`Using default values (--yes flag)
351
- `)),i$2){let c=String(e$1.template||"").trim(),d=b$4(c);if(d$1(d)){let w=await wn(["create","project",d,t,...e$1.skipGit?["--skip-git"]:[]]);w!==0&&process.exit(w);return}if(!!!Pn(process.cwd())){let{registerWorkspaceAtPath:w}=await import('./create-WRZO4HK2.js');if(e$1.createWorkspace)await w(process.cwd(),{skipGit:e$1.skipGit,yes:e$1.yes,userConfig:o});else if(!e$1.noWorkspace)if(e$1.yes)await w(process.cwd(),{skipGit:e$1.skipGit,yes:true,userConfig:o});else {let{createWs:y}=await b$3([{type:"confirm",name:"createWs",message:"This project will be created outside a Workspai workspace. Create and register a workspace here?",default:true}]);y&&await w(process.cwd(),{skipGit:e$1.skipGit,yes:false,userConfig:o});}}let p=["create","project",d,t,"--output",process.cwd()];e$1.yes&&p.push("--yes");let u=oe(process.cwd()),f$2=!!e$1.skipInstall,g=f$2||!!u;f$2&&p.push("--skip-essentials");let h=g?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0,k=await f$1(p,{cwd:process.cwd(),env:h});k!==0&&process.exit(k),u&&!e$1.skipInstall&&(console.log(s.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(s.white(" Next: cd <project-name> && npx workspai init")));let b=Pn(process.cwd());if(b){let w=v.dirname(b),y=v.join(w,".python-version"),x=v.join(l,".python-version");try{if(await E__default.pathExists(y)){let S=P.readFileSync(y,"utf-8");P.writeFileSync(x,S.trim()+`
352
- `),f.debug(`Synced Python version ${S.trim()} from workspace to project`);}}catch(S){f.debug("Could not sync Python version from workspace:",S);}}if(!e$1.skipInstall){let w=await e(["init",l],{cwd:process.cwd()});if(w!==0&&process.exit(w),b){let y=v.dirname(b),x=v.join(y,".python-version"),S=v.join(l,".python-version");try{if(await E__default.pathExists(x)){let A=P.readFileSync(x,"utf-8");P.writeFileSync(S,A.trim()+`
353
- `),f.debug(`Re-synced Python version ${A.trim()} after init`);}}catch(A){f.debug("Could not re-sync Python version after init:",A);}}}}else {let{createProject:c}=await import('./create-WRZO4HK2.js');await c(t,{skipGit:e$1.skipGit,skipPythonEngine:e$1.skipPythonEngine,dryRun:e$1.dryRun,yes:e$1.yes,userConfig:n,installMethod:e$1.installMethod,profile:e$1.profile,parentDirectory:v.dirname(l)}),console.log(s.gray(`\u2139\uFE0F Workspace root: ${l}`)),console.log(s.gray(` Next: ${f$2(l)} && npx workspai create project`));}}catch(o){o instanceof a$1?(f.error(`
386
+ `)),console.log(s.white("\u{1F4C2} Path:"),c),console.log(s.white("\u{1F4E6} Type:"),i$2?`Project (${e$1.template})`:"Workspace"),console.log();return}if(!e$1.yes&&!i$2?await b$3([{type:"input",name:"author",message:"Author name:",default:process.env.USER||"Workspai User"}]):e$1.yes&&console.log(s.gray(`Using default values (--yes flag)
387
+ `)),i$2){let l=String(e$1.template||"").trim(),p=b$4(l);if(d$1(p)){let m=await Mn(["create","project",p,t,...e$1.skipGit?["--skip-git"]:[]]);m!==0&&process.exit(m);return}if(!!!Dn(process.cwd())){let{registerWorkspaceAtPath:m}=await import('./create-DFAWAS5C.js');if(e$1.createWorkspace)await m(process.cwd(),{skipGit:e$1.skipGit,yes:e$1.yes,userConfig:o});else if(!e$1.noWorkspace)if(e$1.yes)await m(process.cwd(),{skipGit:e$1.skipGit,yes:true,userConfig:o});else {let{createWs:g}=await b$3([{type:"confirm",name:"createWs",message:"This project will be created outside a Workspai workspace. Create and register a workspace here?",default:true}]);g&&await m(process.cwd(),{skipGit:e$1.skipGit,yes:false,userConfig:o});}}let d=["create","project",p,t,"--output",process.cwd()];e$1.yes&&d.push("--yes");let w=re(process.cwd()),h=!!e$1.skipInstall,k=h||!!w;h&&d.push("--skip-essentials");let j=k?{...process.env,RAPIDKIT_SKIP_LOCKS:"1",RAPIDKIT_GENERATE_LOCKS:"0"}:void 0,_=await f$1(d,{cwd:process.cwd(),env:j});_!==0&&process.exit(_),w&&!e$1.skipInstall&&(console.log(s.gray("\u2139\uFE0F Fast create mode (workspace): dependencies were deferred.")),console.log(s.white(" Next: cd <project-name> && npx workspai init")));let y=Dn(process.cwd());if(y){let m=C.dirname(y),g=C.join(m,".python-version"),v=C.join(c,".python-version");try{if(await R__default.pathExists(g)){let u=S.readFileSync(g,"utf-8");S.writeFileSync(v,u.trim()+`
388
+ `),f.debug(`Synced Python version ${u.trim()} from workspace to project`);}}catch(u){f.debug("Could not sync Python version from workspace:",u);}}if(!e$1.skipInstall){let m=await e(["init",c],{cwd:process.cwd()});if(m!==0&&process.exit(m),y){let g=C.dirname(y),v=C.join(g,".python-version"),u=C.join(c,".python-version");try{if(await R__default.pathExists(v)){let b=S.readFileSync(v,"utf-8");S.writeFileSync(u,b.trim()+`
389
+ `),f.debug(`Re-synced Python version ${b.trim()} after init`);}}catch(b){f.debug("Could not re-sync Python version after init:",b);}}}}else {let{createProject:l}=await import('./create-DFAWAS5C.js');await l(t,{skipGit:e$1.skipGit,skipPythonEngine:e$1.skipPythonEngine,dryRun:e$1.dryRun,yes:e$1.yes,userConfig:n,installMethod:e$1.installMethod,profile:e$1.profile,parentDirectory:C.dirname(c)}),console.log(s.gray(`\u2139\uFE0F Workspace root: ${c}`)),console.log(s.gray(` Next: ${f$2(c)} && npx workspai create project`));}}catch(o){o instanceof a$1?(f.error(`
354
390
  \u274C ${o.message}`),o.details&&f.warn(`\u{1F4A1} ${o.details}`),f.debug("Error code:",o.code)):(f.error(`
355
- \u274C An unexpected error occurred:`),console.error(o)),process.exit(1);}finally{dt=null;}});ei(se);si(se);Oi(se);se.command("commands").description("Show effective Workspai command ownership and runtime support").option("--json","Emit machine-readable JSON output").action(async t=>{wd({json:t.json});});se.command("analyze").description("Analyze workspace/project health and generate enterprise-ready evidence").option("--workspace <path>","Workspace/root path to analyze").option("--json","Output as JSON").option("--output <file>","Write JSON report to a file").option("--strict","Treat warnings as blocking in the verdict").action(async t=>{try{let{runAnalyze:e,printAnalyzeReport:o}=await import('./analyze-5BU4QIPK.js'),r=await e({workspacePath:t.workspace,json:t.json===true,output:t.output,strict:t.strict===true});t.json?console.log(JSON.stringify(r,null,2)):o(r),r.summary.verdict==="blocked"&&process.exit(2);}catch(e){let o=e instanceof Error?e.message:String(e);t.json?console.log(JSON.stringify({schemaVersion:"rapidkit-analyze-error-v1",ok:false,error:{message:o}},null,2)):console.error(s.red(`Analyze failed: ${o}`)),process.exit(1);}});Ws(se);se.command("shell <action>").description("Shell helpers (activate virtualenv in current shell)").action(async t=>{t!=="activate"&&(console.log(s.red(`Unknown shell command: ${t}`)),process.exit(1));let e=process.cwd();function o(c){let d=c;for(;;){let m=p(d,"context.json").find(u=>P.existsSync(u));if(m)return m;let p$1=v.dirname(d);if(p$1===d)break;d=p$1;}return null}let r=o(e);function n$1(c){let d=c;for(;;){let m=v.join(d,".venv"),p=[v.join(d,".workspai","activate"),v.join(d,".rapidkit","activate")].find(f=>P.existsSync(f))??v.join(d,".workspai","activate");if(P.existsSync(p)||P.existsSync(m))return {venv:m,activateFile:p};let u=v.dirname(d);if(u===d)break;d=u;}return null}let i=n$1(e);!r&&!i&&(console.log(s.yellow("No Workspai project found in this directory")),process.exit(1));let a;i&&P.existsSync(i.activateFile)?a=i.activateFile:i&&P.existsSync(i.venv)?a=n(i.venv):(console.log(s.yellow("No virtual environment found")),process.exit(1));let l=b();console.log(l?`call "${a}"`:`. "${a}"`);});se.command("readiness").description("\u{1F6A6} Generate machine-readable release readiness summary (env + doctor + analyze + verify + dependency)").option("--json","Output readiness result in JSON format").option("--strict","Exit with code 1 unless overall readiness is pass").option("--skip-verify","Skip verify gate (use for workspaces without extension verify artifacts)").action(async t=>{await b$5({json:t.json,strict:t.strict,skipVerify:t.skipVerify});});se.command("pipeline").description("\u{1F517} Run governance pipeline: sync \u2192 doctor \u2192 analyze \u2192 readiness \u2192 autopilot (writes pipeline-last-run.json)").option("--json","Output pipeline report as JSON").option("--strict","Treat warnings as blocking and propagate non-zero exit codes").option("--skip-verify","Skip readiness verify gate").option("--skip-analyze","Skip analyze stage").option("--skip-autopilot","Skip autopilot release stage").option("--autopilot-mode <mode>","Autopilot mode when stage is enabled: audit | safe-fix | enforce","audit").option("--no-agent-sync","Skip cross-tool agent grounding sync after pipeline evidence write").option("--agent-sync","Force agent grounding sync after pipeline (default when report is written)").action(async t=>{let e=String(t.autopilotMode||"audit").trim().toLowerCase();["audit","safe-fix","enforce"].includes(e)||(console.log(s.red(`Invalid autopilot mode: ${t.autopilotMode}`)),process.exit(1));let{runPipelineCommand:o}=await import('./pipeline-QCUHFWDY.js');await o({json:t.json===true,strict:t.strict===true,skipVerify:t.skipVerify===true,skipAnalyze:t.skipAnalyze===true,skipAutopilot:t.skipAutopilot===true,autopilotMode:e,noAgentSync:t.noAgentSync===true,agentSync:t.agentSync===true?true:t.noAgentSync?false:void 0});});se.command("autopilot <action>").description("Run end-to-end release autopilot workflows").option("--mode <mode>","Autopilot mode: audit | safe-fix | enforce","audit").option("--json","Emit machine-readable JSON output").option("--output <file>","Write autopilot report to an additional output path").option("--since <ref>","Git ref for affected project selection (default: HEAD~1)").option("--parallel","Run workspace stage execution in parallel").option("--max-workers <count>","Maximum parallel workers").action(async(t,e)=>{t!=="release"&&(console.log(s.red(`Unknown autopilot action: ${t}`)),console.log(s.gray("Available: release")),process.exit(1));let o=String(e.mode||"audit").trim().toLowerCase();["audit","safe-fix","enforce"].includes(o)||(console.log(s.red(`Invalid autopilot mode: ${e.mode}`)),console.log(s.gray("Allowed modes: audit | safe-fix | enforce")),process.exit(1));let r=Number(e.maxWorkers??""),n=Number.isFinite(r)?Math.max(1,Math.trunc(r)):void 0,{runAutopilotRelease:i}=await import('./autopilot-release-QYUOVB26.js'),a;try{a=await i({workspacePath:process.cwd(),mode:o,since:e.since,parallel:e.parallel===true,maxWorkers:n,json:e.json===true,output:e.output});}catch(l){let c=l instanceof Error?l.message:String(l);console.log(s.red(`Autopilot release failed: ${c}`)),process.exit(3);}e.json&&console.log(JSON.stringify(a,null,2)),a.summary.exitCode!==0&&process.exit(a.summary.exitCode);});se.command("import <source>").description("Import a local backend project folder or clone a git repository into the current workspace").option("--workspace <path>","Workspace root path (defaults to nearest Workspai workspace)").option("--name <projectName>","Override imported project folder name").option("--enable-modules","Preserve Core module/template commands only when imported RapidKit metadata already supports them").option("--git","Force source to be treated as a git repository URL").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{let o=await Ed(t,e);o!==0&&process.exit(o);});se.command("adopt [source]").description("Adopt an existing local project into a Workspai workspace without moving or copying source").option("--workspace <path>","Workspace root path (defaults to nearest or managed default)").option("--name <projectName>","Override adopted project name").option("--enable-modules","Preserve Core module/template commands only when adopted RapidKit metadata already supports them").option("--dry-run","Preview adoption without writing project or registry metadata").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{let o=await _d(t,e);o!==0&&process.exit(o);});var cr=se.command("snapshot").description("Create, list, and restore Workspai workspace snapshots");cr.command("create [name]").description("Create a recoverable workspace snapshot").option("--workspace <path>","Workspace root path (defaults to nearest Workspai workspace)").option("--reason <text>","Reason recorded in the snapshot manifest").option("--include-projects","Include project source files in the snapshot").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let o=await Ot({workspacePath:e.workspace,name:t,reason:e.reason,includeProjects:e.includeProjects===true});if(e.json){console.log(JSON.stringify(o,null,2));return}console.log(s.green(`\u2714 Workspace snapshot created: ${o.manifest.name}`)),console.log(s.gray(` Mode: ${o.manifest.mode}`)),console.log(s.gray(` Path: ${o.snapshotPath}`));}catch(o){console.log(s.red(`\u274C Snapshot create failed: ${o.message}`)),process.exit(1);}});cr.command("list").description("List workspace snapshots").option("--workspace <path>","Workspace root path (defaults to nearest Workspai workspace)").option("--json","Emit machine-readable JSON output").action(async t=>{try{let e=await pi({workspacePath:t.workspace});if(t.json){console.log(JSON.stringify({snapshots:e},null,2));return}if(e.length===0){console.log(s.yellow("No workspace snapshots found."));return}for(let o of e)console.log(s.cyan(o.name)),console.log(s.gray(` ${o.createdAt} | ${o.mode} | ${o.projects.length} project(s)`)),console.log(s.gray(` ${o.snapshotPath}`));}catch(e){console.log(s.red(`\u274C Snapshot list failed: ${e.message}`)),process.exit(1);}});cr.command("inspect <name>").description("Inspect snapshot manifest and estimated payload size").option("--workspace <path>","Workspace root path (defaults to nearest Workspai workspace)").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let o=await di({workspacePath:e.workspace,name:t});if(e.json){console.log(JSON.stringify(o,null,2));return}console.log(s.cyan(`Snapshot: ${o.manifest.name}`)),console.log(s.gray(` Mode: ${o.manifest.mode}`)),console.log(s.gray(` Created: ${o.manifest.createdAt}`)),console.log(s.gray(` Projects: ${o.manifest.projects.length}`)),console.log(s.gray(` Files: ${o.estimatedFileCount}`)),console.log(s.gray(` Bytes: ${o.estimatedBytes}`)),console.log(s.gray(` Path: ${o.snapshotPath}`));}catch(o){console.log(s.red(`\u274C Snapshot inspect failed: ${o.message}`)),process.exit(1);}});cr.command("restore <name>").description("Restore a workspace snapshot").option("--workspace <path>","Workspace root path (defaults to nearest Workspai workspace)").option("--reason <text>","Reason recorded in the audit log").option("--dry-run","Show what would be restored without changing files").option("--force","Required to apply a restore").option("--no-safety-snapshot","Do not create a pre-restore metadata snapshot").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let o=await ui({workspacePath:e.workspace,name:t,reason:e.reason,dryRun:e.dryRun===true||process.argv.includes("--dry-run"),force:e.force===true,safetySnapshot:e.safetySnapshot});if(e.json){console.log(JSON.stringify(o,null,2));return}o.dryRun?console.log(s.cyan(`Snapshot restore dry-run: ${t}`)):console.log(s.green(`\u2714 Workspace snapshot restored: ${t}`)),console.log(s.gray(` Snapshot: ${o.snapshotPath}`)),console.log(s.gray(` Restored paths: ${o.restoredPaths.join(", ")}`)),o.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${o.safetySnapshotPath}`));}catch(o){console.log(s.red(`\u274C Snapshot restore failed: ${o.message}`)),process.exit(1);}});var co=se.command("project").description("Safe workspace project lifecycle operations");co.command("commands").description("Show effective commands supported by the current Workspai project").option("--json","Emit machine-readable JSON output").action(async t=>{Aa({json:t.json});});co.command("archives").description("List archived workspace projects").option("--workspace <path>","Workspace root path (defaults to nearest Workspai workspace)").option("--json","Emit machine-readable JSON output").action(async t=>{try{let e=await Vr({workspacePath:t.workspace});if(t.json){console.log(JSON.stringify({archives:e},null,2));return}if(e.length===0){console.log(s.yellow("No archived projects found."));return}for(let o of e)console.log(s.cyan(o.projectName)),console.log(s.gray(` Archived: ${o.archivedAt}`)),console.log(s.gray(` Path: ${o.archivePath}`)),o.reason&&console.log(s.gray(` Reason: ${o.reason}`));}catch(e){console.log(s.red(`\u274C Project archive list failed: ${e.message}`)),process.exit(1);}});co.command("archive <project>").description("Move a project into .workspai/archive with a safety snapshot").option("--workspace <path>","Workspace root path (defaults to nearest Workspai workspace)").option("--reason <text>","Reason recorded in the archive manifest").option("--dry-run","Show what would be archived without changing files").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let o=await Br({workspacePath:e.workspace,project:t,reason:e.reason,dryRun:e.dryRun===true||process.argv.includes("--dry-run")});if(e.json){console.log(JSON.stringify(o,null,2));return}console.log(o.dryRun?s.cyan(`Project archive dry-run: ${o.projectName}`):s.green(`\u2714 Project archived: ${o.projectName}`)),console.log(s.gray(` From: ${o.projectPath}`)),o.archivePath&&console.log(s.gray(` To: ${o.archivePath}`)),o.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${o.safetySnapshotPath}`));}catch(o){console.log(s.red(`\u274C Project archive failed: ${o.message}`)),process.exit(1);}});co.command("restore <archive>").description("Restore an archived project back into the workspace").option("--workspace <path>","Workspace root path (defaults to nearest Workspai workspace)").option("--name <projectName>","Restore using a new project folder name").option("--reason <text>","Reason recorded in the audit log").option("--force","Overwrite an existing restore target").option("--dry-run","Show what would be restored without changing files").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let o=await yi({workspacePath:e.workspace,archive:t,targetName:e.name,reason:e.reason,force:e.force===true,dryRun:e.dryRun===true});if(e.json){console.log(JSON.stringify(o,null,2));return}console.log(o.dryRun?s.cyan(`Project restore dry-run: ${o.projectName}`):s.green(`\u2714 Project restored: ${o.projectName}`)),console.log(s.gray(` From: ${o.archivePath}`)),console.log(s.gray(` To: ${o.projectPath}`)),o.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${o.safetySnapshotPath}`));}catch(o){console.log(s.red(`\u274C Project restore failed: ${o.message}`)),process.exit(1);}});co.command("delete <project>").description("Archive by default; permanently delete only with --permanent and exact --confirm").option("--workspace <path>","Workspace root path (defaults to nearest Workspai workspace)").option("--reason <text>","Reason recorded in the safety snapshot/archive manifest").option("--permanent","Permanently delete the project directory").option("--confirm <projectName>","Required exact project name for --permanent").option("--dry-run","Show what would be deleted without changing files").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let o=await hi({workspacePath:e.workspace,project:t,reason:e.reason,permanent:e.permanent===true,confirm:e.confirm,dryRun:e.dryRun===true||process.argv.includes("--dry-run")});if(e.json){console.log(JSON.stringify(o,null,2));return}let r=o.action==="archive"?"archived":"deleted";console.log(o.dryRun?s.cyan(`Project ${r} dry-run: ${o.projectName}`):s.green(`\u2714 Project ${r}: ${o.projectName}`)),console.log(s.gray(` Path: ${o.projectPath}`)),o.archivePath&&console.log(s.gray(` Archive: ${o.archivePath}`)),o.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${o.safetySnapshotPath}`));}catch(o){console.log(s.red(`\u274C Project delete failed: ${o.message}`)),process.exit(1);}});se.command("doctor [scope]").description("\u{1FA7A} Check Workspai system health by default; use workspace or project for scoped checks").option("--workspace [path]","Check entire workspace, optionally from an explicit workspace path").option("--project","Check only the current project (or nearest parent project)").option("--json","Output results in JSON format (for CI/CD pipelines)").option("--strict","Exit 1 on health errors or warnings (workspace/project scope)").option("--ci","CI gate: exit 1 on errors, exit 2 on warnings only").option("--profile <profile>","Doctor policy profile: local | ci | release | enterprise-strict").option("--fix","Automatically fix common issues (with confirmation)").option("--plan","Generate remediation plan without applying changes").option("--apply","Apply remediation plan non-interactively").action(async(t,e)=>{t&&t!=="workspace"&&t!=="project"&&(console.log(s.red(`Unknown doctor scope: ${t}`)),console.log(s.gray("Available: workspace, project")),console.log(s.gray("Usage: npx workspai doctor | npx workspai doctor workspace | npx workspai doctor project")),process.exit(1)),e.plan&&(e.fix||e.apply)&&(console.log(s.red("Invalid doctor flags: --plan cannot be combined with --fix or --apply")),process.exit(1));let o=new Set(["local","ci","release","enterprise-strict"]);e.profile&&!o.has(e.profile)&&(console.log(s.red(`Invalid doctor profile: ${e.profile}. Use local, ci, release, or enterprise-strict.`)),process.exit(1));let r=await kd({scope:t,workspaceFlag:e.workspace});r.detected&&!e.json&&(console.log(s.yellow("\u26A0\uFE0F Local launcher shadow detected for doctor workspace checks.")),r.candidatePath&&console.log(s.gray(` Candidate: ${r.candidatePath}`)),console.log(s.gray(" Running npm-wrapper doctor workflow directly as safe fallback to avoid ambiguous rapidkit binary resolution.")),console.log(s.gray(" If this happens in a shell call, run: npx --yes --package workspai workspai doctor workspace")));let{runDoctor:n}=await import('./doctor-MF3M3FS3.js'),i=await n({...e,workspace:e.workspace||t==="workspace",project:e.project||t==="project",strict:e.strict===true,ci:e.ci===true,profile:e.profile});i!==0&&process.exit(i);});se.command("workspace <action> [subaction] [key] [value]").description(`Manage Workspai workspaces (list, sync, policy, share, export, run, intelligence)
391
+ \u274C An unexpected error occurred:`),console.error(o)),process.exit(1);}finally{yt=null;}});Pi(ne);Ei(ne);aa(ne);ne.command("commands").description("Show effective Workspai command ownership and runtime support").option("--json","Emit machine-readable JSON output").action(async t=>{rd({json:t.json});});ne.command("analyze").description("Analyze workspace/project health and generate enterprise-ready evidence").option("--workspace <path>","Workspace/root path to analyze").option("--json","Output as JSON").option("--output <file>","Write JSON report to a file").option("--strict","Treat warnings as blocking in the verdict").action(async t=>{try{let{runAnalyze:e,printAnalyzeReport:o}=await import('./analyze-6OCBM4ID.js'),r=await e({workspacePath:t.workspace,json:t.json===true,output:t.output,strict:t.strict===true});t.json?console.log(JSON.stringify(r,null,2)):o(r),r.summary.verdict==="blocked"&&process.exit(2);}catch(e){let o=e instanceof Error?e.message:String(e);t.json?console.log(JSON.stringify(c$2({operation:"analyze",code:"analyze.failed",message:o}),null,2)):console.error(s.red(`Analyze failed: ${o}`)),process.exit(1);}});ri(ne);ne.command("shell <action>").description("Shell helpers (activate virtualenv in current shell)").action(async t=>{t!=="activate"&&(console.log(s.red(`Unknown shell command: ${t}`)),process.exit(1));let e=process.cwd();function o(l){let p$1=l;for(;;){let f=p(p$1,"context.json").find(w=>S.existsSync(w));if(f)return f;let d=C.dirname(p$1);if(d===p$1)break;p$1=d;}return null}let r=o(e);function n$1(l){let p=l;for(;;){let f=C.join(p,".venv"),d=[C.join(p,".workspai","activate"),C.join(p,".rapidkit","activate")].find(h=>S.existsSync(h))??C.join(p,".workspai","activate");if(S.existsSync(d)||S.existsSync(f))return {venv:f,activateFile:d};let w=C.dirname(p);if(w===p)break;p=w;}return null}let i=n$1(e);!r&&!i&&(console.log(s.yellow("No Workspai project found in this directory")),process.exit(1));let a;i&&S.existsSync(i.activateFile)?a=i.activateFile:i&&S.existsSync(i.venv)?a=n(i.venv):(console.log(s.yellow("No virtual environment found")),process.exit(1));let c=b();console.log(c?`call "${a}"`:`. "${a}"`);});ne.command(d$2.readiness).description("\u{1F6A6} Generate machine-readable release readiness summary (env + doctor + analyze + verify + dependency)").option("--workspace <path>","Workspace root to evaluate instead of the current directory").option("--json","Output readiness result in JSON format").option("--strict","Exit with code 1 unless overall readiness is pass").option("--skip-verify","Skip verify gate (use for workspaces without extension verify artifacts)").action(async t=>{await e$1({workspace:t.workspace,json:t.json,strict:t.strict,skipVerify:t.skipVerify});});ne.command("pipeline").description("\u{1F517} Run governance pipeline: sync \u2192 doctor \u2192 analyze \u2192 readiness \u2192 autopilot (writes pipeline-last-run.json)").option("--json","Output pipeline report as JSON").option("--strict","Treat warnings as blocking and propagate non-zero exit codes").option("--skip-verify","Skip readiness verify gate").option("--skip-analyze","Skip analyze stage").option("--skip-autopilot","Skip autopilot release stage").option("--autopilot-mode <mode>","Autopilot mode when stage is enabled: audit | safe-fix | enforce","audit").option("--no-agent-sync","Skip cross-tool agent grounding sync after pipeline evidence write").option("--agent-sync","Force agent grounding sync after pipeline (default when report is written)").action(async t=>{let e=String(t.autopilotMode||"audit").trim().toLowerCase();["audit","safe-fix","enforce"].includes(e)||(console.log(s.red(`Invalid autopilot mode: ${t.autopilotMode}`)),process.exit(1));let{runPipelineCommand:o}=await import('./pipeline-ND734AJM.js');await o({json:t.json===true,strict:t.strict===true,skipVerify:t.skipVerify===true,skipAnalyze:t.skipAnalyze===true,skipAutopilot:t.skipAutopilot===true,autopilotMode:e,noAgentSync:t.agentSync===false,agentSync:t.agentSync});});ne.command("autopilot <action>").description("Run end-to-end release autopilot workflows").option("--mode <mode>","Autopilot mode: audit | safe-fix | enforce","audit").option("--json","Emit machine-readable JSON output").option("--output <file>","Write autopilot report to an additional output path").option("--since <ref>","Git ref for affected project selection (default: HEAD~1)").option("--parallel","Run workspace stage execution in parallel").option("--max-workers <count>","Maximum parallel workers").action(async(t,e)=>{t!=="release"&&(console.log(s.red(`Unknown autopilot action: ${t}`)),console.log(s.gray("Available: release")),process.exit(1));let o=String(e.mode||"audit").trim().toLowerCase();["audit","safe-fix","enforce"].includes(o)||(console.log(s.red(`Invalid autopilot mode: ${e.mode}`)),console.log(s.gray("Allowed modes: audit | safe-fix | enforce")),process.exit(1));let r=Nn({raw:e.maxWorkers,operation:"autopilot release",json:e.json===true}),{runAutopilotRelease:n}=await import('./autopilot-release-LI2WJCEW.js'),i;try{i=await n({workspacePath:process.cwd(),mode:o,since:e.since,parallel:e.parallel===true,maxWorkers:r,json:e.json===true,output:e.output});}catch(a){let c=a instanceof Error?a.message:String(a);console.log(s.red(`Autopilot release failed: ${c}`)),process.exit(3);}e.json&&console.log(JSON.stringify(i,null,2)),i.summary.exitCode!==0&&process.exit(i.summary.exitCode);});ne.command("import <source>").description("Import a local project folder or clone a git repository into the current workspace").option("--workspace <path>","Workspace root path (defaults to nearest Workspai workspace)").option("--name <projectName>","Override imported project folder name").option("--enable-modules","Preserve Core module/template commands only when imported RapidKit metadata already supports them").option("--git","Force source to be treated as a git repository URL").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{let o=await md(t,e);o!==0&&process.exit(o);});ne.command("adopt [source]").description("Adopt an existing local project into a Workspai workspace without moving or copying source").option("--workspace <path>","Workspace root path (defaults to nearest or managed default)").option("--name <projectName>","Override adopted project name").option("--enable-modules","Preserve Core module/template commands only when adopted RapidKit metadata already supports them").option("--dry-run","Preview adoption without writing project or registry metadata").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{let o=await fd(t,{...e,dryRun:e.dryRun===true||process.argv.includes("--dry-run"),enableModules:e.enableModules===true||process.argv.includes("--enable-modules")});o!==0&&process.exit(o);});var Sr=ne.command("snapshot").description("Create, list, and restore Workspai workspace snapshots");Sr.command("create [name]").description("Create a recoverable workspace snapshot").option("--workspace <path>","Workspace root path (defaults to nearest Workspai workspace)").option("--reason <text>","Reason recorded in the snapshot manifest").option("--include-projects","Include project source files in the snapshot").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let o=await rr({workspacePath:e.workspace,name:t,reason:e.reason,includeProjects:e.includeProjects===true});if(e.json){console.log(JSON.stringify(o,null,2));return}console.log(s.green(`\u2714 Workspace snapshot created: ${o.manifest.name}`)),console.log(s.gray(` Mode: ${o.manifest.mode}`)),console.log(s.gray(` Path: ${o.snapshotPath}`));}catch(o){console.log(s.red(`\u274C Snapshot create failed: ${o.message}`)),process.exit(1);}});Sr.command("list").description("List workspace snapshots").option("--workspace <path>","Workspace root path (defaults to nearest Workspai workspace)").option("--json","Emit machine-readable JSON output").action(async t=>{try{let e=await Ti({workspacePath:t.workspace});if(t.json){console.log(JSON.stringify({snapshots:e},null,2));return}if(e.length===0){console.log(s.yellow("No workspace snapshots found."));return}for(let o of e)console.log(s.cyan(o.name)),console.log(s.gray(` ${o.createdAt} | ${o.mode} | ${o.projects.length} project(s)`)),console.log(s.gray(` ${o.snapshotPath}`));}catch(e){console.log(s.red(`\u274C Snapshot list failed: ${e.message}`)),process.exit(1);}});Sr.command("inspect <name>").description("Inspect snapshot manifest and estimated payload size").option("--workspace <path>","Workspace root path (defaults to nearest Workspai workspace)").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let o=await Mi({workspacePath:e.workspace,name:t});if(e.json){console.log(JSON.stringify(o,null,2));return}console.log(s.cyan(`Snapshot: ${o.manifest.name}`)),console.log(s.gray(` Mode: ${o.manifest.mode}`)),console.log(s.gray(` Created: ${o.manifest.createdAt}`)),console.log(s.gray(` Projects: ${o.manifest.projects.length}`)),console.log(s.gray(` Files: ${o.estimatedFileCount}`)),console.log(s.gray(` Bytes: ${o.estimatedBytes}`)),console.log(s.gray(` Path: ${o.snapshotPath}`));}catch(o){console.log(s.red(`\u274C Snapshot inspect failed: ${o.message}`)),process.exit(1);}});Sr.command("restore <name>").description("Restore a workspace snapshot").option("--workspace <path>","Workspace root path (defaults to nearest Workspai workspace)").option("--reason <text>","Reason recorded in the audit log").option("--dry-run","Show what would be restored without changing files").option("--force","Required to apply a restore").option("--no-safety-snapshot","Do not create a pre-restore metadata snapshot").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let o=await Di({workspacePath:e.workspace,name:t,reason:e.reason,dryRun:e.dryRun===true||process.argv.includes("--dry-run"),force:e.force===true,safetySnapshot:e.safetySnapshot});if(e.json){console.log(JSON.stringify(o,null,2));return}o.dryRun?console.log(s.cyan(`Snapshot restore dry-run: ${t}`)):console.log(s.green(`\u2714 Workspace snapshot restored: ${t}`)),console.log(s.gray(` Snapshot: ${o.snapshotPath}`)),console.log(s.gray(` Restored paths: ${o.restoredPaths.join(", ")}`)),o.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${o.safetySnapshotPath}`));}catch(o){console.log(s.red(`\u274C Snapshot restore failed: ${o.message}`)),process.exit(1);}});var bo=ne.command("project").description("Safe workspace project lifecycle operations");bo.command("commands").description("Show effective commands supported by the current Workspai project").option("--json","Emit machine-readable JSON output").action(async t=>{lc({json:t.json});});bo.command("archives").description("List archived workspace projects").option("--workspace <path>","Workspace root path (defaults to nearest Workspai workspace)").option("--json","Emit machine-readable JSON output").action(async t=>{try{let e=await an({workspacePath:t.workspace});if(t.json){console.log(JSON.stringify({archives:e},null,2));return}if(e.length===0){console.log(s.yellow("No archived projects found."));return}for(let o of e)console.log(s.cyan(o.projectName)),console.log(s.gray(` Archived: ${o.archivedAt}`)),console.log(s.gray(` Path: ${o.archivePath}`)),o.reason&&console.log(s.gray(` Reason: ${o.reason}`));}catch(e){console.log(s.red(`\u274C Project archive list failed: ${e.message}`)),process.exit(1);}});bo.command("archive <project>").description("Move a project into .workspai/archive with a safety snapshot").option("--workspace <path>","Workspace root path (defaults to nearest Workspai workspace)").option("--reason <text>","Reason recorded in the archive manifest").option("--dry-run","Show what would be archived without changing files").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let o=await cn({workspacePath:e.workspace,project:t,reason:e.reason,dryRun:e.dryRun===true||process.argv.includes("--dry-run")});if(e.json){console.log(JSON.stringify(o,null,2));return}console.log(o.dryRun?s.cyan(`Project archive dry-run: ${o.projectName}`):s.green(`\u2714 Project archived: ${o.projectName}`)),console.log(s.gray(` From: ${o.projectPath}`)),o.archivePath&&console.log(s.gray(` To: ${o.archivePath}`)),o.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${o.safetySnapshotPath}`));}catch(o){let r=o.message;e.json?console.log(JSON.stringify(c$2({operation:"project archive",code:"project.archive.failed",message:r}),null,2)):console.log(s.red(`\u274C Project archive failed: ${r}`)),process.exit(1);}});bo.command("restore <archive>").description("Restore an archived project back into the workspace").option("--workspace <path>","Workspace root path (defaults to nearest Workspai workspace)").option("--name <projectName>","Restore using a new project folder name").option("--reason <text>","Reason recorded in the audit log").option("--force","Overwrite an existing restore target").option("--dry-run","Show what would be restored without changing files").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let o=await Gi({workspacePath:e.workspace,archive:t,targetName:e.name,reason:e.reason,force:e.force===true,dryRun:e.dryRun===true||process.argv.includes("--dry-run")});if(e.json){console.log(JSON.stringify(o,null,2));return}console.log(o.dryRun?s.cyan(`Project restore dry-run: ${o.projectName}`):s.green(`\u2714 Project restored: ${o.projectName}`)),console.log(s.gray(` From: ${o.archivePath}`)),console.log(s.gray(` To: ${o.projectPath}`)),o.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${o.safetySnapshotPath}`));}catch(o){let r=o.message;e.json?console.log(JSON.stringify(c$2({operation:"project restore",code:"project.restore.failed",message:r}),null,2)):console.log(s.red(`\u274C Project restore failed: ${r}`)),process.exit(1);}});bo.command("delete <project>").description("Archive by default; permanently delete only with --permanent and exact --confirm").option("--workspace <path>","Workspace root path (defaults to nearest Workspai workspace)").option("--reason <text>","Reason recorded in the safety snapshot/archive manifest").option("--permanent","Permanently delete the project directory").option("--confirm <projectName>","Required exact project name for --permanent").option("--dry-run","Show what would be deleted without changing files").option("--json","Emit machine-readable JSON output").action(async(t,e)=>{try{let o=await Vi({workspacePath:e.workspace,project:t,reason:e.reason,permanent:e.permanent===true,confirm:e.confirm,dryRun:e.dryRun===true||process.argv.includes("--dry-run")});if(e.json){console.log(JSON.stringify(o,null,2));return}let r=o.action==="archive"?"archived":"deleted";console.log(o.dryRun?s.cyan(`Project ${r} dry-run: ${o.projectName}`):s.green(`\u2714 Project ${r}: ${o.projectName}`)),console.log(s.gray(` Path: ${o.projectPath}`)),o.archivePath&&console.log(s.gray(` Archive: ${o.archivePath}`)),o.safetySnapshotPath&&console.log(s.gray(` Safety snapshot: ${o.safetySnapshotPath}`));}catch(o){let r=o.message;e.json?console.log(JSON.stringify(c$2({operation:"project delete",code:"project.delete.failed",message:r}),null,2)):console.log(s.red(`\u274C Project delete failed: ${r}`)),process.exit(1);}});ne.command(d$2.doctor).description("\u{1FA7A} Check Workspai system health by default; use workspace or project for scoped checks").option("--workspace [path]","Check entire workspace, optionally from an explicit workspace path").option("--project","Check only the current project (or nearest parent project)").option("--json","Output results in JSON format (for CI/CD pipelines)").option("--strict","Exit 1 on health errors or warnings (workspace/project scope)").option("--ci","CI gate: exit 1 on errors, exit 2 on warnings only").option("--profile <profile>","Doctor policy profile: local | ci | release | enterprise-strict").option("--fix","Automatically fix common issues (with confirmation)").option("--plan","Generate remediation plan without applying changes").option("--apply","Apply remediation plan non-interactively").action(async(t,e)=>{t&&t!=="workspace"&&t!=="project"&&(console.log(s.red(`Unknown doctor scope: ${t}`)),console.log(s.gray("Available: workspace, project")),console.log(s.gray("Usage: npx workspai doctor | npx workspai doctor workspace | npx workspai doctor project")),process.exit(1)),e.plan&&(e.fix||e.apply)&&(console.log(s.red("Invalid doctor flags: --plan cannot be combined with --fix or --apply")),process.exit(1));let o=new Set(["local","ci","release","enterprise-strict"]);e.profile&&!o.has(e.profile)&&(console.log(s.red(`Invalid doctor profile: ${e.profile}. Use local, ci, release, or enterprise-strict.`)),process.exit(1));let r=await nd({scope:t,workspaceFlag:e.workspace});r.detected&&!e.json&&(console.log(s.yellow("\u26A0\uFE0F Local launcher shadow detected for doctor workspace checks.")),r.candidatePath&&console.log(s.gray(` Candidate: ${r.candidatePath}`)),console.log(s.gray(" Running npm-wrapper doctor workflow directly as safe fallback to avoid ambiguous rapidkit binary resolution.")),console.log(s.gray(" If this happens in a shell call, run: npx --yes --package workspai workspai doctor workspace")));let{runDoctor:n}=await import('./doctor-PVSWDBJL.js'),i=await n({...e,workspace:e.workspace||t==="workspace",project:e.project||t==="project",strict:e.strict===true,ci:e.ci===true,profile:e.profile});i!==0&&process.exit(i);});ne.command(d$2.workspace).description(`Manage Workspai workspaces (list, sync, policy, share, export, run, intelligence)
356
392
  workspace run <stage> \u2014 fleet stage execution across discovered projects
357
393
  stages: init | test | build | start | <custom-from-context>
358
394
  workspace explain|why \u2014 blocker/project narrative (--write for artifact)
359
395
  workspace trace \u2014 diff \u2192 blast radius \u2192 gates narrative (--from <diff>)
360
- workspace mcp serve \u2014 read-mostly stdio MCP bridge over workspace evidence`).option("--workspace <path>","Workspace root path (defaults to nearest Workspai workspace)").option("--output <file>","Output file path for workspace share bundle").option("--from <file>","Input workspace model snapshot/report for workspace diff").option("--from-impact <file>","Input workspace impact report for workspace verify (defaults to last-run impact)").option("--include-paths","Include absolute paths in workspace share bundle").option("--write","Write workspace intelligence artifact to .workspai/reports").option("--include-evidence","Read status metadata from referenced evidence reports").option("--scan-depth <count>","Observable project discovery depth for large monorepos").option("--cache","Reuse cached workspace model when inputs are unchanged (keyed by inputsHash)").option("--incremental","Rebuild only changed projects and re-infer only their incident graph edges (graph-aware)").option("--once","For workspace watch: do the initial in-memory build and exit (no watcher)").option("--for-agent [agent]","Build an agent-ready workspace context pack").option("--agent-sync","After --write on context, sync cross-tool agent grounding files (AGENTS.md, Copilot, Cursor, Claude)").option("--no-agent-sync","Skip automatic agent grounding sync after context --write").option("--target <targets>","Agent customization targets for agent-sync (all|vscode|agents,copilot,cursor,claude,codex,orca)").option("--preset <preset>","Agent customization pack preset for agent-sync (minimal|enterprise)").option("--refresh-context","Rebuild workspace-context-agent.json during agent-sync").option("--experimental-hooks","Generate advisory VS Code agent hook design files during enterprise agent-sync").option("--hydrate-prompts","Hydrate matching Copilot prompt files with workspace-specific verification steps during agent-sync").option("--scope <scope>","Scope workspace intelligence output, e.g. project:<name>").option("--no-doctor","Exclude doctor evidence in workspace share bundle").option("--no-blueprint","Exclude reproducibility blueprint from workspace share bundle").option("--include-env","Include .env/private key files in workspace export archive").option("--force","Overwrite an existing hydrate output directory").option("--refresh","Publish workspace registry summary before reading status").option("--dry-run","Preview hydrate without writing files").option("--affected","Run only affected projects (requires git diff context)").option("--blast-radius","Include downstream dependents from workspace dependency graph").option("--since <ref>","Git ref for affected calculation (default: HEAD~1)").option("--parallel","Run project stages in parallel").option("--max-workers <count>","Maximum parallel workers (default: min(4, selected))").option("--continue-on-error","Continue running remaining projects after a failure").option("--reuse-passed","Skip projects that already passed this stage in workspace-run-last.json").option("--json","Emit machine-readable JSON output").option("--ci","Build CI-oriented command plans where supported").option("--strict","Return non-zero exit on warn/fail gate outcomes").option("--no-gates","Skip doctor/readiness pre-run gates").action(async function(t,e,o,r){let n=this.opts(),i=c=>{let m=(n.workspace?v.resolve(n.workspace):null)??a$5(process.cwd())??oe(process.cwd());(!m||!Ue(m))&&(console.log(s.red("\u274C Not inside a Workspai workspace")),console.log(s.gray("\u{1F4A1} Run from a workspace directory or pass --workspace <path>.")),process.exit(1));let p=v.resolve(process.cwd()),u=v.resolve(m);return p!==u&&!n.json&&console.log(s.gray(`\u2139 Using workspace root ${m} for "${c}" (current directory: ${p}).`)),m},a=c=>process.argv.includes(c),l=()=>{if(!n.scanDepth)return;let c=Number.parseInt(n.scanDepth,10);return Number.isFinite(c)?c:void 0};if((Li(t)||t==="trace"||t==="feedback"||t==="mcp")&&d$2({action:t,status:"started",message:`workspace ${t} started`,metadata:{json:n.json===true||a("--json"),strict:n.strict===true||a("--strict")}}),t==="list"){let{listWorkspaces:c}=await import('./workspace-PR6VZRBG.js');await c({json:n.json===true||a("--json")});}else if(t==="model"){let c=i("model"),{buildWorkspaceModelCached:d,buildWorkspaceModelIncremental:m,writeWorkspaceModel:p}=await import('./workspace-model-PNXXOGPO.js'),u=n.incremental===true||a("--incremental"),f=n.cache===true||a("--cache")||u,g={workspacePath:c,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:l(),strict:n.strict===true||a("--strict")},h,k;if(u){let y=await m(g);h=y.model,k=y.mode;}else {let y=await d({...g,cache:f});h=y.model,k=y.cache;}let b;(n.write===true||a("--write"))&&(b=await p(h,c));let w=(n.strict===true||a("--strict"))&&h.validation?.status!=="passed";if(n.json){console.log(JSON.stringify({...h,...b?{outputPath:b}:{}},null,2)),w&&process.exit(1);return}console.log(s.green(`\u2714 Workspace model: ${h.workspace.name}`)),u?console.log(s.gray(` Build: ${k} (incremental)`)):f&&console.log(s.gray(` Cache: ${k}`)),console.log(s.gray(` Projects: ${h.summary.projectCount}`)),console.log(s.gray(` Runtimes: ${h.summary.runtimes.join(", ")||"none"}`)),console.log(s.gray(` Frameworks: ${h.summary.frameworks.join(", ")||"none"}`)),console.log(s.gray(` Workspace type: ${h.identity.workspaceType}`)),console.log(s.gray(` Validation: ${h.validation?.status??"unknown"} (${h.validation?.errors??0} error, ${h.validation?.warnings??0} warning)`)),console.log(b?s.gray(` Written: ${b}`):s.gray(" Add --write to persist .workspai/reports/workspace-model.json")),w&&process.exit(1);}else if(t==="agent-sync"){let c=i("agent-sync"),{syncWorkspaceAgentGrounding:d,parseAgentGroundingTargets:m}=await import('./workspace-agent-sync-KTYF3HQR.js'),p=n.strict===true||a("--strict"),u=n.write===true||a("--write"),f=a("--dry-run"),g=await d({workspacePath:c,scope:n.scope,agent:n.forAgent,write:u&&!f,dryRun:f,strict:p,preset:n.preset==="minimal"?"minimal":"enterprise",refreshContext:n.refreshContext===true||a("--refresh-context")||a("--refresh"),targets:m(n.target),experimentalHooks:n.experimentalHooks===true||a("--experimental-hooks"),hydratePrompts:n.hydratePrompts===true||a("--hydrate-prompts"),staleAfterHours:24});if(n.json)console.log(JSON.stringify(g,null,2));else {console.log(s.green(`\u2714 Agent grounding ${u&&!f?"synced":"planned"}`)),console.log(s.gray(` Index: ${g.indexPath}`)),g.contextPath&&console.log(s.gray(` Context: ${g.contextPath}`)),g.blockers.length>0&&console.log(s.yellow(` Blockers: ${g.blockers.slice(0,3).join(" \xB7 ")}`));let h=u&&!f?g.writtenFiles:g.skippedFiles;if(h.length>0&&console.log(s.gray(` Files: ${h.join(", ")}`)),g.strictViolations.length>0)for(let k of g.strictViolations)console.log(s.red(`\u274C ${k}`));}p&&g.strictViolations.length>0&&process.exit(1);}else if(t==="remediation-plan"){let c=i("remediation-plan"),{buildArtifactRemediationPlan:d,writeArtifactRemediationPlan:m}=await import('./artifact-remediation-plan-5GJWPPRS.js'),p=await d({workspacePath:c,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),ciMode:n.ci===true||a("--ci")}),u;if((n.write===true||a("--write"))&&(u=await m(p,c)),n.json===true||a("--json")){console.log(JSON.stringify({...p,...u?{outputPath:u}:{}},null,2));return}console.log(s.green(`\u2714 Artifact remediation plan: ${p.workspace.name}`)),console.log(s.gray(` Artifacts scanned: ${p.summary.artifactsScanned}`)),console.log(s.gray(` Cards covered: ${p.summary.cardsCovered}`)),console.log(s.gray(` CI mode: ${p.source.ciMode?"yes":"no"}`)),console.log(s.gray(` Actions: ${p.summary.totalActions}`)),console.log(s.gray(` Risk: safe=${p.summary.risk.safe}, guarded=${p.summary.risk.guarded}, invasive=${p.summary.risk.invasive}`));for(let f of p.actions.slice(0,8))console.log(s.gray(` \u2022 ${f.cardId}: ${f.title} (${f.mode}, ${f.risk})`));p.actions.length>8&&console.log(s.gray(` \u2026 ${p.actions.length-8} more action(s)`)),console.log(u?s.gray(` Written: ${u}`):s.gray(" Add --write to persist .workspai/reports/artifact-remediation-plan-last-run.json"));}else if(t==="context"){let c=i("context");n.forAgent!==true&&typeof n.forAgent!="string"&&e!=="agent"&&(console.log(s.red("\u274C workspace context currently requires --for-agent")),console.log(s.gray(" npx workspai workspace context --for-agent --json [--scope project:<name>]")),process.exit(1));let{buildWorkspaceAgentContext:d,writeWorkspaceAgentContext:m}=await import('./workspace-context-QUTOP2XV.js'),p=n.strict===true||a("--strict"),u=await d({workspacePath:c,agent:n.forAgent||o||e,scope:n.scope,includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:l(),strict:false}),f,g;if((n.write===true||a("--write"))&&(f=await m(u,c),(n.agentSync===true||a("--agent-sync")||n.noAgentSync!==true)&&!a("--no-agent-sync"))){let{syncWorkspaceAgentGrounding:b,parseAgentGroundingTargets:w}=await import('./workspace-agent-sync-KTYF3HQR.js');if(g=await b({workspacePath:c,scope:n.scope,agent:u.agent,write:true,refreshContext:false,strict:p,preset:n.preset==="minimal"?"minimal":"enterprise",targets:w(n.target)}),n.json||console.log(s.gray(` Agent grounding synced: ${g.writtenFiles.length} file(s) updated`)),p&&g.strictViolations.length>0){for(let y of g.strictViolations)console.log(s.red(`\u274C ${y}`));process.exit(1);}}let h=p&&u.validation.status!=="passed";if(n.json){console.log(JSON.stringify({...u,...f?{outputPath:f}:{},...g?{agentGroundingSync:g}:{}},null,2)),h&&process.exit(1);return}if(console.log(s.green(`\u2714 Workspace context: ${u.workspace.name}`)),console.log(s.gray(` Agent: ${u.agent}`)),console.log(s.gray(` Scope: ${u.scope.activeProject??u.scope.requested}`)),console.log(s.gray(` Projects included: ${u.projects.length}`)),console.log(s.gray(` Safe commands: ${u.safeCommands.length}`)),console.log(s.gray(` Validation: ${u.validation.status} (${u.validation.errors} error, ${u.validation.warnings} warning)`)),console.log(f?s.gray(` Written: ${f}`):s.gray(" Add --write to persist .workspai/reports/workspace-context-agent.json")),h){for(let k of u.validation.issues)console.log(s.red(`\u274C ${k.severity}:${k.code}:${k.target}`));process.exit(1);}}else if(t==="snapshot"){let c=i("snapshot"),{buildWorkspaceModelSnapshot:d,writeWorkspaceModelSnapshot:m}=await import('./workspace-intelligence-QJGVL37U.js'),p=await d({workspacePath:c,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:l()}),u=await m(p,c);if(n.json){console.log(JSON.stringify({...p,outputPath:u},null,2));return}console.log(s.green(`\u2714 Workspace model snapshot: ${p.model.workspace.name}`)),console.log(s.gray(` Hash: ${p.modelHash}`)),console.log(s.gray(` Projects: ${p.model.summary.projectCount}`)),console.log(s.gray(` Workspace type: ${p.model.identity.workspaceType}`)),console.log(s.gray(` Written: ${u}`));}else if(t==="diff"){let c=i("diff"),d=n.from||e;d||((n.json===true||a("--json"))&&(console.log(JSON.stringify({schemaVersion:"workspace-diff-error-v1",command:"workspace diff",status:"error",workspacePath:c,error:{code:"workspace.diff.from.required",message:"workspace diff requires --from <snapshot-or-model-report|git[:ref]>."},examples:["npx workspai workspace diff --from .workspai/reports/workspace-model-snapshot.json --json","npx workspai workspace diff --from .workspai/reports/workspace-model.json --json","npx workspai workspace diff --from git --json"]},null,2)),process.exit(1)),console.log(s.red("\u274C workspace diff requires --from <snapshot-or-model-report|git[:ref]>")),console.log(s.gray(" npx workspai workspace diff --from .workspai/reports/workspace-model-snapshot.json --json")),console.log(s.gray(" npx workspai workspace diff --from .workspai/reports/workspace-model.json --json")),console.log(s.gray(" npx workspai workspace impact --from .workspai/reports/workspace-model-diff-last-run.json --json")),console.log(s.gray(" npx workspai workspace diff --from git --json (uses snapshot baseline + git working tree)")),process.exit(1));let{diffWorkspaceModel:m,writeWorkspaceModelDiff:p}=await import('./workspace-intelligence-QJGVL37U.js'),u;try{u=await m({workspacePath:c,fromPath:d,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:l()});}catch(h){throw (n.json===true||a("--json"))&&(console.log(JSON.stringify({schemaVersion:"workspace-diff-error-v1",command:"workspace diff",status:"error",workspacePath:c,fromPath:d,error:{code:"workspace.diff.input_unreadable",message:h.message},nextActions:["npx workspai workspace snapshot create --json","npx workspai workspace diff --from .workspai/reports/workspace-model-snapshot.json --json"]},null,2)),process.exit(1)),h}let f=await p(u,c);if(n.json){console.log(JSON.stringify({...u,outputPath:f},null,2));return}let g=u.summary.changed?s.yellow:s.green;console.log(g(`\u2714 Workspace model diff: ${u.summary.changed?"changed":"clean"}`)),console.log(s.gray(` From: ${u.fromRef}`)),console.log(s.gray(` Added projects: ${u.summary.addedProjects}`)),console.log(s.gray(` Removed projects: ${u.summary.removedProjects}`)),console.log(s.gray(` Changed projects: ${u.summary.changedProjects}`)),console.log(s.gray(` Workspace changes: ${u.summary.workspaceChanges}`)),console.log(s.gray(` Validation changes: ${u.summary.validationChanges}`)),u.git?.available&&console.log(s.gray(` Git: ${u.git.dirty?"dirty":"clean"} (${u.summary.gitChangedFiles} mapped change(s))`));for(let h of u.changes.slice(0,12))console.log(s.gray(` \u2022 ${h.type} ${h.target}: ${h.message}`));u.changes.length>12&&console.log(s.gray(` \u2026 ${u.changes.length-12} more change(s)`)),console.log(s.gray(` Written: ${f}`));}else if(t==="impact"){let c=i("impact"),d=n.from||e;d||((n.json===true||a("--json"))&&(console.log(JSON.stringify({schemaVersion:"workspace-impact-error-v1",command:"workspace impact",status:"error",workspacePath:c,error:{code:"workspace.impact.from.required",message:"workspace impact requires --from <workspace-diff-report>."},examples:["npx workspai workspace diff --from .workspai/reports/workspace-model-snapshot.json --json","npx workspai workspace impact --from .workspai/reports/workspace-model-diff-last-run.json --json"]},null,2)),process.exit(1)),console.log(s.red("\u274C workspace impact requires --from <snapshot-model-or-diff-report>")),console.log(s.gray(" npx workspai workspace impact --from .workspai/reports/workspace-model-diff-last-run.json --json")),process.exit(1));let{buildWorkspaceImpact:m,writeWorkspaceImpact:p}=await import('./workspace-intelligence-QJGVL37U.js'),u;try{u=await m({workspacePath:c,fromPath:d,scope:n.scope,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:l()});}catch(h){throw (n.json===true||a("--json"))&&(console.log(JSON.stringify({schemaVersion:"workspace-impact-error-v1",command:"workspace impact",status:"error",workspacePath:c,fromPath:d,error:{code:"workspace.impact.input_unreadable",message:h.message},nextActions:["npx workspai workspace snapshot create --json","npx workspai workspace diff --from .workspai/reports/workspace-model-snapshot.json --json","npx workspai workspace impact --from .workspai/reports/workspace-model-diff-last-run.json --json"]},null,2)),process.exit(1)),h}let f=await p(u,c);if(n.json){console.log(JSON.stringify({...u,outputPath:f},null,2));return}let g=u.summary.risk==="critical"||u.summary.risk==="high"?s.red:u.summary.risk==="medium"?s.yellow:s.green;console.log(g(`\u2714 Workspace impact: ${u.summary.risk}`)),console.log(s.gray(` From: ${u.fromRef}`)),console.log(s.gray(` Affected projects: ${u.summary.affectedProjects}`)),console.log(s.gray(` Workspace items: ${u.summary.workspaceItems}`)),console.log(s.gray(` Recommended commands: ${u.summary.recommendedCommands}`));for(let h of u.affectedProjects.slice(0,8))console.log(s.gray(` \u2022 ${h.title}: ${h.summary}`));u.affectedProjects.length>8&&console.log(s.gray(` \u2026 ${u.affectedProjects.length-8} more project(s)`)),console.log(s.gray(` Written: ${f}`));}else if(t==="verify"){let c=i("verify"),{buildWorkspaceVerify:d,writeWorkspaceVerify:m,evaluateWorkspaceVerifyGate:p}=await import('./workspace-verify-WSDUUTR5.js'),u=await d({workspacePath:c,fromImpactPath:n.fromImpact||e,scope:n.scope,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:l()}),f=await m(u,c),g=p(u,{strict:n.strict===true||a("--strict")}),h=g.exitCode,{recordWorkspaceHistory:k,historyEntryFromVerify:b}=await import('./workspace-history-CGCK2DJI.js');if(await k(c,b(u,g.passed)),n.json){console.log(JSON.stringify({...u,gate:g,outputPath:f},null,2)),h!==0&&process.exit(h);return}let w=u.summary.verdict==="ready"?s.green:u.summary.verdict==="needs-attention"?s.yellow:s.red;console.log(w(`\u2714 Workspace verify: ${u.summary.verdict}`)),console.log(s.gray(` Freshness: ${u.freshness.verdict}`)),console.log(s.gray(` Impact risk: ${u.impact.risk}`)),console.log(s.gray(` Steps: ${u.steps.length}`)),console.log(s.gray(` Passed ${u.summary.stepsPassed}, warn ${u.summary.stepsWarn}, failed ${u.summary.stepsFailed}, missing ${u.summary.stepsMissing}`));for(let y of u.steps.slice(0,10))console.log(s.gray(` \u2022 ${y.id}: ${y.status} \u2014 ${y.message}`));if(u.steps.length>10&&console.log(s.gray(` \u2026 ${u.steps.length-10} more step(s)`)),u.policyViolations.length>0){console.log(s.gray(` Policy (${u.policyMode}): ${u.policyViolations.length} violation(s)`));for(let y of u.policyViolations.slice(0,5)){let x=y.severity==="error"?s.red("\u2717"):s.yellow("!");console.log(` ${x} [${y.source}] ${y.code}: ${y.message}`);}}console.log(s.gray(` Gate (${g.mode}): ${g.passed?"passed":"blocked"}`));for(let y of g.reasons.slice(0,5))console.log(s.red(` \u2717 ${y}`));console.log(s.gray(` Written: ${f}`)),h!==0&&process.exit(h);}else if(t==="graph"){let c=i("graph"),{buildWorkspaceModel:d}=await import('./workspace-model-PNXXOGPO.js'),{buildGraphEmit:m,renderGraphDot:p,renderGraphMermaid:u,explainGraphNode:f}=await import('./workspace-graph-2A5THUCI.js'),h=(await d({workspacePath:c,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:l()})).graph,k=(e||"emit").toLowerCase();if(h||(n.json&&(console.log(JSON.stringify({command:"workspace graph",action:k,result:"error",workspacePath:c,timestamp:new Date().toISOString(),error:{code:"workspace.graph.missing",message:"Workspace model did not produce a dependency graph."}},null,2)),process.exit(1)),console.log(s.red("\u274C Workspace model did not produce a dependency graph.")),process.exit(1)),k==="dot"){console.log(p(h));return}if(k==="mermaid"){console.log(u(h));return}if(k==="explain"){let w=(n.scope?.replace(/^project:/,"")||o||"").trim();w||(n.json&&(console.log(JSON.stringify({command:"workspace graph explain",result:"error",workspacePath:c,timestamp:new Date().toISOString(),error:{code:"workspace.graph.explain.missing_project",message:"workspace graph explain requires a project."},usage:["npx workspai workspace graph explain <project> --json","npx workspai workspace graph explain --scope project:<name> --json"]},null,2)),process.exit(1)),console.log(s.red("\u274C workspace graph explain requires a project.")),console.log(s.gray(" npx workspai workspace graph explain <project> --json")),console.log(s.gray(" npx workspai workspace graph explain --scope project:<name>")),process.exit(1));let y=f(h,w);if(n.json){console.log(JSON.stringify(y,null,2)),y.found||process.exit(1);return}y.found||(console.log(s.red(`\u274C Project not found in dependency graph: ${w}`)),process.exit(1)),console.log(s.green(`\u2714 Graph explain: ${y.project}`)),y.centrality&&console.log(s.gray(` Centrality: fanIn ${y.centrality.fanIn}, fanOut ${y.centrality.fanOut}, reach ${y.centrality.reach}, betweenness ${y.centrality.betweenness}${y.centrality.isHotspot?" (hotspot)":""}`)),console.log(s.gray(` Direct dependents: ${y.directDependents.join(", ")||"none"}`)),console.log(s.gray(` Direct dependencies: ${y.directDependencies.join(", ")||"none"}`)),console.log(s.gray(` Blast radius (transitive dependents): ${y.transitiveDependents.length}`));for(let x of y.transitiveDependents.slice(0,10))console.log(s.gray(` \u2022 ${x.id} (d${x.distance}, via ${x.via??"\u2014"})`));return}let b=m(h);if(n.json){console.log(JSON.stringify(b,null,2));return}console.log(s.green("\u2714 Workspace dependency graph")),console.log(s.gray(` Nodes: ${b.graph.stats.nodeCount}`)),console.log(s.gray(` Edges: ${b.graph.stats.edgeCount} (inferred ${b.graph.stats.inferredEdges}, contract ${b.graph.stats.contractEdges}, manual ${b.graph.stats.manualEdges})`)),console.log(s.gray(` Integrity: ${b.integrity.ok?"ok":"issues"} (cycles ${b.integrity.stats.cycleCount}, dangling ${b.integrity.stats.danglingCount}, orphans ${b.integrity.stats.orphanCount})`)),console.log(s.gray(` Hotspots: ${b.hotspots.join(", ")||"none"}`)),console.log(s.gray(" Render: workspace graph dot | workspace graph mermaid"));}else if(t==="watch"){let c=i("watch"),{runWorkspaceWatch:d}=await import('./workspace-watch-AGPOJ74Q.js'),m=n.once===true||a("--once"),p=n.json===true,u=new AbortController,f=()=>u.abort();process.once("SIGINT",f),process.once("SIGTERM",f),p||console.log(s.green("\u2714 Workspace watch (model + graph kept in memory)")),await d({workspacePath:c,once:m,signal:u.signal,buildOptions:{workspacePath:c,observableScanDepth:l()},onProgress:g=>{p||console.error(s.gray(` ${g}`));},emit:g=>{if(p){console.log(JSON.stringify(g));return}if(g.kind==="ready"){console.log(s.gray(` Ready: ${g.graph.nodeCount} nodes, ${g.graph.edgeCount} edges (hash ${g.modelHash.slice(0,12)})`));return}if(g.kind==="error"){console.error(s.red(` \u2717 Rebuild failed: ${g.error??"unknown error"}`));return}if(g.kind==="unchanged"){console.log(s.gray(` No structural change (${g.mode}, ${g.durationMs}ms)`));return}let h=[];g.changedProjects.length>0&&h.push(`changed: ${g.changedProjects.join(", ")}`),g.addedProjects.length>0&&h.push(`added: ${g.addedProjects.join(", ")}`),g.removedProjects.length>0&&h.push(`removed: ${g.removedProjects.join(", ")}`),g.graph.edgesAdded.length>0&&h.push(`+${g.graph.edgesAdded.length} edges`),g.graph.edgesRemoved.length>0&&h.push(`-${g.graph.edgesRemoved.length} edges`),console.log(s.cyan(` \u21BB Changed (${g.mode}, ${g.durationMs}ms): ${h.join("; ")||"structure updated"}`));}}),process.removeListener("SIGINT",f),process.removeListener("SIGTERM",f),!p&&!m&&console.log(s.gray(" Watch stopped."));return}else if(t==="sync"){let c=i("sync"),{syncWorkspaceProjects:d}=await import('./workspace-PR6VZRBG.js');n.json||console.log(s.cyan(`\u{1F4C2} Scanning workspace: ${v.basename(c)}`));let m=await d(c,n.json===true);await ot(c,{silent:n.json===true});let{readWorkspaceRegistrySummary:p}=await import('./workspace-registry-summary-RUJE6RPH.js'),u=await p(c);n.json&&console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-sync-v1",workspacePath:c,registry:m,contractSynced:true,registrySummary:u},null,2));}else if(t==="registry"){let c=i("registry"),d=e||"status";d!=="status"&&(console.log(s.red(`\u274C Unknown workspace registry action: ${d}`)),console.log(s.gray(" npx workspai workspace registry status [--refresh] [--json]")),process.exit(1));let{publishWorkspaceRegistrySummary:m,readWorkspaceRegistrySummary:p,resolveWorkspaceRegisteredProjects:u}=await import('./workspace-registry-summary-RUJE6RPH.js'),g=n.refresh===true||a("--refresh")||n.force===true||a("--force")?await m(c):await p(c)||await m(c);if(n.json){console.log(JSON.stringify(g,null,2));return}let h=await u(c);console.log(s.cyan("Workspace registry")),console.log(s.gray(` Authority: ${g.authority}`)),console.log(s.gray(` Projects: ${g.projectCount}`)),console.log(s.gray(` Summary: ${g.registrySummaryPath}`)),h.summary.projectCount===0&&console.log(s.yellow(" No registered projects \u2014 run workspace sync after adding projects."));}else if(t==="foundation"){let c=i("foundation"),d=e||"ensure";d!=="ensure"&&(console.log(s.red(`\u274C Unknown workspace foundation action: ${d}`)),console.log(s.gray(" npx workspai workspace foundation ensure [--force] [--json]")),process.exit(1));let{ensureWorkspaceFoundation:m}=await import('./workspace-foundation-KGSV4E6D.js'),p=await m(c,{force:n.force===true||a("--force")});if(n.json){console.log(JSON.stringify(p,null,2));return}p.created.length>0?console.log(s.green(`\u2714 Workspace foundation ensured: ${p.created.join(", ")}`)):console.log(s.gray("Workspace foundation files are already up to date."));}else if(t==="policy"){let c=i("policy"),d=await Md(c,e,o,r,n.json===true||a("--json"));d!==0&&process.exit(d);}else if(t==="contract"){let c=i("contract"),{buildWorkspaceContractGraph:d,readWorkspaceContract:m,verifyWorkspaceContract:p,writeWorkspaceContract:u,WORKSPACE_CONTRACT_PATH:f}=await import('./workspace-contract-XUGMCUSQ.js'),g=e||"inspect",h=n.output;try{if(g==="init"){let k=await u({workspacePath:c,outputPath:h,force:n.force===true||a("--force")});if(n.json){console.log(JSON.stringify(k,null,2));return}console.log(s.green(`\u2714 Workspace contract initialized: ${k.contractPath}`)),console.log(s.gray(` Projects: ${k.contract.projects.length}`));return}if(g==="inspect"){let k=await m({workspacePath:c,contractPath:h});if(n.json){console.log(JSON.stringify(k,null,2));return}console.log(s.green(`\u2714 Workspace contract: ${k.contractPath}`)),console.log(s.gray(` Workspace: ${k.contract.workspace.name}`)),console.log(s.gray(` Projects: ${k.contract.projects.length}`)),console.log(s.gray(` Schema: v${k.contract.schemaVersion}`));return}if(g==="verify"){let k=await p({workspacePath:c,contractPath:h,strict:n.strict===true||a("--strict")}),{writeWorkspaceContractVerifyEvidence:b}=await import('./workspace-contract-XUGMCUSQ.js'),w=await b({workspacePath:c,result:k});if(n.json)console.log(JSON.stringify({...k,evidencePath:w},null,2));else {let y=k.status==="passed"?s.green:s.red;console.log(y(`\u2714 Workspace contract verification ${k.status}: ${k.contractPath}`)),console.log(s.gray(` Projects: ${k.projectCount}`));for(let x of k.checks){let S=x.status==="passed"?"\u2714":"\u2718";console.log(s.gray(` ${S} ${x.id}: ${x.message}`));}for(let x of k.violations)console.log(s.gray(` Violation: ${x}`));}(k.status==="failed"||k.status!=="passed"&&n.strict)&&process.exit(1);return}if(g==="graph"){let k=await d({workspacePath:c,contractPath:h});if(n.json){console.log(JSON.stringify(k,null,2));return}console.log(s.green(`\u2714 Workspace contract graph: ${k.contractPath}`)),console.log(s.gray(` Workspace: ${k.graph.workspace.name}`)),console.log(s.gray(` Projects: ${k.graph.summary.projectCount}`)),console.log(s.gray(` Dependencies: ${k.graph.summary.dependencyEdges}`)),console.log(s.gray(` Event links: ${k.graph.summary.eventEdges}`)),console.log(s.gray(` Ports: ${k.graph.summary.portCount}`));for(let b of k.graph.nodes){let w=b.ports.map(y=>`${y.name}:${y.port}`).join(", ")||"none";console.log(s.gray(` \u2022 ${b.id} (${b.runtime||"unknown"}${b.framework?`/${b.framework}`:""}) ports=${w}`));}for(let b of k.graph.edges){let w=b.type==="event"?`event:${b.label}`:b.label;console.log(s.gray(` ${b.from} -> ${b.to} [${w}]`));}return}console.log(s.red(`\u274C Unknown workspace contract action: ${g}`)),console.log(s.white(` npx workspai workspace contract init|inspect|verify|graph [--output ${f}]`)),process.exit(1);}catch(k){n.json&&(console.log(JSON.stringify({command:`workspace contract ${g}`,result:"error",workspacePath:c,timestamp:new Date().toISOString(),error:{code:`workspace.contract.${g}.failed`,message:k.message}},null,2)),process.exit(1)),console.log(s.red(`\u274C Workspace contract ${g} failed: ${k.message}`)),process.exit(1);}}else if(t==="share"){let c=i("share"),d=n.output||e,{createWorkspaceShareBundle:m}=await import('./workspace-PR6VZRBG.js'),p=await m(c,{outputPath:d,includePaths:n.includePaths===true,includeDoctorEvidence:n.doctor!==false,includeBlueprint:n.blueprint!==false});if(n.json){console.log(JSON.stringify({command:"workspace share",result:"ok",timestamp:new Date().toISOString(),workspacePath:c,bundlePath:p,options:{includePaths:n.includePaths===true,includeDoctorEvidence:n.doctor!==false,includeBlueprint:n.blueprint!==false}},null,2));return}console.log(s.green(`\u2714 Workspace share bundle exported: ${p}`)),console.log(s.gray("Share this JSON with your team for reproducible workspace/project diagnostics."));}else if(t==="export"){let c=i("export"),{exportWorkspaceArchive:d}=await import('./workspace-archive-GCZNI44O.js'),m=await d({workspacePath:c,outputPath:n.output||e,includeEnv:n.includeEnv===true||a("--include-env")});if(n.json){console.log(JSON.stringify(m,null,2));return}let p=(m.bytesWritten/(1024*1024)).toFixed(2);console.log(s.green(`\u2714 Workspace archive exported: ${m.archivePath}`)),console.log(s.gray(` Files: ${m.manifest.files.length}`)),console.log(s.gray(` Size: ${p} MB`)),m.manifest.security.envFilesIncluded||console.log(s.gray(" Secrets: excluded (.env, private keys, logs, dependency caches)"));}else if(t==="archive"&&(e==="inspect"||e==="verify"||e==="doctor")){let c=o;c||(console.log(s.red(`\u274C workspace archive ${e} requires an archive path or URL.`)),console.log(s.white(` npx workspai workspace archive ${e} team.workspai-archive.zip`)),process.exit(1));let{doctorWorkspaceArchive:d,inspectWorkspaceArchive:m,verifyWorkspaceArchive:p}=await import('./workspace-archive-GCZNI44O.js');try{if(e==="inspect"){let f=await m({archivePathOrUrl:c});if(n.json){console.log(JSON.stringify(f,null,2));return}let g=(f.totalBytes/(1024*1024)).toFixed(2);console.log(s.green(`\u2714 Workspace archive: ${f.archivePath}`)),console.log(s.gray(` Workspace: ${f.manifest.workspaceName}`)),console.log(s.gray(` Exported: ${f.manifest.exportedAt}`)),console.log(s.gray(` Exporter: ${f.manifest.exportedBy||"unknown"}`)),console.log(s.gray(` Files: ${f.fileCount}`)),console.log(s.gray(` Payload: ${g} MB`));return}if(e==="doctor"){let f=await d({archivePathOrUrl:c,strict:n.strict===true||a("--strict")});if(n.json)console.log(JSON.stringify(f,null,2));else {let g=f.status==="passed"?s.green:f.status==="warning"?s.yellow:s.red;console.log(g(`\u2714 Workspace archive doctor ${f.status}: ${f.archivePath}`)),console.log(s.gray(` Workspace: ${f.workspaceName}`)),console.log(s.gray(` Files: ${f.fileCount}`));for(let h of f.checks){let k=h.status==="passed"?"\u2714":h.status==="warning"?"\u26A0":"\u2718";console.log(s.gray(` ${k} ${h.id}: ${h.message}`));}for(let h of f.recommendedActions)console.log(s.gray(` Next: ${h}`));}(f.status==="failed"||f.status==="warning"&&n.strict)&&process.exit(1);return}let u=await p({archivePathOrUrl:c,requireChecksums:n.strict===true||a("--strict")});if(n.json)console.log(JSON.stringify(u,null,2));else if(u.status==="passed")console.log(s.green(`\u2714 Workspace archive verified: ${u.archivePath}`)),console.log(s.gray(` Files: ${u.verifiedFiles}/${u.fileCount}`));else {let f=u.status==="failed"?s.red:s.yellow;console.log(f(`\u274C Workspace archive verification ${u.status}: ${u.archivePath}`)),u.missingArchiveEntries.length&&console.log(s.gray(` Missing entries: ${u.missingArchiveEntries.join(", ")}`)),u.extraArchiveEntries.length&&console.log(s.gray(` Unexpected entries: ${u.extraArchiveEntries.join(", ")}`)),u.mismatches.length&&console.log(s.gray(` Mismatches: ${u.mismatches.map(g=>g.path).join(", ")}`)),u.missingChecksumFiles.length&&console.log(s.gray(` Missing checksums: ${u.missingChecksumFiles.join(", ")}`));}(u.status==="failed"||u.status==="warning"&&n.strict)&&process.exit(1);}catch(u){n.json&&(console.log(JSON.stringify({schemaVersion:"workspace-archive-error-v1",command:`workspace archive ${e}`,status:"error",timestamp:new Date().toISOString(),archivePathOrUrl:c,error:{code:`workspace.archive.${e}.failed`,message:u.message}},null,2)),process.exit(1)),console.log(s.red(`\u274C Workspace archive ${e} failed: ${u.message}`)),process.exit(1);}}else if(t==="hydrate"||t==="import"){let c=e;c||(console.log(s.red(`\u274C workspace ${t} requires an archive path or URL.`)),console.log(s.white(` npx workspai workspace ${t} team.workspai-archive.zip --output ./team`)),process.exit(1));let{hydrateWorkspaceArchive:d}=await import('./workspace-archive-GCZNI44O.js');try{let m=await d({archivePathOrUrl:c,outputPath:n.output,force:n.force===true||a("--force"),dryRun:n.dryRun===true||a("--dry-run"),strict:n.strict===true||a("--strict")});if(n.json){console.log(JSON.stringify(m,null,2));return}console.log(s.green(m.dryRun?`\u2714 Workspace archive hydrate preview: ${m.outputPath}`:`\u2714 Workspace archive hydrated: ${m.outputPath}`)),console.log(s.gray(` Files: ${m.files.length}`)),m.manifest?.workspaceName&&console.log(s.gray(` Workspace: ${m.manifest.workspaceName}`));}catch(m){n.json&&(console.log(JSON.stringify({schemaVersion:"workspace-archive-error-v1",command:`workspace ${t}`,status:"error",timestamp:new Date().toISOString(),archivePathOrUrl:c,outputPath:n.output??null,dryRun:n.dryRun===true||a("--dry-run"),error:{code:`workspace.${t}.failed`,message:m.message}},null,2)),process.exit(1)),console.log(s.red(`\u274C Workspace ${t} failed: ${m.message}`)),process.exit(1);}}else if(t==="run"){let c=i(`run ${e||""}`.trim()),d=new Set(["init","test","build","start"]),m=e?.trim()??"";m||(console.log(s.red(`Unknown workspace run stage: ${e||"(none provided)"}`)),console.log(s.gray("Available stages: init | test | build | start | <custom-from-context>")),console.log(s.gray(" \u2022 init \u2014 run install/bootstrap across the project fleet")),console.log(s.gray(" \u2022 test \u2014 run test suite across selected projects")),console.log(s.gray(" \u2022 build \u2014 compile/package across selected projects")),console.log(s.gray(" \u2022 start \u2014 start services (smoke/e2e scenarios)")),console.log(s.gray(" \u2022 custom \u2014 any stage key declared in .workspai/context.json commands")),console.log(s.gray(" Note: dev is excluded \u2014 it is a local-only primitive, not a CI stage")),process.exit(2)),d.has(m)||(!/^[a-z][a-z0-9_-]*$/i.test(m)||m==="dev"||m==="stop")&&(console.log(s.red(`Unknown workspace run stage: ${m}`)),console.log(s.gray("Available stages: init | test | build | start | <custom-from-context>")),process.exit(2));let p=Number(n.maxWorkers??""),u=Number.isFinite(p)?Math.max(1,Math.trunc(p)):void 0;if(m==="init"&&n.json!==true){let h=await bn(c);h!==0&&process.exit(h);}let{runWorkspaceStage:f}=await import('./workspace-run-Y7YMUIHX.js'),g=await f({workspacePath:c,stage:m,scope:n.scope,affected:n.affected===true,blastRadius:n.blastRadius===true,since:n.since,parallel:n.parallel===true,maxWorkers:u,continueOnError:n.continueOnError===true,strict:n.strict===true,json:n.json===true,enforceGates:n.gates,reusePassed:n.reusePassed===true});n.json&&console.log(JSON.stringify(g,null,2)),g.summary.exitCode!==0&&process.exit(g.summary.exitCode);}else if(t==="explain"||t==="why"){let c=i(t),{parseWorkspaceExplainTarget:d}=await import('./workspace-explain-contract-DNS2YEL7.js'),{buildWorkspaceExplain:m,writeWorkspaceExplainReport:p}=await import('./workspace-explain-JEONEGZZ.js'),u=(e??o??"").trim();!u&&n.scope&&(u=n.scope.startsWith("project:")?n.scope:`project:${n.scope}`),u||(console.log(s.red(`\u274C workspace ${t} requires a target.`)),console.log(s.gray(" npx workspai workspace explain project:<name>|release-blocked [--json] [--write]")),console.log(s.gray(" npx workspai workspace why <project>|release-blocked [--json]")),process.exit(1));let f=d(u);f||(console.log(s.red(`\u274C Invalid explain target: ${u}`)),process.exit(1));let g=await m({workspacePath:c,target:f}),h=n.write===true||a("--write"),k;if(h&&(k=await p(g,c,t==="why"?"why":"explain")),n.json){console.log(JSON.stringify({...g,outputPath:k},null,2));return}console.log(s.green(`\u2714 Workspace ${t==="why"?"why":"explain"}: ${g.summary}`));for(let b of g.sections)console.log(s.bold(`
361
- ${b.title}`)),console.log(b.body);k&&console.log(s.gray(`
362
- Written: ${k}`));}else if(t==="trace"){let c=i("trace"),d=n.from||e;d||(console.log(s.red("\u274C workspace trace requires --from <diff-ref>")),console.log(s.gray(" npx workspai workspace trace --from .workspai/reports/workspace-model-diff-last-run.json --json")),process.exit(1));let{resolveWorkspaceTraceTarget:m}=await import('./workspace-explain-contract-DNS2YEL7.js'),{buildWorkspaceExplain:p,writeWorkspaceExplainReport:u}=await import('./workspace-explain-JEONEGZZ.js'),f=m(d);(!f||f.kind!=="trace")&&(console.log(s.red(`\u274C Invalid trace ref: ${d}`)),console.log(s.gray(" Use a diff artifact path or trace:<path>, e.g. trace:.workspai/reports/workspace-model-diff-last-run.json")),process.exit(1));let g=await p({workspacePath:c,target:f}),h=n.write===true||a("--write"),k;if(h&&(k=await u(g,c,"trace")),n.json){console.log(JSON.stringify({...g,outputPath:k},null,2));return}console.log(s.green(`\u2714 Workspace trace: ${g.summary}`));for(let b of g.sections)console.log(s.bold(`
363
- ${b.title}`)),console.log(b.body);k&&console.log(s.gray(`
364
- Written: ${k}`));}else if(t==="feedback"){let c=i("feedback"),d=(e||"record").toLowerCase();d!=="record"&&(console.log(s.red(`Unknown feedback action: ${d}`)),console.log(s.gray("Available: record")),process.exit(1)),!n.json&&!a("--json")&&(console.log(s.red("\u274C workspace feedback record requires --json (stdin payload)")),console.log(s.gray(` echo '{"actionId":"fix","summary":"ok","outcome":"ok"}' | npx workspai workspace feedback record --json`)),process.exit(1)),process.stdin.isTTY&&(console.log(s.red("\u274C workspace feedback record requires piped JSON on stdin (not a TTY)")),console.log(s.gray(` echo '{"actionId":"fix","summary":"ok","outcome":"ok"}' | npx workspai workspace feedback record --json`)),process.exit(1));let{recordWorkspaceFeedback:m,parseFeedbackStdinPayload:p,readStdinAll:u}=await import('./workspace-feedback-R6H4UFZB.js'),f=await u(),g=p(f);g||(console.log(s.red("\u274C Invalid or empty feedback JSON on stdin")),process.exit(1));let h=await m({workspacePath:c,payload:g});n.json?console.log(JSON.stringify(h,null,2)):h.ok?(console.log(s.green("\u2714 Workspace feedback recorded")),console.log(s.gray(` History: ${h.historyPath}`))):console.log(s.red(`\u274C ${h.error??"Failed to record feedback"}`)),h.ok||process.exit(1);}else if(t==="mcp"){let c=i("mcp"),d=(e||"serve").toLowerCase();d!=="serve"&&(n.json&&(console.log(JSON.stringify({command:"workspace mcp",action:d,result:"error",workspacePath:c,timestamp:new Date().toISOString(),error:{code:"workspace.mcp.unknown_action",message:`Unknown mcp action: ${d}`},availableActions:["serve"]},null,2)),process.exit(1)),console.log(s.red(`Unknown mcp action: ${d}`)),console.log(s.gray("Available: serve")),process.exit(1));let{runWorkspaceMcpServe:m}=await import('./workspace-mcp-serve-AK4MYEHQ.js');n.json||console.error(s.gray("\u2139 Workspai MCP server (read-mostly) listening on stdio JSON-RPC\u2026")),await m({workspacePath:c});}else if(t==="init"){console.log(s.yellow("\u2139 workspace init is an alias of: npx workspai workspace run init")),console.log(s.gray(` Equivalent full-init aliases at workspace root:
396
+ workspace mcp serve \u2014 read-mostly stdio MCP bridge over workspace evidence`).option("--workspace <path>","Workspace root path (defaults to nearest Workspai workspace)").option("--output <file>","Output file path for workspace share/export artifacts").option("--from <file>","Input workspace model snapshot/report for workspace diff").option("--from-impact <file>","Input workspace impact report for workspace verify (defaults to last-run impact)").option("--include-paths","Include absolute paths in workspace share bundle").option("--write","Write workspace intelligence artifact to .workspai/reports").option("--include-evidence","Read status metadata from referenced evidence reports").option("--scan-depth <count>","Observable project discovery depth for large monorepos").option("--cache","Reuse cached workspace model when inputs are unchanged (keyed by inputsHash)").option("--incremental","Rebuild only changed projects and re-infer only their incident graph edges (graph-aware)").option("--once","For workspace watch: do the initial in-memory build and exit (no watcher)").option("--for-agent [agent]","Build an agent-ready workspace context pack").option("--agent-sync","After --write on context, sync cross-tool agent grounding files (AGENTS.md, Copilot, Cursor, Claude)").option("--no-agent-sync","Skip automatic agent grounding sync after context --write").option("--target <targets>","Agent customization targets for agent-sync (all|vscode|agents,copilot,cursor,claude,codex,orca)").option("--preset <preset>","Agent customization pack preset for agent-sync (minimal|enterprise)").option("--refresh-context","Rebuild workspace-context-agent.json during agent-sync").option("--experimental-hooks","Generate advisory VS Code agent hook design files during enterprise agent-sync").option("--hydrate-prompts","Hydrate matching Copilot prompt files with workspace-specific verification steps during agent-sync").option("--scope <scope>","Scope workspace intelligence output, e.g. project:<name>").option("--no-doctor","Exclude doctor evidence in workspace share bundle").option("--no-blueprint","Exclude reproducibility blueprint from workspace share bundle").option("--include-env","Include .env/private key files in workspace export archive").option(f$3.archiveCompression.signature,f$3.archiveCompression.description).option(f$3.maxDownloadSize.signature,f$3.maxDownloadSize.description).option(f$3.maxExpandedSize.signature,f$3.maxExpandedSize.description).option(f$3.downloadTimeoutMs.signature,f$3.downloadTimeoutMs.description).option("--force","Overwrite an existing hydrate output directory").option("--refresh","Publish workspace registry summary before reading status").option("--dry-run","Preview hydrate without writing files").option("--affected","Run only affected projects (requires git diff context)").option("--blast-radius","Include downstream dependents from workspace dependency graph").option("--since <ref>","Git ref for affected calculation (default: HEAD~1)").option("--parallel","Run project stages in parallel").option("--max-workers <count>","Maximum parallel workers (default: min(4, selected))").option("--continue-on-error","Continue running remaining projects after a failure").option("--reuse-passed","Skip projects that already passed this stage in workspace-run-last.json").option("--json","Emit machine-readable JSON output").option("--ci","Build CI-oriented command plans where supported").option("--strict","Return non-zero exit on warn/fail gate outcomes").option("--no-gates","Skip doctor/readiness pre-run gates").action(async function(t,e,o,r){let n=this.opts(),i=y=>{let m=n.workspace?C.resolve(n.workspace):null,g=m??a$5(process.cwd())??re(process.cwd());(!g||!qe(g))&&((n.json===true||process.argv.includes("--json"))&&(console.log(JSON.stringify(c$2({operation:`workspace ${y}`,code:"workspace.root.required",message:"Not inside a Workspai workspace. Run from a workspace directory or pass --workspace <path>.",context:{cwd:C.resolve(process.cwd()),...m?{requestedWorkspace:m}:{}}}),null,2)),process.exit(1)),console.log(s.red("\u274C Not inside a Workspai workspace")),console.log(s.gray("\u{1F4A1} Run from a workspace directory or pass --workspace <path>.")),process.exit(1));let v=C.resolve(process.cwd()),u=C.resolve(g);return v!==u&&!n.json&&console.log(s.gray(`\u2139 Using workspace root ${g} for "${y}" (current directory: ${v}).`)),g},a=y=>process.argv.includes(y),c=y=>be(process.argv,y),l=()=>n.output||c("--output"),p=()=>{if(!n.scanDepth)return;let y=Number.parseInt(n.scanDepth,10);return Number.isFinite(y)?y:void 0},f=(y,m)=>{if(!y)return;let g=y.trim().toLowerCase().match(/^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb|tb)?$/);if(!g)throw new Error(`${m} must be a byte size such as 500gb or 2tb.`);let v={b:1,kb:1024,mb:1024**2,gb:1024**3,tb:1024**4},u=Number(g[1])*v[g[2]||"b"];if(!Number.isSafeInteger(Math.floor(u))||u<=0)throw new Error(`${m} is outside the supported numeric range.`);return Math.floor(u)},d=()=>{let y=n.downloadTimeoutMs,m=y===void 0?void 0:Number.parseInt(y,10);if(m!==void 0&&(!Number.isFinite(m)||m<0))throw new Error("--download-timeout-ms must be zero or a positive integer.");return {maxDownloadBytes:f(n.maxDownloadSize,"--max-download-size"),maxExpandedBytes:f(n.maxExpandedSize,"--max-expanded-size"),downloadTimeoutMs:m}},w={list:["--json"],model:["--workspace","--json","--include-paths","--include-evidence","--scan-depth","--cache","--incremental","--write","--strict"],"agent-sync":["--workspace","--json","--scope","--for-agent","--write","--dry-run","--strict","--preset","--refresh-context","--refresh","--target","--experimental-hooks","--hydrate-prompts"],"remediation-plan":["--workspace","--json","--include-paths","--ci","--write"],context:["--workspace","--json","--for-agent","--scope","--include-evidence","--scan-depth","--write","--agent-sync","--no-agent-sync","--preset","--target","--strict"],snapshot:["--workspace","--json","--include-paths","--include-evidence","--scan-depth"],diff:["--workspace","--json","--from","--include-paths","--include-evidence","--scan-depth","--strict"],impact:["--workspace","--json","--from","--scope","--include-paths","--include-evidence","--scan-depth","--strict"],verify:["--workspace","--json","--from-impact","--scope","--include-paths","--include-evidence","--scan-depth","--strict"],graph:["--workspace","--json","--include-paths","--include-evidence","--scan-depth","--scope"],watch:["--workspace","--json","--once","--scan-depth"],sync:["--workspace","--json"],registry:["--workspace","--json","--refresh"],foundation:["--workspace","--json","--force"],policy:["--workspace","--json"],contract:["--workspace","--json","--output","--force","--strict"],share:["--workspace","--json","--output","--include-paths","--no-doctor","--no-blueprint"],export:["--workspace","--json","--output","--include-env","--archive-compression"],archive:["--json","--strict","--max-download-size","--max-expanded-size","--download-timeout-ms"],hydrate:["--json","--output","--force","--dry-run","--strict","--max-download-size","--max-expanded-size","--download-timeout-ms"],import:["--json","--output","--force","--dry-run","--strict","--max-download-size","--max-expanded-size","--download-timeout-ms"],run:["--workspace","--json","--scope","--affected","--blast-radius","--since","--parallel","--max-workers","--continue-on-error","--reuse-passed","--strict","--no-gates"],explain:["--workspace","--json","--scope","--write"],why:["--workspace","--json","--scope","--write"],trace:["--workspace","--json","--from","--write"],feedback:["--workspace","--json"],mcp:["--workspace","--json"],init:["--workspace","--json","--scope","--parallel","--max-workers","--continue-on-error","--reuse-passed","--strict","--no-gates"]},h=new Set(Object.values(w).flatMap(y=>[...y])),k=new Set(process.argv.slice(2).filter(y=>y.startsWith("--")).map(y=>y.split("=",1)[0]).filter(y=>h.has(y))),j=w[t],_=j?[...k].filter(y=>!j.includes(y)):[];if(_.length>0){let y=`${_.join(", ")} ${_.length===1?"is":"are"} not supported by workspace ${t}.`;n.json===true||k.has("--json")?console.log(JSON.stringify(c$2({operation:`workspace ${t}`,code:"workspace.option.unsupported",message:y,exitCode:2,context:{action:t,unsupportedFlags:_,allowedFlags:j}}),null,2)):(console.log(s.red(`\u274C ${y}`)),console.log(s.gray(` Allowed flags: ${j.join(", ")||"none"}`))),process.exit(2);}if((ma(t)||t==="trace"||t==="feedback"||t==="mcp")&&d$3({action:t,status:"started",message:`workspace ${t} started`,metadata:{json:n.json===true||a("--json"),strict:n.strict===true||a("--strict")}}),t==="list"){let{listWorkspaces:y}=await import('./workspace-FQT3QIRS.js');await y({json:n.json===true||a("--json")});}else if(t==="model"){let y=i("model"),{buildWorkspaceModelCached:m,buildWorkspaceModelIncremental:g,writeWorkspaceModel:v}=await import('./workspace-model-GMSRBICO.js'),u=n.incremental===true||a("--incremental"),b=n.cache===true||a("--cache")||u,P={workspacePath:y,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:p(),strict:n.strict===true||a("--strict")},x,A;if(u){let N=await g(P);x=N.model,A=N.mode;}else {let N=await m({...P,cache:b});x=N.model,A=N.cache;}let I;(n.write===true||a("--write"))&&(I=await v(x,y));let W=(n.strict===true||a("--strict"))&&x.validation?.status!=="passed";if(n.json){console.log(JSON.stringify({...x,...I?{outputPath:I}:{}},null,2)),W&&process.exit(1);return}console.log(s.green(`\u2714 Workspace model: ${x.workspace.name}`)),u?console.log(s.gray(` Build: ${A} (incremental)`)):b&&console.log(s.gray(` Cache: ${A}`)),console.log(s.gray(` Projects: ${x.summary.projectCount}`)),console.log(s.gray(` Runtimes: ${x.summary.runtimes.join(", ")||"none"}`)),console.log(s.gray(` Frameworks: ${x.summary.frameworks.join(", ")||"none"}`)),console.log(s.gray(` Workspace type: ${x.identity.workspaceType}`)),console.log(s.gray(` Validation: ${x.validation?.status??"unknown"} (${x.validation?.errors??0} error, ${x.validation?.warnings??0} warning)`)),console.log(I?s.gray(` Written: ${I}`):s.gray(" Add --write to persist .workspai/reports/workspace-model.json")),W&&process.exit(1);}else if(t==="agent-sync"){let y=i("agent-sync"),{syncWorkspaceAgentGrounding:m,parseAgentGroundingTargets:g}=await import('./workspace-agent-sync-ZYCPXTU3.js'),v=n.strict===true||a("--strict"),u=n.write===true||a("--write"),b=a("--dry-run"),P=await m({workspacePath:y,scope:n.scope,agent:n.forAgent,write:u&&!b,dryRun:b,strict:v,preset:n.preset==="minimal"?"minimal":"enterprise",refreshContext:n.refreshContext===true||a("--refresh-context")||a("--refresh"),targets:g(n.target),experimentalHooks:n.experimentalHooks===true||a("--experimental-hooks"),hydratePrompts:n.hydratePrompts===true||a("--hydrate-prompts"),staleAfterHours:24});if(n.json)console.log(JSON.stringify(P,null,2));else {console.log(s.green(`\u2714 Agent grounding ${u&&!b?"synced":"planned"}`)),console.log(s.gray(` Index: ${P.indexPath}`)),P.contextPath&&console.log(s.gray(` Context: ${P.contextPath}`)),P.blockers.length>0&&console.log(s.yellow(` Blockers: ${P.blockers.slice(0,3).join(" \xB7 ")}`));let x=u&&!b?P.writtenFiles:P.skippedFiles;if(x.length>0&&console.log(s.gray(` Files: ${x.join(", ")}`)),P.strictViolations.length>0)for(let A of P.strictViolations)console.log(s.red(`\u274C ${A}`));}v&&P.strictViolations.length>0&&process.exit(1);}else if(t==="remediation-plan"){let y=i("remediation-plan"),{buildArtifactRemediationPlan:m,writeArtifactRemediationPlan:g}=await import('./artifact-remediation-plan-Z7OCSME3.js'),v=await m({workspacePath:y,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),ciMode:n.ci===true||a("--ci")}),u;if((n.write===true||a("--write"))&&(u=await g(v,y)),n.json===true||a("--json")){console.log(JSON.stringify(b$5("workspace remediation-plan",v,u),null,2));return}console.log(s.green(`\u2714 Artifact remediation plan: ${v.workspace.name}`)),console.log(s.gray(` Artifacts scanned: ${v.summary.artifactsScanned}`)),console.log(s.gray(` Cards covered: ${v.summary.cardsCovered}`)),console.log(s.gray(` CI mode: ${v.source.ciMode?"yes":"no"}`)),console.log(s.gray(` Actions: ${v.summary.totalActions}`)),console.log(s.gray(` Risk: safe=${v.summary.risk.safe}, guarded=${v.summary.risk.guarded}, invasive=${v.summary.risk.invasive}`));for(let b of v.actions.slice(0,8))console.log(s.gray(` \u2022 ${b.cardId}: ${b.title} (${b.mode}, ${b.risk})`));v.actions.length>8&&console.log(s.gray(` \u2026 ${v.actions.length-8} more action(s)`)),console.log(u?s.gray(` Written: ${u}`):s.gray(" Add --write to persist .workspai/reports/artifact-remediation-plan-last-run.json"));}else if(t==="context"){let y=i("context");n.forAgent!==true&&typeof n.forAgent!="string"&&e!=="agent"&&(console.log(s.red("\u274C workspace context currently requires --for-agent")),console.log(s.gray(" npx workspai workspace context --for-agent --json [--scope project:<name>]")),process.exit(1));let{buildWorkspaceAgentContext:m,writeWorkspaceAgentContext:g}=await import('./workspace-context-WAGGJCDL.js'),v=n.strict===true||a("--strict"),u=await m({workspacePath:y,agent:n.forAgent||o||e,scope:n.scope,includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:p(),strict:false}),b,P;if((n.write===true||a("--write"))&&(b=await g(u,y),(n.agentSync===true||a("--agent-sync")||n.noAgentSync!==true)&&!a("--no-agent-sync"))){let{syncWorkspaceAgentGrounding:I,parseAgentGroundingTargets:W}=await import('./workspace-agent-sync-ZYCPXTU3.js');if(P=await I({workspacePath:y,scope:n.scope,agent:u.agent,write:true,refreshContext:false,strict:v,preset:n.preset==="minimal"?"minimal":"enterprise",targets:W(n.target)}),n.json||console.log(s.gray(` Agent grounding synced: ${P.writtenFiles.length} file(s) updated`)),v&&P.strictViolations.length>0){for(let N of P.strictViolations)console.log(s.red(`\u274C ${N}`));process.exit(1);}}let x=v&&u.validation.status!=="passed";if(n.json){console.log(JSON.stringify({...u,...b?{outputPath:b}:{},...P?{agentGroundingSync:P}:{}},null,2)),x&&process.exit(1);return}if(console.log(s.green(`\u2714 Workspace context: ${u.workspace.name}`)),console.log(s.gray(` Agent: ${u.agent}`)),console.log(s.gray(` Scope: ${u.scope.activeProject??u.scope.requested}`)),console.log(s.gray(` Projects included: ${u.projects.length}`)),console.log(s.gray(` Safe commands: ${u.safeCommands.length}`)),console.log(s.gray(` Validation: ${u.validation.status} (${u.validation.errors} error, ${u.validation.warnings} warning)`)),console.log(b?s.gray(` Written: ${b}`):s.gray(" Add --write to persist .workspai/reports/workspace-context-agent.json")),x){for(let A of u.validation.issues)console.log(s.red(`\u274C ${A.severity}:${A.code}:${A.target}`));process.exit(1);}}else if(t==="snapshot"){let y=i("snapshot"),{buildWorkspaceModelSnapshot:m,writeWorkspaceModelSnapshot:g}=await import('./workspace-intelligence-QOGD2TZS.js'),v=await m({workspacePath:y,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:p()}),u=await g(v,y);if(n.json){console.log(JSON.stringify(b$5("workspace snapshot",v,u),null,2));return}console.log(s.green(`\u2714 Workspace model snapshot: ${v.model.workspace.name}`)),console.log(s.gray(` Hash: ${v.modelHash}`)),console.log(s.gray(` Projects: ${v.model.summary.projectCount}`)),console.log(s.gray(` Workspace type: ${v.model.identity.workspaceType}`)),console.log(s.gray(` Written: ${u}`));}else if(t==="diff"){let y=i("diff"),m=n.from||e;m||((n.json===true||a("--json"))&&(console.log(JSON.stringify(c$2({operation:"workspace diff",code:"workspace.diff.from.required",message:"workspace diff requires --from <snapshot-or-model-report|git[:ref]>.",context:{workspacePath:y},examples:["npx workspai workspace diff --from .workspai/reports/workspace-model-snapshot.json --json","npx workspai workspace diff --from .workspai/reports/workspace-model.json --json","npx workspai workspace diff --from git --json"]}),null,2)),process.exit(1)),console.log(s.red("\u274C workspace diff requires --from <snapshot-or-model-report|git[:ref]>")),console.log(s.gray(" npx workspai workspace diff --from .workspai/reports/workspace-model-snapshot.json --json")),console.log(s.gray(" npx workspai workspace diff --from .workspai/reports/workspace-model.json --json")),console.log(s.gray(" npx workspai workspace impact --from .workspai/reports/workspace-model-diff-last-run.json --json")),console.log(s.gray(" npx workspai workspace diff --from git --json (uses snapshot baseline + git working tree)")),process.exit(1));let{diffWorkspaceModel:g,writeWorkspaceModelDiff:v}=await import('./workspace-intelligence-QOGD2TZS.js'),u;try{u=await g({workspacePath:y,fromPath:m,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:p()});}catch(x){throw (n.json===true||a("--json"))&&(console.log(JSON.stringify(c$2({operation:"workspace diff",code:"workspace.diff.input_unreadable",message:x.message,context:{workspacePath:y,fromPath:m},nextActions:["npx workspai workspace snapshot create --json","npx workspai workspace diff --from .workspai/reports/workspace-model-snapshot.json --json"]}),null,2)),process.exit(1)),x}let b=await v(u,y);if(n.json){console.log(JSON.stringify(b$5("workspace diff",u,b),null,2));return}let P=u.summary.changed?s.yellow:s.green;console.log(P(`\u2714 Workspace model diff: ${u.summary.changed?"changed":"clean"}`)),console.log(s.gray(` From: ${u.fromRef}`)),console.log(s.gray(` Added projects: ${u.summary.addedProjects}`)),console.log(s.gray(` Removed projects: ${u.summary.removedProjects}`)),console.log(s.gray(` Changed projects: ${u.summary.changedProjects}`)),console.log(s.gray(` Workspace changes: ${u.summary.workspaceChanges}`)),console.log(s.gray(` Validation changes: ${u.summary.validationChanges}`)),u.git?.available&&console.log(s.gray(` Git: ${u.git.dirty?"dirty":"clean"} (${u.summary.gitChangedFiles} mapped change(s))`));for(let x of u.changes.slice(0,12))console.log(s.gray(` \u2022 ${x.type} ${x.target}: ${x.message}`));u.changes.length>12&&console.log(s.gray(` \u2026 ${u.changes.length-12} more change(s)`)),console.log(s.gray(` Written: ${b}`));}else if(t==="impact"){let y=i("impact"),m=n.from||e;m||((n.json===true||a("--json"))&&(console.log(JSON.stringify(c$2({operation:"workspace impact",code:"workspace.impact.from.required",message:"workspace impact requires --from <workspace-diff-report>.",context:{workspacePath:y},examples:["npx workspai workspace diff --from .workspai/reports/workspace-model-snapshot.json --json","npx workspai workspace impact --from .workspai/reports/workspace-model-diff-last-run.json --json"]}),null,2)),process.exit(1)),console.log(s.red("\u274C workspace impact requires --from <workspace-diff-report>")),console.log(s.gray(" npx workspai workspace impact --from .workspai/reports/workspace-model-diff-last-run.json --json")),process.exit(1));let{buildWorkspaceImpact:g,writeWorkspaceImpact:v}=await import('./workspace-intelligence-QOGD2TZS.js'),u;try{u=await g({workspacePath:y,fromPath:m,scope:n.scope,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:p()});}catch(x){throw (n.json===true||a("--json"))&&(console.log(JSON.stringify(c$2({operation:"workspace impact",code:"workspace.impact.input_unreadable",message:x.message,context:{workspacePath:y,fromPath:m},nextActions:["npx workspai workspace snapshot create --json","npx workspai workspace diff --from .workspai/reports/workspace-model-snapshot.json --json","npx workspai workspace impact --from .workspai/reports/workspace-model-diff-last-run.json --json"]}),null,2)),process.exit(1)),x}let b=await v(u,y);if(n.json){console.log(JSON.stringify(b$5("workspace impact",u,b),null,2));return}let P=u.summary.risk==="critical"||u.summary.risk==="high"?s.red:u.summary.risk==="medium"?s.yellow:s.green;console.log(P(`\u2714 Workspace impact: ${u.summary.risk}`)),console.log(s.gray(` From: ${u.fromRef}`)),console.log(s.gray(` Affected projects: ${u.summary.affectedProjects}`)),console.log(s.gray(` Workspace items: ${u.summary.workspaceItems}`)),console.log(s.gray(` Recommended commands: ${u.summary.recommendedCommands}`));for(let x of u.affectedProjects.slice(0,8))console.log(s.gray(` \u2022 ${x.title}: ${x.summary}`));u.affectedProjects.length>8&&console.log(s.gray(` \u2026 ${u.affectedProjects.length-8} more project(s)`)),console.log(s.gray(` Written: ${b}`));}else if(t==="verify"){let y=i("verify"),{buildWorkspaceVerify:m,writeWorkspaceVerify:g,evaluateWorkspaceVerifyGate:v}=await import('./workspace-verify-NP4GMFSV.js'),u=await m({workspacePath:y,fromImpactPath:n.fromImpact||e,scope:n.scope,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:p()}),b=await g(u,y),P=v(u,{strict:n.strict===true||a("--strict")}),x=P.exitCode,{recordWorkspaceHistory:A,historyEntryFromVerify:I}=await import('./workspace-history-M4QQBIPB.js');if(await A(y,I(u,P.passed)),n.json){console.log(JSON.stringify(b$5("workspace verify",{...u,gate:P},b),null,2)),x!==0&&process.exit(x);return}let W=u.summary.verdict==="ready"?s.green:u.summary.verdict==="needs-attention"?s.yellow:s.red;console.log(W(`\u2714 Workspace verify: ${u.summary.verdict}`)),console.log(s.gray(` Freshness: ${u.freshness.verdict}`)),console.log(s.gray(` Impact risk: ${u.impact.risk}`)),console.log(s.gray(` Steps: ${u.steps.length}`)),console.log(s.gray(` Passed ${u.summary.stepsPassed}, warn ${u.summary.stepsWarn}, failed ${u.summary.stepsFailed}, missing ${u.summary.stepsMissing}`));for(let N of u.steps.slice(0,10))console.log(s.gray(` \u2022 ${N.id}: ${N.status} \u2014 ${N.message}`));if(u.steps.length>10&&console.log(s.gray(` \u2026 ${u.steps.length-10} more step(s)`)),u.policyViolations.length>0){console.log(s.gray(` Policy (${u.policyMode}): ${u.policyViolations.length} violation(s)`));for(let N of u.policyViolations.slice(0,5)){let D=N.severity==="error"?s.red("\u2717"):s.yellow("!");console.log(` ${D} [${N.source}] ${N.code}: ${N.message}`);}}console.log(s.gray(` Gate (${P.mode}): ${P.passed?"passed":"blocked"}`));for(let N of P.reasons.slice(0,5))console.log(s.red(` \u2717 ${N}`));console.log(s.gray(` Written: ${b}`)),x!==0&&process.exit(x);}else if(t==="graph"){let y=i("graph"),{buildWorkspaceModel:m}=await import('./workspace-model-GMSRBICO.js'),{buildGraphEmit:g,renderGraphDot:v,renderGraphMermaid:u,explainGraphNode:b}=await import('./workspace-graph-2A5THUCI.js'),x=(await m({workspacePath:y,includeAbsolutePaths:n.includePaths===true||a("--include-paths"),includeEvidence:n.includeEvidence===true||a("--include-evidence"),observableScanDepth:p()})).graph,A=(e||"emit").toLowerCase();if(x||(n.json&&(console.log(JSON.stringify({command:"workspace graph",action:A,result:"error",workspacePath:y,timestamp:new Date().toISOString(),error:{code:"workspace.graph.missing",message:"Workspace model did not produce a dependency graph."}},null,2)),process.exit(1)),console.log(s.red("\u274C Workspace model did not produce a dependency graph.")),process.exit(1)),A==="dot"){console.log(v(x));return}if(A==="mermaid"){console.log(u(x));return}if(A==="explain"){let W=(n.scope?.replace(/^project:/,"")||o||"").trim();W||(n.json&&(console.log(JSON.stringify({command:"workspace graph explain",result:"error",workspacePath:y,timestamp:new Date().toISOString(),error:{code:"workspace.graph.explain.missing_project",message:"workspace graph explain requires a project."},usage:["npx workspai workspace graph explain <project> --json","npx workspai workspace graph explain --scope project:<name> --json"]},null,2)),process.exit(1)),console.log(s.red("\u274C workspace graph explain requires a project.")),console.log(s.gray(" npx workspai workspace graph explain <project> --json")),console.log(s.gray(" npx workspai workspace graph explain --scope project:<name>")),process.exit(1));let N=b(x,W);if(n.json){console.log(JSON.stringify(N,null,2)),N.found||process.exit(1);return}N.found||(console.log(s.red(`\u274C Project not found in dependency graph: ${W}`)),process.exit(1)),console.log(s.green(`\u2714 Graph explain: ${N.project}`)),N.centrality&&console.log(s.gray(` Centrality: fanIn ${N.centrality.fanIn}, fanOut ${N.centrality.fanOut}, reach ${N.centrality.reach}, betweenness ${N.centrality.betweenness}${N.centrality.isHotspot?" (hotspot)":""}`)),console.log(s.gray(` Direct dependents: ${N.directDependents.join(", ")||"none"}`)),console.log(s.gray(` Direct dependencies: ${N.directDependencies.join(", ")||"none"}`)),console.log(s.gray(` Blast radius (transitive dependents): ${N.transitiveDependents.length}`));for(let D of N.transitiveDependents.slice(0,10))console.log(s.gray(` \u2022 ${D.id} (d${D.distance}, via ${D.via??"\u2014"})`));return}let I=g(x);if(n.json){console.log(JSON.stringify(I,null,2));return}console.log(s.green("\u2714 Workspace dependency graph")),console.log(s.gray(` Nodes: ${I.graph.stats.nodeCount}`)),console.log(s.gray(` Edges: ${I.graph.stats.edgeCount} (inferred ${I.graph.stats.inferredEdges}, contract ${I.graph.stats.contractEdges}, manual ${I.graph.stats.manualEdges})`)),console.log(s.gray(` Integrity: ${I.integrity.ok?"ok":"issues"} (cycles ${I.integrity.stats.cycleCount}, dangling ${I.integrity.stats.danglingCount}, orphans ${I.integrity.stats.orphanCount})`)),console.log(s.gray(` Hotspots: ${I.hotspots.join(", ")||"none"}`)),console.log(s.gray(" Render: workspace graph dot | workspace graph mermaid"));}else if(t==="watch"){let y=i("watch"),{runWorkspaceWatch:m}=await import('./workspace-watch-IIBH3Y25.js'),g=n.once===true||a("--once"),v=n.json===true,u=new AbortController,b=()=>u.abort();process.once("SIGINT",b),process.once("SIGTERM",b),v||console.log(s.green("\u2714 Workspace watch (model + graph kept in memory)")),await m({workspacePath:y,once:g,signal:u.signal,buildOptions:{workspacePath:y,observableScanDepth:p()},onProgress:P=>{v||console.error(s.gray(` ${P}`));},emit:P=>{if(v){console.log(JSON.stringify(P));return}if(P.kind==="ready"){console.log(s.gray(` Ready: ${P.graph.nodeCount} nodes, ${P.graph.edgeCount} edges (hash ${P.modelHash.slice(0,12)})`));return}if(P.kind==="error"){console.error(s.red(` \u2717 Rebuild failed: ${P.error??"unknown error"}`));return}if(P.kind==="unchanged"){console.log(s.gray(` No structural change (${P.mode}, ${P.durationMs}ms)`));return}let x=[];P.changedProjects.length>0&&x.push(`changed: ${P.changedProjects.join(", ")}`),P.addedProjects.length>0&&x.push(`added: ${P.addedProjects.join(", ")}`),P.removedProjects.length>0&&x.push(`removed: ${P.removedProjects.join(", ")}`),P.graph.edgesAdded.length>0&&x.push(`+${P.graph.edgesAdded.length} edges`),P.graph.edgesRemoved.length>0&&x.push(`-${P.graph.edgesRemoved.length} edges`),console.log(s.cyan(` \u21BB Changed (${P.mode}, ${P.durationMs}ms): ${x.join("; ")||"structure updated"}`));}}),process.removeListener("SIGINT",b),process.removeListener("SIGTERM",b),!v&&!g&&console.log(s.gray(" Watch stopped."));return}else if(t==="sync"){let y=i("sync"),{syncWorkspaceProjects:m}=await import('./workspace-FQT3QIRS.js');n.json||console.log(s.cyan(`\u{1F4C2} Scanning workspace: ${C.basename(y)}`));let g=await m(y,n.json===true);await at(y,{silent:n.json===true});let{readWorkspaceRegistrySummary:v}=await import('./workspace-registry-summary-S52SEJAG.js'),u=await v(y);n.json&&console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-sync-v1",workspacePath:y,registry:g,contractSynced:true,registrySummary:u},null,2));}else if(t==="registry"){let y=i("registry"),m=e||"status";m!=="status"&&(console.log(s.red(`\u274C Unknown workspace registry action: ${m}`)),console.log(s.gray(" npx workspai workspace registry status [--refresh] [--json]")),process.exit(1));let{publishWorkspaceRegistrySummary:g,resolveWorkspaceRegisteredProjects:v}=await import('./workspace-registry-summary-S52SEJAG.js'),u=await g(y);if(n.json){console.log(JSON.stringify(u,null,2));return}let b=await v(y);console.log(s.cyan("Workspace registry")),console.log(s.gray(` Authority: ${u.authority}`)),console.log(s.gray(` Projects: ${u.projectCount}`)),console.log(s.gray(` Summary: ${u.registrySummaryPath}`)),b.summary.projectCount===0&&console.log(s.yellow(" No registered projects \u2014 run workspace sync after adding projects."));}else if(t==="foundation"){let y=i("foundation"),m=e||"ensure";m!=="ensure"&&(console.log(s.red(`\u274C Unknown workspace foundation action: ${m}`)),console.log(s.gray(" npx workspai workspace foundation ensure [--force] [--json]")),process.exit(1));let{ensureWorkspaceFoundation:g}=await import('./workspace-foundation-KXDL6P6X.js'),v=await g(y,{force:n.force===true||a("--force")});if(n.json){console.log(JSON.stringify(v,null,2));return}v.created.length>0?console.log(s.green(`\u2714 Workspace foundation ensured: ${v.created.join(", ")}`)):console.log(s.gray("Workspace foundation files are already up to date."));}else if(t==="policy"){let y=i("policy"),m=await wd(y,e,o,r,n.json===true||a("--json"));m!==0&&process.exit(m);}else if(t==="contract"){let y=i("contract"),{buildWorkspaceContractGraph:m,readWorkspaceContract:g,verifyWorkspaceContract:v,writeWorkspaceContract:u,WORKSPACE_CONTRACT_PATH:b}=await import('./workspace-contract-SEI4SNSG.js'),P=e||"inspect",x=l();try{if(P==="init"){let A=await u({workspacePath:y,outputPath:x,force:n.force===true||a("--force")});if(n.json){console.log(JSON.stringify(A,null,2));return}console.log(s.green(`\u2714 Workspace contract initialized: ${A.contractPath}`)),console.log(s.gray(` Projects: ${A.contract.projects.length}`));return}if(P==="inspect"){let A=await g({workspacePath:y,contractPath:x});if(n.json){console.log(JSON.stringify(A,null,2));return}console.log(s.green(`\u2714 Workspace contract: ${A.contractPath}`)),console.log(s.gray(` Workspace: ${A.contract.workspace.name}`)),console.log(s.gray(` Projects: ${A.contract.projects.length}`)),console.log(s.gray(` Schema: v${A.contract.schemaVersion}`));return}if(P==="verify"){let A=await v({workspacePath:y,contractPath:x,strict:n.strict===true||a("--strict")}),{writeWorkspaceContractVerifyEvidence:I}=await import('./workspace-contract-SEI4SNSG.js'),W=await I({workspacePath:y,result:A});if(n.json)console.log(JSON.stringify({...A,evidencePath:W},null,2));else {let N=A.status==="passed"?s.green:s.red;console.log(N(`\u2714 Workspace contract verification ${A.status}: ${A.contractPath}`)),console.log(s.gray(` Projects: ${A.projectCount}`));for(let D of A.checks){let M=D.status==="passed"?"\u2714":"\u2718";console.log(s.gray(` ${M} ${D.id}: ${D.message}`));}for(let D of A.violations)console.log(s.gray(` Violation: ${D}`));}(A.status==="failed"||A.status!=="passed"&&n.strict)&&process.exit(1);return}if(P==="graph"){let A=await m({workspacePath:y,contractPath:x});if(n.json){console.log(JSON.stringify(A,null,2));return}console.log(s.green(`\u2714 Workspace contract graph: ${A.contractPath}`)),console.log(s.gray(` Workspace: ${A.graph.workspace.name}`)),console.log(s.gray(` Projects: ${A.graph.summary.projectCount}`)),console.log(s.gray(` Dependencies: ${A.graph.summary.dependencyEdges}`)),console.log(s.gray(` Event links: ${A.graph.summary.eventEdges}`)),console.log(s.gray(` Ports: ${A.graph.summary.portCount}`));for(let I of A.graph.nodes){let W=I.ports.map(N=>`${N.name}:${N.port}`).join(", ")||"none";console.log(s.gray(` \u2022 ${I.id} (${I.runtime||"unknown"}${I.framework?`/${I.framework}`:""}) ports=${W}`));}for(let I of A.graph.edges){let W=I.type==="event"?`event:${I.label}`:I.label;console.log(s.gray(` ${I.from} -> ${I.to} [${W}]`));}return}console.log(s.red(`\u274C Unknown workspace contract action: ${P}`)),console.log(s.white(` npx workspai workspace contract init|inspect|verify|graph [--output ${b}]`)),process.exit(1);}catch(A){n.json&&(console.log(JSON.stringify({command:`workspace contract ${P}`,result:"error",workspacePath:y,timestamp:new Date().toISOString(),error:{code:`workspace.contract.${P}.failed`,message:A.message}},null,2)),process.exit(1)),console.log(s.red(`\u274C Workspace contract ${P} failed: ${A.message}`)),process.exit(1);}}else if(t==="share"){let y=i("share"),m=l()||e,{createWorkspaceShareBundle:g}=await import('./workspace-FQT3QIRS.js'),v=await g(y,{outputPath:m,includePaths:n.includePaths===true,includeDoctorEvidence:n.doctor!==false,includeBlueprint:n.blueprint!==false});if(n.json){console.log(JSON.stringify({command:"workspace share",result:"ok",timestamp:new Date().toISOString(),workspacePath:y,bundlePath:v,options:{includePaths:n.includePaths===true,includeDoctorEvidence:n.doctor!==false,includeBlueprint:n.blueprint!==false}},null,2));return}console.log(s.green(`\u2714 Workspace share bundle exported: ${v}`)),console.log(s.gray("Share this JSON with your team for reproducible workspace/project diagnostics."));}else if(t==="export"){let y=i("export");try{let{exportWorkspaceArchive:m}=await import('./workspace-archive-EEGLHZDW.js'),g=n.archiveCompression?.trim().toLowerCase()??"store";if(g!=="store"&&g!=="deflate")throw new Error("--archive-compression must be store or deflate.");let v=await m({workspacePath:y,outputPath:l()||e,includeEnv:n.includeEnv===true||a("--include-env"),compression:g});if(n.json){console.log(JSON.stringify(v,null,2));return}let u=(v.bytesWritten/(1024*1024)).toFixed(2);console.log(s.green(`\u2714 Workspace archive exported: ${v.archivePath}`)),console.log(s.gray(` Files: ${v.manifest.files.length}`)),console.log(s.gray(` Size: ${u} MB`)),v.manifest.security.envFilesIncluded||console.log(s.gray(" Secrets: excluded (.env, private keys, logs, dependency caches)"));}catch(m){n.json&&(console.log(JSON.stringify({schemaVersion:c$3,operation:"export",status:"error",timestamp:new Date().toISOString(),error:{code:"workspace.archive.export.failed",message:m.message}},null,2)),process.exit(1)),console.log(s.red(`\u274C Workspace archive export failed: ${m.message}`)),process.exit(1);}}else if(t==="archive"&&(e==="inspect"||e==="verify"||e==="doctor")){let y=o;y||(n.json&&(console.log(JSON.stringify({schemaVersion:c$3,operation:e,status:"error",timestamp:new Date().toISOString(),error:{code:`workspace.archive.${e}.input-required`,message:`workspace archive ${e} requires an archive path or URL.`}},null,2)),process.exit(1)),console.log(s.red(`\u274C workspace archive ${e} requires an archive path or URL.`)),console.log(s.white(` npx workspai workspace archive ${e} team.workspai-archive.zip`)),process.exit(1));let{doctorWorkspaceArchive:m,inspectWorkspaceArchive:g,verifyWorkspaceArchive:v}=await import('./workspace-archive-EEGLHZDW.js');try{if(e==="inspect"){let b=await g({archivePathOrUrl:y,safety:d()});if(n.json){console.log(JSON.stringify(b,null,2));return}let P=(b.totalBytes/(1024*1024)).toFixed(2);console.log(s.green(`\u2714 Workspace archive: ${b.archivePath}`)),console.log(s.gray(` Workspace: ${b.manifest.workspaceName}`)),console.log(s.gray(` Exported: ${b.manifest.exportedAt}`)),console.log(s.gray(` Exporter: ${b.manifest.exportedBy||"unknown"}`)),console.log(s.gray(` Files: ${b.fileCount}`)),console.log(s.gray(` Payload: ${P} MB`));return}if(e==="doctor"){let b=await m({archivePathOrUrl:y,strict:n.strict===true||a("--strict"),safety:d()});if(n.json)console.log(JSON.stringify(b,null,2));else {let P=b.status==="passed"?s.green:b.status==="warning"?s.yellow:s.red;console.log(P(`\u2714 Workspace archive doctor ${b.status}: ${b.archivePath}`)),console.log(s.gray(` Workspace: ${b.workspaceName}`)),console.log(s.gray(` Files: ${b.fileCount}`));for(let x of b.checks){let A=x.status==="passed"?"\u2714":x.status==="warning"?"\u26A0":"\u2718";console.log(s.gray(` ${A} ${x.id}: ${x.message}`));}for(let x of b.recommendedActions)console.log(s.gray(` Next: ${x}`));}(b.status==="failed"||b.status==="warning"&&n.strict)&&process.exit(1);return}let u=await v({archivePathOrUrl:y,requireChecksums:n.strict===true||a("--strict"),safety:d()});if(n.json)console.log(JSON.stringify(u,null,2));else if(u.status==="passed")console.log(s.green(`\u2714 Workspace archive verified: ${u.archivePath}`)),console.log(s.gray(` Files: ${u.verifiedFiles}/${u.fileCount}`));else {let b=u.status==="failed"?s.red:s.yellow;console.log(b(`\u274C Workspace archive verification ${u.status}: ${u.archivePath}`)),u.missingArchiveEntries.length&&console.log(s.gray(` Missing entries: ${u.missingArchiveEntries.join(", ")}`)),u.extraArchiveEntries.length&&console.log(s.gray(` Unexpected entries: ${u.extraArchiveEntries.join(", ")}`)),u.mismatches.length&&console.log(s.gray(` Mismatches: ${u.mismatches.map(P=>P.path).join(", ")}`)),u.missingChecksumFiles.length&&console.log(s.gray(` Missing checksums: ${u.missingChecksumFiles.join(", ")}`));}(u.status==="failed"||u.status==="warning"&&n.strict)&&process.exit(1);}catch(u){n.json&&(console.log(JSON.stringify({schemaVersion:c$3,operation:e,status:"error",timestamp:new Date().toISOString(),archivePathOrUrl:y,error:{code:`workspace.archive.${e}.failed`,message:u.message}},null,2)),process.exit(1)),console.log(s.red(`\u274C Workspace archive ${e} failed: ${u.message}`)),process.exit(1);}}else if(t==="hydrate"||t==="import"){let y=e;y||(n.json&&(console.log(JSON.stringify({schemaVersion:c$3,operation:"hydrate",status:"error",timestamp:new Date().toISOString(),error:{code:`workspace.${t}.input-required`,message:`workspace ${t} requires an archive path or URL.`}},null,2)),process.exit(1)),console.log(s.red(`\u274C workspace ${t} requires an archive path or URL.`)),console.log(s.white(` npx workspai workspace ${t} team.workspai-archive.zip --output ./team`)),process.exit(1));let{hydrateWorkspaceArchive:m}=await import('./workspace-archive-EEGLHZDW.js');try{let g=await m({archivePathOrUrl:y,outputPath:l(),force:n.force===true||a("--force"),dryRun:n.dryRun===true||a("--dry-run"),strict:n.strict===true||a("--strict"),safety:d()});if(n.json){console.log(JSON.stringify(g,null,2));return}console.log(s.green(g.dryRun?`\u2714 Workspace archive hydrate preview: ${g.outputPath}`:`\u2714 Workspace archive hydrated: ${g.outputPath}`)),console.log(s.gray(` Files: ${g.files.length}`)),g.manifest?.workspaceName&&console.log(s.gray(` Workspace: ${g.manifest.workspaceName}`));}catch(g){n.json&&(console.log(JSON.stringify({schemaVersion:c$3,operation:"hydrate",status:"error",timestamp:new Date().toISOString(),archivePathOrUrl:y,...l()?{outputPath:l()}:{},dryRun:n.dryRun===true||a("--dry-run"),error:{code:`workspace.${t}.failed`,message:g.message}},null,2)),process.exit(1)),console.log(s.red(`\u274C Workspace ${t} failed: ${g.message}`)),process.exit(1);}}else if(t==="run"){let y=i(`run ${e||""}`.trim()),m=new Set(["init","test","build","start"]),g=e?.trim()??"";g||(console.log(s.red(`Unknown workspace run stage: ${e||"(none provided)"}`)),console.log(s.gray("Available stages: init | test | build | start | <custom-from-context>")),console.log(s.gray(" \u2022 init \u2014 run install/bootstrap across the project fleet")),console.log(s.gray(" \u2022 test \u2014 run test suite across selected projects")),console.log(s.gray(" \u2022 build \u2014 compile/package across selected projects")),console.log(s.gray(" \u2022 start \u2014 start services (smoke/e2e scenarios)")),console.log(s.gray(" \u2022 custom \u2014 any stage key declared in .workspai/context.json commands")),console.log(s.gray(" Note: dev is excluded \u2014 it is a local-only primitive, not a CI stage")),process.exit(2)),m.has(g)||(!/^[a-z][a-z0-9_-]*$/i.test(g)||g==="dev"||g==="stop")&&(console.log(s.red(`Unknown workspace run stage: ${g}`)),console.log(s.gray("Available stages: init | test | build | start | <custom-from-context>")),process.exit(2));let v=Nn({raw:n.maxWorkers,operation:`workspace run ${g}`,json:n.json===true||a("--json")});if(g==="init"&&n.json!==true){let P=await Ln(y);P!==0&&process.exit(P);}let{runWorkspaceStage:u}=await import('./workspace-run-VC4OUPRF.js'),b=await u({workspacePath:y,stage:g,scope:n.scope,affected:n.affected===true,blastRadius:n.blastRadius===true,since:n.since,parallel:n.parallel===true,maxWorkers:v,continueOnError:n.continueOnError===true,strict:n.strict===true,json:n.json===true,enforceGates:n.gates,reusePassed:n.reusePassed===true});n.json&&console.log(JSON.stringify(b,null,2)),b.summary.exitCode!==0&&process.exit(b.summary.exitCode);}else if(t==="explain"||t==="why"){let y=i(t),{parseWorkspaceExplainTarget:m}=await import('./workspace-explain-contract-KT757JGQ.js'),{buildWorkspaceExplain:g,writeWorkspaceExplainReport:v}=await import('./workspace-explain-MVGGRCDN.js'),u=(e??o??"").trim();!u&&n.scope&&(u=n.scope.startsWith("project:")?n.scope:`project:${n.scope}`),u||(console.log(s.red(`\u274C workspace ${t} requires a target.`)),console.log(s.gray(" npx workspai workspace explain project:<name>|release-blocked [--json] [--write]")),console.log(s.gray(" npx workspai workspace why <project>|release-blocked [--json]")),process.exit(1));let b=m(u);b||(console.log(s.red(`\u274C Invalid explain target: ${u}`)),process.exit(1));let P=await g({workspacePath:y,target:b}),x=n.write===true||a("--write"),A;if(x&&(A=await v(P,y,t==="why"?"why":"explain")),n.json){console.log(JSON.stringify(b$5(`workspace ${t}`,P,A),null,2));return}console.log(s.green(`\u2714 Workspace ${t==="why"?"why":"explain"}: ${P.summary}`));for(let I of P.sections)console.log(s.bold(`
397
+ ${I.title}`)),console.log(I.body);A&&console.log(s.gray(`
398
+ Written: ${A}`));}else if(t==="trace"){let y=i("trace"),m=n.from||e;m||(console.log(s.red("\u274C workspace trace requires --from <diff-ref>")),console.log(s.gray(" npx workspai workspace trace --from .workspai/reports/workspace-model-diff-last-run.json --json")),process.exit(1));let{resolveWorkspaceTraceTarget:g}=await import('./workspace-explain-contract-KT757JGQ.js'),{buildWorkspaceExplain:v,writeWorkspaceExplainReport:u}=await import('./workspace-explain-MVGGRCDN.js'),b=g(m);(!b||b.kind!=="trace")&&(console.log(s.red(`\u274C Invalid trace ref: ${m}`)),console.log(s.gray(" Use a diff artifact path or trace:<path>, e.g. trace:.workspai/reports/workspace-model-diff-last-run.json")),process.exit(1));let P=await v({workspacePath:y,target:b}),x=n.write===true||a("--write"),A;if(x&&(A=await u(P,y,"trace")),n.json){console.log(JSON.stringify(b$5("workspace trace",P,A),null,2));return}console.log(s.green(`\u2714 Workspace trace: ${P.summary}`));for(let I of P.sections)console.log(s.bold(`
399
+ ${I.title}`)),console.log(I.body);A&&console.log(s.gray(`
400
+ Written: ${A}`));}else if(t==="feedback"){let y=i("feedback"),m=(e||"record").toLowerCase();m!=="record"&&(console.log(s.red(`Unknown feedback action: ${m}`)),console.log(s.gray("Available: record")),process.exit(1)),!n.json&&!a("--json")&&(console.log(s.red("\u274C workspace feedback record requires --json (stdin payload)")),console.log(s.gray(` echo '{"actionId":"fix","summary":"ok","outcome":"ok"}' | npx workspai workspace feedback record --json`)),process.exit(1)),process.stdin.isTTY&&(console.log(s.red("\u274C workspace feedback record requires piped JSON on stdin (not a TTY)")),console.log(s.gray(` echo '{"actionId":"fix","summary":"ok","outcome":"ok"}' | npx workspai workspace feedback record --json`)),process.exit(1));let{recordWorkspaceFeedback:g,parseFeedbackStdinPayload:v,readStdinAll:u}=await import('./workspace-feedback-RCB25NFO.js'),b=await u(),P=v(b);P||(console.log(s.red("\u274C Invalid or empty feedback JSON on stdin")),process.exit(1));let x=await g({workspacePath:y,payload:P});n.json?console.log(JSON.stringify(x,null,2)):x.ok?(console.log(s.green("\u2714 Workspace feedback recorded")),console.log(s.gray(` History: ${x.historyPath}`))):console.log(s.red(`\u274C ${x.error??"Failed to record feedback"}`)),x.ok||process.exit(1);}else if(t==="mcp"){let y=i("mcp"),m=(e||"serve").toLowerCase();m!=="serve"&&(n.json&&(console.log(JSON.stringify({command:"workspace mcp",action:m,result:"error",workspacePath:y,timestamp:new Date().toISOString(),error:{code:"workspace.mcp.unknown_action",message:`Unknown mcp action: ${m}`},availableActions:["serve"]},null,2)),process.exit(1)),console.log(s.red(`Unknown mcp action: ${m}`)),console.log(s.gray("Available: serve")),process.exit(1));let{runWorkspaceMcpServe:g}=await import('./workspace-mcp-serve-CEFKEMYG.js');n.json||console.error(s.gray("\u2139 Workspai MCP server (read-mostly) listening on stdio JSON-RPC\u2026")),await g({workspacePath:y});}else if(t==="init"){n.json||(console.log(s.yellow("\u2139 workspace init is an alias of: npx workspai workspace run init")),console.log(s.gray(` Equivalent full-init aliases at workspace root:
365
401
  npx workspai init | npx workspai workspace init | npx workspai workspace run init
366
- `));let c=i("init"),d=Number(n.maxWorkers??""),m=Number.isFinite(d)?Math.max(1,Math.trunc(d)):void 0,p=await bn(c);p!==0&&process.exit(p);let{runWorkspaceStage:u}=await import('./workspace-run-Y7YMUIHX.js'),f=await u({workspacePath:c,stage:"init",scope:n.scope,affected:n.affected===true,blastRadius:n.blastRadius===true,since:n.since,parallel:n.parallel===true,maxWorkers:m,continueOnError:n.continueOnError===true,strict:n.strict===true,json:n.json===true,enforceGates:n.gates});n.json&&console.log(JSON.stringify(f,null,2)),f.summary.exitCode!==0&&process.exit(f.summary.exitCode);}else console.log(s.red(`Unknown workspace action: ${t}`)),console.log(s.gray(`Available: ${Zo.join(", ")}`)),process.exit(1);});function Jt(t){let e="\u2500".repeat(46);console.log(""),console.log(s.gray(e)),console.log(s.bold(t)),console.log(s.gray(e));}function Ta(){let t=n=>n.replace(/\bnpx (?:rapidkit|workspai)\b/g,ke),e=n=>s.gray(t(n)),o=n=>s.cyan(t(n)),r=b()?`${ke} init; ${ke} dev`:`${ke} init && ${ke} dev`;console.log(s.white(`Usage:
367
- `)),console.log(s.cyan(` ${ke} <workspace-name> [options]`)),Nd==="rapidkit"&&console.log(s.gray(` You are using the legacy rapidkit alias. New docs use ${ke}.
402
+ `)));let y=i("init"),m=Nn({raw:n.maxWorkers,operation:"workspace init",json:n.json===true||a("--json")});if(n.json!==true){let u=await Ln(y);u!==0&&process.exit(u);}let{runWorkspaceStage:g}=await import('./workspace-run-VC4OUPRF.js'),v=await g({workspacePath:y,stage:"init",scope:n.scope,affected:n.affected===true,blastRadius:n.blastRadius===true,since:n.since,parallel:n.parallel===true,maxWorkers:m,continueOnError:n.continueOnError===true,strict:n.strict===true,json:n.json===true,enforceGates:n.gates});n.json&&console.log(JSON.stringify(v,null,2)),v.summary.exitCode!==0&&process.exit(v.summary.exitCode);}else (n.json===true||a("--json"))&&(console.log(JSON.stringify(c$2({operation:`workspace ${t}`,code:"workspace.action.unknown",message:`Unknown workspace action: ${t}`,context:{availableActions:fo}}),null,2)),process.exit(1)),console.log(s.red(`Unknown workspace action: ${t}`)),console.log(s.gray(`Available: ${fo.join(", ")}`)),process.exit(1);});function Yt(t){let e="\u2500".repeat(46);console.log(""),console.log(s.gray(e)),console.log(s.bold(t)),console.log(s.gray(e));}function hc(){let t=n=>n.replace(/\bnpx (?:rapidkit|workspai)\b/g,ye),e=n=>s.gray(t(n)),o=n=>s.cyan(t(n)),r=b()?`${ye} init; ${ye} dev`:`${ye} init && ${ye} dev`;console.log(s.white(`Usage:
403
+ `)),console.log(s.cyan(` ${ye} <command> [options]`)),console.log(s.gray(` ${ye} <workspace-name> [options] # shortcut: create workspace`)),vd==="rapidkit"&&console.log(s.gray(` You are using the legacy rapidkit alias. New docs use ${ye}.
368
404
  `)),console.log(s.bold(`Open-Source Workspace Intelligence for Software Systems
369
405
  `)),console.log(s.white("Most AI tools understand files.")),console.log(s.white("Workspai helps developers, CI pipelines, IDEs, and AI agents share the same understanding of a software system.")),console.log(s.dim(`One workspace. One truth. Humans and AI aligned.
370
- `)),Jt("Workspace Lifecycle"),console.log(s.white(`
406
+ `)),Yt("Workspace Lifecycle"),console.log(s.white(`
371
407
  1. Create or adopt a workspace
372
408
  `)),console.log(s.cyan(t(" npx workspai my-workspace"))),console.log(s.cyan(t(" npx workspai adopt /path/to/project"))),console.log(s.cyan(t(` npx workspai import <path|git-url>
373
409
  `))),console.log(s.white(`2. Build a workspace model
@@ -375,18 +411,18 @@ Written: ${k}`));}else if(t==="feedback"){let c=i("feedback"),d=(e||"record").to
375
411
  `))),console.log(s.white(`3. Generate agent-ready context
376
412
  `)),console.log(s.cyan(t(` npx workspai workspace context --for-agent --json --write
377
413
  `))),console.log(s.white(`4. Analyze change impact
378
- `)),console.log(s.cyan(t(` npx workspai workspace impact --from <snapshot>
414
+ `)),console.log(s.cyan(t(` npx workspai workspace impact --from <diff>
379
415
  `))),console.log(s.white(`5. Verify release readiness
380
416
  `)),console.log(s.cyan(t(" npx workspai workspace verify --strict"))),console.log(s.cyan(t(` npx workspai pipeline --strict
381
417
  `))),console.log(s.white(`6. Explain blockers and trace change impact
382
418
  `)),console.log(s.cyan(t(" npx workspai workspace explain release-blocked --json --write"))),console.log(s.cyan(t(` npx workspai workspace trace --from .workspai/reports/workspace-model-diff-last-run.json --json --write
383
- `))),Jt("Workspace Intelligence"),console.log(s.white(`
419
+ `))),Yt("Workspace Intelligence"),console.log(s.white(`
384
420
  What projects exist?
385
421
  `)),console.log(s.cyan(t(` npx workspai workspace model --json
386
422
  `))),console.log(s.white(`What should AI agents know?
387
423
  `)),console.log(s.cyan(t(` npx workspai workspace context --for-agent --json --write
388
424
  `))),console.log(s.white(`What breaks if this changes?
389
- `)),console.log(s.cyan(t(` npx workspai workspace impact --from <snapshot>
425
+ `)),console.log(s.cyan(t(` npx workspai workspace impact --from <diff>
390
426
  `))),console.log(s.white(`Is this change safe?
391
427
  `)),console.log(s.cyan(t(` npx workspai workspace verify --strict
392
428
  `))),console.log(s.white(`Why is release blocked?
@@ -397,7 +433,7 @@ What projects exist?
397
433
  `)),console.log(s.cyan(t(` npx workspai workspace agent-sync --write
398
434
  `))),console.log(s.white(`Expose evidence to MCP clients?
399
435
  `)),console.log(s.cyan(t(` npx workspai workspace mcp serve
400
- `))),Jt("Workspace Operations"),console.log(s.white(`
436
+ `))),Yt("Workspace Operations"),console.log(s.white(`
401
437
  Create workspace
402
438
  `)),console.log(s.cyan(t(` npx workspai my-workspace
403
439
  `))),console.log(s.white(`Bootstrap toolchains
@@ -409,7 +445,7 @@ Create workspace
409
445
  `)),console.log(s.cyan(t(` npx workspai adopt /path/to/project
410
446
  `))),console.log(s.white(`Import repository
411
447
  `)),console.log(s.cyan(t(` npx workspai import <path|git-url>
412
- `))),Jt("Governance & Release"),console.log(s.white(`
448
+ `))),Yt("Governance & Release"),console.log(s.white(`
413
449
  Analyze workspace
414
450
  `)),console.log(s.cyan(t(` npx workspai analyze
415
451
  `))),console.log(s.white(`Check readiness
@@ -420,7 +456,7 @@ Analyze workspace
420
456
  `)),console.log(s.cyan(t(` npx workspai snapshot create
421
457
  `))),console.log(s.white(`Archive project
422
458
  `)),console.log(s.cyan(t(` npx workspai project archive
423
- `))),Jt("Agent Grounding"),console.log(s.white(`
459
+ `))),Yt("Agent Grounding"),console.log(s.white(`
424
460
  Generate context pack
425
461
  `)),console.log(s.cyan(t(` npx workspai workspace context --for-agent
426
462
  `))),console.log(s.white(`Sync agent surfaces
@@ -429,26 +465,26 @@ Generate context pack
429
465
  `)),console.log(s.cyan(t(` npx workspai workspace mcp serve
430
466
  `))),console.log(s.white(`Supported ecosystems:
431
467
  `)),console.log(s.gray(` Copilot \xB7 Cursor \xB7 Claude Code \xB7 Codex \xB7 MCP-ready tools
432
- `)),Jt("Mental Model"),console.log(s.gray(`
433
- Repository`)),console.log(s.gray(" \u2193")),console.log(s.gray(" Workspace")),console.log(s.gray(" \u2193")),console.log(s.gray(" Workspace Intelligence")),console.log(s.gray(" \u2193")),console.log(s.gray(` Developers \xB7 CI \xB7 IDEs \xB7 AI Agents
468
+ `)),Yt("Mental Model"),console.log(s.gray(`
469
+ Repository`)),console.log(s.gray(" \u2193")),console.log(s.gray(" Workspace Intelligence")),console.log(s.gray(" \u2193")),console.log(s.gray(` Developers \xB7 CI \xB7 IDEs \xB7 AI Agents
434
470
  `)),console.log(s.dim(`Workspai turns projects and repositories into a shared, evidence-backed understanding of a software system.
435
- `)),console.log(s.bold("Quick start \u2014 workspace workflow:")),console.log(s.cyan(`${ke} my-workspace `)+s.gray("# Create workspace (interactive profile picker)")),console.log(s.cyan(` cd ${v.join(g(),"my-workspace")}`)+s.gray(" # default managed location")),console.log(o(" npx workspai my-workspace --here ")+s.gray("# Create in current directory, then cd my-workspace")),console.log(o(" npx workspai bootstrap ")+s.gray("# Bootstrap all runtime toolchains")),console.log(o(" npx workspai create project nextjs web ")+s.gray("# Frontend (Next.js)")),console.log(o(" npx workspai create project fastapi.standard api ")+s.gray("# Backend (FastAPI)")),console.log(s.cyan(" cd my-api")),console.log(s.cyan(` ${r}
471
+ `)),console.log(s.bold("Quick start \u2014 workspace workflow:")),console.log(s.cyan(`${ye} my-workspace `)+s.gray("# Create workspace (interactive profile picker)")),console.log(s.cyan(" cd ~/.workspai/workspaces/my-workspace")+s.gray(" # default managed location")),console.log(o(" npx workspai my-workspace --here ")+s.gray("# Create in current directory, then cd my-workspace")),console.log(o(" npx workspai bootstrap ")+s.gray("# Bootstrap all runtime toolchains")),console.log(o(" npx workspai create project nextjs web ")+s.gray("# Frontend (Next.js)")),console.log(o(" npx workspai create project fastapi.standard api ")+s.gray("# Backend (FastAPI)")),console.log(s.cyan(" cd api")),console.log(s.cyan(` ${r}
436
472
  `)),console.log(s.bold("Installed command:")),console.log(s.gray(" npm install -g workspai")),console.log(s.gray(" workspai create project Scaffold a new project")),console.log(s.gray(" workspai init Install project dependencies")),console.log(s.gray(" workspai dev Start dev server")),console.log(s.gray(" workspai workspace list List registered workspaces")),console.log(s.gray(" workspai import <path|git-url> Copy or clone a project")),console.log(s.gray(` workspai adopt [path] Link an existing local project
437
473
  `)),console.log(s.bold("Workspace profiles (asked during creation):")),console.log(s.gray(" minimal Foundation files only \u2014 fastest bootstrap (default)")),console.log(s.gray(" java-only Java runtime (Spring Boot services)")),console.log(s.gray(" python-only Python + Poetry (FastAPI, Django, ML)")),console.log(s.gray(" node-only Node.js runtime (NestJS, Express, Next.js)")),console.log(s.gray(" go-only Go runtime (Fiber, Gin, gRPC)")),console.log(s.gray(" dotnet-only .NET runtime (ASP.NET Core services)")),console.log(s.gray(" polyglot Python + Node.js + Go + Java + .NET multi-runtime")),console.log(s.gray(` enterprise Polyglot + governance + Sigstore
438
474
  `)),console.log(s.gray(` Tip: use --skip-python-engine for a Python-aware Workspace Intelligence shell first; after creating a RapidKit Core module-enabled project, run workspace run init to install the local Python engine.
439
- `)),console.log(s.bold("Workspace commands (inside a workspace):")),console.log(e(" npx workspai bootstrap [--profile <p>] Re-bootstrap toolchains")),console.log(e(" npx workspai analyze [--json --strict] Analyze workspace health and gaps")),console.log(e(" npx workspai pipeline [--json --strict] Governance loop: sync \u2192 doctor \u2192 analyze \u2192 readiness \u2192 autopilot")),console.log(e(" npx workspai readiness [--json --strict] Release readiness gates (env/doctor/analyze/verify/deps)")),console.log(e(" npx workspai doctor workspace [--ci] Workspace health with CI exit codes")),console.log(e(" npx workspai workspace list List registered workspaces")),console.log(e(" npx workspai workspace model --json Build workspace intelligence model")),console.log(e(" npx workspai workspace context --for-agent --json --write Build agent context + sync grounding")),console.log(e(" npx workspai workspace agent-sync --write --refresh-context Sync the Agent Customization Pack")),console.log(e(" npx workspai workspace snapshot --json Persist workspace intelligence snapshot")),console.log(e(" npx workspai workspace diff --from <file|git[:ref]> --json Diff current model against a snapshot")),console.log(e(" npx workspai workspace impact --from <file> --json Build blast radius from model diff")),console.log(e(" npx workspai workspace verify [--strict] --json Evaluate impact verification evidence")),console.log(e(" npx workspai workspace explain <target> [--write] --json Narrative for blockers/projects (alias: why)")),console.log(e(" npx workspai workspace trace --from <diff> [--write] --json Diff \u2192 blast radius \u2192 gates narrative")),console.log(e(" npx workspai workspace feedback record --json Append agent action outcome to intelligence history")),console.log(e(" npx workspai workspace mcp serve Read-mostly stdio MCP over workspace evidence")),console.log(e(" npx workspai workspace graph [emit|explain|dot|mermaid] Inspect/visualize dependency graph")),console.log(e(" npx workspai workspace watch [--once] [--json] Keep model+graph in memory; stream change events")),console.log(e(" npx workspai workspace run <stage> [--scope project:<name>] [--reuse-passed] Fleet init/test/build/start or custom stage")),console.log(e(" npx workspai workspace sync [--json] Sync registry + contract from projects")),console.log(e(" npx workspai workspace registry status [--refresh] [--json] Canonical project registry summary")),console.log(e(" npx workspai import <path|git-url> Copy or clone a backend project into this workspace")),console.log(e(" npx workspai adopt [path] Link an existing local project to a workspace")),console.log(e(" npx workspai snapshot create [name] Create a recoverable workspace snapshot")),console.log(e(" npx workspai snapshot restore <name> Restore snapshot metadata with safety guard")),console.log(e(" npx workspai snapshot inspect <name> Inspect snapshot manifest and size")),console.log(e(" npx workspai project archive <name> Archive a project with a safety snapshot")),console.log(e(" npx workspai project restore <archive> Restore an archived project safely")),console.log(e(" npx workspai workspace share [--output <file>] Export collaboration bundle")),console.log(e(" npx workspai workspace foundation ensure Ensure workspace.json/policies/toolchain files")),console.log(e(" npx workspai workspace contract init Create workspace service contract")),console.log(e(" npx workspai workspace contract verify Verify service ports/dependencies")),console.log(e(" npx workspai workspace contract graph Show service dependency graph")),console.log(e(" npx workspai workspace export --output <file> Export portable workspace archive")),console.log(e(" npx workspai workspace archive verify <file> Verify archive integrity")),console.log(e(" npx workspai workspace archive doctor <file> Diagnose archive readiness")),console.log(e(" npx workspai workspace hydrate <archive> --output <dir> Hydrate workspace archive")),console.log(e(" npx workspai workspace policy show Show effective workspace policies")),console.log(e(" npx workspai workspace policy set <k> <v> Update workspace policy values")),console.log(e(" npx workspai setup python|node|go|java|dotnet [--warm-deps] Set up runtime (+ optional deps warm-up)")),console.log(e(" npx workspai mirror [status|sync|verify|rotate] Registry mirror management")),console.log(e(" npx workspai cache [status|clear|prune|repair] Package cache management")),console.log(e(" npx workspai infra plan Discover and generate infra compose")),console.log(e(` npx workspai infra up|down|status Manage Docker sidecar infrastructure
475
+ `)),console.log(s.bold("Workspace commands (inside a workspace):")),console.log(e(" npx workspai bootstrap [--profile <p>] Re-bootstrap toolchains")),console.log(e(" npx workspai analyze [--json --strict] Analyze workspace health and gaps")),console.log(e(" npx workspai pipeline [--json --strict --no-agent-sync] Governance loop: sync \u2192 doctor \u2192 analyze \u2192 readiness \u2192 autopilot")),console.log(e(" npx workspai readiness [--workspace <path>] [--json --strict] Release readiness gates (env/doctor/analyze/verify/deps)")),console.log(e(" npx workspai doctor workspace [--ci] Workspace health with CI exit codes")),console.log(e(" npx workspai workspace list List registered workspaces")),console.log(e(" npx workspai workspace model --json Build workspace intelligence model")),console.log(e(" npx workspai workspace context --for-agent --json --write Build agent context + sync grounding")),console.log(e(" npx workspai workspace agent-sync --write --refresh-context Sync the Agent Customization Pack")),console.log(e(" npx workspai workspace snapshot --json Persist workspace intelligence snapshot")),console.log(e(" npx workspai workspace diff --from <file|git[:ref]> --json Diff current model against a snapshot")),console.log(e(" npx workspai workspace impact --from <diff> --json Build blast radius from model diff")),console.log(e(" npx workspai workspace verify [--strict] --json Evaluate impact verification evidence")),console.log(e(" npx workspai workspace explain <target> [--write] --json Narrative for blockers/projects (alias: why)")),console.log(e(" npx workspai workspace trace --from <diff> [--write] --json Diff \u2192 blast radius \u2192 gates narrative")),console.log(e(" npx workspai workspace feedback record --json Append agent action outcome to intelligence history")),console.log(e(" npx workspai workspace mcp serve Read-mostly stdio MCP over workspace evidence")),console.log(e(" npx workspai workspace graph [emit|explain|dot|mermaid] Inspect/visualize dependency graph")),console.log(e(" npx workspai workspace watch [--once] [--json] Keep model+graph in memory; stream change events")),console.log(e(" npx workspai workspace run <stage> [--scope project:<name>] [--reuse-passed] Fleet init/test/build/start or custom stage")),console.log(e(" npx workspai workspace sync [--json] Sync registry + contract from projects")),console.log(e(" npx workspai workspace registry status [--refresh] [--json] Canonical project registry summary")),console.log(e(" npx workspai import <path|git-url> Copy or clone a project into this workspace")),console.log(e(" npx workspai adopt [path] Link an existing local project to a workspace")),console.log(e(" npx workspai snapshot create [name] Create a recoverable workspace snapshot")),console.log(e(" npx workspai snapshot restore <name> Restore snapshot metadata with safety guard")),console.log(e(" npx workspai snapshot inspect <name> Inspect snapshot manifest and size")),console.log(e(" npx workspai project archive <name> Archive a project with a safety snapshot")),console.log(e(" npx workspai project restore <archive> Restore an archived project safely")),console.log(e(" npx workspai workspace share [--output <file>] Export collaboration bundle")),console.log(e(" npx workspai workspace foundation ensure Ensure workspace.json/policies/toolchain files")),console.log(e(" npx workspai workspace contract init Create workspace service contract")),console.log(e(" npx workspai workspace contract verify Verify service ports/dependencies")),console.log(e(" npx workspai workspace contract graph Show service dependency graph")),console.log(e(" npx workspai workspace export --output <file> Export portable workspace archive")),console.log(e(" npx workspai workspace archive verify <file> Verify archive integrity")),console.log(e(" npx workspai workspace archive doctor <file> Diagnose archive readiness")),console.log(e(" npx workspai workspace hydrate <archive> --output <dir> Hydrate workspace archive")),console.log(e(" npx workspai workspace policy show Show effective workspace policies")),console.log(e(" npx workspai workspace policy set <k> <v> Update workspace policy values")),console.log(e(" npx workspai setup python|node|go|java|dotnet [--warm-deps] Set up runtime (+ optional deps warm-up)")),console.log(e(" npx workspai mirror [status|sync|verify|rotate] Registry mirror management")),console.log(e(" npx workspai cache [status|clear|prune|repair] Package cache management")),console.log(e(" npx workspai infra plan Discover and generate infra compose")),console.log(e(` npx workspai infra up|down|status Manage Docker sidecar infrastructure
440
476
  `)),console.log(s.bold("Options (workspace creation):")),console.log(s.gray(" -y, --yes Skip prompts and use defaults")),console.log(s.gray(" --author <name> Author/team name for workspace metadata")),console.log(s.gray(" --skip-git Skip git initialization")),console.log(s.gray(" --debug Enable debug logging")),console.log(s.gray(" --dry-run Show what would be created")),console.log(s.gray(" --create-workspace When creating a project outside a workspace: create and register a workspace in the current directory")),console.log(s.gray(" --no-workspace When creating a project outside a workspace: do not create a workspace")),console.log(s.gray(` --no-update-check Skip checking for updates
441
- `)),console.log(s.bold("Project commands (inside a project):")),console.log(e(" npx workspai create project Scaffold a new project")),console.log(s.gray(" cd my-api Change directory to the new project")),console.log(e(" npx workspai init Install project dependencies")),console.log(e(" npx workspai dev Start dev server")),console.log(e(" npx workspai build Build for production")),console.log(e(` npx workspai test Run tests
477
+ `)),console.log(s.bold("Project commands (inside a project):")),console.log(e(" npx workspai create project Scaffold a new project")),console.log(s.gray(" cd my-project Change directory to the new project")),console.log(e(" npx workspai init Install project dependencies")),console.log(e(" npx workspai dev Start dev server")),console.log(e(" npx workspai build Build for production")),console.log(e(` npx workspai test Run tests
442
478
  `)),console.log(s.bold("Flags clarification:")),console.log(s.gray(" --skip-install npm fast-path for lock/dependency steps")),console.log(s.gray(` --skip-essentials core flag for skipping essential module installation
443
- `)),Wd?(console.log(s.bold("Legacy (shown because RAPIDKIT_SHOW_LEGACY=1):")),console.log(s.gray(" npx workspai my-project --template fastapi")),console.log(s.gray(" npx workspai my-project --template nestjs")),console.log(s.gray(" npx workspai my-project --template springboot")),console.log(s.gray(" npx workspai my-project --template gofiber")),console.log(s.gray(" npx workspai my-project --template gogin")),console.log(s.gray(" npx workspai my-project --template dotnet")),console.log(s.gray(` --skip-install Fast-path lock/deps (legacy template mode) \u2014 not same as --skip-essentials
479
+ `)),Pd?(console.log(s.bold("Legacy (shown because RAPIDKIT_SHOW_LEGACY=1):")),console.log(s.gray(" npx workspai my-project --template fastapi")),console.log(s.gray(" npx workspai my-project --template nestjs")),console.log(s.gray(" npx workspai my-project --template springboot")),console.log(s.gray(" npx workspai my-project --template gofiber")),console.log(s.gray(" npx workspai my-project --template gogin")),console.log(s.gray(" npx workspai my-project --template dotnet")),console.log(s.gray(` --skip-install Fast-path lock/deps (legacy template mode) \u2014 not same as --skip-essentials
444
480
  `))):console.log(s.gray(`Tip: set RAPIDKIT_SHOW_LEGACY=1 to show legacy template flags in help.
445
- `));}var Pa="__rapidkit_signal_handlers_registered__",ba=globalThis;ba[Pa]||(ba[Pa]=true,process.on("SIGINT",async()=>{if(!ar){if(ar=true,console.log(s.yellow(`
481
+ `));}var ec="__rapidkit_signal_handlers_registered__",tc=globalThis;tc[ec]||(tc[ec]=true,process.on("SIGINT",async()=>{if(!Cr){if(Cr=true,console.log(s.yellow(`
446
482
 
447
- \u26A0\uFE0F Interrupted by user`)),dt&&await E__default.pathExists(dt)){console.log(s.gray("Cleaning up partial installation..."));try{await E__default.remove(dt),console.log(s.green("\u2713 Cleanup complete"));}catch(t){f.debug("Cleanup failed:",t);}}b$6(130,"Interrupted by user"),process.exit(130);}}),process.on("SIGTERM",async()=>{if(!ar){if(ar=true,f.debug("Received SIGTERM"),dt&&await E__default.pathExists(dt))try{await E__default.remove(dt);}catch(t){f.debug("Cleanup failed:",t);}b$6(143,"Terminated"),process.exit(143);}}));var Ld=process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test",Jd=(()=>{let t=process.argv[1];if(!t)return false;let e=t.replace(/\\/g,"/"),o=e.endsWith("/dist/index.js")||e.endsWith("/src/index.ts");try{return P.realpathSync(t)===P.realpathSync(fileURLToPath(import.meta.url))||o}catch{return v.resolve(t)===v.resolve(fileURLToPath(import.meta.url))||o}})(),Kd=!Ld||Jd;function Gd(){for(let t of [process.stdout,process.stderr])t._handle?.setBlocking?.(true);}function Ud(){for(let t of [process.stdout,process.stderr]){if(t.isTTY)continue;let e=t;if(e.__rapidkitSyncWriteInstalled)continue;let o=t.fd;if(typeof o!="number")continue;let r=t.write.bind(t);e.write=((n,i,a)=>{let l=typeof i=="string"?i:"utf8",c=typeof i=="function"?i:typeof a=="function"?a:void 0;try{let d=typeof n=="string"?Buffer.from(n,l):n instanceof Uint8Array?Buffer.from(n):Buffer.from(String(n),l);return P.writeSync(o,d),c?.(),true}catch{return r(n,l,c)}}),e.__rapidkitSyncWriteInstalled=true;}}async function ae(t){b$6(t),await new Promise(e=>setImmediate(e)),await new Promise(e=>setTimeout(e,25)),await Promise.all([process.stdout,process.stderr].map(e=>new Promise(o=>{e.write("",()=>o());}))),process.exit(t);}async function Sa(t,e=0){return P.writeSync(process.stdout.fd??1,t),ae(e)}if(Kd){Gd(),Ud(),d$3(),a$2({argv:process.argv,cwd:process.cwd(),rapidkitVersion:c()}),c$2(process.argv);let t=process.argv.slice(2),e$2=t[0],o$1=process.cwd(),r=Ue(o$1),n=p(o$1,"project.json").some(m=>P.existsSync(m)),i=fd(),a$1=pa(t),l=i&&ao(t),c$1=e$2==="init"&&r&&!n;(t.length===0||t.length===1&&(e$2==="--help"||e$2==="-h"||e$2==="help"))&&(a("npm cli"),Ta(),await ae(0)),t.some(m=>m==="--version"||m==="-V"||m==="-v")&&!t.some(m=>m==="--help"||m==="-h"||m==="help")&&(t.includes("--json")?await Sa(`${JSON.stringify(hd(),null,2)}
448
- `):await Sa(`${c()}
449
- `)),kn(t)&&await ae(0),l&&ua(e$2)?(async()=>{e$2==="bootstrap"&&await ae(await ha(t)),e$2==="setup"&&await ae(await ya(t)),e$2==="cache"&&await ae(await wa(t)),await ae(await ka(t));})().catch(m=>{process.stderr.write(`Workspai CLI failed to run ${e$2}: ${m?.message??m}
450
- `),process.exit(1);}):a$1||l?se.parseAsync().then(()=>ae(0)).catch(m=>{process.stderr.write(`Workspai CLI failed: ${m?.message??m}
451
- `),process.exit(1);}):c$1?Sn(t).then(m=>ae(m)).catch(m=>{process.stderr.write(`Workspai CLI failed to run workspace init: ${m?.message??m}
452
- `),process.exit(1);}):Od().then(async m$1=>{if(!m$1){let p=process.argv.slice(2);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[workspai-cli] argv=${JSON.stringify(p)}
453
- `),pa(p)){await se.parseAsync();return}if(kn(p)&&await ae(0),p[0]==="create"){let f=await Ra(p);await ae(f);}if(p[0]==="init"){let f=await Sn(p);await ae(f);}if(ua(p[0])){if(p[0]==="bootstrap"){let g=await ha(p);await ae(g);}if(p[0]==="setup"){let g=await ya(p);await ae(g);}if(p[0]==="cache"){let g=await wa(p);await ae(g);}let f=await ka(p);await ae(f);}if(m(p[0])){if(vn(p))return;let f=p[0],g=d$4(process.cwd()),h=await bt(process.cwd()),k=oe(process.cwd()),b=false;if(k){let S=o(k,"policies.yml").find(A=>P.existsSync(A));if(S&&await E__default.pathExists(S))try{let A=await P.promises.readFile(S,"utf-8");if(b=((A.match(/^\s*enforcement_mode:\s*(warn|strict)\s*(?:#.*)?$/m)??A.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m))?.[1]??"warn")==="strict",b){let te=o(k,"toolchain.lock").find(U=>P.existsSync(U)),K=[];if(!te||!await E__default.pathExists(te))K.push("toolchain.lock is missing \u2014 run `workspai bootstrap` first (strict mode requires a reproducible toolchain).");else try{let D=JSON.parse(await P.promises.readFile(te,"utf-8")).runtime??{};e$1(g,process.cwd())&&!D.go?.version&&K.push("Go runtime version is not pinned in toolchain.lock \u2014 run `workspai setup go` first."),f$3(g,process.cwd())&&!D.node?.version&&K.push("Node runtime version is not pinned in toolchain.lock \u2014 run `workspai setup node` first."),g$2(g,process.cwd())&&!D.java?.version&&K.push("Java runtime version is not pinned in toolchain.lock \u2014 run `workspai setup java` first."),h$2(g,process.cwd())&&!D.dotnet?.version&&K.push(".NET runtime version is not pinned in toolchain.lock \u2014 run `workspai setup dotnet` first."),i$2(g,process.cwd())&&!D.python?.version&&K.push("Python runtime version is not pinned in toolchain.lock \u2014 run `workspai setup python` first.");}catch{K.push("toolchain.lock is invalid JSON \u2014 regenerate it with `workspai bootstrap` before running commands in strict mode.");}let B=o(k,"workspace.json").find(U=>P.existsSync(U));if(B&&await E__default.pathExists(B))try{let D=JSON.parse(await P.promises.readFile(B,"utf-8")).profile??"",R=i$3(process.cwd(),g),ue=lt({profile:D,runtime:R.runtime,subjectLabel:v.basename(process.cwd()),mode:"strict"});ue.ok||K.push(`${ue.message} Update the workspace profile or use a polyglot workspace.`);}catch{}if(K.length>0){console.log(s.red(`\u274C Strict policy violations block \`${f}\`:`));for(let U of K)console.log(s.red(` \u2022 ${U}`));console.log(s.gray("\u{1F4A1} Fix violations or switch to warn mode: set mode: warn in .workspai/policies.yml")),await ae(1);}}}catch{}}let w=await a$3({startPath:process.cwd(),action:f,writeReport:true}),y=b||process.env.RAPIDKIT_LIFECYCLE_ENFORCE_READINESS==="1"||process.env.RAPIDKIT_ENFORCE_READINESS==="1";if(w.blocking&&y){console.log(s.red(`\u274C Release readiness blocks \`${f}\`:`));for(let S of w.blockingReasons)console.log(s.red(` \u2022 ${S}`));w.evidencePath&&console.log(s.gray(`\u2139\uFE0F Readiness evidence: ${w.evidencePath}`)),await ae(1);}w.overallStatus!=="pass"&&!y&&(console.log(s.yellow(`\u26A0\uFE0F Release readiness is ${w.overallStatus}. Command continues in warn mode.`)),w.evidencePath&&console.log(s.gray(` Evidence: ${w.evidencePath} (set RAPIDKIT_LIFECYCLE_ENFORCE_READINESS=1 to block)`)));let x=await Wa(process.cwd(),async()=>{if(e$1(g,process.cwd())||h==="go"){let S=Je("go",{runCommandInCwd:z,runCoreRapidkit:e});if(f==="lint")return ee(await S.runLint?.(process.cwd())??{exitCode:1,message:"Lint is not supported."});if(f==="format")return ee(await S.runFormat?.(process.cwd())??{exitCode:1,message:"Format is not supported."});let A=f==="dev"?await S.runDev(process.cwd()):f==="test"?await S.runTest(process.cwd()):f==="build"?await S.runBuild(process.cwd()):await S.runStart(process.cwd());return A.message&&console.log(s.red(`\u274C ${A.message}`)),A.exitCode}if(g$2(g,process.cwd())||h==="java")return f==="dev"?await tt("dev",process.cwd()):f==="test"?await tt("test",process.cwd()):f==="build"?await tt("build",process.cwd()):f==="lint"?await tt("lint",process.cwd()):f==="format"?await tt("format",process.cwd()):await tt("start",process.cwd());if(h$2(g,process.cwd())||h==="dotnet"){let S=Je("dotnet",{runCommandInCwd:z,runCoreRapidkit:e});if(f==="lint")return ee(await S.runLint?.(process.cwd())??{exitCode:1,message:"Lint is not supported."});if(f==="format")return ee(await S.runFormat?.(process.cwd())??{exitCode:1,message:"Format is not supported."});let A=f==="dev"?await S.runDev(process.cwd()):f==="test"?await S.runTest(process.cwd()):f==="build"?await S.runBuild(process.cwd()):await S.runStart(process.cwd());return A.message&&console.log(s.red(`\u274C ${A.message}`)),A.exitCode}if(f$3(g,process.cwd())||h==="node")return f==="dev"?await Pt("dev",process.cwd()):f==="test"?await Pt("test",process.cwd()):f==="build"?await Pt("build",process.cwd()):f==="lint"?await Pt("lint",process.cwd()):f==="format"?await Pt("format",process.cwd()):await Pt("start",process.cwd());if(i$2(g,process.cwd())||h==="python"){if(f==="lint"||f==="format")return await e([f],{cwd:process.cwd()});let S=Je("python",{runCommandInCwd:z,runCoreRapidkit:e});return ee(f==="dev"?await S.runDev(process.cwd()):f==="test"?await S.runTest(process.cwd()):f==="build"?await S.runBuild(process.cwd()):await S.runStart(process.cwd()))}return -1});if(!x.ok){await ae(x.code);return}if(x.ok&&x.value>=0){await ae(x.value);return}if(x.ok&&x.value===-1){console.error(s.red(`\u274C Workspai cannot run \`${f}\` for this project runtime.`)),console.error(s.gray("Run `workspai project commands` to inspect supported commands.")),await ae(1);return}}if(vn(p))return;let u=await Dd(p);if(process.env.RAPIDKIT_NPM_DEBUG_ARGS==="1"&&process.stderr.write(`[workspai-cli] shouldForwardToCore=${u}
454
- `),u){let f=await e(p,{cwd:process.cwd()});await ae(f);}await se.parseAsync();}});}export{Ia as COMMAND_CAPABILITIES_SCHEMA_VERSION,ld as NPM_ONLY_SCOPED_COMMANDS,Ea as NPM_ONLY_TOP_LEVEL_COMMANDS,gd as VERSION_CONTRACT_SCHEMA_VERSION,dd as WRAPPER_ORCHESTRATED_PROJECT_COMMANDS,kd as detectWindowsDoctorWorkspaceShadow,yd as getGlobalCommandCapabilities,tr as getPublishedContractVersions,hd as getVersionContract,_d as handleAdoptCommand,ha as handleBootstrapCommand,wa as handleCacheCommand,Ra as handleCreateOrFallback,Ed as handleImportCommand,Sn as handleInitCommand,ka as handleMirrorCommand,ya as handleSetupCommand,bn as installWorkspaceDependencies,fd as isNpmExecInvocation,Dd as shouldForwardToCore};
483
+ \u26A0\uFE0F Interrupted by user`)),yt&&await R__default.pathExists(yt)){console.log(s.gray("Cleaning up partial installation..."));try{await R__default.remove(yt),console.log(s.green("\u2713 Cleanup complete"));}catch(t){f.debug("Cleanup failed:",t);}}b$6(130,"Interrupted by user"),process.exit(130);}}),process.on("SIGTERM",async()=>{if(!Cr){if(Cr=true,f.debug("Received SIGTERM"),yt&&await R__default.pathExists(yt))try{await R__default.remove(yt);}catch(t){f.debug("Cleanup failed:",t);}b$6(143,"Terminated"),process.exit(143);}}));var Sd=process.env.VITEST==="true"||process.env.VITEST==="1"||process.env.NODE_ENV==="test",xd=(()=>{let t=process.argv[1];if(!t)return false;let e=t.replace(/\\/g,"/"),o=e.endsWith("/dist/index.js")||e.endsWith("/src/index.ts");try{return S.realpathSync(t)===S.realpathSync(fileURLToPath(import.meta.url))||o}catch{return C.resolve(t)===C.resolve(fileURLToPath(import.meta.url))||o}})(),Ed=!Sd||xd;function Rd(){for(let t of [process.stdout,process.stderr])t._handle?.setBlocking?.(true);}function _d(){for(let t of [process.stdout,process.stderr]){if(t.isTTY)continue;let e=t;if(e.__rapidkitSyncWriteInstalled)continue;let o=t.fd;if(typeof o!="number")continue;let r=t.write.bind(t);e.write=((n,i,a)=>{let c=typeof i=="string"?i:"utf8",l=typeof i=="function"?i:typeof a=="function"?a:void 0;try{let p=typeof n=="string"?Buffer.from(n,c):n instanceof Uint8Array?Buffer.from(n):Buffer.from(String(n),c);return S.writeSync(o,p),l?.(),true}catch{return r(n,c,l)}}),e.__rapidkitSyncWriteInstalled=true;}}async function ie(t){b$6(t),await new Promise(e=>setImmediate(e)),await new Promise(e=>setTimeout(e,25)),await Promise.all([process.stdout,process.stderr].map(e=>new Promise(o=>{e.write("",()=>o());}))),process.exit(t);}async function oc(t,e=0){return S.writeSync(process.stdout.fd??1,t),ie(e)}if(Ed){Rd(),_d(),d$4(),a$2({argv:process.argv,cwd:process.cwd(),rapidkitVersion:c()}),c$4(process.argv);let t=process.argv.slice(2),e$1=t[0],o$1=process.cwd(),r=qe(o$1),n=p(o$1,"project.json").some(f=>S.existsSync(f)),i=ed(),a$1=Ga(t),c$1=i&&Po(t),l=e$1==="init"&&r&&!n;(t.length===0||t.length===1&&(e$1==="--help"||e$1==="-h"||e$1==="help"))&&(a("npm cli"),hc(),await ie(0)),t.some(f=>f==="--version"||f==="-V"||f==="-v")&&!t.some(f=>f==="--help"||f==="-h"||f==="help")&&(t.includes("--json")?await oc(`${JSON.stringify(td(),null,2)}
484
+ `):await oc(`${c()}
485
+ `)),Tn(t)&&await ie(0),c$1&&Ua(e$1)?(async()=>{e$1==="bootstrap"&&await ie(await za(t)),e$1==="setup"&&await ie(await Ya(t)),e$1==="cache"&&await ie(await Qa(t)),await ie(await Xa(t));})().catch(f=>{process.stderr.write(`Workspai CLI failed to run ${e$1}: ${f?.message??f}
486
+ `),process.exit(1);}):a$1||c$1?ne.parseAsync().then(()=>ie(0)).catch(f=>{let d=Qt()&&f instanceof Error&&f.stack?f.stack:f?.message??f;process.stderr.write(`Workspai CLI failed: ${d}
487
+ `),process.exit(1);}):l?Fn(t).then(f=>ie(f)).catch(f=>{process.stderr.write(`Workspai CLI failed to run workspace init: ${f?.message??f}
488
+ `),process.exit(1);}):kd().then(async f=>{if(!f){let d=process.argv.slice(2);if(Qt()&&process.stderr.write(`[workspai-cli] argv=${JSON.stringify(d)}
489
+ `),Ga(d)){await ne.parseAsync();return}if(Tn(d)&&await ie(0),d[0]==="create"){let h=await ic(d);await ie(h);}if(d[0]==="init"){let h=await Fn(d);await ie(h);}if(Ua(d[0])){if(d[0]==="bootstrap"){let k=await za(d);await ie(k);}if(d[0]==="setup"){let k=await Ya(d);await ie(k);}if(d[0]==="cache"){let k=await Qa(d);await ie(k);}let h=await Xa(d);await ie(h);}if(m(d[0])){if(Wn(d))return;let h=d[0],k=d$5(process.cwd()),j=await _t(process.cwd()),_=re(process.cwd()),y=false;if(_){let u=o(_,"policies.yml").find(b=>S.existsSync(b));if(u&&await R__default.pathExists(u))try{let b=await S.promises.readFile(u,"utf-8");if(y=((b.match(/^\s*enforcement_mode:\s*(warn|strict)\s*(?:#.*)?$/m)??b.match(/^\s*mode:\s*(warn|strict)\s*(?:#.*)?$/m))?.[1]??"warn")==="strict",y){let A=o(_,"toolchain.lock").find(N=>S.existsSync(N)),I=[];if(!A||!await R__default.pathExists(A))I.push("toolchain.lock is missing \u2014 run `workspai bootstrap` first (strict mode requires a reproducible toolchain).");else try{let D=JSON.parse(await S.promises.readFile(A,"utf-8")).runtime??{};e$2(k,process.cwd())&&!D.go?.version&&I.push("Go runtime version is not pinned in toolchain.lock \u2014 run `workspai setup go` first."),f$4(k,process.cwd())&&!D.node?.version&&I.push("Node runtime version is not pinned in toolchain.lock \u2014 run `workspai setup node` first."),g$1(k,process.cwd())&&!D.java?.version&&I.push("Java runtime version is not pinned in toolchain.lock \u2014 run `workspai setup java` first."),h$2(k,process.cwd())&&!D.dotnet?.version&&I.push(".NET runtime version is not pinned in toolchain.lock \u2014 run `workspai setup dotnet` first."),i$2(k,process.cwd())&&!D.python?.version&&I.push("Python runtime version is not pinned in toolchain.lock \u2014 run `workspai setup python` first.");}catch{I.push("toolchain.lock is invalid JSON \u2014 regenerate it with `workspai bootstrap` before running commands in strict mode.");}let W=o(_,"workspace.json").find(N=>S.existsSync(N));if(W&&await R__default.pathExists(W))try{let D=JSON.parse(await S.promises.readFile(W,"utf-8")).profile??"",M=i$3(process.cwd(),k),me=ht({profile:D,runtime:M.runtime,subjectLabel:C.basename(process.cwd()),mode:"strict"});me.ok||I.push(`${me.message} Update the workspace profile or use a polyglot workspace.`);}catch{}if(I.length>0){console.log(s.red(`\u274C Strict policy violations block \`${h}\`:`));for(let N of I)console.log(s.red(` \u2022 ${N}`));console.log(s.gray("\u{1F4A1} Fix violations or switch to warn mode: set mode: warn in .workspai/policies.yml")),await ie(1);}}}catch{}}let m=await d$6({startPath:process.cwd(),action:h,writeReport:true}),g=y||process.env.RAPIDKIT_LIFECYCLE_ENFORCE_READINESS==="1"||process.env.RAPIDKIT_ENFORCE_READINESS==="1";if(m.blocking&&g){console.log(s.red(`\u274C Release readiness blocks \`${h}\`:`));for(let u of m.blockingReasons)console.log(s.red(` \u2022 ${u}`));m.evidencePath&&console.log(s.gray(`\u2139\uFE0F Readiness evidence: ${m.evidencePath}`)),await ie(1);}m.overallStatus!=="pass"&&!g&&(console.log(s.yellow(`\u26A0\uFE0F Release readiness is ${m.overallStatus}. Command continues in warn mode.`)),m.evidencePath&&console.log(s.gray(` Evidence: ${m.evidencePath} (set RAPIDKIT_LIFECYCLE_ENFORCE_READINESS=1 to block)`)));let v=await fc(process.cwd(),async()=>{if(e$2(k,process.cwd())||j==="go"){let u=Ue("go",{runCommandInCwd:Q,runCoreRapidkit:e});if(h==="lint")return te(await u.runLint?.(process.cwd())??{exitCode:1,message:"Lint is not supported."});if(h==="format")return te(await u.runFormat?.(process.cwd())??{exitCode:1,message:"Format is not supported."});let b=h==="dev"?await u.runDev(process.cwd()):h==="test"?await u.runTest(process.cwd()):h==="build"?await u.runBuild(process.cwd()):await u.runStart(process.cwd());return b.message&&console.log(s.red(`\u274C ${b.message}`)),b.exitCode}if(g$1(k,process.cwd())||j==="java")return h==="dev"?await it("dev",process.cwd()):h==="test"?await it("test",process.cwd()):h==="build"?await it("build",process.cwd()):h==="lint"?await it("lint",process.cwd()):h==="format"?await it("format",process.cwd()):await it("start",process.cwd());if(h$2(k,process.cwd())||j==="dotnet"){let u=Ue("dotnet",{runCommandInCwd:Q,runCoreRapidkit:e});if(h==="lint")return te(await u.runLint?.(process.cwd())??{exitCode:1,message:"Lint is not supported."});if(h==="format")return te(await u.runFormat?.(process.cwd())??{exitCode:1,message:"Format is not supported."});let b=h==="dev"?await u.runDev(process.cwd()):h==="test"?await u.runTest(process.cwd()):h==="build"?await u.runBuild(process.cwd()):await u.runStart(process.cwd());return b.message&&console.log(s.red(`\u274C ${b.message}`)),b.exitCode}if(f$4(k,process.cwd())||j==="node")return h==="dev"?await Rt("dev",process.cwd()):h==="test"?await Rt("test",process.cwd()):h==="build"?await Rt("build",process.cwd()):h==="lint"?await Rt("lint",process.cwd()):h==="format"?await Rt("format",process.cwd()):await Rt("start",process.cwd());if(i$2(k,process.cwd())||j==="python"){if(h==="lint"||h==="format")return await e([h],{cwd:process.cwd()});let u=Ue("python",{runCommandInCwd:Q,runCoreRapidkit:e});return te(h==="dev"?await u.runDev(process.cwd()):h==="test"?await u.runTest(process.cwd()):h==="build"?await u.runBuild(process.cwd()):await u.runStart(process.cwd()))}return -1});if(!v.ok){await ie(v.code);return}if(v.ok&&v.value>=0){await ie(v.value);return}if(v.ok&&v.value===-1){console.error(s.red(`\u274C Workspai cannot run \`${h}\` for this project runtime.`)),console.error(s.gray("Run `workspai project commands` to inspect supported commands.")),await ie(1);return}}if(Wn(d))return;let w=await bd(d);if(Qt()&&process.stderr.write(`[workspai-cli] shouldForwardToCore=${w}
490
+ `),w){let h=await e(d,{cwd:process.cwd()});await ie(h);}await ne.parseAsync();}});}export{Pn as COMMAND_CAPABILITIES_SCHEMA_VERSION,zp as NPM_ONLY_SCOPED_COMMANDS,ac as NPM_ONLY_TOP_LEVEL_COMMANDS,ka as VERSION_CONTRACT_SCHEMA_VERSION,Yp as WRAPPER_ORCHESTRATED_PROJECT_COMMANDS,nd as detectWindowsDoctorWorkspaceShadow,od as getGlobalCommandCapabilities,wr as getPublishedContractCatalog,go as getPublishedContractVersions,td as getVersionContract,fd as handleAdoptCommand,za as handleBootstrapCommand,Qa as handleCacheCommand,ic as handleCreateOrFallback,md as handleImportCommand,Fn as handleInitCommand,Xa as handleMirrorCommand,Ya as handleSetupCommand,Ln as installWorkspaceDependencies,ed as isNpmExecInvocation,bd as shouldForwardToCore};