workspai 0.43.1 → 0.45.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 (137) hide show
  1. package/README.md +28 -11
  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/cli-runtime-command-inventory.v1.snapshot.json +1368 -0
  6. package/contracts/command-capabilities.v1.json +303 -0
  7. package/contracts/compatibility-matrix.v1.json +37 -0
  8. package/contracts/create-planner-capabilities.v1.json +156 -65
  9. package/contracts/doctor-project-scan.v2.json +60 -0
  10. package/contracts/doctor-remediation-plan.v1.json +19 -4
  11. package/contracts/doctor-remediation-plan.v2.json +7 -0
  12. package/contracts/doctor-workspace-cache.v2.json +82 -0
  13. package/contracts/extension-cli-compatibility.v1.json +48 -3
  14. package/contracts/infra-plan.v1.json +189 -0
  15. package/contracts/private-product-manifest.v1.json +155 -0
  16. package/contracts/product-factory-plan.v1.json +200 -0
  17. package/contracts/project-archive.v1.json +40 -0
  18. package/contracts/project-entry-capability.v1.json +127 -0
  19. package/contracts/published-contract-catalog.v1.json +339 -0
  20. package/contracts/runtime-command-surface.v1.json +1680 -11
  21. package/contracts/version.v1.json +48 -0
  22. package/contracts/workspace-archive-capabilities.v1.json +90 -0
  23. package/contracts/workspace-archive-manifest.v1.json +107 -0
  24. package/contracts/workspace-archive-operation-result.v1.json +565 -0
  25. package/contracts/workspace-intelligence/agent-customization-pack-report.v1.json +98 -0
  26. package/contracts/workspace-intelligence/agent-hooks.v1.json +38 -0
  27. package/contracts/workspace-intelligence/agent-reports-index.v1.json +56 -0
  28. package/contracts/workspace-intelligence/mcp-design.v1.json +42 -0
  29. package/contracts/workspace-intelligence/workspace-context.v1.json +12 -0
  30. package/contracts/workspace-intelligence/workspace-explain.v1.json +1 -0
  31. package/contracts/workspace-intelligence-architecture.v1.json +723 -0
  32. package/contracts/workspace-intelligence-chain.v1.json +1194 -0
  33. package/contracts/workspace-list.v1.json +56 -0
  34. package/contracts/workspace-model-cache.v1.json +55 -0
  35. package/contracts/workspace-snapshot.v1.json +58 -0
  36. package/contracts/workspace-snapshot.v2.json +97 -0
  37. package/contracts/workspace-sync.v1.json +30 -0
  38. package/contracts/workspace-watch-event.v1.json +112 -0
  39. package/dist/analyze-YLV7NVLF.js +1 -0
  40. package/dist/{artifact-remediation-plan-244S5K6I.js → artifact-remediation-plan-WLZGROUU.js} +2 -2
  41. package/dist/autopilot-release-YBN3SWAA.js +1 -0
  42. package/dist/{chunk-LZQNVH7D.js → chunk-2K3GYCPS.js} +1 -1
  43. package/dist/chunk-2QOWRBQD.js +1 -0
  44. package/dist/chunk-42G2OK64.js +1 -0
  45. package/dist/chunk-5AKYMAIL.js +1 -0
  46. package/dist/chunk-5GNT4RJI.js +8 -0
  47. package/dist/{chunk-FDDDQMJ2.js → chunk-5PVEQ6CZ.js} +1 -1
  48. package/dist/chunk-6AA3WWQZ.js +2 -0
  49. package/dist/chunk-6ZENXBMG.js +33 -0
  50. package/dist/chunk-7RIWU5TZ.js +1 -0
  51. package/dist/chunk-BJLE5CH7.js +4 -0
  52. package/dist/{chunk-PPHTYJ7G.js → chunk-DXPU4DDV.js} +36 -37
  53. package/dist/{chunk-DOCPUNWS.js → chunk-G3H5R3RR.js} +1 -1
  54. package/dist/chunk-HYJK7W3B.js +1 -0
  55. package/dist/chunk-IMUU5Q2V.js +13 -0
  56. package/dist/chunk-J4AICQFB.js +1 -0
  57. package/dist/{chunk-EMTQ6OKI.js → chunk-JP25YL3J.js} +1 -1
  58. package/dist/{chunk-ONU457VN.js → chunk-K63BSU56.js} +52 -50
  59. package/dist/chunk-KPPGZCUW.js +78 -0
  60. package/dist/chunk-KU4S7RCM.js +1 -0
  61. package/dist/chunk-LCRROMRR.js +2 -0
  62. package/dist/chunk-LG6RFLPZ.js +1 -0
  63. package/dist/{chunk-JHC6SCJC.js → chunk-NHN4QXPP.js} +1 -1
  64. package/dist/{chunk-U6AXYUQY.js → chunk-OOOPYUL2.js} +1 -1
  65. package/dist/chunk-P7SCWJFG.js +8 -0
  66. package/dist/chunk-QWU2CZBG.js +2 -0
  67. package/dist/chunk-V2H2KRMZ.js +1 -0
  68. package/dist/chunk-WANW4QA4.js +4 -0
  69. package/dist/chunk-XIVFLY6G.js +1 -0
  70. package/dist/chunk-ZWO6K24C.js +2 -0
  71. package/dist/{create-42RTNLH2.js → create-KFR6FLRT.js} +1 -1
  72. package/dist/doctor-YJDM5XBH.js +1 -0
  73. package/dist/index.d.ts +284 -25
  74. package/dist/index.js +214 -204
  75. package/dist/pipeline-FEDYO3IA.js +5 -0
  76. package/dist/{platform-capabilities-XAVU4HSM.js → platform-capabilities-YICBF4FA.js} +1 -1
  77. package/dist/{pythonRapidkitExec-GCQ3M46E.js → pythonRapidkitExec-UJYIB6FL.js} +1 -1
  78. package/dist/{workspace-DZHWB7BV.js → workspace-PLXOO6ST.js} +1 -1
  79. package/dist/workspace-agent-sync-G5YVI3BJ.js +1 -0
  80. package/dist/workspace-archive-EEGLHZDW.js +10 -0
  81. package/dist/workspace-context-E3UFWL5X.js +1 -0
  82. package/dist/{workspace-contract-2TA27LGT.js → workspace-contract-LQJDZV36.js} +1 -1
  83. package/dist/workspace-explain-G74ZIF23.js +1 -0
  84. package/dist/workspace-explain-contract-KT757JGQ.js +1 -0
  85. package/dist/{workspace-feedback-R6H4UFZB.js → workspace-feedback-YY6WQPWQ.js} +1 -1
  86. package/dist/{workspace-foundation-FQWHPQGX.js → workspace-foundation-3C2DLCVI.js} +1 -1
  87. package/dist/{workspace-history-CGCK2DJI.js → workspace-history-VF3CHDYQ.js} +1 -1
  88. package/dist/workspace-intelligence-3GG7GEDQ.js +1 -0
  89. package/dist/workspace-mcp-serve-MJMUV4RY.js +3 -0
  90. package/dist/{workspace-model-F3B75TYT.js → workspace-model-NG45SRM5.js} +1 -1
  91. package/dist/workspace-registry-summary-JM2XY52C.js +1 -0
  92. package/dist/workspace-run-WEQYIERE.js +1 -0
  93. package/dist/{workspace-verify-OAATQV5T.js → workspace-verify-ZNT6JX7D.js} +1 -1
  94. package/dist/workspace-watch-W47T4RX2.js +1 -0
  95. package/docs/AI_FEATURES.md +67 -34
  96. package/docs/README.md +2 -1
  97. package/docs/commands-reference.md +39 -14
  98. package/docs/contracts/ARTIFACT_CATALOG.md +60 -36
  99. package/docs/contracts/COMMAND_OWNERSHIP_MATRIX.md +27 -6
  100. package/docs/contracts/README.md +3 -2
  101. package/docs/create-planner-capabilities.md +36 -18
  102. package/docs/workspace-operations.md +25 -0
  103. package/package.json +27 -14
  104. package/scripts/enterprise-package-smoke.mjs +40 -8
  105. package/scripts/prepack-enterprise.mjs +12 -0
  106. package/dist/analyze-5BU4QIPK.js +0 -1
  107. package/dist/autopilot-release-45YVOBQO.js +0 -1
  108. package/dist/chunk-3QVTWKUI.js +0 -4
  109. package/dist/chunk-753LOKFZ.js +0 -2
  110. package/dist/chunk-AMDKXXLP.js +0 -1
  111. package/dist/chunk-AQ4XZZC6.js +0 -1
  112. package/dist/chunk-CDE4Q77U.js +0 -2
  113. package/dist/chunk-DNAY5ALC.js +0 -1
  114. package/dist/chunk-FHSMY75W.js +0 -1
  115. package/dist/chunk-FM7GMFZA.js +0 -2
  116. package/dist/chunk-HV5ZFXAZ.js +0 -13
  117. package/dist/chunk-LRW2SAGL.js +0 -4
  118. package/dist/chunk-LTWYYP6E.js +0 -7
  119. package/dist/chunk-NAAQMSO3.js +0 -1
  120. package/dist/chunk-NFUXULIF.js +0 -1
  121. package/dist/chunk-OL64GWQC.js +0 -9
  122. package/dist/chunk-SI3AQKIP.js +0 -1
  123. package/dist/chunk-TH5Y3EMA.js +0 -33
  124. package/dist/chunk-UQKCCWUL.js +0 -78
  125. package/dist/chunk-XNGANEXM.js +0 -2
  126. package/dist/doctor-DK4BON3N.js +0 -1
  127. package/dist/pipeline-HQ57V6OZ.js +0 -5
  128. package/dist/workspace-agent-sync-5ADIQS7B.js +0 -1
  129. package/dist/workspace-archive-GCZNI44O.js +0 -3
  130. package/dist/workspace-context-GEXDHA7A.js +0 -1
  131. package/dist/workspace-explain-D5NNL3NG.js +0 -1
  132. package/dist/workspace-explain-contract-DNS2YEL7.js +0 -1
  133. package/dist/workspace-intelligence-BEM6WGCZ.js +0 -1
  134. package/dist/workspace-mcp-serve-OMBA5V3C.js +0 -3
  135. package/dist/workspace-registry-summary-6MFBRWDS.js +0 -1
  136. package/dist/workspace-run-3WJXIQKR.js +0 -1
  137. package/dist/workspace-watch-HU2OTQ52.js +0 -1
@@ -0,0 +1 @@
1
+ import {d,q,a as a$5}from'./chunk-7UZVOYF5.js';import {i,h}from'./chunk-4KUIFXHM.js';import {a as a$6}from'./chunk-HTYMXMQM.js';import {a as a$4,j as j$1,b as b$3}from'./chunk-QWU2CZBG.js';import {g,f as f$1,c as c$1}from'./chunk-6AA3WWQZ.js';import {j}from'./chunk-5PVEQ6CZ.js';import {c,b as b$2}from'./chunk-P424XYHP.js';import {a as a$1}from'./chunk-GSWPGELT.js';import {a as a$3}from'./chunk-GZTYAEWX.js';import {b as b$1,a}from'./chunk-5AKYMAIL.js';import {a as a$2}from'./chunk-XZGVNGRB.js';import {p,o}from'./chunk-5XATWNME.js';import f from'path';import P from'fs-extra';import yt from'crypto';import {createRequire}from'module';var ft=new Set(["service","frontend","worker","library","infra","docs","test-suite","unknown"]);async function He(e){try{if(!await P.pathExists(e))return null;let t=await P.readJSON(e);return t&&typeof t=="object"?t:null}catch{return null}}async function mt(e){for(let t of e){let r=await He(t);if(r)return r}return null}function Te(e){if(typeof e!="string")return null;let t=e.trim().toLowerCase();return ft.has(t)?t:null}async function $e(e,t){let r=t??await mt(p(e,"project.json")),o=Te(r?.kind)??Te(r?.type);if(o)return o;let s=typeof r?.kit_name=="string"?r.kit_name:r?.kit,n=typeof r?.framework=="string"?r.framework:null,a=typeof r?.runtime=="string"?r.runtime:null,i=`${typeof s=="string"?s:""} ${n??""} ${a??""}`.trim().toLowerCase();if(/\b(frontend|nextjs|next\.js|react|vue|svelte|vite|angular|astro|remix|nuxt)\b/.test(i))return "frontend";if(/\b(fastapi|nestjs|springboot|spring boot|gofiber|gogin|dotnet|webapi|django|flask|express|fastify|python|node|java|go|rust|php|ruby|elixir)\b/.test(i))return "service";let c=await He(f.join(e,"package.json"));if(c){let d={...c.dependencies??{},...c.devDependencies??{}},l=c.scripts??{},p=Object.values(l).filter(u=>typeof u=="string").join(" ").toLowerCase();if(d.next||d.react||d.vue||d.svelte||d.vite||d["@angular/core"]||p.includes("next ")||p.includes("vite "))return "frontend";if(c.private===true&&!d.express&&!d["@nestjs/core"])return "library"}return await P.pathExists(f.join(e,"Dockerfile"))||await P.pathExists(f.join(e,"docker-compose.yml"))||await P.pathExists(f.join(e,"terraform.tf"))?"infra":"service"}var gt=new Set(c().map(e=>e.id)),ht=[...j().map(e=>({id:e.kitId,aliases:[...e.aliases],ecosystem:e.framework,status:"available",canExecuteCreate:true,officialCommands:[e.commandDisplay("<name>",{skipGit:false,skipInstall:false})],adoptAfterCreate:true})),{id:"wordpress-site",aliases:["wordpress","wordpress-site","wp","wp-site"],ecosystem:"wordpress",status:"planned",canExecuteCreate:false,officialCommands:["wp core download","wp config create","wp db create","wp core install"],adoptAfterCreate:true},{id:"wordpress-block",aliases:["wordpress-block","wp-block","gutenberg-block"],ecosystem:"wordpress",status:"planned",canExecuteCreate:false,officialCommands:["npx @wordpress/create-block@latest <slug>"],adoptAfterCreate:true},{id:"laravel",aliases:["laravel","php-laravel"],ecosystem:"php",status:"planned",canExecuteCreate:false,officialCommands:["composer create-project laravel/laravel <name>"],adoptAfterCreate:true},{id:"symfony",aliases:["symfony","php-symfony"],ecosystem:"php",status:"planned",canExecuteCreate:false,officialCommands:["composer create-project symfony/skeleton <name>"],adoptAfterCreate:true},{id:"rails",aliases:["rails","ruby-on-rails","ruby-rails"],ecosystem:"ruby",status:"planned",canExecuteCreate:false,officialCommands:["rails new <name>"],adoptAfterCreate:true}],V=new Map;for(let e of ht){V.set(e.id,e);for(let t of e.aliases)V.set(t,e);}var kt=new Set(["php","ruby","rust","elixir","clojure","scala","kotlin","unknown"]);function F(e){return e?.trim().toLowerCase()||void 0}function Ve(e){let t=F(e.kitId)??F(e.framework)??F(e.runtime)??"unknown";if(e.projectExists)return {lane:"existing",status:"available",canExecuteCreate:false,requested:t,reason:"Existing projects enter Workspace Intelligence through adopt/import."};let r=e.kitId?b$2(e.kitId):void 0;if(r&&gt.has(r))return {lane:"native",status:"available",canExecuteCreate:true,requested:t,resolved:r,reason:"Workspai owns the create contract, project marker, registry, doctor, and workspace model path."};let o=V.get(t)??V.get(F(e.framework)??"")??V.get(F(e.runtime)??"");if(o)return {lane:"official",status:o.status,canExecuteCreate:o.canExecuteCreate,requested:t,resolved:o.id,officialCommands:o.officialCommands,fallbackLane:o.canExecuteCreate?void 0:"existing",reason:o.status==="available"?"Workspai runs the official ecosystem generator, then registers the project in Workspace Intelligence.":"Official generator support is planned but not enabled; use adopt/import until Workspai owns the post-create contract."};let s=F(e.runtime);return s&&kt.has(s)?{lane:"existing",status:"available",canExecuteCreate:false,requested:t,resolved:s,reason:"Runtime can be governed through Workspace Intelligence, but native create is not supported."}:{lane:"existing",status:"available",canExecuteCreate:false,requested:t,reason:"No native create contract is available; use adopt/import to enter Workspace Intelligence."}}function br(e){return !e.canExecuteCreate&&(e.lane==="official"||e.lane==="existing"&&e.resolved!==void 0)}var Ke="workspace-dependency-graph.v1",Be=["code-import","package-dep","event-pub-sub","service-dependsOn","shared-resource"];var Wr="rapidkit-freshness-metadata-v1";function le(e){if(Array.isArray(e))return e.map(t=>le(t));if(e&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=le(e[r]);return t}return e}function wt(e){return JSON.stringify(le(e))}function M(e){return yt.createHash("sha256").update(wt(e)).digest("hex")}var Le=".workspai/workspace-graph.overrides.json",vt=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),bt=new Set([".git",".hg",".svn",".workspai",".rapidkit",".venv","node_modules","dist","build","out","target","coverage","htmlcov",".next",".turbo",".cache"]),Ue=600,Je=5,jt=256*1024,ze={inferred:1,contract:2,manual:3};function Ct(e){return e.split(f.sep).join("/")}function Z(e,t){return Ct(f.relative(e,t)||".")}function qe(e){let t=new Map;for(let r of e.projects)t.has(r.name)||t.set(r.name,{id:r.name,path:r.path,...r.runtime?{runtime:r.runtime}:{},...r.framework?{framework:r.framework}:{},...r.kind?{kind:r.kind}:{}});return [...t.values()].sort((r,o)=>r.id.localeCompare(o.id))}function Xe(e,t){let r=new Map,o=new Map;for(let n of t.projects){if(r.has(n.name))continue;let a=n.absolutePath?f.resolve(n.absolutePath):f.resolve(e,n.path);r.set(n.name,a),o.has(a)||o.set(a,n.name);}let s=[...o.entries()].map(([n,a])=>({dir:n,id:a})).sort((n,a)=>a.dir.length-n.dir.length||n.dir.localeCompare(a.dir));return {idToDir:r,dirToId:o,sortedDirs:s}}function ee(e,t){let r=f.resolve(t);for(let{dir:o,id:s}of e.sortedDirs)if(r===o||r.startsWith(`${o}${f.sep}`))return s;return null}async function me(e){try{if(!await P.pathExists(e))return null;let t=await P.readJSON(e);return t&&typeof t=="object"&&!Array.isArray(t)?t:null}catch{return null}}async function he(e){try{return await P.pathExists(e)?await P.readFile(e,"utf8"):null}catch{return null}}async function Ye(e,t){let r=[],o=new Map;for(let[s,n]of t.idToDir.entries()){let a=await me(f.join(n,"package.json")),i=typeof a?.name=="string"?a.name.trim():"";i&&!o.has(i)&&o.set(i,s);}for(let[s,n]of t.idToDir.entries()){let a=await me(f.join(n,"package.json"));if(a){let i=["dependencies","devDependencies","peerDependencies","optionalDependencies"],c=new Set;for(let d of i){let l=a[d];if(!(!l||typeof l!="object"||Array.isArray(l)))for(let p of Object.keys(l)){let u=o.get(p);!u||u===s||c.has(u)||(c.add(u),r.push({from:s,to:u,kind:"package-dep",source:"inferred",confidence:"high",evidence:[{file:Z(e,f.join(n,"package.json")),detail:`declares dependency ${p}`}]}));}}}r.push(...await Et(e,t,s,n)),r.push(...await St(e,t,s,n));}return r}async function Et(e,t,r,o){let s=await he(f.join(o,"pyproject.toml"));if(!s)return [];let n=[],a=new Set,i=/path\s*=\s*["']([^"']+)["']/g,c;for(;(c=i.exec(s))!==null;){let d=ee(t,f.resolve(o,c[1]));!d||d===r||a.has(d)||(a.add(d),n.push({from:r,to:d,kind:"package-dep",source:"inferred",confidence:"high",evidence:[{file:Z(e,f.join(o,"pyproject.toml")),detail:`path dependency ${c[1]}`}]}));}return n}async function St(e,t,r,o){let s=await he(f.join(o,"go.mod"));if(!s)return [];let n=[],a=new Set,i=/replace\s+\S+\s+=>\s+(\.[^\s]+)/g,c;for(;(c=i.exec(s))!==null;){let d=ee(t,f.resolve(o,c[1]));!d||d===r||a.has(d)||(a.add(d),n.push({from:r,to:d,kind:"package-dep",source:"inferred",confidence:"high",evidence:[{file:Z(e,f.join(o,"go.mod")),detail:`go.mod replace ${c[1]}`}]}));}return n}async function Pt(e,t){let r=[],o=[e];for(;o.length>0&&r.length<t;){let s=o.shift();if(!s)continue;let n=[];try{n=await P.readdir(s,{withFileTypes:true});}catch{continue}let a=[],i=[];for(let c of n)if(c.isDirectory()){if(bt.has(c.name)||c.name.startsWith("."))continue;a.push(f.join(s,c.name));}else c.isFile()&&vt.has(f.extname(c.name))&&i.push(f.join(s,c.name));i.sort((c,d)=>c.localeCompare(d)),a.sort((c,d)=>c.localeCompare(d));for(let c of i){if(r.length>=t)break;r.push(c);}o.push(...a);}return r}var Wt=[/\bfrom\s+["']([^"']+)["']/g,/\bimport\s+["']([^"']+)["']/g,/\bimport\s*\(\s*["']([^"']+)["']\s*\)/g,/\brequire\s*\(\s*["']([^"']+)["']\s*\)/g];function xt(e){let t=new Set;for(let r of Wt){r.lastIndex=0;let o;for(;(o=r.exec(e))!==null;){let s=o[1];s.startsWith(".")&&t.add(s);}}return [...t]}async function ge(e,t,r,o){let s=new Map;for(let[n,a]of t.idToDir.entries()){if(o&&!o.has(n))continue;let i=await Pt(a,r);for(let c of i){let d=await P.stat(c).catch(()=>null);if(!d||d.size>jt)continue;let l=await he(c);if(l)for(let p of xt(l)){let u=f.resolve(f.dirname(c),p),m=ee(t,u);if(!m||m===n)continue;let E=`${n}\0${m}`,w=s.get(E);w||(w={from:n,to:m,evidence:[]},s.set(E,w)),w.evidence.length<Je&&w.evidence.push({file:Z(e,c),detail:`imports ${p}`});}}}return [...s.values()].map(n=>({from:n.from,to:n.to,kind:"code-import",source:"inferred",confidence:"medium",evidence:n.evidence}))}function Rt(e,t,r){let o=new Map;for(let s of r.projects){let n=At(e,t,s);n&&o.set(s.slug,n);}return o}function At(e,t,r){let o=[r.relativePath,r.externalPath].filter(s=>typeof s=="string"&&s.length>0);for(let s of o){let n=f.resolve(e,s),a=t.dirToId.get(n)??ee(t,n);if(a)return a}return t.idToDir.has(r.slug)?r.slug:null}function Qe(e,t,r){let o=[],s=Rt(e,t,r),n=b$3,a=new Map,i=new Map;for(let c of r.projects){let d=s.get(c.slug);if(!d)continue;let l=c.contracts??{publishes:[],consumes:[],dependsOn:[]};for(let p of l.dependsOn??[]){let u=s.get(p);!u||u===d||o.push({from:d,to:u,kind:"service-dependsOn",source:"contract",confidence:"high",evidence:[{file:n,detail:`dependsOn ${p}`}]});}for(let p of l.publishes??[])a.has(p)||a.set(p,new Set),a.get(p)?.add(d);for(let p of l.consumes??[])i.has(p)||i.set(p,new Set),i.get(p)?.add(d);}for(let[c,d]of a.entries()){let l=i.get(c);if(l)for(let p of l)for(let u of d)p!==u&&o.push({from:p,to:u,kind:"event-pub-sub",source:"contract",confidence:"high",evidence:[{file:n,detail:`consumes event ${c}`}]});}return o.push(...It(r,s)),o}function ue(e){return e.toLowerCase().replace(/[^a-z0-9]/g,"")}function It(e,t){let r=[],o=e.projects.map(s=>({project:s,id:t.get(s.slug)})).filter(s=>!!s.id).filter(s=>ue(s.project.slug).length>=3);for(let s of e.projects){let n=t.get(s.slug);if(!n)continue;let a=s.contracts?.env??[];if(a.length===0)continue;let i=new Set;for(let c of a){let d=ue(c);for(let l of o)l.id===n||i.has(l.id)||!(d.includes(ue(l.project.slug))&&(l.project.ports?.length??0)>0)||(i.add(l.id),r.push({from:n,to:l.id,kind:"shared-resource",source:"inferred",confidence:"low",evidence:[{file:b$3,detail:`env ${c} references ${l.project.slug}`}]}));}}return r}async function Ze(e,t){let r=await me(f.join(e,Le)),o=Array.isArray(r?.edges)?r?.edges:[],s=[],n=new Set(Be);for(let a of o){if(!a||typeof a!="object"||Array.isArray(a))continue;let i=a,c=typeof i.from=="string"?i.from:"",d=typeof i.to=="string"?i.to:"",l=typeof i.kind=="string"?i.kind:"";if(!t.has(c)||!t.has(d)||c===d||!n.has(l))continue;let p=Array.isArray(i.evidence)?i.evidence.map(u=>u&&typeof u=="object"&&typeof u.file=="string"?{file:u.file,...typeof u.detail=="string"?{detail:u.detail}:{}}:null).filter(u=>!!u):[];s.push({from:c,to:d,kind:l,source:"manual",confidence:"high",evidence:p.length>0?p:[{file:Le,detail:"manual edge"}]});}return s}function Ft(e){return `${e.from}\0${e.to}\0${e.kind}`}function Mt(e){let t=new Set,r=[];for(let o of e){let s=`${o.file}\0${o.detail??""}`;t.has(s)||(t.add(s),r.push(o));}return r.sort((o,s)=>o.file.localeCompare(s.file)||(o.detail??"").localeCompare(s.detail??"")).slice(0,Je)}function Dt(e){let t=new Map;for(let r of e){let o=Ft(r),s=t.get(o);if(!s){t.set(o,{...r,evidence:[...r.evidence]});continue}let n=ze[s.source],a=ze[r.source];a>n?t.set(o,{...r,evidence:[...r.evidence,...s.evidence]}):a===n&&s.evidence.push(...r.evidence);}return [...t.values()].map(r=>({from:r.from,to:r.to,kind:r.kind,source:r.source,confidence:r.confidence,evidence:Mt(r.evidence)})).sort((r,o)=>r.from.localeCompare(o.from)||r.to.localeCompare(o.to)||r.kind.localeCompare(o.kind)||r.source.localeCompare(o.source))}function fe(e){return Math.round(e*1e3)/1e3}function Gt(e){return Math.max(0,Math.min(100,Math.round(e)))}function Ot(e){return e>=75?"critical":e>=50?"high":e>=20?"medium":"low"}function _t(e){return e==="critical"||e==="high"?"strict":e==="medium"?"elevated":"normal"}function Nt(e,t){let r=a$6({nodes:e,edges:t}),o=new Map;for(let s of e){let n=r.byId.get(s.id)??{fanIn:0,fanOut:0,reach:0,betweenness:0,isHotspot:false},a=t.filter(m=>m.from===s.id||m.to===s.id),i=a.filter(m=>m.source==="contract"||m.source==="manual").length,c=a.filter(m=>m.confidence==="low").length,d=[],l=n.reach*20+n.fanIn*14+n.fanOut*8+Math.min(20,n.betweenness*4)+i*8;n.isHotspot&&(l+=24,d.push("Critical-path hotspot in dependency graph")),n.reach>0&&d.push(`Change reaches ${n.reach} dependent project(s)`),n.fanIn>0&&d.push(`${n.fanIn} direct dependent project(s)`),n.fanOut>0&&d.push(`${n.fanOut} direct dependency project(s)`),i>0&&d.push(`${i} contract/manual edge(s)`),c>0&&d.push(`${c} low-confidence inferred edge(s) need review`),a.length===0&&d.push("No dependency evidence connected to this project yet");let p=Gt(l),u=Ot(p);o.set(s.id,{weight:u,score:p,verificationPriority:_t(u),reasons:d.slice(0,5),centrality:{fanIn:n.fanIn,fanOut:n.fanOut,reach:n.reach,betweenness:n.betweenness,isHotspot:n.isHotspot}});}return o}function Tt(e,t){let r=Nt(e,t);return e.map(o=>({...o,operationalProfile:r.get(o.id)}))}function Ht(e,t){let r=new Set;for(let c of t)r.add(c.from),r.add(c.to);let o=e.length,s=t.length,n=e.filter(c=>r.has(c.id)).length,a=Math.max(0,o-n),i=a$6({nodes:e,edges:t});return {nodeCount:o,edgeCount:s,inferredEdges:t.filter(c=>c.source==="inferred").length,contractEdges:t.filter(c=>c.source==="contract").length,manualEdges:t.filter(c=>c.source==="manual").length,authoritativeEdges:t.filter(c=>c.source==="contract"||c.source==="manual").length,lowConfidenceEdges:t.filter(c=>c.confidence==="low").length,orphanCount:a,connectedNodeCount:n,density:fe(o>1?s/(o*(o-1)):0),edgeCoverageRatio:fe(o>0?n/o:1),evidenceCoverageRatio:fe(s>0?t.filter(c=>c.evidence.length>0).length/s:1),hotspotCount:i.hotspots.length,hasCycle:Vt(e,t)}}function $t(e,t,r){let o=[],s=e.filter(n=>!t.some(a=>a.from===n.id||a.to===n.id)).map(n=>n.id).sort((n,a)=>n.localeCompare(a));return r.nodeCount===0&&o.push({code:"graph.empty",severity:"info",message:"Workspace model has no projects, so dependency reasoning is unavailable.",recommendation:"Import, scaffold, or register projects before relying on graph-aware impact."}),r.nodeCount>1&&r.edgeCount===0?o.push({code:"graph.edges.missing",severity:"warning",message:"Projects were detected, but no inter-project dependency edges were found.",recommendation:"Run graph explain, add workspace contract relationships, or define manual graph overrides for operational dependencies that code imports cannot reveal.",nodeIds:s}):r.orphanCount>0&&o.push({code:"graph.orphans.detected",severity:"warning",message:`${r.orphanCount} project(s) have no dependency evidence connected to the graph.`,recommendation:"Review isolated projects and add package, contract, or manual edges when they participate in release-critical flows.",nodeIds:s.slice(0,12)}),r.lowConfidenceEdges>0&&o.push({code:"graph.low_confidence_edges",severity:"info",message:`${r.lowConfidenceEdges} inferred edge(s) are low confidence.`,recommendation:"Promote important low-confidence relationships to workspace contract or manual overrides."}),r.edgeCount>0&&r.evidenceCoverageRatio<1&&o.push({code:"graph.evidence.partial",severity:"warning",message:"Some dependency edges do not include file-level evidence.",recommendation:"Attach evidence to manual overrides so agents can audit why a relationship exists."}),r.hasCycle&&o.push({code:"graph.cycle.detected",severity:"error",message:"The dependency graph contains at least one directed cycle.",recommendation:"Break the cycle or document the relationship explicitly before using graph-aware release gates."}),o.sort((n,a)=>{let i={error:0,warning:1,info:2};return i[n.severity]-i[a.severity]||n.code.localeCompare(a.code)})}function Vt(e,t){let r=new Map;for(let c of e)r.set(c.id,[]);for(let c of t)r.has(c.from)||r.set(c.from,[]),r.get(c.from)?.push(c.to);let o=0,s=1,n=2,a=new Map;for(let c of r.keys())a.set(c,o);let i=c=>{let d=[{id:c,index:0}];for(a.set(c,s);d.length>0;){let l=d[d.length-1],p=r.get(l.id)??[];if(l.index>=p.length){a.set(l.id,n),d.pop();continue}let u=p[l.index];l.index+=1;let m=a.get(u)??o;if(m===s)return true;m===o&&(a.set(u,s),d.push({id:u,index:0}));}return false};for(let c of [...r.keys()].sort())if(a.get(c)===o&&i(c))return true;return false}function et(e,t,r,o){let s=Dt(r.filter(c=>t.has(c.from)&&t.has(c.to))),n=Tt(e,s),a=Ht(e,s),i=$t(e,s,a);return {schemaVersion:Ke,generatedAt:(o??new Date).toISOString(),nodes:n,edges:s,stats:a,...i.length>0?{diagnostics:i}:{}}}async function tt(e){let t=f.resolve(e.workspacePath),r=e.maxImportFilesPerProject??Ue,o=qe(e.model),s=new Set(o.map(i=>i.id)),n=Xe(t,e.model),a=[];return a.push(...await Ye(t,n)),a.push(...await ge(t,n,r)),e.contract&&a.push(...Qe(t,n,e.contract)),a.push(...await Ze(t,s)),et(o,s,a,e.now)}async function rt(e){let t=f.resolve(e.workspacePath),r=e.maxImportFilesPerProject??Ue,o=qe(e.model),s=new Set(o.map(i=>i.id)),n=Xe(t,e.model),a=[];if(a.push(...await Ye(t,n)),e.structuralChange)a.push(...await ge(t,n,r));else {a.push(...await ge(t,n,r,e.changedProjectIds));for(let i of e.previousGraph.edges)i.kind==="code-import"&&i.source==="inferred"&&!e.changedProjectIds.has(i.from)&&s.has(i.from)&&s.has(i.to)&&a.push({from:i.from,to:i.to,kind:"code-import",source:"inferred",confidence:i.confidence,evidence:i.evidence});}return e.contract&&a.push(...Qe(t,n,e.contract)),a.push(...await Ze(t,s)),et(o,s,a,e.now)}var ye="workspace-model-cache.v1",ke=".workspai/cache/workspace-model.v1.json",nt=["package.json","pyproject.toml","requirements.txt","go.mod","go.sum","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","composer.json","Gemfile","workspai.project.json",".workspai/project.json",".workspai/context.json","rapidkit.project.json",".rapidkit/project.json",".rapidkit/context.json"],ot=[".workspai/workspace.contract.json",".workspai/workspace.json","workspai.workspace.json",".workspai/policies.yml",".workspai/policies.yaml",".rapidkit/workspace.contract.json",".rapidkit/workspace.json","rapidkit.workspace.json",".rapidkit/policies.yml",".rapidkit/policies.yaml"],Lt=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),zt=new Set([".git",".workspai",".rapidkit","node_modules","dist","build","out","target","coverage",".next",".turbo",".cache",".venv"]),Ut=1500,K=null;function we(){if(K)return K;try{K=createRequire(import.meta.url)("../package.json")?.version??"0.0.0";}catch{K="0.0.0";}return K}async function te(e){try{let t=await P.readFile(e);return yt.createHash("sha256").update(t).digest("hex")}catch{return null}}async function Jt(e){let t={};for(let s of nt){let n=await te(f.join(e,s));n&&(t[s]=n);}let r=[],o=[e];for(;o.length>0&&r.length<Ut;){let s=o.shift();if(!s)continue;let n=[];try{n=await P.readdir(s,{withFileTypes:true});}catch{continue}let a=[];for(let i of n)if(i.isDirectory()){if(zt.has(i.name)||i.name.startsWith("."))continue;a.push(f.join(s,i.name));}else if(i.isFile()&&Lt.has(f.extname(i.name))){let c=f.join(s,i.name),d=await P.stat(c).catch(()=>null);if(d){let l=f.relative(e,c).split(f.sep).join("/");r.push(`${l}:${d.size}:${Math.round(d.mtimeMs)}`);}}a.sort((i,c)=>i.localeCompare(c)),o.push(...a);}return r.sort((s,n)=>s.localeCompare(n)),M({manifests:t,source:r})}async function re(e,t){let r=f.resolve(e),o={},s=[...new Set(t.map(n=>f.relative(r,f.resolve(n)).split(f.sep).join("/")))].sort((n,a)=>n.localeCompare(a));for(let n of s)o[n]=await Jt(f.join(r,n));return o}async function ne(e){let t=f.resolve(e),r={};for(let o of ot){let s=await te(f.join(t,o));s&&(r[o]=s);}return r}async function oe(e){let t=f.resolve(e.workspacePath),r=[...new Set(e.projectPaths.map(n=>f.relative(t,f.resolve(n)).split(f.sep).join("/")))].sort((n,a)=>n.localeCompare(a)),o=[];for(let n of r){let a={};for(let i of nt){let c=await te(f.join(t,n,i));c&&(a[i]=c);}o.push({project:n,manifests:a});}let s={};for(let n of ot){let a=await te(f.join(t,n));a&&(s[n]=a);}return M({cacheSchema:ye,cliVersion:e.cliVersion,flags:e.flags,workspaceJson:e.workspaceJson??null,marker:e.marker??null,projects:o,workspaceFiles:s})}async function ve(e){let t=await f$1(e,ke)??c$1(e,ke);try{if(!await P.pathExists(t))return null;let r=await P.readJson(t);return !r||r.schemaVersion!==ye||typeof r.inputsHash!="string"||typeof r.cliVersion!="string"||!r.model?null:r}catch{return null}}async function se(e,t){let r={schemaVersion:ye,...t};return g(e,ke,r)}var st="rapidkit-fact-freshness-v1",L={durable:720*60*60,derived:10080*60,evidenceBacked:1440*60,live:300,verifyBeforeUse:1440*60};function qt(e){switch(e){case "durable":return L.durable;case "derived":return L.derived;case "evidence-backed":return L.evidenceBacked;case "live":return L.live;case "verify-before-use":return L.verifyBeforeUse}}function Xt(e){if(e.status)return e.status;if(e.ttlSeconds===null)return "unknown";let t=Date.parse(e.generatedAt);if(!Number.isFinite(t))return "unknown";let r=t+e.ttlSeconds*1e3;return e.now.getTime()>r?"stale":"fresh"}function Yt(e){let t=e.now??new Date,r=e.generatedAt??t.toISOString(),o=Date.parse(r),s=Number.isFinite(o),n=s?r:t.toISOString(),a=e.ttlSeconds===void 0?qt(e.kind):e.ttlSeconds,i=Xt({generatedAt:n,ttlSeconds:a,status:e.status??(s?void 0:"unknown"),now:t}),c=Date.parse(n),d=a===null||!Number.isFinite(c)?void 0:new Date(c+a*1e3),l=e.verifyBeforeUse??(e.kind==="live"||e.kind==="verify-before-use"||e.category!=="structure"||i!=="fresh");return {schemaVersion:st,kind:e.kind,category:e.category,generatedAt:n,ttlSeconds:a,...d?{expiresAt:d.toISOString()}:{},status:i,verifyBeforeUse:l,...e.sourceArtifact?{sourceArtifact:e.sourceArtifact}:{},...e.sourcePath?{sourcePath:e.sourcePath}:{},inputsHash:e.inputsHash??M(e.value??null),reason:e.reason}}function v(e){return {id:e.id,label:e.label,scope:e.scope,value:e.value,...e.project?{project:e.project}:{},freshness:Yt({...e.freshness,value:e.value})}}function at(e){let t=e.generatedAt??(e.now??new Date).toISOString(),r={durable:0,derived:0,"evidence-backed":0,live:0,"verify-before-use":0},o={structure:0,verification:0,state:0},s=0,n=0,a=0,i=0;for(let c of e.facts)r[c.freshness.kind]+=1,o[c.freshness.category]+=1,c.freshness.status==="stale"&&(s+=1),c.freshness.status==="unknown"&&(n+=1),c.freshness.kind==="live"&&(a+=1),c.freshness.verifyBeforeUse&&(i+=1);return {schemaVersion:st,generatedAt:t,status:s>0?"stale":n>0?"unknown":"fresh",totalFacts:e.facts.length,staleFacts:s,unknownFacts:n,liveFacts:a,verifyBeforeUseFacts:i,byKind:r,byCategory:o}}var Qt=b$1.model,ct=a.model,Zt=["package.json","pyproject.toml","requirements.txt","go.mod","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","composer.json","Gemfile","mix.exs","deno.json","deno.jsonc","bun.lock","bun.lockb","deps.edn","project.clj","build.sbt","docker-compose.yml","docker-compose.yaml","terraform.tf"],er=new Set([".git",".hg",".svn",".workspai",".rapidkit",".venv","node_modules","dist","build","target","coverage","htmlcov",".next",".turbo"]);function dt(e,t){return (f.relative(e,t)||".").split(f.sep).join("/")}async function pt(e){try{if(!await P.pathExists(e))return null;let t=await P.readJSON(e);return t&&typeof t=="object"?t:null}catch{return null}}async function tr(e,t){for(let r of t)if(await P.pathExists(f.join(e,r)))return true;return false}function be(e){let t=Number.parseInt(process.env.RAPIDKIT_WORKSPACE_MODEL_SCAN_DEPTH??"",10),r=typeof e=="number"&&Number.isFinite(e)?e:Number.isFinite(t)?t:4;return Math.min(12,Math.max(1,Math.trunc(r)))}async function je(e,t){let r=f.resolve(e),o=[{dirPath:r,depth:0}],s=new Set,n=new Set;for(;o.length>0;){let a=o.shift();if(!a)continue;let i=f.resolve(a.dirPath);if(n.has(i))continue;if(n.add(i),i!==r&&await tr(i,Zt)){s.add(i);continue}if(a.depth>=t)continue;let c=[];try{c=await P.readdir(i,{withFileTypes:true});}catch{continue}for(let d of c)!d.isDirectory()||er.has(d.name)||d.name.startsWith(".")&&d.name!==".config"||o.push({dirPath:f.join(i,d.name),depth:a.depth+1});}return Array.from(s).sort((a,i)=>a.localeCompare(i))}function Ce(e){let t=new Set,r=[];for(let o of e){let s=f.resolve(o);t.has(s)||(t.add(s),r.push(s));}return r.sort((o,s)=>o.localeCompare(s))}function it(e,t){let r=e?.[t];return typeof r=="string"&&r.trim()?r.trim():void 0}function rr(e,t){return e?.[t]===true}function nr(e,t,r){let o=e?.frontend&&typeof e.frontend=="object"&&!Array.isArray(e.frontend)?e.frontend:void 0,s=it(o,"generator"),n=it(o,"command_display"),a=typeof t=="string"&&t.startsWith("frontend.");if(!(!s&&!a))return {...s?{id:s}:{},...t?{kit:t}:{},displayName:r,source:rr(o,"official_generator")?"official-generator":"metadata",...n?{commandDisplay:n}:{}}}async function or(e){let t=[".workspai/project.json",".workspai/context.json",".rapidkit/project.json",".rapidkit/context.json","package.json","pyproject.toml","requirements.txt","go.mod","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","composer.json","Gemfile","mix.exs","deno.json","Dockerfile","docker-compose.yml","README.md"],r=[];for(let o of t)await P.pathExists(f.join(e,o))&&r.push(o);return r}async function S(e,t,r,o=t){let s=await f$1(e,t),n=s!==null,a={path:o.split(f.sep).join("/"),exists:n};if(s&&r){let i=await pt(s);typeof i?.generatedAt=="string"&&(a.generatedAt=i.generatedAt);let c=i?.status??i?.result??i?.verdict;typeof c=="string"&&(a.status=c);}return a}async function sr(e,t,r){let o=dt(e,t),s=".workspai/reports",n=c=>S(t,`${s}/${c}`,r,`${o}/${s}/${c}`),a=await n("doctor-project-last-run.json");return {doctor:a?.exists===true?a:await n("doctor-last-run.json"),remediationPlan:await n("doctor-remediation-plan-last-run.json"),fixResult:await n("doctor-fix-result-last-run.json"),analyze:await n("analyze-last-run.json"),readiness:await n("release-readiness-last-run.json")}}async function ar(e,t,r){let o=d(t),s=i(t,o),n=q(t),a=a$5(s.runtime),i$1=await $e(t,o),c=typeof o?.name=="string"&&o.name.trim()?o.name.trim():f.basename(t),d$1=typeof o?.kit_name=="string"?o.kit_name:typeof o?.kit=="string"?o.kit:void 0,l=typeof o?.engine=="string"?o.engine:n.engine!=="unknown"?n.engine:void 0,p=nr(o,d$1,s.displayName),u=Ve({kitId:d$1,framework:s.key,runtime:s.runtime});return {name:c,path:dt(e,t),...r.includeAbsolutePaths?{absolutePath:t}:{},kind:i$1,runtime:s.runtime,runtimeCandidates:h(t),framework:s.key,frameworkDisplayName:s.displayName,confidence:s.confidence,detectionSource:s.source,supportTier:s.supportTier,runtimeSupportTier:a.tier,runtimeDoctorSupport:a.doctorSupport,moduleSupport:n.moduleSupport,...d$1?{kit:d$1}:{},...l?{engine:l}:{},...p?{generator:p}:{},createCapability:u,commands:{supported:n.supportedCommands,unsupported:n.unsupportedCommands,global:n.globalCommands,fleetStages:n.fleetStages,localOnly:n.localOnlyCommands,map:n.commandMap},importantFiles:await or(t),evidence:await sr(e,t,r.includeEvidence),provenance:{path:"filesystem discovery",runtime:s.source,framework:s.source,commands:"project command capability matrix",createCapability:"create planner capability contract",evidence:"project .workspai/reports"}}}async function Ee(e){for(let t of o(e,"workspace.json")){let r=await pt(t);if(r)return r}return null}function ir(e){return e.length===0?"empty-workspace":e.some(t=>t.kind==="frontend")&&e.length>1?"full-stack-workspace":e.some(t=>t.kind==="frontend")?"frontend-workspace":e.length>1?"backend-platform":"backend-workspace"}function cr(e){let t=new Set;for(let r of e){let o=`${r.name} ${r.path}`.toLowerCase();for(let s of ["auth","billing","payment","notification","order","admin","report","search","analytics"])o.includes(s)&&t.add(s);}return Array.from(t).sort()}function C(e,t,r,o){return {severity:e,code:t,message:r,target:o}}function lt(e){let t=[];e.workspace.name.trim()||t.push(C("error","workspace.name.missing","Workspace name could not be resolved.","workspace")),e.workspace.type==="observed-workspace"&&t.push(C("warning","workspace.marker.missing","Workspace marker is missing; model is based on filesystem observation.","workspace.marker")),e.summary.projectCount===0&&t.push(C("warning","workspace.projects.empty","No project roots were detected in this workspace.","projects")),e.contracts.exists||t.push(C("warning","workspace.contract.missing","Workspace contract is missing; dependency and API edges may be incomplete.",e.contracts.workspaceContractPath));let r=new Map;for(let n of e.projects){let a=n.name.toLowerCase(),i=r.get(a)??[];i.push(n),r.set(a,i),n.importantFiles.length||t.push(C("warning","project.markers.missing",`Project ${n.name} has no important manifest files recorded.`,n.path)),n.runtime==="unknown"&&t.push(C("warning","project.runtime.unknown",`Project ${n.name} runtime could not be confidently detected.`,n.path));let c=["test","build"];for(let p of c)n.commands.supported.includes(p)&&n.commands.unsupported.includes(p)&&t.push(C("error","project.commands.conflict",`Project ${n.name} marks ${p} as both supported and unsupported.`,n.path));let d=new Set(n.commands.fleetStages),l=new Set(n.commands.localOnly);for(let p of n.commands.fleetStages){l.has(p)&&t.push(C("error","project.commands.scope-conflict",`Project ${n.name} marks ${p} as both fleet and local-only.`,n.path));let u=n.commands.map[p];(!u||u.status!=="supported"||u.fleetEligible!==true||u.executionScope!=="fleet")&&t.push(C("error","project.commands.fleet-stage-invalid",`Project ${n.name} advertises ${p} as a fleet stage without a supported fleet capability.`,n.path));}for(let p of n.commands.localOnly){let u=n.commands.map[p];(!u||u.status!=="supported"||u.executionScope!=="local-only"||u.fleetEligible===true)&&t.push(C("error","project.commands.local-only-invalid",`Project ${n.name} advertises ${p} as local-only without a matching local-only capability.`,n.path));}for(let p of Object.values(n.commands.map))p.status==="supported"&&(p.fleetEligible===true&&!d.has(p.command)&&t.push(C("error","project.commands.fleet-stage-missing",`Project ${n.name} capability ${p.command} is fleet-eligible but missing from fleetStages.`,n.path)),p.executionScope==="local-only"&&p.fleetEligible!==true&&!l.has(p.command)&&t.push(C("error","project.commands.local-only-missing",`Project ${n.name} capability ${p.command} is local-only but missing from localOnly commands.`,n.path)));}for(let[n,a]of r.entries())a.length>1&&t.push(C("error","project.name.duplicate",`Project name "${n}" is ambiguous across ${a.length} project roots.`,a.map(i=>i.path).join(", ")));let o=t.filter(n=>n.severity==="error").length,s=t.filter(n=>n.severity==="warning").length;return {status:o>0?"failed":s>0?"warning":"passed",errors:o,warnings:s,issues:t}}function gn(e){return lt(e)}function b(e){return e.join(".")}function dr(e,t){let r=ct,o=e.generatedAt,s=[v({id:"workspace.name",label:"Workspace name",scope:"workspace",value:e.workspace.name,freshness:{kind:"durable",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:b(["workspace","name"]),reason:"Workspace identity is structural metadata and changes through workspace setup."}}),v({id:"workspace.type",label:"Workspace type",scope:"workspace",value:e.identity.workspaceType,freshness:{kind:"derived",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:b(["identity","workspaceType"]),reason:"Workspace type is derived from the current project inventory."}}),v({id:"workspace.projectCount",label:"Project count",scope:"workspace",value:e.summary.projectCount,freshness:{kind:"derived",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:b(["summary","projectCount"]),reason:"Project count is derived from workspace discovery and should be refreshed after structural changes."}}),v({id:"workspace.runtimeFamilies",label:"Runtime families",scope:"workspace",value:e.identity.runtimeFamilies,freshness:{kind:"derived",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:b(["identity","runtimeFamilies"]),reason:"Runtime coverage is inferred from project surfaces."}}),v({id:"workspace.policyMode",label:"Workspace policy mode",scope:"policy",value:e.policies.mode,freshness:{kind:"durable",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:b(["policies","mode"]),reason:"Policy mode is configuration, not runtime state."}}),v({id:"workspace.contract.exists",label:"Workspace contract presence",scope:"contract",value:e.contracts.exists,freshness:{kind:"derived",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:b(["contracts","exists"]),reason:"Contract presence is derived from workspace files and should be refreshed before release gating."}})];e.graph&&s.push(v({id:"graph.edgeCount",label:"Dependency graph edge count",scope:"graph",value:e.graph.stats.edgeCount,freshness:{kind:"derived",category:"structure",generatedAt:e.graph.generatedAt??o,now:t,sourceArtifact:r,sourcePath:b(["graph","stats","edgeCount"]),reason:"Graph topology is derived from manifests, imports, and workspace contracts."}}),v({id:"graph.evidenceCoverageRatio",label:"Dependency graph evidence coverage",scope:"graph",value:e.graph.stats.evidenceCoverageRatio,freshness:{kind:"derived",category:"structure",generatedAt:e.graph.generatedAt??o,now:t,sourceArtifact:r,sourcePath:b(["graph","stats","evidenceCoverageRatio"]),reason:"Graph evidence coverage changes when dependency evidence or contract edges change."}}));for(let[n,a]of e.projects.entries()){let i=`projects[${n}]`,c={kind:"derived",category:"structure",generatedAt:o,now:t,sourceArtifact:r,reason:"Project facts are derived from workspace discovery, project metadata, and framework probes."};s.push(v({id:`project.${a.name}.kind`,label:`${a.name} kind`,scope:"project",project:a.name,value:a.kind,freshness:{...c,sourcePath:b([i,"kind"])}}),v({id:`project.${a.name}.runtime`,label:`${a.name} runtime`,scope:"project",project:a.name,value:a.runtime,freshness:{...c,sourcePath:b([i,"runtime"])}}),v({id:`project.${a.name}.framework`,label:`${a.name} framework`,scope:"project",project:a.name,value:a.frameworkDisplayName,freshness:{...c,sourcePath:b([i,"frameworkDisplayName"])}}),v({id:`project.${a.name}.supportTier`,label:`${a.name} support tier`,scope:"project",project:a.name,value:a.supportTier,freshness:{...c,sourcePath:b([i,"supportTier"])}}),v({id:`project.${a.name}.safeFleetStages`,label:`${a.name} safe fleet stages`,scope:"command",project:a.name,value:a.commands.fleetStages,freshness:{...c,sourcePath:b([i,"commands","fleetStages"]),reason:"Safe command availability is derived from package and project command surfaces."}}));for(let[d,l]of Object.entries(a.evidence))s.push(v({id:`project.${a.name}.evidence.${d}`,label:`${a.name} ${d} evidence`,scope:"evidence",project:a.name,value:l?{path:l.path,exists:l.exists,status:l.status??null}:{exists:false},freshness:{kind:l?.exists?"evidence-backed":"verify-before-use",category:"verification",generatedAt:l?.generatedAt??o,now:t,status:l?.exists?void 0:"unknown",sourceArtifact:l?.path??r,sourcePath:b([i,"evidence",d]),verifyBeforeUse:true,reason:l?.exists?"Evidence reports can expire or become stale after source changes.":"Missing evidence must be generated before this fact is used for verification."}}));}for(let[n,a]of Object.entries(e.evidence))s.push(v({id:`workspace.evidence.${n}`,label:`Workspace ${n} evidence`,scope:"evidence",value:a?{path:a.path,exists:a.exists,status:a.status??null}:null,freshness:{kind:a?.exists?"evidence-backed":"verify-before-use",category:"verification",generatedAt:a?.generatedAt??o,now:t,status:a?.exists?void 0:"unknown",sourceArtifact:a?.path??r,sourcePath:b(["evidence",n]),verifyBeforeUse:true,reason:a?.exists?"Workspace evidence can expire or become stale after project, dependency, or policy changes.":"Missing workspace evidence must be generated before release or repair decisions."}}));return s}async function ae(e){let t=f.resolve(e.workspacePath),r=e.includeAbsolutePaths===true,o$1=e.includeEvidence===true,s=be(e.observableScanDepth),n=e.now??new Date,[a$4,i,c,d,l]=await Promise.all([a$1(t),Ee(t),a$2(t),a$3(t,{descendIntoMatchedProjects:false}),je(t,s)]),p=Ce([...d,...l,...c.map(g=>f.isAbsolute(g.path)?g.path:f.join(t,g.path))]),u=e.reuseProjectModels,m=await Promise.all(p.map(g=>{if(u){let ut=f.relative(t,f.resolve(g)).split(f.sep).join("/"),Se=u.get(ut);if(Se)return Promise.resolve(Se)}return ar(t,g,{includeAbsolutePaths:r,includeEvidence:o$1})})),E=typeof i?.workspace_name=="string"?i.workspace_name:typeof i?.name=="string"?i.name:a$4?.name||f.basename(t),w=typeof i?.profile=="string"?i.profile:typeof i?.mode=="string"?i.mode:void 0,G=Array.from(new Set(m.map(g=>g.kind))).sort(),A=Array.from(new Set(m.map(g=>g.runtime))).sort(),ie=Array.from(new Set(m.map(g=>g.framework))).sort(),O=[".workspai/policies.yml",".workspai/policies.yaml",".rapidkit/policies.yml",".rapidkit/policies.yaml"].find(g=>P.existsSync(f.join(t,g))),_=o(t,"workspace.contract.json").map(g=>f.relative(t,g).split(f.sep).join("/")).find(g=>P.existsSync(f.join(t,g)))??".workspai/workspace.contract.json",W=await P.pathExists(f.join(t,_)),z={schemaVersion:Qt,generatedAt:n.toISOString(),workspace:{name:E,root:t,...w?{profile:w}:{},type:a$4?"rapidkit-workspace":"observed-workspace",...a$4?{marker:{createdBy:a$4.createdBy,version:a$4.version,createdAt:a$4.createdAt}}:{}},identity:{workspaceType:ir(m),surfaces:G,runtimeFamilies:A,businessCapabilities:cr(m)},discovery:{observableScanDepth:s},projects:m,policies:{mode:typeof i?.policy_mode=="string"?i.policy_mode:typeof i?.policyMode=="string"?i.policyMode:"warn",source:O??null,exists:!!O},contracts:{workspaceContractPath:_,exists:W,status:W?"known":"missing"},evidence:{doctor:await S(t,a.doctor,o$1),projectDoctor:await S(t,".workspai/reports/doctor-project-last-run.json",o$1),doctorRemediationPlan:await S(t,".workspai/reports/doctor-remediation-plan-last-run.json",o$1),artifactRemediationPlan:await S(t,".workspai/reports/artifact-remediation-plan-last-run.json",o$1),doctorFixResult:await S(t,".workspai/reports/doctor-fix-result-last-run.json",o$1),analyze:await S(t,a.analyze,o$1),readiness:await S(t,a.readiness,o$1),pipeline:await S(t,".workspai/reports/pipeline-last-run.json",o$1)},summary:{projectCount:m.length,runtimes:A,frameworks:ie,firstClassProjects:m.filter(g=>g.supportTier==="first-class").length,observedProjects:m.filter(g=>g.supportTier==="observed").length}},N=await fr(t,z,{contractExists:W,now:n,incrementalGraph:e.incrementalGraph}),T={...z,graph:N},y=lt(T),j=dr({...T},n),I=at({facts:j,generatedAt:n.toISOString(),now:n});return {...T,facts:j,factFreshness:I,validation:y}}async function hn(e){if(e.cache!==true)return {model:await ae(e),cache:"disabled"};let t=f.resolve(e.workspacePath),r=be(e.observableScanDepth),o=we(),[s,n,a,i,c]=await Promise.all([a$1(t),Ee(t),a$2(t),a$3(t,{descendIntoMatchedProjects:false}),je(t,r)]),d=Ce([...i,...c,...a.map(w=>f.isAbsolute(w.path)?w.path:f.join(t,w.path))]),l=await oe({workspacePath:t,cliVersion:o,flags:{includeAbsolutePaths:e.includeAbsolutePaths===true,includeEvidence:e.includeEvidence===true,observableScanDepth:r},projectPaths:d,workspaceJson:n,marker:s}),p=await ve(t);if(p&&p.cliVersion===o&&p.inputsHash===l)return {model:p.model,cache:"hit"};let u=await ae({...e}),[m,E]=await Promise.all([re(t,d),ne(t)]);return await se(t,{cliVersion:o,inputsHash:l,generatedAt:(e.now??new Date).toISOString(),model:u,projectSignatures:m,workspaceFileSignatures:E}),{model:u,cache:"miss"}}function pr(e,t){let r=new Set,o=new Set,s=new Set;for(let[n,a]of Object.entries(t))n in e?e[n]!==a&&r.add(n):o.add(n);for(let n of Object.keys(e))n in t||s.add(n);return {changed:r,added:o,removed:s}}function lr(e={},t={}){let r=new Set([...Object.keys(e),...Object.keys(t)]);for(let o of r)if(e[o]!==t[o])return false;return true}async function kn(e){let t=f.resolve(e.workspacePath),r=be(e.observableScanDepth),o=we(),s=e.now??new Date,[n,a,i,c,d]=await Promise.all([a$1(t),Ee(t),a$2(t),a$3(t,{descendIntoMatchedProjects:false}),je(t,r)]),l=Ce([...c,...d,...i.map(y=>f.isAbsolute(y.path)?y.path:f.join(t,y.path))]),p=await ve(t),u=async()=>{let y=await ae({...e}),j=await oe({workspacePath:t,cliVersion:o,flags:{includeAbsolutePaths:e.includeAbsolutePaths===true,includeEvidence:e.includeEvidence===true,observableScanDepth:r},projectPaths:l,workspaceJson:a,marker:n}),[I,g]=await Promise.all([re(t,l),ne(t)]);return await se(t,{cliVersion:o,inputsHash:j,generatedAt:s.toISOString(),model:y,projectSignatures:I,workspaceFileSignatures:g}),{model:y,mode:"full"}};if(!p||p.cliVersion!==o||!p.projectSignatures||!p.model?.graph)return u();let m=await ne(t);if(!lr(p.workspaceFileSignatures,m))return u();let E=await re(t,l),{changed:w,added:G,removed:A}=pr(p.projectSignatures,E);if(w.size===0&&G.size===0&&A.size===0)return {model:p.model,mode:"unchanged"};let ie=new Set([...w,...G]),O=new Map;for(let y of p.model.projects){let j=y.path.split(f.sep).join("/");!ie.has(j)&&!A.has(j)&&O.set(j,y);}let _=new Set,W=false;for(let y of p.model.projects){let j=y.path.split(f.sep).join("/");w.has(j)&&_.add(y.name);}let z=G.size>0||A.size>0,N=await ae({...e,reuseProjectModels:O,incrementalGraph:{previousGraph:p.model.graph,changedProjectIds:_,structuralChange:z||W}});for(let y of p.model.projects){let j=y.path.split(f.sep).join("/");if(!w.has(j))continue;let I=N.projects.find(g=>g.path.split(f.sep).join("/")===j);if(I&&I.name!==y.name){W=true;break}}if(W)return u();let T=await oe({workspacePath:t,cliVersion:o,flags:{includeAbsolutePaths:e.includeAbsolutePaths===true,includeEvidence:e.includeEvidence===true,observableScanDepth:r},projectPaths:l,workspaceJson:a,marker:n});return await se(t,{cliVersion:o,inputsHash:T,generatedAt:s.toISOString(),model:N,projectSignatures:E,workspaceFileSignatures:m}),{model:N,mode:"incremental"}}async function ur(e){try{let{contract:t}=await j$1({workspacePath:e});return t&&typeof t=="object"?t:null}catch{return null}}async function fr(e,t,r){let o=r.contractExists?await ur(e):null;try{return r.incrementalGraph?await rt({workspacePath:e,model:t,contract:o,now:r.now,previousGraph:r.incrementalGraph.previousGraph,changedProjectIds:r.incrementalGraph.changedProjectIds,structuralChange:r.incrementalGraph.structuralChange}):await tt({workspacePath:e,model:t,contract:o,now:r.now})}catch{let s=t.projects.map(n=>({id:n.name,path:n.path}));return {schemaVersion:"workspace-dependency-graph.v1",generatedAt:r.now.toISOString(),nodes:s,edges:[],stats:{nodeCount:s.length,edgeCount:0,inferredEdges:0,contractEdges:0,manualEdges:0,authoritativeEdges:0,lowConfidenceEdges:0,orphanCount:s.length,connectedNodeCount:0,density:0,edgeCoverageRatio:s.length>0?0:1,evidenceCoverageRatio:1,hotspotCount:0,hasCycle:false},diagnostics:s.length>1?[{code:"graph.inference.failed",severity:"warning",message:"Dependency graph inference failed; model contains projects but no dependency edges.",recommendation:"Run workspace model again after fixing graph inputs, or add workspace contract/manual graph overrides.",nodeIds:s.map(n=>n.id).sort((n,a)=>n.localeCompare(a))}]:void 0}}}async function yn(e,t){return g(t,ct,a$4(e))}export{Wr as a,M as b,st as c,v as d,at as e,Ve as f,br as g,$e as h,Ke as i,Qt as j,ct as k,gn as l,dr as m,ae as n,hn as o,kn as p,yn as q};
@@ -0,0 +1,13 @@
1
+ import {a as a$1}from'./chunk-JEI6BTZI.js';import {d as d$1,b}from'./chunk-42G2OK64.js';import {g}from'./chunk-ZWO6K24C.js';import {a}from'./chunk-J4AICQFB.js';import {c,e,d}from'./chunk-XIVFLY6G.js';import {n}from'./chunk-HYJK7W3B.js';import {j as j$1,a as a$2}from'./chunk-QWU2CZBG.js';import {g as g$1,b as b$1}from'./chunk-6AA3WWQZ.js';import {a as a$3}from'./chunk-LG6RFLPZ.js';import j from'path';import W from'fs-extra';function G(e$1){switch(e$1){case "why":return d;case "trace":return e;default:return c}}async function P(e,n,o){try{if(!await W.pathExists(e))return null;let r=await W.readJson(e);return n?b$1(n,r,e):o&&a$3(r,o,e),r}catch(r){if((n||o)&&await W.pathExists(e))throw r;return null}}function z(e,n){if(!e)return null;let o=n.trim().toLowerCase();return e.projects.find(r=>r.slug.toLowerCase()===o||r.relativePath.toLowerCase()===o)??null}function J(e,n,o){let r=o.trim().toLowerCase(),t=(e.graph?.nodes.map(a=>a.id)??e.projects.map(a=>a.name)).find(a=>a.toLowerCase()===r);if(t)return t;let d=e.projects.find(a=>[a.name,a.path,j.basename(a.path)].filter(u=>u.trim().length>0).some(u=>u.toLowerCase()===r));if(d)return d.name;let c=z(n,o);if(c){let a=e.projects.find(u=>u.path===c.relativePath||u.path.endsWith(`/${c.relativePath}`));if(a)return a.name}return o}function X(e,n){if(!e)return [];let o=n.trim().toLowerCase(),r=new Set;for(let l of e.projects){l.contracts.dependsOn?.some(t=>t.toLowerCase()===o)&&r.add(l.slug);for(let t of l.contracts.consumes??[])for(let d of e.projects)d.contracts.publishes?.includes(t)&&d.slug===o&&r.add(l.slug);}return [...r].sort()}function Y(e,n){if(!e)return [];let o=n.trim().toLowerCase();return e.steps.filter(r=>r.scope==="project"&&r.project?.toLowerCase()===o&&r.command?.display).map(r=>r.command.display).slice(0,8)}function p(e,n,o){return {id:e,title:n,body:o.trim()}}async function me(e){let n$1=j.resolve(e.workspacePath),o=(e.now??new Date).toISOString(),r=e.model??await n({workspacePath:n$1,includeEvidence:true}),l=e.contract;if(l===void 0)try{l=(await j$1({workspacePath:n$1})).contract;}catch{l=null;}let t=e.verify;t===void 0&&(t=await P(j.join(n$1,d$1),d$1));let d=e.impact;if(d===void 0&&(d=await P(j.join(n$1,g),g)),e.target.kind==="release-blocked"){let s=t?.blockingReasons??[],i=(r.summary?.projectCount??r.projects.length)===0,g=[p("verdict",i?"Workspace scaffold posture":"Release verdict",t?i?`Scaffold posture: **${t.summary.verdict}** (exit ${t.summary.exitCode}). Freshness: **${t.freshness.verdict}**. No registered projects yet \u2014 release gates apply after the first project is added.`:`Verdict: **${t.summary.verdict}** (exit ${t.summary.exitCode}). Risk: **${t.impact.risk}**. Freshness: **${t.freshness.verdict}**.`:"No workspace verify report found. Run `npx workspai workspace verify --json --write` first."),p("blockers",i?"Pre-project signals":"Blocking reasons",s.length?s.map(h=>`- ${h}`).join(`
2
+ `):i?"No pre-project signals in the latest verify report.":"No blocking reasons in the latest verify report.")];return t?.resolutionHints?.length&&g.push(p("resolution","Resolution hints",t.resolutionHints.map(h=>`- **${h.blockerId}** (${h.resolutionClass}): ${h.commandRetryHint??h.fixHints[0]?.detail??"See fix hints"}`).join(`
3
+ `))),{schemaVersion:a,generatedAt:o,workspacePath:n$1,target:e.target,summary:t?i?b(s.length,t.summary.verdict):`Release blocked: ${t.summary.verdict} with ${s.length} blocking reason(s).`:"Release posture unknown \u2014 verify report missing.",sections:g,releaseRisk:t?.impact.risk,blockingReasons:s,resolutionHints:t?.resolutionHints}}if(e.target.kind==="blocker"){let s=e.target,m=t?.resolutionHints?.find(g=>g.blockerId===s.blockerId),i=t?.blockingReasons.find(g=>g.includes(s.blockerId))??t?.blockingReasons[0];return {schemaVersion:a,generatedAt:o,workspacePath:n$1,target:s,summary:m?`Blocker ${s.blockerId}: ${m.resolutionClass}`:`Blocker ${s.blockerId} (no structured hint)`,sections:[p("reason","Blocking signal",i??"No matching blocking reason in verify."),p("hint","Resolution class",m?`${m.resolutionClass}
4
+
5
+ ${m.commandRetryHint??""}
6
+
7
+ ${m.fixHints.map(g=>`- ${g.detail}`).join(`
8
+ `)}`:"Run workspace verify to emit resolutionHints for this blocker.")],blockingReasons:i?[i]:[],resolutionHints:m?[m]:[]}}if(e.target.kind==="trace"){let s=j.isAbsolute(e.target.diffRef)?e.target.diffRef:j.join(n$1,e.target.diffRef),m=await P(s,void 0,"contracts/workspace-intelligence/workspace-model-diff.v1.json"),i=m?.summary?.changedProjects??[...new Set((m?.changes??[]).map(f=>f.project).filter(Boolean))],h=(r.summary?.projectCount??r.projects.length)===0,T=d?.transitiveImpact?.map(f=>`${f.project?.name??f.target} (d${f.distance??0}, via ${f.via??"\u2014"})`)??[],y=t?.affectedSubgraph;return {schemaVersion:a,generatedAt:o,workspacePath:n$1,target:e.target,summary:i?.length?`Trace from ${i.length} changed project(s) through blast radius to gate coverage.`:h?"Trace: workspace scaffold baseline \u2014 no project changes in the latest diff.":"Trace: diff baseline present with no project changes.",sections:[p("origin","Change origin",i?.length?i.map(f=>`- ${f}`).join(`
9
+ `):"No changed projects in diff."),p("blast-radius","Transitive impact",T.length?T.map(f=>`- ${f}`).join(`
10
+ `):"No transitive impact report."),p("gate","Subgraph gate",y?`Directly changed: ${y.directlyChanged}; transitive dependents: ${y.transitiveDependents}; covered: ${y.covered}; uncovered: ${y.uncovered}; unverifiable: ${y.unverifiable}.`:"No verify subgraph coverage available.")],releaseRisk:d?.summary?.risk??t?.impact.risk,blockingReasons:t?.blockingReasons}}let c=e.target.project,a$2=J(r,l,c),u=r.graph,k=u?a$1(u,a$2):{found:false,centrality:null,directDependents:[],transitiveDependents:[]},w=z(l,c),E=X(l,c),b$1=Y(t,c),v=r.projects.find(s=>s.name.toLowerCase()===c.toLowerCase()),x=[p("overview","Project overview",v?`${v.name} (${v.frameworkDisplayName}, ${v.runtime}) at \`${v.path}\`.`:`Project **${c}** ${k.found?"exists in graph":"not found in workspace model"}.`),p("consumers","Consumers / dependents",[`Direct dependents: ${k.directDependents.join(", ")||"none"}`,`Contract consumers: ${E.join(", ")||"none"}`,`Transitive dependents (blast radius): ${k.transitiveDependents.length}`].join(`
11
+ `)),p("contracts","Critical contracts",w?[`Owns: ${w.contracts?.owns?.join(", ")||"none"}`,`Publishes: ${w.contracts.publishes.join(", ")||"none"}`,`Consumes: ${w.contracts.consumes.join(", ")||"none"}`,`APIs: ${w.contracts.apis.map(s=>s.name).join(", ")||"none"}`].join(`
12
+ `):"No workspace.contract.json entry for this project."),p("verification","Required verification",b$1.length?b$1.map(s=>`- ${s}`).join(`
13
+ `):"- `npx workspai workspace verify --json`\n- Project test/build via `workspace run` when configured")];k.centrality&&x.push(p("centrality","Graph centrality",`fanIn ${k.centrality.fanIn}, fanOut ${k.centrality.fanOut}, reach ${k.centrality.reach}, hotspot ${k.centrality.isHotspot?"yes":"no"}.`));let I=c.trim().toLowerCase(),A=s=>s.project?.name?.toLowerCase()===I||s.target.toLowerCase()===I,S=d?.affectedProjects?.find(A)?.risk??d?.transitiveImpact?.find(A)?.risk??t?.impact.risk??"unknown";return {schemaVersion:a,generatedAt:o,workspacePath:n$1,target:e.target,summary:`${c}: ${E.length} consumer(s), release risk **${S}**.`,sections:x,releaseRisk:String(S)}}async function fe(e,n,o="explain"){let r=G(o);return await g$1(n,r,a$2(e)),r}export{G as a,me as b,fe as c};
@@ -0,0 +1 @@
1
+ import {b}from'./chunk-5AKYMAIL.js';var i=b.explain,g=["project","release-blocked","blocker","trace"];function s(t){let r=t.trim();if(!r)return null;if(r==="release-blocked")return {kind:"release-blocked"};if(r.startsWith("project:")){let e=r.slice(8).trim();return e?{kind:"project",project:e}:null}if(r.startsWith("blocker:")){let e=r.slice(8).trim();return e?{kind:"blocker",blockerId:e}:null}if(r.startsWith("trace:")){let e=r.slice(6).trim();return e?{kind:"trace",diffRef:e}:null}return {kind:"project",project:r}}function u(t){let r=t.trim();if(!r)return null;if(r.startsWith("trace:")){let n=s(r);return n?.kind==="trace"?n:null}let e=r.replace(/\\/g,"/").trim().toLowerCase();return e.endsWith(".json")||e.includes("workspace-model-diff")||e.startsWith(".rapidkit/")||e.includes("/.rapidkit/")?{kind:"trace",diffRef:r}:null}function A(t){if(!t||typeof t!="object"||Array.isArray(t))return false;let r=t;return r.schemaVersion===i&&typeof r.generatedAt=="string"&&typeof r.summary=="string"&&Array.isArray(r.sections)&&r.target!=null&&typeof r.target=="object"&&!Array.isArray(r.target)&&typeof r.target.kind=="string"}export{i as a,g as b,s as c,u as d,A as e};
@@ -1,4 +1,4 @@
1
- import {l,j as j$1,i,b,s,m,h}from'./chunk-LZQNVH7D.js';import {a}from'./chunk-2FIX2MDC.js';import {c,d}from'./chunk-5XATWNME.js';import wt from'crypto';import tt from'os';import l$1 from'path';import*as p from'fs-extra';import {execa}from'execa';var yt=["version","project","create","add","list","info","upgrade","diff","doctor","license","commands","reconcile","rollback","uninstall","checkpoint","optimize","snapshot","frameworks","modules","merge"],M=new Set(yt);var g=a();async function et(t){for(let e of [c,d]){let r=l$1.join(t,e);if(await p.pathExists(r))try{let n=await p.readJson(r);if(n&&typeof n=="object")return n}catch{return null}}return null}function O(){let t=[],e=i=>{let o=i?.trim();o&&t.push(o);};e(process.env.RAPIDKIT_BRIDGE_PYTHON),e(process.env.RAPIDKIT_PYTHON_CMD),e(process.env.POETRY_PYTHON);let r=_();(r.startsWith("/")||r.startsWith(".")||r.startsWith(".."))&&!r.startsWith("file:")&&e(l(l$1.join(l$1.resolve(r),".venv")));for(let i of j$1())i.args.length===1&&i.args[0]==="--version"&&e(i.command);for(let i$1 of i())e(i$1);return [...new Set(t)]}function v(t,e){return t==="py"?["-3",...e]:e}function H(t){if(!t)return t;let e=["Installed Poetry version does not support '--no-update'. Falling back to 'poetry lock'."];return t.split(/\r?\n/).filter(i=>!e.some(o=>i.includes(o))).join(`
1
+ import {l,j as j$1,i,b,s,m,h}from'./chunk-2K3GYCPS.js';import {a}from'./chunk-2FIX2MDC.js';import {c,d}from'./chunk-5XATWNME.js';import wt from'crypto';import tt from'os';import l$1 from'path';import*as p from'fs-extra';import {execa}from'execa';var yt=["version","project","create","add","list","info","upgrade","diff","doctor","license","commands","reconcile","rollback","uninstall","checkpoint","optimize","snapshot","frameworks","modules","merge"],M=new Set(yt);var g=a();async function et(t){for(let e of [c,d]){let r=l$1.join(t,e);if(await p.pathExists(r))try{let n=await p.readJson(r);if(n&&typeof n=="object")return n}catch{return null}}return null}function O(){let t=[],e=i=>{let o=i?.trim();o&&t.push(o);};e(process.env.RAPIDKIT_BRIDGE_PYTHON),e(process.env.RAPIDKIT_PYTHON_CMD),e(process.env.POETRY_PYTHON);let r=_();(r.startsWith("/")||r.startsWith(".")||r.startsWith(".."))&&!r.startsWith("file:")&&e(l(l$1.join(l$1.resolve(r),".venv")));for(let i of j$1())i.args.length===1&&i.args[0]==="--version"&&e(i.command);for(let i$1 of i())e(i$1);return [...new Set(t)]}function v(t,e){return t==="py"?["-3",...e]:e}function H(t){if(!t)return t;let e=["Installed Poetry version does not support '--no-update'. Falling back to 'poetry lock'."];return t.split(/\r?\n/).filter(i=>!e.some(o=>i.includes(o))).join(`
2
2
  `)}var w=class extends Error{code;constructor(e,r){super(r),this.code=e;}};function D(t){if(t instanceof w)switch(t.code){case "PYTHON_NOT_FOUND":return `Workspai could not find Python (python3/python/py) on your PATH.
3
3
  Install Python 3.10+ and ensure \`${h()}\` is available, then retry.
4
4
  Tip: if you are inside a RapidKit project, use the local ./rapidkit launcher.`;case "BRIDGE_VENV_CREATE_FAILED":return `Workspai failed to create its bridge virtual environment.
@@ -1,6 +1,8 @@
1
- import {c as c$1}from'./chunk-NFUXULIF.js';import {a}from'./chunk-A5FBGRJA.js';import {a as a$3}from'./chunk-GZTYAEWX.js';import {c}from'./chunk-Y45WZR5N.js';import {a as a$2}from'./chunk-TQEMLBAG.js';import {p,r}from'./chunk-LZQNVH7D.js';import {p as p$1,o}from'./chunk-5XATWNME.js';import {promises}from'fs';import n from'path';import a$1 from'chalk';import N from'ora';import {execa}from'execa';async function H(e){try{let t=await execa("git",["rev-parse","--show-toplevel"],{cwd:e,env:a$2()});return t.stdout.trim()?n.resolve(e,t.stdout.trim()):null}catch{return null}}async function J(e,t,r){if(await H(e)){t.warn("Git initialization skipped because target is already inside a git worktree");return}t.start("Initializing git repository...");try{await execa("git",["init"],{cwd:e,env:a$2()}),await execa("git",["add","."],{cwd:e,env:a$2()}),await execa("git",["commit","-m",r],{cwd:e,env:a$2()}),t.succeed("Git repository initialized");}catch{t.warn("Could not initialize git repository");}}function q(e){let t=a(e.path),r=Array.isArray(e.projects)?e.projects:[],i=[],o=new Set;for(let l of r){if(!l||typeof l.name!="string"||typeof l.path!="string")continue;let c=a(l.path);o.has(c)||(o.add(c),i.push({name:l.name,path:c}));}return {name:e.name,path:t,mode:e.mode,projects:i}}function z(e){let t=[],r=new Set;for(let i of e.workspaces||[]){if(!i||typeof i.name!="string"||typeof i.path!="string")continue;let o=q(i);r.has(o.path)||(r.add(o.path),t.push(o));}return {workspaces:t}}async function U(e){try{let t=await promises.readFile(e,"utf8"),r=JSON.parse(t);if(r&&Array.isArray(r.workspaces))return z(r)}catch{}return {workspaces:[]}}async function F(){let e={workspaces:[]},t=new Set;for(let r$1 of r()){let i=await U(r$1);for(let o of i.workspaces)t.has(o.path)||(t.add(o.path),e.workspaces.push(o));}return e}async function K(e,t){try{let r=a(e),i=p(),o=n.join(i,"workspaces.json");await promises.mkdir(i,{recursive:true});let l={name:t,path:r,mode:"full",projects:[]};for(let c=0;c<3;c+=1){let s=await F();if(s.workspaces.some(u=>u.path===r)||(s.workspaces.push(l),await promises.writeFile(o,JSON.stringify(s,null,2)),(await U(o)).workspaces.some(u=>u.path===r)))return}console.warn(a$1.gray("Note: Could not register workspace in shared registry"));}catch{console.warn(a$1.gray("Note: Could not register workspace in shared registry"));}}async function ye(e,t=false){let r=a(e),i={workspacePath:r,workspaceFound:false,added:[],skipped:0};try{let o=p(),l=n.join(o,"workspaces.json"),c=await F();if(c.workspaces.length===0)return t||console.log("\u26A0\uFE0F Workspace registry not found"),i;let s=c.workspaces.find(f=>f.path===r);if(!s)return t||console.log("\u26A0\uFE0F Workspace not registered in registry"),i;Array.isArray(s.projects)||(s.projects=[]);let p$2=0,u=0,k=[],m=[e],y=new Set;for(;m.length>0;){let f=m.shift();if(!f||y.has(f))continue;y.add(f);let $=await promises.readdir(f,{withFileTypes:true});for(let h of $){if(!h.isDirectory()||h.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(h.name))continue;let _=n.join(f,h.name),g=a(_);try{let w=false;for(let j of [...p$1(g,"context.json"),...p$1(g,"project.json")])try{await promises.access(j),w=true;break}catch{}if(w){let j=n.basename(g);s.projects.some(S=>S.path===g||S.name===j)?u++:(s.projects.push({name:j,path:g}),p$2++,k.push(g),t||console.log(`\u2714 Added: ${n.relative(e,g)}`));continue}}catch{}m.push(_);}}return p$2>0?(await promises.writeFile(l,JSON.stringify(c,null,2)),t||console.log(`
2
- \u2705 Synced ${p$2} project(s) to registry`)):t||console.log(`
3
- \u2705 All projects already registered (${u} found)`),{workspacePath:r,workspaceFound:true,added:k,skipped:u}}catch(o){return t||console.error("\u274C Failed to sync projects:",o.message),i}}async function $e(e,t,r){try{let i=a(e),o=a(r),l=p(),c=n.join(l,"workspaces.json"),s=await F();if(s.workspaces.length===0)return;let p$1=s.workspaces.find(m=>m.path===i);if(!p$1)return;Array.isArray(p$1.projects)||(p$1.projects=[]);let u=p$1.projects.findIndex(m=>m.path===o||m.name===t),k={name:t,path:o};if(u>=0){let m=p$1.projects[u];(m.name!==k.name||m.path!==k.path)&&(p$1.projects[u]=k,await promises.writeFile(c,JSON.stringify(s,null,2)));}else p$1.projects.push({name:t,path:o}),await promises.writeFile(c,JSON.stringify(s,null,2));}catch{}}async function je(e,t){let r=N("Creating Workspai workspace...").start();try{await promises.mkdir(e,{recursive:true}),await promises.mkdir(n.join(e,".workspai"),{recursive:true});let i={workspace_name:t.name,author:t.author,rapidkit_version:c(),created_at:new Date().toISOString(),type:"workspace"};await promises.writeFile(n.join(e,".workspai","config.json"),JSON.stringify(i,null,2));let{syncWorkspaceFoundationFiles:o}=await import('./create-42RTNLH2.js');await o(e,{workspaceName:t.name,installMethod:"venv",writeMarker:true,writeGitignore:false,onlyIfMissing:true});let{publishWorkspaceRegistrySummary:l}=await import('./workspace-registry-summary-6MFBRWDS.js');await l(e);let c$1=Q();await promises.writeFile(n.join(e,"rapidkit"),c$1),await promises.chmod(n.join(e,"rapidkit"),493);let s=X();await promises.writeFile(n.join(e,"rapidkit.cmd"),s);let p=Z(t.name);await promises.writeFile(n.join(e,"README.md"),p),await promises.writeFile(n.join(e,".gitignore"),`# Workspai workspace
1
+ import {c as c$2}from'./chunk-2QOWRBQD.js';import {a}from'./chunk-A5FBGRJA.js';import {a as a$2}from'./chunk-GZTYAEWX.js';import {c as c$1}from'./chunk-Y45WZR5N.js';import {a as a$1}from'./chunk-TQEMLBAG.js';import {p as p$1,r,q as q$1}from'./chunk-2K3GYCPS.js';import {p,o}from'./chunk-5XATWNME.js';import {promises}from'fs';import {randomUUID}from'crypto';import c from'path';import s from'chalk';import ee from'fs-extra';import E from'ora';import {execa}from'execa';async function te(e){try{let r=await execa("git",["rev-parse","--show-toplevel"],{cwd:e,env:a$1()});return r.stdout.trim()?c.resolve(e,r.stdout.trim()):null}catch{return null}}async function V(e,r,t){if(await te(e)){r.warn("Git initialization skipped because target is already inside a git worktree");return}r.start("Initializing git repository...");try{await execa("git",["init"],{cwd:e,env:a$1()}),await execa("git",["add","."],{cwd:e,env:a$1()}),await execa("git",["commit","-m",t],{cwd:e,env:a$1()}),r.succeed("Git repository initialized");}catch{r.warn("Could not initialize git repository");}}function Y(e){let r=a(e.path),t=Array.isArray(e.projects)?e.projects:[],o=[],a$1=new Set;for(let p of t){if(!p||typeof p.name!="string"||typeof p.path!="string")continue;let n=a(p.path);a$1.has(n)||(a$1.add(n),o.push({name:p.name,path:n}));}return {name:e.name,path:r,mode:e.mode,projects:o}}function F(e){let r=[],t=new Set;for(let o of e.workspaces||[]){if(!o||typeof o.name!="string"||typeof o.path!="string")continue;let a=Y(o);t.has(a.path)||(t.add(a.path),r.push(a));}return {workspaces:r}}async function re(e){try{let r=await promises.readFile(e,"utf8"),t=JSON.parse(r);if(t&&Array.isArray(t.workspaces))return F(t)}catch{}return {workspaces:[]}}async function O(){let e={workspaces:[]},r$1=new Set;for(let t of r()){let o=await re(t);for(let a of o.workspaces)r$1.has(a.path)||(r$1.add(a.path),e.workspaces.push(a));}return e}function ae(e){let r=e?.code;return process.platform==="win32"&&(r==="EPERM"||r==="EINVAL"||r==="ENOSYS")}async function H(e){try{await e.sync();}catch(r){if(!ae(r))throw r}}async function M(e,r){let t=c.dirname(e);await promises.mkdir(t,{recursive:true});let o=`${c.basename(e)}.`,a=Date.now();for(let i of await promises.readdir(t)){if(!i.startsWith(o)||!i.endsWith(".tmp"))continue;let l=c.join(t,i),m=await promises.stat(l).catch(()=>null);m&&a-m.mtimeMs>3e4&&await promises.rm(l,{force:true}).catch(()=>{});}let p=await promises.readFile(e,"utf8").catch(()=>null);if(p!==null){let i=false;try{let l=JSON.parse(p);i=Array.isArray(l.workspaces);}catch{i=false;}if(!i){let l=`${e}.corrupt-${Date.now()}`;await promises.copyFile(e,l);}}let n=`${e}.${process.pid}.${randomUUID()}.tmp`;try{await promises.writeFile(n,`${JSON.stringify(F(r),null,2)}
2
+ `);let i=await promises.open(n,"r");try{await H(i);}finally{await i.close();}try{await promises.rename(n,e);}catch(l){let m=l.code;if(m!=="EEXIST"&&m!=="EPERM")throw l;await ee.move(n,e,{overwrite:true});}}finally{await promises.rm(n,{force:true}).catch(()=>{});}}async function oe(e){let r=p$1(),t=c.join(r,"workspaces.json.lock");await promises.mkdir(r,{recursive:true});let o=Date.now(),a;for(;!a;)try{a=await promises.open(t,"wx"),await a.writeFile(`${JSON.stringify({pid:process.pid,createdAt:new Date().toISOString()})}
3
+ `),await H(a);}catch(p){if(p.code!=="EEXIST")throw p;let n=await promises.stat(t).catch(()=>null);if(n&&Date.now()-n.mtimeMs>3e4){let i=await promises.readFile(t,"utf8").then(f=>JSON.parse(f)).catch(()=>null),l=Number(i?.pid),m=false;if(Number.isInteger(l)&&l>0)try{process.kill(l,0),m=true;}catch(f){m=f.code==="EPERM";}if(!m){await promises.rm(t,{force:true}).catch(()=>{});continue}}if(Date.now()-o>1e4)throw new Error(`Timed out waiting for workspace registry lock: ${t}`);await new Promise(i=>setTimeout(i,25));}try{return await e()}finally{await a.close().catch(()=>{}),await promises.rm(t,{force:true}).catch(()=>{});}}async function P(e){return oe(async()=>{let r=await O();await e(r);let t=F(r),o=c.join(p$1(),"workspaces.json"),a=c.join(q$1(),"workspaces.json");return await M(o,t),await M(a,t),t})}async function q(e,r){try{let t=a(e);await P(o=>{let a=o.workspaces.find(p=>p.path===t);if(a){a.name=r,a.mode=a.mode||"full",a.projects=Array.isArray(a.projects)?a.projects:[];return}o.workspaces.push({name:r,path:t,mode:"full",projects:[]});});}catch{console.warn(s.gray("Note: Could not register workspace in shared registry"));}}async function Ce(e,r=false){let t=a(e),o={workspacePath:t,workspaceFound:false,added:[],skipped:0};try{let a$1=await O(),p$1=a$1.workspaces.find(u=>u.path===t);if(!p$1){if(await q(t,c.basename(c.resolve(e))),a$1=await O(),p$1=a$1.workspaces.find(u=>u.path===t),!p$1)return r||console.log("\u26A0\uFE0F Workspace could not be registered in registry"),o;r||console.log("\u2714 Registered workspace in shared registry");}Array.isArray(p$1.projects)||(p$1.projects=[]);let n=0,i=0,l=[],m=[],f=[e],g=new Set;for(;f.length>0;){let u=f.shift();if(!u||g.has(u))continue;g.add(u);let y=await promises.readdir(u,{withFileTypes:true});for(let h of y){if(!h.isDirectory()||h.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(h.name))continue;let j=c.join(u,h.name),w=a(j);try{let k=false;for(let $ of [...p(w,"context.json"),...p(w,"project.json")])try{await promises.access($),k=true;break}catch{}if(k){let $=c.basename(w),b=p$1.projects.some(W=>W.path===w);m.push({name:$,path:w}),b?i++:(p$1.projects.push({name:$,path:w}),n++,l.push(w),r||console.log(`\u2714 Added: ${c.relative(e,w)}`));continue}}catch{}f.push(j);}}return await P(u=>{let y=u.workspaces.find(w=>w.path===t);if(!y)return;let h=`${t}${c.sep}`,j=(y.projects||[]).filter(w=>w.path!==t&&!w.path.startsWith(h));y.projects=Y({...y,projects:[...j,...m]}).projects;}),n>0?r||console.log(`
4
+ \u2705 Synced ${n} project(s) to registry`):r||console.log(`
5
+ \u2705 All projects already registered (${i} found)`),{workspacePath:t,workspaceFound:true,added:l,skipped:i}}catch(a){return r||console.error("\u274C Failed to sync projects:",a.message),o}}async function Pe(e,r,t){try{let o=a(e),a$1=a(t);await P(p=>{let n=p.workspaces.find(m=>m.path===o);if(!n)return;n.projects=Array.isArray(n.projects)?n.projects:[];let i=n.projects.findIndex(m=>m.path===a$1||m.name===r),l={name:r,path:a$1};i>=0?n.projects[i]=l:n.projects.push(l);});}catch{}}async function We(e,r){let t=E("Creating Workspai workspace...").start();try{await promises.mkdir(e,{recursive:true}),await promises.mkdir(c.join(e,".workspai"),{recursive:true});let o={workspace_name:r.name,author:r.author,rapidkit_version:c$1(),created_at:new Date().toISOString(),type:"workspace"};await promises.writeFile(c.join(e,".workspai","config.json"),JSON.stringify(o,null,2));let{syncWorkspaceFoundationFiles:a}=await import('./create-KFR6FLRT.js');await a(e,{workspaceName:r.name,installMethod:"venv",writeMarker:true,writeGitignore:false,onlyIfMissing:true});let p=ie();await promises.writeFile(c.join(e,"rapidkit"),p),await promises.chmod(c.join(e,"rapidkit"),493);let n=se();await promises.writeFile(c.join(e,"rapidkit.cmd"),n);let i=ne(r.name);await promises.writeFile(c.join(e,"README.md"),i),await promises.writeFile(c.join(e,".gitignore"),`# Workspai workspace
4
6
  .env
5
7
  .env.*
6
8
  !.env.example
@@ -15,10 +17,10 @@ Thumbs.db
15
17
 
16
18
  # Logs
17
19
  *.log
18
- `),await promises.writeFile(n.join(e,".workspai-workspace"),JSON.stringify({signature:"WORKSPAI_WORKSPACE",createdBy:"workspai-cli",version:c(),createdAt:new Date().toISOString(),name:t.name},null,2)),await ee(e),r.succeed("Workspace created!"),t.skipGit||await J(e,N(),"Initial commit: Workspai workspace"),await K(e,t.name),console.log(`
19
- ${a$1.green("\u2728 Workspai workspace created successfully!")}
20
+ `),await promises.writeFile(c.join(e,".workspai-workspace"),JSON.stringify({signature:"WORKSPAI_WORKSPACE",createdBy:"workspai-cli",version:c$1(),createdAt:new Date().toISOString(),name:r.name},null,2)),await ce(e),t.succeed("Workspace created!"),r.skipGit||await V(e,E(),"Initial commit: Workspai workspace"),await q(e,r.name);let{publishWorkspaceRegistrySummary:m}=await import('./workspace-registry-summary-JM2XY52C.js');await m(e),console.log(`
21
+ ${s.green("\u2728 Workspai workspace created successfully!")}
20
22
 
21
- ${a$1.bold("\u{1F4C2} Workspace structure:")}
23
+ ${s.bold("\u{1F4C2} Workspace structure:")}
22
24
  ${e}/
23
25
  \u251C\u2500\u2500 rapidkit # Local CLI wrapper
24
26
  \u251C\u2500\u2500 rapidkit.cmd # Windows local CLI wrapper
@@ -30,29 +32,29 @@ ${e}/
30
32
  \u2502 \u2514\u2500\u2500 config.json # Workspai workspace config
31
33
  \u2514\u2500\u2500 README.md
32
34
 
33
- ${a$1.bold("\u{1F680} Get started:")}
34
- ${a$1.cyan(`cd ${t.name}`)}
35
- ${a$1.cyan("npx workspai create project fastapi.standard my-api --yes")}
36
- ${a$1.cyan("cd my-api")}
37
- ${a$1.cyan("npx workspai init")}
38
- ${a$1.cyan("npx workspai dev")}
35
+ ${s.bold("\u{1F680} Get started:")}
36
+ ${s.cyan(`cd ${r.name}`)}
37
+ ${s.cyan("npx workspai create project fastapi.standard my-api --yes")}
38
+ ${s.cyan("cd my-api")}
39
+ ${s.cyan("npx workspai init")}
40
+ ${s.cyan("npx workspai dev")}
39
41
 
40
- ${a$1.bold("\u{1F4E6} Available templates:")}
42
+ ${s.bold("\u{1F4E6} Available templates:")}
41
43
  fastapi - FastAPI + Python
42
44
  nestjs - NestJS + TypeScript
43
45
  springboot - Spring Boot + Java
44
46
  gofiber - Go Fiber
45
47
  gogin - Go Gin
46
48
 
47
- ${a$1.bold("\u{1F4DA} Commands:")}
49
+ ${s.bold("\u{1F4DA} Commands:")}
48
50
  npx workspai create project <kit> <name> Create a new project
49
51
  npx workspai init Install dependencies
50
52
  npx workspai dev Start dev server
51
53
  npx workspai help Show all commands
52
54
 
53
- ${a$1.gray("Alternative: npx workspai dev, make dev")}
54
- ${a$1.gray("\u{1F4A1} Tip: Install globally (npm i -g workspai) to use without npx")}
55
- `);}catch(i){throw r.fail("Failed to create workspace"),i}}function Q(){return `#!/usr/bin/env bash
55
+ ${s.gray("Alternative: npx workspai dev, make dev")}
56
+ ${s.gray("\u{1F4A1} Tip: Install globally (npm i -g workspai) to use without npx")}
57
+ `);}catch(o){throw t.fail("Failed to create workspace"),o}}function ie(){return `#!/usr/bin/env bash
56
58
  #
57
59
  # Workspai CLI - local workspace commands
58
60
  # This script provides legacy ./rapidkit commands within the workspace
@@ -426,7 +428,7 @@ main() {
426
428
  print_help
427
429
  ;;
428
430
  version|-v|--version)
429
- echo "Workspai CLI (legacy ./rapidkit launcher) v${c()}"
431
+ echo "Workspai CLI (legacy ./rapidkit launcher) v${c$1()}"
430
432
  ;;
431
433
  *)
432
434
  echo -e "\${RED}\u274C Unknown command: $cmd\${NC}"
@@ -438,7 +440,7 @@ main() {
438
440
  }
439
441
 
440
442
  main "$@"
441
- `}function X(){return `@echo off
443
+ `}function se(){return `@echo off
442
444
  setlocal enabledelayedexpansion
443
445
 
444
446
  set "SCRIPT_DIR=%~dp0"
@@ -458,7 +460,7 @@ if %ERRORLEVEL%==0 (
458
460
  echo [Workspai] No sh/bash found. Falling back to npx workspai.
459
461
  npx workspai %*
460
462
  exit /b %ERRORLEVEL%
461
- `}function Z(e){return `# ${e}
463
+ `}function ne(e){return `# ${e}
462
464
 
463
465
  Workspai workspace for building API projects.
464
466
 
@@ -504,7 +506,7 @@ npx workspai dev # Start dev server
504
506
 
505
507
  - [Workspai Documentation](https://workspai.dev)
506
508
  - [GitHub Repository](https://github.com/rapidkitlabs/workspai)
507
- `}async function ee(e){let{fileURLToPath:t}=await import('url'),r=t(import.meta.url),i=n.dirname(r),o=n.resolve(i,".."),l=n.join(o,"templates","kits"),c=n.join(e,".workspai","templates"),{default:s}=await import('fs-extra');await s.copy(l,c);let p=n.join(o,"templates","generator.js"),u=n.join(e,".workspai","generator.js");await s.copy(p,u);}async function ve(e,t){let r=t.template==="fastapi",i=r?"FastAPI":"NestJS",o=N(`Creating ${i} project...`).start();try{let{fileURLToPath:l}=await import('url'),c$1=l(import.meta.url),s=n.dirname(c$1),p=n.resolve(s,".."),u=r?"fastapi-standard":"nestjs-standard",k=n.join(p,"templates","kits",u);await promises.mkdir(e,{recursive:true});let m={project_name:r?t.name.replace(/-/g,"_").toLowerCase():t.name.replace(/_/g,"-").toLowerCase(),author:t.author,description:t.description||`${i} application generated with Workspai`,app_version:"0.1.0",license:"MIT",package_manager:t.package_manager||"npm",created_at:new Date().toISOString(),rapidkit_version:c()};await V(k,e,m);let y=r?`# Python
509
+ `}async function ce(e){let{fileURLToPath:r}=await import('url'),t=r(import.meta.url),o=c.dirname(t),a=c.resolve(o,".."),p=c.join(a,"templates","kits"),n=c.join(e,".workspai","templates"),{default:i}=await import('fs-extra');await i.copy(p,n);let l=c.join(a,"templates","generator.js"),m=c.join(e,".workspai","generator.js");await i.copy(l,m);}async function Ne(e,r){let t=r.template==="fastapi",o=t?"FastAPI":"NestJS",a=E(`Creating ${o} project...`).start();try{let{fileURLToPath:p}=await import('url'),n=p(import.meta.url),i=c.dirname(n),l=c.resolve(i,".."),m=t?"fastapi-standard":"nestjs-standard",f=c.join(l,"templates","kits",m);await promises.mkdir(e,{recursive:true});let g={project_name:t?r.name.replace(/-/g,"_").toLowerCase():r.name.replace(/_/g,"-").toLowerCase(),author:r.author,description:r.description||`${o} application generated with Workspai`,app_version:"0.1.0",license:"MIT",package_manager:r.package_manager||"npm",created_at:new Date().toISOString(),rapidkit_version:c$1()};await K(f,e,g);let u=t?`# Python
508
510
  __pycache__/
509
511
  *.py[cod]
510
512
  *$py.class
@@ -572,10 +574,10 @@ Thumbs.db
572
574
 
573
575
  # Coverage
574
576
  coverage/
575
- `;if(await promises.writeFile(n.join(e,".gitignore"),y),o.succeed(`${i} project created!`),t.skipGit||await J(e,N(),`Initial commit: ${i} project via Workspai`),!t.skipInstall&&!r){let $=t.package_manager||"npm",h=N(`Installing dependencies with ${$}...`).start();try{await execa($,["install"],{cwd:e}),h.succeed("Dependencies installed");}catch{h.warn(`Could not install dependencies. Run '${$} install' manually.`);}}let f=n.basename(e);console.log(r?`
576
- ${a$1.green("\u2728 FastAPI project created successfully!")}
577
+ `;if(await promises.writeFile(c.join(e,".gitignore"),u),a.succeed(`${o} project created!`),r.skipGit||await V(e,E(),`Initial commit: ${o} project via Workspai`),!r.skipInstall&&!t){let h=r.package_manager||"npm",j=E(`Installing dependencies with ${h}...`).start();try{await execa(h,["install"],{cwd:e}),j.succeed("Dependencies installed");}catch{j.warn(`Could not install dependencies. Run '${h} install' manually.`);}}let y=c.basename(e);console.log(t?`
578
+ ${s.green("\u2728 FastAPI project created successfully!")}
577
579
 
578
- ${a$1.bold("\u{1F4C2} Project structure:")}
580
+ ${s.bold("\u{1F4C2} Project structure:")}
579
581
  ${e}/
580
582
  \u251C\u2500\u2500 .workspai/ # Project metadata
581
583
  \u251C\u2500\u2500 src/
@@ -587,12 +589,12 @@ ${e}/
587
589
  \u251C\u2500\u2500 pyproject.toml # Poetry configuration
588
590
  \u2514\u2500\u2500 README.md
589
591
 
590
- ${a$1.bold("\u{1F680} Get started:")}
591
- ${a$1.cyan(`cd ${f}`)}
592
- ${a$1.cyan("npx workspai init")} ${a$1.gray("# Install dependencies")}
593
- ${a$1.cyan("npx workspai dev")} ${a$1.gray("# Start dev server")}
592
+ ${s.bold("\u{1F680} Get started:")}
593
+ ${s.cyan(`cd ${y}`)}
594
+ ${s.cyan("npx workspai init")} ${s.gray("# Install dependencies")}
595
+ ${s.cyan("npx workspai dev")} ${s.gray("# Start dev server")}
594
596
 
595
- ${a$1.bold("\u{1F4DA} Available commands:")}
597
+ ${s.bold("\u{1F4DA} Available commands:")}
596
598
  npx workspai init # Install dependencies (poetry install)
597
599
  npx workspai dev # Start dev server with hot reload
598
600
  npx workspai start # Start production server
@@ -600,12 +602,12 @@ ${a$1.bold("\u{1F4DA} Available commands:")}
600
602
  npx workspai lint # Lint code
601
603
  npx workspai format # Format code
602
604
 
603
- ${a$1.gray("Alternative: make dev, npx workspai dev, poetry run dev")}
604
- ${a$1.gray("\u{1F4A1} Tip: Install globally (npm i -g workspai) to use without npx")}
605
+ ${s.gray("Alternative: make dev, npx workspai dev, poetry run dev")}
606
+ ${s.gray("\u{1F4A1} Tip: Install globally (npm i -g workspai) to use without npx")}
605
607
  `:`
606
- ${a$1.green("\u2728 NestJS project created successfully!")}
608
+ ${s.green("\u2728 NestJS project created successfully!")}
607
609
 
608
- ${a$1.bold("\u{1F4C2} Project structure:")}
610
+ ${s.bold("\u{1F4C2} Project structure:")}
609
611
  ${e}/
610
612
  \u251C\u2500\u2500 .workspai/ # Project metadata
611
613
  \u251C\u2500\u2500 src/
@@ -617,13 +619,13 @@ ${e}/
617
619
  \u251C\u2500\u2500 package.json # Dependencies
618
620
  \u2514\u2500\u2500 README.md
619
621
 
620
- ${a$1.bold("\u{1F680} Get started:")}
621
- ${a$1.cyan(`cd ${f}`)}
622
- ${t.skipInstall?a$1.cyan("npx workspai init")+a$1.gray(" # npm install")+`
623
- `:""}${a$1.cyan("cp .env.example .env")}
624
- ${a$1.cyan("npx workspai dev")} ${a$1.gray("# Start dev server")}
622
+ ${s.bold("\u{1F680} Get started:")}
623
+ ${s.cyan(`cd ${y}`)}
624
+ ${r.skipInstall?s.cyan("npx workspai init")+s.gray(" # npm install")+`
625
+ `:""}${s.cyan("cp .env.example .env")}
626
+ ${s.cyan("npx workspai dev")} ${s.gray("# Start dev server")}
625
627
 
626
- ${a$1.bold("\u{1F4DA} Available commands:")}
628
+ ${s.bold("\u{1F4DA} Available commands:")}
627
629
  npx workspai init # Install dependencies
628
630
  npx workspai dev # Start dev server with hot reload
629
631
  npx workspai start # Start production server
@@ -632,22 +634,22 @@ ${a$1.bold("\u{1F4DA} Available commands:")}
632
634
  npx workspai lint # Lint code
633
635
  npx workspai format # Format code
634
636
 
635
- ${a$1.bold("\u{1F310} API endpoints:")}
637
+ ${s.bold("\u{1F310} API endpoints:")}
636
638
  http://localhost:8000/health # Health check
637
639
  http://localhost:8000/docs # Swagger docs
638
640
  http://localhost:8000/examples/notes # Example API
639
641
 
640
- ${a$1.gray("\u{1F4A1} Tip: Install globally (npm i -g workspai) to use without npx")}
641
- `);}catch(l){throw o.fail(`Failed to create ${i} project`),l}}async function V(e,t,r){let i=await promises.readdir(e,{withFileTypes:true});for(let o of i){let l=n.join(e,o.name),c=o.name.replace(/\.j2$/,""),s=n.join(t,c);if(o.isDirectory())await promises.mkdir(s,{recursive:true}),await V(l,s,r);else {let p=await promises.readFile(l,"utf-8");o.name.endsWith(".j2")&&(p=te(p,r)),await promises.writeFile(s,p),(c==="rapidkit"||c==="activate"||c.endsWith(".py")&&(s.includes(".workspai")||s.includes(".rapidkit")))&&await promises.chmod(s,493);}}}function te(e,t){let r=e;for(let[i,o]of Object.entries(t)){let l=new RegExp(`\\{\\{\\s*${i}\\s*\\}\\}`,"g");r=r.replace(l,String(o));let c=new RegExp(`\\{\\{\\s*${i}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\}\\}`,"g");r=r.replace(c,(u,k,m)=>String(o).replace(new RegExp(k,"g"),m));let s=new RegExp(`\\{\\{\\s*${i}\\s*\\|\\s*lower\\s*\\}\\}`,"g");r=r.replace(s,String(o).toLowerCase());let p=new RegExp(`\\{\\{\\s*${i}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\|\\s*lower\\s*\\}\\}`,"g");r=r.replace(p,(u,k,m)=>String(o).replace(new RegExp(k,"g"),m).toLowerCase());}return r}async function _e(e={}){let t=p(),r=n.join(t,"workspaces.json"),i=await F();if(i.workspaces.length===0){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:r,workspaces:[],summary:{total:0,missing:0,registryExists:false}},null,2));return}console.log(a$1.yellow(`
642
+ ${s.gray("\u{1F4A1} Tip: Install globally (npm i -g workspai) to use without npx")}
643
+ `);}catch(p){throw a.fail(`Failed to create ${o} project`),p}}async function K(e,r,t){let o=await promises.readdir(e,{withFileTypes:true});for(let a of o){let p=c.join(e,a.name),n=a.name.replace(/\.j2$/,""),i=c.join(r,n);if(a.isDirectory())await promises.mkdir(i,{recursive:true}),await K(p,i,t);else {let l=await promises.readFile(p,"utf-8");a.name.endsWith(".j2")&&(l=pe(l,t)),await promises.writeFile(i,l),(n==="rapidkit"||n==="activate"||n.endsWith(".py")&&(i.includes(".workspai")||i.includes(".rapidkit")))&&await promises.chmod(i,493);}}}function pe(e,r){let t=e;for(let[o,a]of Object.entries(r)){let p=new RegExp(`\\{\\{\\s*${o}\\s*\\}\\}`,"g");t=t.replace(p,String(a));let n=new RegExp(`\\{\\{\\s*${o}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\}\\}`,"g");t=t.replace(n,(m,f,g)=>String(a).replace(new RegExp(f,"g"),g));let i=new RegExp(`\\{\\{\\s*${o}\\s*\\|\\s*lower\\s*\\}\\}`,"g");t=t.replace(i,String(a).toLowerCase());let l=new RegExp(`\\{\\{\\s*${o}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\|\\s*lower\\s*\\}\\}`,"g");t=t.replace(l,(m,f,g)=>String(a).replace(new RegExp(f,"g"),g).toLowerCase());}return t}async function Ie(e={}){let r=p$1(),t=c.join(r,"workspaces.json"),o=await O();if(o.workspaces.length===0){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:t,workspaces:[],summary:{total:0,missing:0,registryExists:false}},null,2));return}console.log(s.yellow(`
642
644
  \u26A0\uFE0F No workspaces registered yet.
643
- `)),console.log(a$1.gray(`Create a workspace with: npx workspai <workspace-name>
644
- `));return}try{let o=i;if(!o||typeof o!="object"||!Array.isArray(o.workspaces)){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:r,workspaces:[],summary:{total:0,missing:0,registryExists:true,registryValid:false},error:{code:"workspace.registry.invalid",message:"Workspace registry is invalid."}},null,2));return}console.log(a$1.yellow(`
645
+ `)),console.log(s.gray(`Create a workspace with: npx workspai <workspace-name>
646
+ `));return}try{let a=o;if(!a||typeof a!="object"||!Array.isArray(a.workspaces)){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:t,workspaces:[],summary:{total:0,missing:0,registryExists:true,registryValid:false},error:{code:"workspace.registry.invalid",message:"Workspace registry is invalid."}},null,2));return}console.log(s.yellow(`
645
647
  \u26A0\uFE0F Workspace registry is invalid; resetting to empty state.
646
- `)),await promises.writeFile(r,JSON.stringify({workspaces:[]},null,2));return}let l=z(o),c=[],s=0;for(let m of l.workspaces)await promises.stat(m.path).catch(()=>null)?c.push(m):s+=1;let p={workspaces:c},u=JSON.stringify(o),k=JSON.stringify(p);if(!e.json&&u!==k&&await promises.writeFile(r,JSON.stringify(p,null,2)),!p.workspaces||p.workspaces.length===0){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:r,workspaces:[],summary:{total:0,missing:s,registryExists:true,registryValid:true,cleanupApplied:false}},null,2));return}console.log(a$1.yellow(`
648
+ `)),await P(g=>{g.workspaces=[];});return}let p=F(a),n=[],i=0;for(let g of p.workspaces)await promises.stat(g.path).catch(()=>null)?n.push(g):i+=1;let l={workspaces:n},m=JSON.stringify(a),f=JSON.stringify(l);if(!e.json&&m!==f){let g=new Set(n.map(u=>u.path));await P(u=>{u.workspaces=u.workspaces.filter(y=>g.has(y.path));});}if(!l.workspaces||l.workspaces.length===0){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:t,workspaces:[],summary:{total:0,missing:i,registryExists:true,registryValid:true,cleanupApplied:false}},null,2));return}console.log(s.yellow(`
647
649
  \u26A0\uFE0F No workspaces registered yet.
648
- `)),s>0&&console.log(a$1.gray(`Cleaned ${s} stale workspace entr${s===1?"y":"ies"}.
649
- `));return}if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:r,workspaces:p.workspaces,summary:{total:p.workspaces.length,missing:s,registryExists:true,registryValid:true,cleanupApplied:false}},null,2));return}console.log(a$1.bold(`
650
+ `)),i>0&&console.log(s.gray(`Cleaned ${i} stale workspace entr${i===1?"y":"ies"}.
651
+ `));return}if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:t,workspaces:l.workspaces,summary:{total:l.workspaces.length,missing:i,registryExists:true,registryValid:true,cleanupApplied:false}},null,2));return}console.log(s.bold(`
650
652
  \u{1F4E6} Registered Workspai Workspaces:
651
- `));for(let m of p.workspaces)console.log(a$1.cyan(` ${m.name}`)),console.log(a$1.gray(` Path: ${m.path}`)),console.log(a$1.gray(` Projects: ${m.projects?.length||0}`)),console.log();s>0&&console.log(a$1.gray(`Cleaned ${s} stale workspace entr${s===1?"y":"ies"}.`)),console.log(a$1.gray(`Total: ${p.workspaces.length} workspace(s)
652
- `));}catch(o){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:r,workspaces:[],summary:{total:0,missing:0,registryExists:true,registryValid:false},error:{code:"workspace.registry.read_failed",message:o.message}},null,2));return}console.error(a$1.red(`
653
- \u274C Failed to read workspace registry`)),console.error(a$1.gray(String(o)));}}async function re(e){try{let t=await promises.readFile(e,"utf8");return JSON.parse(t)}catch{return null}}async function D(e){for(let t of e){let r=await re(t);if(r!==null)return r}return null}function oe(e){return c$1(e)}async function ae(e){return a$3(e,{skipDirs:new Set(["node_modules","dist","build","target","coverage","htmlcov"]),includeHiddenDirs:false,descendIntoMatchedProjects:true})}async function L(e){try{return (await promises.readdir(e,{withFileTypes:true})).filter(r=>r.isFile()&&r.name.toLowerCase().endsWith(".json")).map(r=>r.name).sort((r,i)=>r.localeCompare(i))}catch{return []}}async function xe(e,t){let r=t?.includePaths===true,i=t?.includeDoctorEvidence!==false,o$1=t?.includeBlueprint!==false,l=n.resolve(e),c=await D(o(l,"workspace.json")),s=typeof c?.workspace_name=="string"&&c.workspace_name.trim()||n.basename(l),p=typeof c?.profile=="string"?c.profile:void 0,u=typeof c?.rapidkit_version=="string"?c.rapidkit_version:void 0,k=await ae(l),m=[];for(let g of k){let w=await D(p$1(g,"project.json")),j=n.relative(l,g)||".",O=n.dirname(p$1(g,n.join("reports","placeholder"))[0]),S=n.dirname(p$1(g,n.join("reports","placeholder"))[1]),W={name:n.basename(g),relative_path:j,runtime:typeof w?.runtime=="string"?w.runtime:void 0,kit_name:typeof w?.kit_name=="string"?w.kit_name:void 0,modules:Array.isArray(w?.modules)?w.modules.filter(x=>typeof x=="string"):void 0};if(r&&(W.absolute_path=g),i){let x=await D([n.join(O,"doctor-last-run.json"),n.join(S,"doctor-last-run.json")]);oe(x)&&(W.doctor_report=x);}let A=[...await L(O),...await L(S)].filter((x,M,Y)=>Y.indexOf(x)===M);A.length>0&&(W.reports=A),m.push(W);}let y=o(l,"reports"),f=[...await L(y[0]),...await L(y[1])].filter((g,w,j)=>j.indexOf(g)===w),$=await D(o(l,"workspace.contract.json")),h={schema_version:"1.1",generated_at:new Date().toISOString(),generated_by:"workspai",workspace:{name:s,relative_root:".",profile:p,rapidkit_version:u,...r?{absolute_root:l}:{}},summary:{project_count:m.length,doctor_evidence_included:i,contract_included:!!$},reports:{workspace:f},projects:m,...$?{contract:$}:{}};o$1&&(h.blueprint={schema_version:"rapidkit.workspace-blueprint.v1",purpose:"portable-reproducibility",workspace:{name:s,profile:p},projects:m.map(g=>({name:g.name,relative_path:g.relative_path,runtime:g.runtime,kit_name:g.kit_name,modules:g.modules??[],recreate_commands:[...g.kit_name?[`npx workspai create project ${g.kit_name} ${g.name} --yes --skip-install`]:[],`cd ${g.relative_path}`,"npx workspai init","npx workspai test"]})),recommended_commands:["npx workspai workspace contract verify --strict","npx workspai doctor workspace","npx workspai workspace run init --json","npx workspai workspace run test --strict --json","npx workspai readiness --strict --json"]});let _=t?.outputPath?n.resolve(t.outputPath):n.join(y[0],"share-bundle.json");return await promises.mkdir(n.dirname(_),{recursive:true}),await promises.writeFile(_,JSON.stringify(h,null,2),"utf8"),_}export{K as a,ye as b,$e as c,je as d,ve as e,_e as f,xe as g};
653
+ `));for(let g of l.workspaces)console.log(s.cyan(` ${g.name}`)),console.log(s.gray(` Path: ${g.path}`)),console.log(s.gray(` Projects: ${g.projects?.length||0}`)),console.log();i>0&&console.log(s.gray(`Cleaned ${i} stale workspace entr${i===1?"y":"ies"}.`)),console.log(s.gray(`Total: ${l.workspaces.length} workspace(s)
654
+ `));}catch(a){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:t,workspaces:[],summary:{total:0,missing:0,registryExists:true,registryValid:false},error:{code:"workspace.registry.read_failed",message:a.message}},null,2));return}console.error(s.red(`
655
+ \u274C Failed to read workspace registry`)),console.error(s.gray(String(a)));}}async function le(e){try{let r=await promises.readFile(e,"utf8");return JSON.parse(r)}catch{return null}}async function A(e){for(let r of e){let t=await le(r);if(t!==null)return t}return null}function de(e){return c$2(e)}async function me(e){return a$2(e,{skipDirs:new Set(["node_modules","dist","build","target","coverage","htmlcov"]),includeHiddenDirs:false,descendIntoMatchedProjects:true})}async function L(e){try{return (await promises.readdir(e,{withFileTypes:true})).filter(t=>t.isFile()&&t.name.toLowerCase().endsWith(".json")).map(t=>t.name).sort((t,o)=>t.localeCompare(o))}catch{return []}}async function De(e,r){let t=r?.includePaths===true,o$1=r?.includeDoctorEvidence!==false,a=r?.includeBlueprint!==false,p$1=c.resolve(e),n=await A(o(p$1,"workspace.json")),i=typeof n?.workspace_name=="string"&&n.workspace_name.trim()||c.basename(p$1),l=typeof n?.profile=="string"?n.profile:void 0,m=typeof n?.rapidkit_version=="string"?n.rapidkit_version:void 0,f=await me(p$1),g=[];for(let k of f){let $=await A(p(k,"project.json")),b=c.relative(p$1,k)||".",W=c.dirname(p(k,c.join("reports","placeholder"))[0]),B=c.dirname(p(k,c.join("reports","placeholder"))[1]),N={name:c.basename(k),relative_path:b,runtime:typeof $?.runtime=="string"?$.runtime:void 0,kit_name:typeof $?.kit_name=="string"?$.kit_name:void 0,modules:Array.isArray($?.modules)?$.modules.filter(_=>typeof _=="string"):void 0};if(t&&(N.absolute_path=k),o$1){let _=await A([c.join(W,"doctor-last-run.json"),c.join(B,"doctor-last-run.json")]);de(_)&&(N.doctor_report=_);}let T=[...await L(W),...await L(B)].filter((_,X,Q)=>Q.indexOf(_)===X);T.length>0&&(N.reports=T),g.push(N);}let u=o(p$1,"reports"),y=[...await L(u[0]),...await L(u[1])].filter((k,$,b)=>b.indexOf(k)===$),h=await A(o(p$1,"workspace.contract.json")),j={schema_version:"1.1",generated_at:new Date().toISOString(),generated_by:"workspai",workspace:{name:i,relative_root:".",profile:l,rapidkit_version:m,...t?{absolute_root:p$1}:{}},summary:{project_count:g.length,doctor_evidence_included:o$1,contract_included:!!h},reports:{workspace:y},projects:g,...h?{contract:h}:{}};a&&(j.blueprint={schema_version:"rapidkit.workspace-blueprint.v1",purpose:"portable-reproducibility",workspace:{name:i,profile:l},projects:g.map(k=>({name:k.name,relative_path:k.relative_path,runtime:k.runtime,kit_name:k.kit_name,modules:k.modules??[],recreate_commands:[...k.kit_name?[`npx workspai create project ${k.kit_name} ${k.name} --yes --skip-install`]:[],`cd ${k.relative_path}`,"npx workspai init","npx workspai test"]})),recommended_commands:["npx workspai workspace contract verify --strict","npx workspai doctor workspace","npx workspai workspace run init --json","npx workspai workspace run test --strict --json","npx workspai readiness --strict --json"]});let w=r?.outputPath?c.resolve(r.outputPath):c.join(u[0],"share-bundle.json");return await promises.mkdir(c.dirname(w),{recursive:true}),await promises.writeFile(w,JSON.stringify(j,null,2),"utf8"),w}export{q as a,Ce as b,Pe as c,We as d,Ne as e,Ie as f,De as g};